大部分读者一看到这个书名应该会很好奇,黑客与画家?听上去是两种截然不同的职业,这两个之间有什么关系吗?慢慢读下去才发现,作者把两者放在一起,不仅仅是因为作者既有绘画又有编程的经历,更是因为作者发现这两者有共同之处—都属于创作者。为什么我看到这个名字的时候没有想到呢,可能是我太迟钝了。总的来说,这本书值得一读。
简单介绍一下作者和本书,作为美国知名程序员、Lisp专家,保罗·格雷厄姆曾被《福布斯》杂志称为“撼动硅谷的人”,他发明了世界上首个互联网应用程序 Viaweb,同时,他也是一名成功的商人和风险投资家,其创办的 Y Combinator 是为创业者服务的商业孵化器,目前已成功孵化数千个初创项目和近万名创始人,总估值近万亿美元。作者通过自己丰富的创业经历以及从画家到黑客的跨界经历,生动诠释了什么是黑客精神以及黑客们如何看待世界、影响世界。
一、为什么书呆子不受欢迎?
作者将书呆子定义为那些在学业上表现出色但是在生活中不怎么合群的人。当然,这群聪明的小孩不是排斥受欢迎,而只是把时间花在了他们觉得更重要的事情上了,他们可能觉得变得聪明比受欢迎重要。这可能是美国等国家的一个特点吧,在学校里最受欢迎的那些是擅长体育或者社交的小孩。不过,在中国的环境中,我觉得学业出色的孩子还是比较容易受到欢迎的,起码收到欺凌的概率较小。所以这里,我不太同意聪明和受欢迎有点对立,受欢迎和合群不是同一个概念。在中国的语境中,书呆子可能指的是只对读书感兴趣而对其他领域一无所知的人,特别是看起来木讷的。虽然两者的定义可能不同,但是不同国家的这两类人可能容易被孤立的确相同。
二、为什么书呆子容易被孤立甚至欺凌?
一个原因是,青少年在心理上还没有摆脱儿童状态,许多人会残忍地对待他人。他们折磨书呆子的原因就像拔掉一条蜘蛛腿一样,觉得很好玩。在一个人产生良知之前,折磨就是一种娱乐。
同样,在任何社会等级制度中,那些对自己没自信的人会通过虐待他们眼中的下等人来突显自己的身份。
但是我认为,孩子们欺负书呆子的主要原因也与追求“受欢迎”的心理有关。怎样才能让自己更受欢迎?个人魅力只是很小的一方面,你应该更多地考虑如何结盟。秘诀就是不停地设法使自己与其他受欢迎的人变得关系更密切。没有什么比一个共同的敌人更能使得人们团结起来了。
如果说其中还有一丝安慰,那就是书呆子不妨记住,这种虐待不是针对个人的。一群孩子成群结伙地欺负你,那并不是因为你做错了什么,而是因为这一伙人需要找一件事情一起干,这就好像一群人成群结伙地去打猎一样。他们实际上并不恨你,他们只是需要一个共同的目标。
最受欢迎的孩子并不欺负书呆子,他们不需要靠踩在书呆子身上来垫高自己。大部分的欺负来自处于下一等级的学生,那些焦虑的中间层。
不受欢迎是一种传染病,虽然善良的孩子不会去欺负书呆子,但是为了保护自己,也依然会与书呆子保持距离。
作者分析了在校园中为什么书呆子容易被欺凌的原因。这里,我很是佩服作者观察的细致和对现象的思考。好像我从来没有考虑过这个问题,是因为我很少遇到这种现象?还是说即使遇到了,也没有意识去思考现象背后的原因。上面的第二句话,如果抛开实际的虐待行为来说,在如今的社会也是很常见。比如有些人总是会通过贬低侮辱他人来获得一种优越感,可能这个是获取优越感的一种廉价的方式吧。不得不说,作者把美国公立学校类比成监狱有点惊艳。
三、黑客应该如何学习工作?
作者认为坚持一丝不苟,就能取得优秀的成果,因为那些看不见的细节累加起来,就变得可见了。但是黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。对于画家和黑客这样的创作者,有些工作需要投入巨大的热情,另一些工作则是不需要很操心的日常琐事。在你厌倦的时候再去做那些比较容易的工作,这是一个不错的主意。
作者认为多人共同开发一个软件的正确模式是:需要合作,但是不要“合”得过头。正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。
作者认为与其说优秀的软件设计师是工程师,还不如说是是建筑师。因为建筑师决定做什么,而工程师想出怎么做。就像现在大多数负责实现的叫开发工程师,而负责怎么实现的就叫架构师了。
作者认为直接动手是编程最有效的方式。他在大学受到的教育是,先在纸上编程,再去计算机上编程。而他则不同,他更喜欢直接上机编程,不是在编程之前就做出一个完美的构想,把每一步都思考清楚,而是先不管对错,把代码码出来,再回头慢慢修改。对他而言,编程的过程就是一个调试的过程。不要期望有一个完美的规格设计再动手,正确的方法是在编程的过程中不断完善。既要避免过早优化,又要避免过早设计。
四、创业者的机会
大公司为了避免设计上的灾难,选择了降低设计结果的标准差。但是当你排斥差异的时候,你不仅将失败的可能性排除在外,也将获得高利润的可能性排除在外。这对大公司来说不是问题,因为生产特别优秀的产品不是它们的获胜手段。大公司只要做得不太烂,就能赢。
真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。
五、怎么做一个好的软件?
作者认为做一个优秀软件的方法之一是自己创业,但是会遇到两个问题。一是必须处理许许多多与开发软件完全无关的事情。二是赚钱的软件往往不是好玩的软件,你可能不得不去干那些很麻烦很令人讨厌的事情,因为这些事情没人愿意义务来干。那黑客怎么才能做自己喜欢做的事呢?那就是找两份工作,一个用来赚钱满足生计,另一个用来满足爱好。对于编程人员来说,做开源也许是第二种的一个形式。
作者在面试程序员的时候,喜欢关注候选人在业余时间做了什么软件,他觉得,如果一个人不爱一件事,那不可能把这件事做的真正优秀。就比如如果一个人热爱编程,就不可避免地会开发自己的项目。
六、黑客为谁而创作?
黑客必须像画家一样,时刻考虑到用户的人性需要,这样才能做出伟大的产品。你必须能够站在用户的角度思考问题,也就是说,你必须学会“换位思考”。这必然意味着你要做其他人需要的事情,而不是你自己想做的事情。事实表明,从他人的角度思考问题正是成功的奥秘所在。判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。程序也是如此,软件的部分功能就是解释自身,就好像《计算机程序的构造和解释》一书的卷首语:程序必须写得能够供人们阅读,偶尔供计算机执行。
七、什么是不能说的话?
作者认为,什么是不能说的话呢?可以看看周围的人因为说了什么而陷入麻烦。触怒他人的言论是那些可能会有人相信的言论。最令人暴跳如雷的言论,就是被认为说出了真相的言论。感觉这里作者太不严谨了,谣言也可能有人相信,也能让人暴跳如雷,但是并不一定是真相。
作者认为流行一时的不仅有衣服,还有道德观念。明明是专横武断、毫无依据的错误观点,大多数人却深信不疑,受到影响而不自知。这个在古代是很常见的,作者认为在自己的时代也没有什么不同。如果作者认为现在我们言之凿凿的东西,在未来人们的眼里却可能是荒诞不经的,我是很同意的,但这并不意味着这就是不能说的话吧,是因为那个时候美国的政治正确现象已经很严重了吗?作者认为思考什么是不能说的话有助于我们避免随大流的想法。如果别人告诉你应该相信什么,你就相信什么,那你就会把别人灌输的观点变成了自己的观点。所以需要自己思考和判断。有人会说:要根据社会需要,改造自己的思想。如果你真的相信,凡是不认同社会之处,马上放弃自己的观点,那才会真正出问题。所以,遇到一件事,可以问一下为什么是这样。现行体系中可能没有什么事是必然的。它之所以是现在这个样子,主要是因为没人去改变它。
八、贴标签的问题
标签有巨大的威力,历史上的每一个年代,都会给“异端邪说”贴一些标签,目的是在人们开始思考它们是否为真之前就把它们封杀。“亵渎神明”、“冒犯圣灵”、“异端”都是西方历史上常见的标签,当代的标签则是“有伤风化”、“不得体”等。当然,看起来这些标签在今天已经不可避免地失去了杀伤力,不过这种现象仍然广泛存在。当一个政治家说自己的对手是错的,这是直截了当的批评。但是,如果他不谈论对错,却使用“对种族问题不敏感”这样的标签攻击对手,那就应该多加注意了。因为被贴上标签、受到打压后,人们都噤若寒蝉了。这是一种很理想的压制反对声音的方法。我倒觉得标签本身并没有那么大的作用,可能就是一种行为的概括,就好像犯法总有一个罪名一样。也有标签是好的词。如果标签真的有作用,可能就是会把事情放大,比如,一个人做了一件“不得体”的事,一旦被贴上标签之后,就会让人觉得他是不是处处不得体。就好像一个人被贴上“圣人”的标签,人们可能就会希望他是个完美的人。
九、潜意识
最先从你头脑中跳出来的想法,往往就是最困挠你、很可能为真的想法。你已经注意到它们,但还没有认真思考过。1989年,一些聪明的研究人员设计了一个实验,给放射科医生看胸部X光片,请他们判断病人有没有肺癌迹象。研究人员记录了医生检查X光片时的眼球运动。研究发现,即使那些医生漏掉了一个癌症病灶,他们的目光通常也会在那个地方停留一会。这说明他们的头脑深处已经意识到那里有问题,但是这种深层的反应没有上升为自觉的意识。所以,当你有一个直觉的想法时,不妨再想一下,为什么自己会这么想,也许就能有所发现。
十、从历史看现在
人们无法通晓未来,发现当代表面上正确但是实际上可笑的想法,但是可替代的,或许我们可以回顾过去,去找那些过去被认为理所当然、如今却被认为不可思议的事情。这是政治正确带给作者的阴影吗?我自己也发现一个现象,就是随着时间的发展,以前很多褒义的词慢慢变得带有贬义,但是似乎很难找到之前是贬义的词变得成为了褒义。这是为什么呢?社会是螺旋上升的,还是说每个时代都会产生新的问题?作者建议在时间上把不同得观念 diff 一下,来发现那些古人觉得正常的观念,但是现在却觉得不合理的情况。同时,也可以把不同文化进行一下diff,不是说脑补,而是亲自去看一下。不过作者的一个观察我觉得挺有意思,那就是禁忌是单方面的,就是说某个观点在一种文化中不允许说出口,而在其他文化中说不说都可以。作者认为如果某个观点在大部分时空是不受禁止的,只有我们这个社会才把它当作禁忌,那么很可能是我们出错了。这个明显也是有问题的,比如现在认为奴隶制不被允许,也许只是因为社会进步了而已。我觉得历史的作用在于让我们在面对一个相似的问题时不去选择错误的解决方法,但是一味的按照历史经验去做很难改善现在的问题。就好像《战国策》所言:法古之学,不足以制今。
十一、道貌安然的卫道者
作者观察到,长辈们心里认为孩子的思想应当光明纯洁,所以为了保证孩子不受外界“不良”思想的影响,就对那些“不良”思想进行了“消毒”和屏蔽,把世界描述成光明的样子,向孩子们灌输,将他们的心灵塑造成我们想象中的样子。作者认为,这样会导致孩子”被迫“在一个精心设计的环境中长大,不知道那些”不能说的话“。感觉搞笑的是作者这里举了个说脏话的例子,如果”不能说的话“是指脏话,那让孩子知道的意义是什么呢?当然作者可能并不是特指脏话,作者觉得,如果从来没有被真实的社会生活“污染”过,将来当孩子长大以后接触社会,就会发以前觉得真实的事情可能是荒唐可笑的。我也不同意这个观点。对一个三观还未形成的孩子来说,没必要让其过早地了解世界的黑暗吧,长大后发现这个世界是荒唐的不好吗?这时,一个成年人会怎么做,融入它还是改变它?如果你想要一个好的世界,那么还是应该教育孩子从善,一个了解社会黑暗的孩子会比一个只了解真善美的孩子在成年后更有概率做好事吗?作者似乎觉得接受社会的真相比使社会变得更好重要,否则为什么强调质疑,却不质疑社会的黑暗为什么要存在呢?毕竟前面作者不认为存在即合理。
十一、禁忌的产生机制
作者认为流行的道德观念不同于时尚,它们往往不是偶然产生的,而是被刻意创造出来的,我感觉现如今的时尚可能也是刻意为之。如果有些观点我们不能说出口,原因很可能是某些团体不允许我们说。道德禁忌的最主要制造者是那些在权力斗争中略占上风的一方。你会发现,这一方有实力推行禁忌,同时又软弱到需要禁忌来保护自己的利益。不太理解作者所说的道德禁忌是什么,平权算是一种吗?作者可能不认同这种,但我觉得健康的社会确实需要一种机制来保护弱者,否则也太丛林法则了吧。但是这种机制不应该演变成一种特权,如果一个群体声称他们需要被特别照顾,我们应该思考的是比这个团体还要弱势的人是否也得到了相应的关照。另一方面,如果一个团体很强大,他们是不是就不会为了自己的利益推动禁忌了,感觉这也很难说,特别是如果这个禁忌是不公平或者不道德的。我赞同作者认为如果一个团体强大到无比自信,它根本不会在乎别人的抨击。但是一个不在乎别人批评的人不一定是因为自信,也有可能是它能控制别人的批评,或者能控制这些批评的受众。就像作者认为美国人或者英国人对外国媒体的诋毁就毫不在意一样,也许之前是,但是现在似乎不是了。
十二、为什么要寻找不能说的话?
作者认为自己是纯粹的好奇心,他对任何被禁止的东西都有特别强烈的好奇心。要亲眼看一下,然后自己做决定。想要做出优秀作品,你需要一个什么问题都能思考的大脑。尤其是那些似乎不应该思考的问题,你的大脑也要养成思考它们的习惯。科学家(或者至少是优秀科学家)做事的方式,准确地说,就是寻找传统观点无法自圆其说的地方,然后试着拆开那里,看个究竟,瞧瞧里面到底出了什么问题。新的理论就是这样产生的。因为科学命题的真伪更显而易见,所以你想在科学界谋职,就不得不训练自己的智力,去发现并解决那些真正的问题,而不能仅仅当一个政治家,通过搞人事关系和派系斗争立足。训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。只要你能看到别人看不到或不敢看的东西,你就有很大的优势。如果你能“远远地”跳出传统思维,提出让别人一听就脑袋轰一声“炸开”的惊人观点,那么你在“小小地”跳出传统思维方面就不会有任何困难,人们把后面这种情况称为“创新”。
十三、守口如瓶,笑脸相迎
一旦发现了“不能说的话”,下一步怎么办?作者的建议是别说,至少也要挑选合适的场合再说。与笨蛋辩论,你也会变成笨蛋。你要对每一个人微笑,但是不要说出自己的真实想法。但是还是要有讨论,讨论一个观点会产生更多的观点,不讨论就什么观点也没有。能够一起谈论“异端邪说”并且不会因此气急败坏的人,就是你最应该认识的朋友。那如果别人问你到底是赞成还是反对呢?你可以回答”我还没想好“。或者说你可以逐步把辩论提升到一个抽象的层次,使用隐喻或者幽默。作者认为”政治正确“的时代正在消亡,还是太乐观了。
十四、永远质疑
作者觉得,荷兰人认为自己思想开放,但是这种想法本身却什么也证明不了。有谁认为自己的思想不开放呢?因为如果你的思想很保守,你自己不会知道,而且你很可能还会持有相反的看法。这里有点不同意,实际上可以通过比较自己和他人的想法的差别来判断出自己是开放还是保守吧,开放和保守是相对的。作者觉得与流行保持一定的距离,才能观察到人们观念的变化。这里也同意人应该永远质疑,你不仅要远距离观察人群,更要远距离观察你自己。就好像如果你觉得别人都是被洗脑了,也应该想一下是不是自己的这个想法也是被洗脑的结果。
十五、丑和美的相同之处
就像黑客既指入侵计算机的人,又能指优秀的程序员一样,丑陋的做法和聪明更的做法存在着一个共同点,那就是都不符合常规。就好像正态分布的两端。
十六、版权法
作者认为最新的版权法设置了前所未有的障碍,禁止外部人员了解专有技术的内部细节,从而也就禁止了外部人员经由这个途径获得新构想。过去,厂商使用专利,防止你出售他们产品的复制品,但是他们无法阻止你把产品拆开,了解内部的工作原理。最新的版权法将后面的这种行为定义为一种犯罪,作者可能特指软件,毕竟像文学作品,音视频本来就是直观的内容。我觉得这可以理解,在信息时代,软件的作者在创造财富,但是由于数据的易复制性,这些创作者在创造财富之后,并不能直接获得回报-金钱,所以版权制度算是一种对这些人的保护吧。虽然现在的版权制度限制了一些交流和研究,但是我并不觉得是弊大于利。就好像作者似乎支持开源,但是有没有把自己开发的viaweb开源呢?作为一个黑客,作者可能觉得能自由的研究很重要,但是作为一个创业者,作者似乎又不这么想。特别是在个人创业者和大公司相比处于绝对劣势的情况下。那怎么办?作者思考一百年后的编程语言,是不是我们也可以想象一下一百年后的创作者的保护制度。那时候,个人创作将得到很好的保护,大公司也没法随意抄袭别人的创意。
十七、不服从管教的黑客
作者认为对于适当的不服从管教保持宽容,这不会有太大的坏处,反而很有利于造就美国的国家优势,它使得美国不仅能吸引聪明人,还能吸引那些很自负的人。黑客永远是自负的。这里我同意美国确实能吸引聪明人,但是似乎也吸引不聪明的人,包容自负的笨蛋的代价是不是会达到不可承受的地步呢?作者认为公民自由是国家富强的原因,而不是结果。这里存疑,类似的想,开放是强大的结果,还是强大的原因?因为遍观世界,落后的国家更会采取贸易保护政策,而先进的国家则推崇开放市场。如果开放是强大的原因,那么这么多落后的国家的领导者是不懂这个真理吗?特朗普似乎是个例外,不过这也许正是美国不再那么强大的一个表现。作者认为一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。这里也是存疑,我觉得拥有言论自由和行动自由的社会,更有可能提出最优方案,但是未必会采取这个方案。因为人们会觉得,不采取这个方案也是一种自由的表现。实际上,无论是否自由,有权势的群体总是可以控制媒体来把持社会的走向,区别只是这个走向是好还是坏而已。
十八、集权和分权
作者认为随着对公民自由的限制不断加强,政府的力量会先增大后减小,反过来也是一样。作者认为极权主义制度只要形成了,就很难废除。可见的情况就是革命或者开明的领导人进行改革吧。感觉分权制度同样如此,一旦形成,实际上也很难改革了。除非遇到一个政治强人或者独裁者,就好像特朗普一样。作者认为那些不服从管教的人,才是美国财富与力量的源泉。作者把自由或者创新等同于不服从管教,有点主观了。就好像作者认为相对于保护傻瓜,不限制天才更重要。
十九、互联网软件和桌面软件
作者认为互联网软件与桌面软件最显著的区别就是,前者不是一个单独的代码块。它是许多不同种类程序的集合,而不是一个单独的巨大的二进制文件。设计桌面软件就像设计一幢大楼,而设计互联网软件就像设计一座城市。如果互联网软件能够击败桌面软件,一定是赢在更方便这一优势上。无论从用户的角度还是从开发者的角度来看,都是如此。就好像普通用户不需要明白很多软件专业的细节,而是只需要知道怎么使用就行了。在某种程度上确实如此,不过互联网软件能够如此流行的原因是不是也和互联网内容越来越丰富多彩有关呢?这是桌面软件无法媲美的。
如果以前还会担心有没有网络的问题,在通信技术如此发达的今天,除了一些特殊的场合,很少有人因为担心没有网络而不去使用互联网软件。当然,也有软件需要充分利用本地的计算资源,否则公司承担不起所有用户的开销。另外,互联网软件也引发了一个新的问题,就是私有数据的隐私保护问题,这就导致了桌面软件还有一席之地。
由于没有安装这一步,所以在“购买”之前试用互联网软件将变得非常普遍、非常容易。只要进入网站,应该就能免费试用该网站提供的服务。从这里可以看出网络软件的另一个特点是不像桌面软件那样容易被盗版破解。同时,互联网软件升级不再对用户形成大的冲击。他们必须正确地设计软件,使得它能够平滑升级,不让使用者感到困惑。不过现在很多桌面软件为了方便也支持增量升级。作者认为互联网应用程序能够同时被多人使用,所以非常适合团队协作性的工作。大多数用户现在还不了解软件协同办公,否则估计他们会强烈要求大部分应用程序具备这个功能。
二十、发布版本
作者认为互联网软件根本没有“版本”这个概念。你的软件是连续性渐变的,某些更新也许比较重大,但是“版本”这个概念不适用于互联网软件。其实滚动式更新也是有版本概念的吧,只是或许没有暴露给用户。在移动端应用流行的今天,部分互联网软件又被取代了,导致了版本更新的问题又回来了。作者认为媒体喜欢听版本号,如果你发布一个大的版本更新(版本号的第一位数字发生变动),它们就会以大篇幅报道;如果你发布一个小的版本更新(版本号小数点后的数字发生变化),它们最多只用一段话提一下。所以作者一想要给自己宣传了,就会发布一个新的版本号,这是一个公关技巧。
二十一、软件bug
软件公司有时会受到指责,因为他们竟然把发现bug的任务交给用户去完成。作者提倡这种做法,对于创业公司来说,这个可能是迫不得已的,毕竟资源不够。而且这是依赖于代码本身有一定的质量保证,而不是依赖于众测的方法本身。
解决新代码的 bug要比解决历史遗留代码的 bug容易。在自己刚刚写好的代码中,找出 bug往往会比较快。早一点发现 bug就不容易形成复合式 bug,也就是互相影响的两个 bug。举例来说,一个 bug是楼梯很滑,另一个 bug是扶手松了,那么只有当这两个 bug互相作用时,才会导致你从楼梯上摔下来。在软件中,复合式 bug是最难发现的 bug,往往也会导致最大的损失。传统的方法是: 把软件彻底拆开,将所有 bug统统清理干净。 这样做难免产生一大堆的复合式 bug。如果软件是经常性发布,每次只有小幅度的变化,那么就不容易产生复合式 bug。这就好比做扫除:你一直在打扫大厅,掉落在地板上的东西会被立刻清理,省得它们时间一长与其他东西粘在一起。
复合式 bug 有一个子类型:两个 bug 是互相弥补的,好比“负负得正”,软件反而能正常运行。这种 bug 可能才是最难发现的 bug 。当你修正了其中的一个 bug ,另一个 bug 才会暴露出来。这时对你来说,你会觉得刚才修正错了,因为那是你最后修改的地方,你就怀疑自己在那里做错了,但是你其实是对的。
二十二、立即开始
你有没有注意过,在坐下来写东西的时候,一半的构思是写作时产生的。所以,将一个构思束之高阁,不仅意味着延迟它的实现,还意味着延迟所有在实现过程中激发的构思。因为你看一眼堆放在一边还没有实现的构思,就会想“我已经为下一个版本准备了很多有待实现的新东西”,你就懒得再思考更多的新功能了。作者这个观察也很有趣,告诉我们有什么想法就立刻去做。计划这个词,只是将构思束之高阁的另一种表达方式。只要想到好的构思,我们就会立刻着手实现。提高软件可靠性的关键在于开发时全神贯注,而不是降低开发速度。这种方式适用于小型的、由优秀且可靠的程序员组成的开发团队,不适用于大型的、充斥着大量平庸之辈的软件公司。
二十三、小团队的优势
正如《人月神话》一书中所指出的,向一个项目增加人手,往往会拖慢项目进程。随着参与人数的增加,人与人之间需要的沟通成本呈现指数级增长。人数少,开发效率反倒会高,至于缺点,就是由于开发人员比较少,每个程序员都必须承担一点儿系统管理的责任。另外,不要梦想写完代码,向服务器一递交,一天的工作就结束了,然后就可以回家了,因为这在互联网软件身上肯定没有实现的可能。因此,不要在下班前发布代码,不要在假日前发布代码。
二十四、关注用户
互联网软件不仅把开发者与他的代码更紧密地联系在了一起,而且把开发者与他的用户也更紧密地联系在了一起。这也可能是作者让开发和产品经理坐在一起的原因。作者发现在某一个地方,试用的用户会停止前进,改为点击浏览器的“后退”按钮。所以,作者就在那个地方加了一条提示,告诉用户已经接近终点了。这就是进度条设计,用户需要对一件事情的始终有判断。
另外,效率对互联网软件至关重要,因为硬件费用由你支付。如果软件效率足够高,每个用户的硬件成本现在可以接近零。
二十五、软件订阅制
作者曾经读过一篇文章,认为应该让用户订阅报纸那样按照使用时间长短订购软件的使用权。公开收取软件的订阅费,而不是让用户购买软件的所有权,操作起来会更自然、更简便。“订报纸模式”正是互联网软件天然的收费模式。我觉得还是等分情况,如果一个软件不断有新的功能,那么这种做法可能是合理的。但是如果一个软件功能基本不更新,又没有云端存储或者计算的成本,感觉用户应该很难认同。作者认为一定数量的盗版对软件公司是有好处的,因为你多了一个潜在的付费用户,市场影响力变大了。这里应该指的是桌面软件吧。
软件的定价特别适合采用价格歧视方法,因为软件的边际成本接近于零。盗版实质上是一种价格歧视,只不过针对的是最底层的消费者。由于互联网软件无法盗版,所以软件公司必须想出其他策略推广软件。一般人可能认为在购买商品时,人们是先做出决定,然后再购买,好像这个行为分成两个独立的步骤。如果某样商品购买起来很困难,人们就会改变主意,放弃购买。反过来也成立,如果某样东西易于购买,你就会多买一点。作者认为互联网软件不适合ISP分销的模式,因为你需要不断改善硬件和软件。
二十六、互联网软件的目标客户
作者认为内互联网软件的目标客户是个人和小企业。因为这些客户决策比较灵活,又需要低成本的新技术,所以他们更愿意尝试新事物。作者认为互联网软件很安全,因为这些公司有更高水平的网络安全专家。但是另一方面是,互联网公司也更容易受到攻击吧,这里面显然也包括高水平的入侵者。但是更重要的,很多公司并不愿意把用户数据提供给互联网服务商,比如为了商业机密或者保护用户隐私。
二十七、竞争压力
作者认为非IT公司的内部系统管理员没有行业竞争压力,日久天长就会变得工作效率低下、不负责任。要让员工表现优秀,必须有竞争压力。销售员必须面对消费者,程序员必须面对竞争对手的软件。公司内部所有不直接感受到竞争压力的部门都应该外包出去,让它们暴露在竞争压力之下。
二十八、推销和品牌
作者认为有钱的客户倾向于更贵的选择,即使便宜的选择更符合他们的需要,他们也不会买。这种现象普遍存在。原因就是,那些索要高价的人将更多的钱投入推销,而买贵的东西的人也想让别人知道自己有能力买。大公司付出的高价之中,很大一部分是商家为了让大公司买下这个商品而付出的费用。(如果国防部花1000美元买一个马桶座圈,部分原因是要让国防部买下它本身就需要花很多钱。)作者这个时候就知道国防部的马桶座圈问题了吗?
二十九、微软的矛盾之处
在作者的时代,令人敬畏的巨无霸是微软公司,作者认为它面对新技术的威胁不会像IBM那样疏忽大意,自以为高枕无忧,毕竟微软的成功就是利用了IBM的疏忽。现在看来,微软也错过了移动端。作者预计微软会推出某种服务器和桌面电脑的混合产品,让它的桌面操作系统专门与由它控制的服务器协同工作。至少它也会把文件放在服务器上,需要的用户可以自己去下载。要是微软不能控制终端设备,它就只剩下一条路,就是把用户推向它自己的互联网软件。这点在Office365上有所体现。作者认为微软并不会因为它在桌面软件世界的成功而在互联网软件世界自动得到一席之地。也许通过努力它能为自己争取到一个席位,但是我不认为它会主宰这个新的世界,取得桌面软件领域那样的地位。因为微软不仅要面对新的技术问题,还要面对它自己毫无根据、一厢情愿的旧思维。就像IBM曾经有过同样的处境,它没有正确应对。在很晚的阶段,它才进入微机市场,并且做得三心二意,没有倾注全力,因为大型机是IBM的主要利润来源,发展微机就等于扼杀这头金牛,所以它感到很纠结。微软也同样感到纠结,因为它想保住桌面软件。看来金牛也会成为沉重的负担。
三十、创业公司
典型的创业公司行动快速,看上去不是那么正式,只有很少几个人,资金也有限。这几个人勤奋工作,技术放大了他们的决策。如果他们赌赢了,那就是一场大胜利。你必须打破常规、快速行动,循规蹈矩不可能成功。许多软件公司的开发者都有一段睡在桌子底下(或者类似经历)的日子,尤其是在初创期。互联网软件永远没有收工的那一天,如果你愿意,可以一直干下去,每天忙上16个小时。可能这就是996吧。而且,你能够做到这一点,意味着竞争者也能做到这一点,所以你必须长时间工作,不得不如此。因为你能做到,所以你必须做到。这简直就是逆向的帕金森定律。
大公司可以互相模仿,但是创业公司就不行。我觉得很多人没有意识到这一点,尤其是一些创业者。一般情况是,创业公司要么赢得一切,要么彻底失败。小公司的平均结果就意味着关门倒闭,创业公司的生存率远低于50%。所以,如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。创业公司对竞争对手应该越保密越好。
三十一、管理企业
管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。随着事业的发展,你自己就能琢磨出来其他的诀窍。用户总是对的,但是不同的用户要求不一样。满足不同的用户的需求的方法是正确设置默认值,而不是限制用户的选择。比较软件的标准应该是看对手的软件将来会有什么功能,而不是现在有什么功能。
三十二、如何创造财富?
如果你想致富,应该怎么做?作者认为最好的办法就是自己创业,或者加入创业公司。自己创业的效率是在公司工作的数十倍,这个有点夸张了。作者认为这是极限的情况,这时,休闲时间为0,工作强度之大足以危害到健康。这里有一个守恒定律:如果你想赚100万美元,就不得不忍受相当于100万美元的痛苦。创业公司将你所有的压力压缩到三四年。承受较大的压力通常会为你带来额外的报酬,但是你还是无法逃避基本的守恒定律。如果创业那么轻松,所有人就都去创业了。任何公司的成功历程中,运气都是一个很大的随机因素。致富的方法有许多种,本文只谈论其中的一种,也就是通过创造有价值的东西在市场上得到回报,从而致富。
三十三、金钱和财富
创造有价值的东西就是创造财富。我们需要的东西就是财富,食品、服装、住房、汽车、生活用品以及外出旅行等都是财富。财富才是你的目标,金钱只是专业化的副产品。大多数生意的目的是创造财富,做出人们真正需要的东西。作者认为实际上的财富总额不是固定不变的,金钱不是财富,只是用来转移财富所有权的东西。他举了一个例子,如果你新修一辆车,财富增加了,但是也没有使别人更贫穷。这里存在一个漏洞,就是你所创造东西一定就会被别人需要吗?假如一个人要了你的这个车,是不是就会导致别人新修的车没人要了?作者说创造别人需要的东西就是财富,前提是别人需要。
三十四、财富和公平
作者认为,在这个世界,你向下沉沦或者向上奋进都取决于你自己,不能把原因推给外界。一般人认为最富有的5%的人口占有全社会一半以上的财富,往往会认定这是不公平的。作者不以为然,因为他觉得5%的程序员写出了全世界99%的优秀软件。我承认,但是这世界上的财富不只有优秀的软件,还有那些不那么优秀的软件。而这些占据了世界上的大部分财富。作者认为财富分化是合理的,现代社会的收入差距扩大是一种健康的信号。不以为然,就比如大公司的财富大部分是这个公司的老板创造的,还是他们的员工呢?一个社会确实需要允许人致富,但是用什么样的分配制度也是一个问题,现在的分配制度是合理的吗?是拥有生产资料的老板分配的还不够,还是创造剩余价值的员工分配的还不够呢?我想,最初设计这个制度的人肯定不是一个员工。
三十五、工作的本质
几乎所有情况下,公司的存在目的就是满足人们的某种需要。即使不加入公司,你也能做到。公司不过是一群人在一起工作,共同做出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司。
三十六、致富的条件
大公司最大的困扰就是无法准确测量每个员工的贡献,销售员和高级管理除外。如果一家公司真正能够按照贡献付薪,它将取得巨大成功。许多雇员会更努力地工作。更重要的是,这样一家公司将吸引那些工作特别努力的人,从而超越竞争对手。
要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。小团队等于可测量性,公司越小,你就越能准确估计每个人的贡献。你最好找出色的人合作,因为他们的工作和你的一起平均计算。另一方面,高科技等于可放大性。如果你发现了一种做事的新方式,它的经济价值就取决于有多少人使用这种新方式,这就是可放大性。假定软件有两个候选的新功能,它们创造的商业价值完全相同,作者觉得选择较困难的那个功能。不是因为这个功能能带来更多的收入,而是因为它比较难。这类似于建立护城河,但是这么说不太严谨了,可能作者比较自信吧。
三十七、公司如何被收购?
大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。次强的动机则是让他们担心如果现在不收购你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成他们的一个竞争对手。
三十八、税收
在控制程度更高的社会,统治者和官僚阶层用税收代替直接充公。但是,根本的一点并没有变,那就是致富的方法不是创造财富,而是以统治者的强权进行搜刮掠夺。作者可能认为对国家的管理不是在创造财富,或者并不必要,不然为什么他觉得CEO是在创造财富且应该有高收入呢?
三十九、技术的贫富分化
首先,技术肯定加剧了有技术者与无技术者之间的生产效率差异,毕竟这就是技术进步的目的。但是作者似乎觉得贫富分化只是技术造成的,这也太片面了吧,我想,单纯技术造成的差距绝大部分的人都能接受,但是还有很多非技术外的因素。作者认为无法被技术变得更便宜的唯一东西,就是品牌。这正是为什么我们现在越来越多地听到品牌这个词。富人与穷人之间生活的鸿沟正在缩小,品牌是这种差距的遗留物。他还认为技术让普通人与富人的生活之间的差距变小了,这点赞同,不过反过来思考,是不是也正因为这个技术能让更多的普罗大众接受,才使得搞技术的人变富呢?作者认为今天的人们多多少少还是有一些互相隔离的趋势,但主要是因为教育层次的差别,而不是财富的差别。这里有点脱离现实了,可能作者只是看自己的圈层吧,作为科技致富者看待暴发户,但问题是他们都有很多的财富,财富差距悬殊之间的人呢?他们之间隔离只是因为教育吗?
四十、垃圾邮件的过滤
对于大多数用户来说,错过一封正常邮件的后果要比收到垃圾邮件严重得多。如果每个用户的过滤器大部分是基于独立的数据库,那么每个过滤器的过滤条件都不一样,而且会更加富有成效。作者提倡使用白名单,主要是为了减少计算,而不是认为这样可以改进过滤器的效果。作者使用了贝叶斯过滤,效果不错。
四十一、设计者的品味
如果你在当今社会提到“品味”,很多人会对你说“品味是主观的”。我们大多数人从孩提时代起就被鼓励不要去分析清楚自己的头脑。我曾经想过,艺术品真的有艺术性吗?说实话,我对大多数人口中说的有名的绘画作品都不感冒,比如我就没看出《蒙娜丽莎的微笑》和《向日葵》的价值。作者认为,“美”可能存在一种共识,如果你是一个设计师,并且你不承认有一种人们共同认可的东西叫作“美”,那么你就没有办法做好工作。
四十二、什么是好的设计?
好设计是简单的设计。在写作上,这种说法意味着只说必须要说的话,并且说得简短。
好设计是永不过时的设计。如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不是来自风潮的影响。
好设计是解决主要问题的设计。如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现而已。
好设计通常是有点趣味性的设计。有趣的设计不一定都是好的设计,但是很难想象完全无趣的设计会是好的设计。
好设计是艰苦的设计,如果你工作没有挑战性,你可能正在浪费时间。好设计是看似容易的设计。科学和工程学的一些最重大的发现在形式上往往很简单,会使得你觉得自己也想到过。可是,如果它真的那么简单,为什么发现的人不是你呢?
好设计是对称的设计。对称有两种:重复性对称和递归性对称。递归性对称就是指子元素的重复,比如树叶上叶脉的纹路。
好设计是模仿大自然的设计。不是说模仿大自然这种行为本身有多么好,而是说大自然在长期的演化中已经解决了很多设计问题。所以,如果你的设计与大自然很接近,那么它基本上不会很差。
好设计是一种再设计。扔掉早期原型是需要信心的,你必须有本事看出什么地方还可以改进。
好设计是能够复制的设计。等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。
好设计常常是奇特的设计。爱因斯坦并不想让相对论变得很奇特,他只想找出真理,是真理本身显得很奇特。最后发展出来的风格是自然而然形成的。
好设计是成批出现的。在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果。
好设计常常是大胆的设计。实际上,发现丑陋的东西要比你想象出一个优美的东西更容易。伟大成果的出现常常来源于某人看到一样东西后,心想我能做得比这更好。
做出优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。
四十三、编程语言的观点
如果想在软件行业获得成功,就要毫不犹豫地选择最强大的编程语言。一个操作所需的代码越多,就越难避免bug,也越难发现它们。而高级语言写出来的程序的长度只有机器语言的五分之一。所以,要是你犯错了,现在也更容易发现。普通的消费者也许不需要看到他们使用的文字处理器的源码,但是在非常强调软件可靠性的情况下,出于强烈的工程需求的考虑,会要求开放源码。如果你非常关注运行速度,那么最好使用接近机器的语言。
静态类型语言的拥护者认为这样可以防止bug,并且帮助编译器生成更快的代码。动态类型语言的拥护者认为静态类型对程序构成了限制。
事实上有两种程度的面向对象编程:某些语言允许你以这种风格编程,另一些语言则强迫你一定要这样编程。作者认为应该使用允许你面向对象编程的语言。至于你最后到底用不用则是另外一个问题了。
只要你懂得驾驭开源软件社区,就会有很多人在短期内为你提供大量的代码。有些编程语言的内核设计得并非很好,但是有着无数强大的函数库,可以用来解决特定的问题,所以这些库本身可能比核心的语言还要重要。
编程语言就像生物物种一样,存在一个进化的脉络,许许多多分支最终都会成为进化的死胡同。编程语言之所以可能出现聚合,一个原因是它的概率空间比较小,另一个原因是它的突变不是随机的。语言的设计者们总是有意识地借鉴其他语言的设计思想。编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。
任何一种编程语言都可以分成两大组成部分:基本运算符的集合(扮演公理的角色)以及除运算符以外的其他部分(原则上,这个部分可以用基本运算符表达出来)。慎重选择公理还不够,还必须控制它的规模。数学家总是觉得公理越少越好,冗余的代码会导致更多冗余的代码。
作者设想一百年后的编程语言,因为在之前的五十年中,编程语言的进化其实是非常缓慢的,因此展望一百年后的语言并不是虚无缥缈的想法。不过作者也认为,也许一百年后人类已经不编程了,或者直接告诉计算机想做什么,计算机就会自动完成。
作者认为一百年后的计算机的运行速度一定很快,那现在被认为运行速度慢(即运行效率不高)的语言将来会有更大的发展空间。就类似于神经网络由于算力的发展大放异彩一样。一些使用新语言开发的热门应用程序对硬件资源的浪费非常惊人,未来可能新增加的运算能力都会被糟蹋掉。
作者提出了一个观点:字符串或多或少可以理解成列表的一个子集,其中的每一个元素都是字符。那么,为什么还需要把字符串单列为一种数据类型呢?作者认为这种为了加快运行速度而使得编程语言的语义大大复杂的行为,很不可取。我觉得这样做对于编程人员来说也很方便,还是很可取的。
作者认为一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率很低。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。
设计新语言的方法之一就是直接写下你想写的程序,我们的思想可能往往会受限于某种现存的语言,只采用在这种语言看来更简单的形式。作者思考:(1)一百年后的编程语言在理论上今天就能设计出来;(2)如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的结果。结合起来,为什么不现在就动手尝试写出一百年后的编程语言呢?如果去掉一百年这个具体的数字,我们应该想想,为什么现在不去创造一个未来将会出现的东西呢?这就是发明的由来。当然要动手创造一种新语言,那是因为你觉得它在某些方面会优于现有的语言,就好像不要为了创业而创业一样。
有一句俗话说,如果你自己做不到,那就去当老师。这点和费曼学习法不谋而合,但是可能对设计编程语言来说不成立。老师做研究可能更关心一个问题写成论文后是不是看起来更高深,最极端的例子可能就是文学,文学研究者的任何成果几乎对文学创作者毫无影响。
梦寐以求的编程语言应该是什么样子?作者认为这种语言干净简练,具有最高层次的抽象和互动性,而且很容易装备,可以只用很少的代码就解决常见的问题。不管是什么程序,你真正要写的代码几乎都与你自己的特定设置有关,其他具有普遍性的问题都有现成的函数库可以调用。除了快速写出一个程序的原型,它还提供一个出色的性能分析器。除了一些绝对必要隐藏的东西,这种语言的所有细节对使用者都是透明的。它提供的抽象能力只是为了方便你的开发,而不是为了强迫你按照它的方式行事。你能够对它的任何部分加以改变,甚至包括它的语法。这种梦幻般的编程语言不仅开放源码,更开放自身的设计。
四十四、矛盾与统一
作者认为:经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。经理使用一种编程语言的原因是觉得所有的编程语言的功能都差不多,可以互相取代。所以就用大家都在用的那种语言好了。可能经理也希望使用一种很容易雇到程序员的语言。就像在大型组织内部,有一个专门的术语描述这种跟随大多数人的选择的做法,叫作“业界最佳实践”。作者认为这个可能是用来推卸责任的词。既然选择的是业界最佳实践,如果不成功,项目失败了,那么也无法指责我,因为做出选择的人是整个业界。虽然不是太赞同这一点,不过从这里确实可以看出作者思考问题的角度。
四十五、Lisp语言的特别之处
- 条件结构(即if-then-else结构)
- 函数也是一种数据类型
- 递归
- 变量的动态类型
- 垃圾回收机制
- 程序有表达式组成
- 符号类型
- 代码使用符号和常量组成的树形表示法
- 不区分读取期、编译器和运行期,可以在读取期编译或运行代码,也可以在编译期读取或运行代码,还可以在运行期读取或者编译代码。
四十六、流行
作者认为大多数人选择某一种编程语言,不是因为这种语言有什么独特的特点,而是因为听说其他人使用这种语言。那其他人使用这种语言的原因是什么呢?岂不是递归起来了。就好像作者说接受流行,不是因为想要与众不同,而是因为害怕与众不同。流行的起初是一群人为了与众不同,当流行之后另一群人又害怕与众不同了。流行本身会使编程语言更好,只有流行才会让它保持优秀。一个流行的编程语言必须要依附一个流行的系统。
四十七、时间沉淀
让别人相信一种新事物是需要时间的。有的人在他的客户第一次提出某种需求时,他很少理会,因为他知道人们有时候会想要自己并不真正需要的东西。为了避免浪费时间,只有当客户第三次或第四次提出同样的需求时,他才认真对待。大多数人接触新事物时会使用类似的过滤机制,甚至有时要听到别人提起十遍以上他们才会留意。这样做完全是合理的,因为大多数热门新商品事后被证明是浪费时间的噱头,没多久就消失得无影无踪。发明新事物的人必须有耐心,要长年累月不断地做市场推广,直到人们开始接受这种发明。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。前者是白手起家、自力更生的创业者,后者是有风险投资支持、在市场上大张旗鼓宣传的创业公司。
四十八、再设计
为了写出优秀软件,你必须同时具备两种互相冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。用户是一把双刃剑。他们推动产品的发展,但也使得你不敢对产品进行大规模改造。
四十九、创业公式
- 搭建原型
- 上线运营(别管 bug)
- 收集反馈
- 调整产品
- 成长壮大
但是我感觉这是常识吧。。。