2017-03-17 15:33:36
这时,“黑客”这个词不仅是第一流能力的象征,还包含着求解问题过程中产生的精神愉悦或享受。也就是说,从一开始,黑客就是有精神追求的。自由软件基金会创始人理查德·斯托尔曼说:“出于兴趣而解决某个难题,不管它有没有用,这就是黑客。”
根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。
为了澄清“黑客”这个概念,他们提出只有传统意义上的黑客才能被称为hacker,而那些恶意入侵计算机系统的人应该被称为cracker(入侵者)。这个观点已经在程序员社区中得到普通认同。
Hackers and Painters这个书名就是在提示应该把黑客与画家当作同一种人看待。和画家一样,黑客只是怀有一门特殊手艺、有创造天赋的普通人。这个书名还有另一层含义,即编程是一种艺术创作,黑客就是艺术家,开发软件与画家作画、雕塑家雕刻、建筑师设计房屋并没有本质不同。
但是我认为,孩子们欺负书呆子的主要原因也与追求“受欢迎”的心理有关。怎样才能让自己更受欢迎?个人魅力只是很小的一方面,你应该更多地考虑如何结盟。秘诀就是不停地设法使自己与其他受欢迎的人变得关系更密切。没有什么比一个共同的敌人更能使得人们团结起来了。
如果说其中还有一丝安慰,那就是书呆子不妨记住,这种虐待不是针对个人的。一群孩子成群结伙地欺负你,那并不是因为你做错了什么,而是因为这一伙人需要找一件事情一起干,这就好像一群人成群结伙地去打猎一样。他们实际上并不恨你,他们只是需要一个共同的目标。
我认为,真实世界的关键并非在于它是由成年人组成的,而在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。学校、监狱、上流社会的女士午餐会,都做不到这一点。这些场合的成员都好像关在封闭的泡沫之中,所作所为只对泡沫内部有影响,对外部没有影响。那么很自然地,这些场合就会产生野蛮的做法。因为它们不具备实际功能,所以也就无所谓采用的形式^。
「约翰·纳什(John Nash,1928—),美国著名数学家,因其对博弈论的突出贡献而获得1994年的诺贝尔经济学奖。纳什从小性格孤僻,不合群,读大学期间以行为古怪而闻名,30岁时就患上了严重的精神分裂症。电影《美丽心灵》讲述的就是他的故事。——译者注」
因为我在这个世界中过得并不好,我觉得一定是自己什么地方做错了。我没有意识到,作为书呆子,我不适应周围环境,某种程度上正说明我领先了一步。书呆子已经在思考的东西,正是真实世界看重的东西。他们与别人不一样,不把所有时间用来玩一种耗尽全力但又亳无意义的游戏。
对于书呆子来说,意识到学校并非全部的人生,也是很重要的事情。学校是一个很奇怪的、人为设计出来的体系,一半像是无菌室,一半像是野蛮洪荒之地。它就像人生一样,里面无所不包,但又不是事物的真实样子。它只是一个暂时的过程,只要你向前看,你就能超越它,哪怕现在你还是身处其中。
「在英语中,“建筑师”(architect)和“架构师”(architect)是同一个词,所以这里用的是双关语,意思是优秀程序员不仅负责建造,还负责架构。后一句中的“建筑学”(architecture)也是这种双关用法,同时指“架构学”(architecture)。一译者注」
首先,科学研究必须具有原创性。写过博士论文的人都知道,确保自己正在开垦新领地的方法,就是去找那些没有人要的土地。
那么,为什么大学和实验室还把论文数量作为考核黑客工作的指标呢?这种事情其实在日常生活中普遍存在,比如,我们使用简单的标准化测试考核学生的“学术能力倾向”(scholastic aptitude),再比如,我们使用代码的行数考核程序员的工作效率。这样的考核容易实施,而容易实施的考核总是首先被采用。
我对待代码的认真程度远远超过我对待其他事情,如果我以这种态度对待日常生活的每件事,那么我就够资格找心理医生开处方药了。看到代码前面的缩进乱七八糟,或者看到丑陋的变量名,都会把我逼疯的。
黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。
这时你要明白,自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明自,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。我认为这样傲不可取,更好的方法是在思想和言论之间划一条明确的界线。在心里无所不想,但是不一定要说出来。我就鼓励自己在心里默默思考那些最无法无天的想法。你的思想是一个地下组织,绝不要把那里发生的事情一股脑说给外人听。
因为弥尔顿是一个喜欢争论、好打嘴仗的人,而当时罗马教廷的宗教裁判所非常强势,所以沃顿爵士才会这样建议他。需要记住的是,弥尔顿的时代与我们的时代并没有本质不同。每个时代都有自己的忌讳,如果你触犯它们,就算没有坐牢,至少也会为自己惹来麻烦,干扰了正常生活。
所以,如果可能的话,你最好找一些信得过的知己,只与他们畅所欲言、无所不谈。这样不仅可以获得新观点,还可以用来选择朋友。能够一起谈论“异端邪说”并且不会因此气急败坏的人,就是你最应该认识的朋友。
互联网应用程序能够同时被多人使用,所以非常适合团队协作性的工作。大多数用户现在还不了解软件协同办公,否则估计他们会强烈要求大部分应用程序都具备这个功能。举例来说,允许两个用户同时编辑一个文档是一项很有用的功能。
投资者和分析家会问,你们对未来有何计划。真实的回答是,我们没有任何计划。我们有改进的想法,但是如果我们想到应该怎么改进,就已经把它实现了。接下来六个月我们要做什么?所有能想到的最佳改进。我不知道自己是否有胆量公开这么说,但这是实话。计划这个词,只是将构思束之高阁的另一种表达方式。只要想到好的构思,我们就立刻着手实现。
^「基准测试(benchmark test)指的是先设置一个基本的数据环境,测试应用程序的表现,然后把这个表现当作“基准”(benchmark),用来比较其他情况下应用程序的表现。——译者注」
^^「“边际成本”是一个经济学概念,指下一个单位产品的生产成本。软件的边际成本就是复制代码的成本,所以接近零。这意味着,对软件公司来说,增加一个用户几乎没有增加生产成本。它与价格歧视的关系在于,边际成本越低,厂商的定价空间就越大,它可以针对特定消费者定出很低的价格,从而达到扩大销售、利润最大化的目的。——译者注」
「不少公司都很想知道,什么事情可以外包,什么事情不可以外包。一个可能的答案是,公司内部所有不直接感受到竞争压力的部门都应该外包出去,让它们暴露在竞争压力之下。(我这里所说的“外包”,指的是聘请另一个公司来执行,而不是指把业务部门转移到海外。)」
^「近代历史上,政府有时都搞不清楚金钱和财富的区别。亚当·斯密在《国富论》中提到,许多国家政府为了保住“财富”,禁止出口白银或者黄金。但是,黄金和白银实际上只是一种交换媒介,留住它们并不会让一个国家变得更富有。如果物质财富保持不变,金钱越多,导致的唯一结果就是物价越高。」
「总的来说,这也是很好的处事原则。如果你有两个选择,就选较难的那个。如果你要选择是坐在家里看电视,还是外出跑步,那就出去跑步吧。这个方法有效的原因可能是遇到两个一难一易的选择时,往往出于懒惰的缘故,你会选择较易的那个选项。在意识深处,你其实知道不懒惰的做法会带来更好的结果,这个方法只是迫使你接受这一点。」
在美国,一些大型上市公司的CEO的收入大概是普通人的100倍^。职业棒球选手的年收入是普通人的72倍,职业篮球选手的年收入则是普通人的128倍。报纸的社论用恐怖的语调引用这样的统计数据。但是我觉得,想象一个人的产出是另一个人的100倍是一件毫无困难的事情。
17世纪的英国很像今天的第三世界,当官是公认的发财职业。那个年代要赚大钱仍然主要通过贪污,而不是经商^。到了19世纪,情况就变了,虽然存在大量贪污受贿(今天依然如此),但是政府遂渐被一些将良心和名誉看得比金钱更重要的人所控制。技术的发展使得通过创造而积累财富的速度第一次有可能超过通过偷窃而积累财富的速度。19世纪典型的富人不是宫廷朝臣,而是实业家。
如果我可以做选择,到底是生活在一个整体上非常富裕但是我个人相对贫穷的社会,还是生活在一个我个人相对非常富裕但是整体上非常贫穷的社会呢?我会选择第一个选项。如果我有小孩的话,可能哪一个选项更好还值得争论。但是,总的来说,你要避免的是绝对贫穷,而不是相对贫穷。如果必须在这两种社会之间做选择,根据目前的证据,我选择个人相对贫穷、但是整体上更富裕的社会。
一个社会需要有富人,这主要不是因为你需要富人的支出创造就业机会,而是因为他们在致富过程做出的事情。我在这里谈的不是财富从富人流向穷人的那种扩散效应(trickle-down effect),也不是说如果你让亨利·福特致富,他就会在下一场宴会雇用你当服务员,而是说如果你让他致富,他就会造出一台拖拉机,使你不再需要使用马匹耕田了。
Lisp很值得学习。你掌握它以后,会感到它给你带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到Lisp。
Lisp语言的好处不在于它有一些狂热爱好者才明白的优点,而只在于它是目前最强大的编程语言。它没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。
认为所有语言都一样的看法的缺点是自欺欺人,但是优点是可以使许多事情变得很简单。我想这就是为什么它被广泛接受的主要原因。它是一个令人舒服的想法。
但是,如果你靠近观察这个世界,就会发现不同的人对“酷”的理解是不一样的。在黑客圏子里,Perl被公认比Java酷得多。黑客社区网站Slashdot就是用Perl开发的。我估计你不可能看到黑客愿意使用Java的JSP技术开发网站。可是,还有一种更新的语言叫做Python,它的使用者往往看不起Perl。另一些人则认为Ruby语言是取代Python的最佳选择。
当你按照Java、Perl,Python,Ruby这样的顺序观察这些语言,你会发现一个有趣的结果。至少,如果你是一个Lisp黑客,你就看得出来,排在越后面的语言越像Lisp。Python语言模仿Lisp,甚至把许多Lisp黑客认为属于设计错误的功能也一起模仿了。至于Ruby语言,如果回到1975年,你声称它是一种有着自己句法的Lisp方言,没有人会提出反对意见。编程语言现在的发展不过刚刚赶上1958年Lisp语言的水平。
由此也就得出了20世纪50年代的编程语言到现在还没有过时的原因。简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。你不应该把Lisp语言与50年代的硬件联系在一起,而是应该把它与快速排序(Quicksort)算法进行类比。这种算法是1960年提出的,至今仍然是最快的通用排序方法。
Lisp语言刚出现的时候,这些思想与其他编程语言大相径庭,后者的设计思想主要由50年代后期的硬件决定。随着时间流逝,流行的编程语言不断更新换代,语言设计思想逐渐向Lisp靠拢。
如果使用Lisp语言,程序能变得多短?以Lisp和C的比较为例,我听到的大多数说法是C代码的长度是Lisp的7倍到10倍。但是最近,New Architect杂志上有一篇介绍ITA软件公司的文章^,里面说“1行Lisp代码相当于20行C代码”,因为此文都是引用ITA总裁的话,所以我想这个数字来自ITA的编程实践。如果真是这样,那么我们可以相信这句话。ITA的软件不仅使用Lisp语言,还同时大量使用C和C++,所以这是他们的经验之谈。
举例来说,hello-world本应该是一个很简单的程序,但是在Java语言中却要写上一大堆东西,这本身就差不多可以说明Java语言设计得有问题了^。
「帕金森定律(Parkinson’s Law)的一种原始表达形式是“工作总是到最后一刻才会完成”,后来引申到计算机领域就变成了“数据总是会填满所有空间”,更一般性的总结则是“对一种资源的需求总是会消耗光这种资源的所有供应”。——译者注」
新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。自然成长式的一个例子就是在车库里白手起家、自力更生的创业者。几个好朋友埋头工作,在外界毫不知晓的情况下开发出某种新技术。他们把它推向市场,没有任何宣传,最初的用户寥寥无几(但是热心程度无与伦比)。创业者持续改进新技术,与此同时,通过口碑效应,用户数量不断增长。在创业者不经意间,他们已经壮大起来了。
大爆炸式的例子是有风险资本支持、在市场上大张旗鼓宣传的创业公司。他们急急忙忙地开发一个产品,推向市场的时候大肆曝光,立刻就获得了一大批使用者(至少他们希望如此)。
伹是我想他们不必难过。最终来看,自然成长式会比大爆炸式产生更好的技术,能为创始人带来更多的财富。如果你研究一下目前的主流技术,就会发现大部分都是源于自然成长式。
让我们试着描述黑客心目中梦寐以求的语言来为以上内容做个小结。这种语言干净简练,具有最高层次的抽象和互动性,而且很容易装备,可以只用很少的代码就解决常见的问题。不管是什么程序,你真正要写的代码几乎都与你自己的特定设置有关,其他具有普遍性的问题都有现成的函数库可以调用。
这种语言的句法短到令人生疑。你输入的命令中,没有任何一个字母是多余的,甚至用到Shift键的杌会也很少。
这种语言的抽象程度很高,使得你可以快速写出一个程序的原型。然后,等到你开始优化的时候,它还提供一个真正出色的性能分析器,告诉你应该重点关注什么地方。你能让多重循环快得难以置信,并且在需要的地方还能直接嵌入字节码。
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼
❤ 点击这里 -> 订阅《从放弃C语言到使用C++刷算法的简明教程》by 柳婼
❤ 点击这里 -> 订阅PAT甲级乙级、蓝桥杯、GPLT天梯赛、LeetCode题解离线版