软件随想录(by Joel Spolsky)
这周在地铁上读完了 Joel Spolsky 的《软件随想录》,译者是阮一峰。摘录或提炼一部分有趣的东西于此。
1991 年,Joel Spolsky 加入微软 Excel 开发小组,担任 Program manager。他当时需要为 Excel 的宏寻找一个解决方案(其实就是 basic 语言内嵌到 excel 中)。Joel 为这个功能编写了 500 页的规格说明书,并打印出来交给 Bill Gates 审查。令 Joel 惊叹的是,Bill 用一个晚上就看完了 500 页说明书,并写满了备注的问题,同时在审查会议上,提出了各种非常专业的技术问题。Joel 说,「你不能糊弄 bill,哪怕是一分钟,因为他也是一个程序员,一个真正的程序员」。
同所有行业的人才一样,优秀的程序员不会出现在招聘市场上。一个推论是,在人才市场上找工作的人,大部分是一些水平很差的人(真正牛逼的程序员不需要找工作,他们可以去任何他们想去的地方,而雇佣他们的人如果不是太蠢,也会想尽办法留住他们)。而想要得到那些真正的人才,除了自身牛逼之外,还有三个方法。第一,去牛逼大学里面找牛逼学生,给他最好的实习机会。第二,去优秀的技术社区找,尤其是那些极客扎堆的。第三,建立自己的社区以吸引人才。
好的管理不应该只是告诉别人做什么,也要告诉他为什么要这么做,以获得对方的认同。
Joel 说,「我从来没见过哪个能用 scheme 语言、haskell 语言和 c 中的指针写代码的人,不能在两天内学会 java」。常春藤院校只教 unix,函数式编程、状态机理论,而顺着学校排名往下看到一些比较差的学习,java 语言开始在课程中出现了。(lol)
在一个研究型大学里,系主任实际上是一种负担,没有人真的想干,大家都更愿意去做研究。硅谷式的管理风格正是这样。经理存在的唯一理由就是把家具的位置摆好,不要挡道。这样天才才能做出优秀的成功。
那些决定游戏规则的人都是善于写作的人,为什么 C 语言是最流行的语言,原因是创始人 Brain Kernighan 和 Dennis Ritchie 写出了一本伟大的书。(《The C Programming Language》确实是一本非常非常棒的书,我至少看了三遍)
最有权势和影响力的程序员正是那些表达能力强的程序员,无论书面还是口头,他们都能清晰、自如、有说服力地表达观点。
为了发现可以改进的地方,你必须有一个思维定势,始终用批判的眼光看世界。随便找一样东西,如果你看不出它的缺点,那么你的思维转型还没有成功。
眼睛的工作原理与内存访问的 page-fault 机制有类似之处。
「说实话,我觉得“杜绝信息孤岛”对“架构太空人”最有吸引力。那些人看到子类就会想到抽象的基类,他们喜欢把功能从子类移到基类中,但是又说不出实际好处,唯一理由就是这样符合软件架构上的美学」。
别给用户太多选择。太多选择实际上损害了我们内心的幸福感。(Barry Schwartz 《The Paradox of Choice: Why More is Less》)
如果一个程序具备非常重要的功能,而且用户真的非常需要这个功能,那么这个程序即使非常难用,也还是会大受欢迎。
避开攻击最好的方法,就是让攻击看上去好像成功了。也就是装死战术。
Jon Postel 提出的鲁棒性原则(robustness principle): 「对于己方行为要保守(conservative),对于塌方行为要宽容(liberal)」。(然后我还真找了一下,发现居然来自 TCP 协议的 RFC 中的 section 2.10,真是一个有趣的发现 https://tools.ietf.org/html/rfc793#section-2.10)
TCP implementations will follow a general principle of robustness: be conservative in what you do, be liberal in what you accept from others.
另一个小发现,Joel 的文章中提到了 Borg 是星际迷航中的一种生物。我想到 kubernetes 的原型项目也叫 borg (google 内部的集群管理软件),于是 wiki 上查了一下关于 Borg 这种科幻生物的信息:
博格人是严格奉行集体意识的种族,从生理上完全剥夺了个体的自由意识。博格人的社会系统由“博格集合体”组成,每个集合体中的个体成员被称为“Drone”。集合体内的博格个体通过某种复杂的子空间通信网络相互连接。在博格集合体中,博格个体没有自我意识,而是通过一个被称为博格女皇(Borg Queen)的程序对整个集合体进行控制。因此在战略上显示出高度的智慧与适应能力。博格女皇安装在一个独特的博格个体上,也是集合体内唯一一个与其他个体不同并拥有自我意识的个体。 博格人依然需要有机的生理结构来维持身体运作。因此摧毁一个博格人的有机结构也可以有效的将这个博格个体消灭。如果被消灭的个体是博格女皇,那么整个博格集合体都会因此而停止运作。不过如果这个博格集合体没有与其他的博格集合体失去联系,那么被摧毁的博格女皇程序依然会上传到其他博格集合体中,并不会因此被真正消灭。
Brooks’ Law: 向一个延误的软件项目增加人手,只会使它更加延误。
常常看到一种说法说,一个优秀的程序员顶十个普通程序员。这种说法是不准确的。因为再多普通程序员也写不出优秀程序员能写出的优秀代码。所以,如果你想做一个伟大的软件,不要在寻找人才上做任何妥协。(就好像你想组一个 NBA 球队,就不要去看那些高中校队球员的简历了,除非你遇到勒布朗。)
在软件中,对你最重要,最关键的部分,一定要用更原始的工具来开发。(不要轻易相信那些看起来星很多的项目)
丰田创始人 Sakichi Toyoda 提出的,遇到问题要问「五个为什么」。当某个地方出错了,你不要只是解决这个问题,而是要一遍一遍追问,直到找到根本性问题。
为什么我们的接口不工作了?
为什么我们花了这么长时间才判断出造成问题的原因?
为什么我们事先没有预知这个问题,也没能测出这个问题?
为什么我们没有在更早的时候写出文档?
为什么我们对文档的看法这么狭隘?我们应该更好地利用文档来避免这种事情发生。
「定制软件」是一个暗无天日的世界。先是客户提出他想要什么,你问他是否确定,他说是的。你就写了一份漂亮的软件规格说明,问他是不是他想要的,他回答是的。你要他在文件上签字并用命担保,他也签了。但是等你按照说明把软件做出来给他,他看到软件的时候却被吓坏了。事实上,你听命于大客户的实际效果,只是让销售人员指挥开发人员,达到他们个人销售佣金最大化的目标。
不要因为有些事不得不做,你就去做,不得不做不是一个足够好的理由。