硕大的汤姆

硕大的汤姆

The official website of Minhua Chen

11 Jan 2020

软件随想录(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 提出的,遇到问题要问「五个为什么」。当某个地方出错了,你不要只是解决这个问题,而是要一遍一遍追问,直到找到根本性问题。

为什么我们的接口不工作了?
为什么我们花了这么长时间才判断出造成问题的原因?
为什么我们事先没有预知这个问题,也没能测出这个问题?
为什么我们没有在更早的时候写出文档?
为什么我们对文档的看法这么狭隘?我们应该更好地利用文档来避免这种事情发生。
  • 「定制软件」是一个暗无天日的世界。先是客户提出他想要什么,你问他是否确定,他说是的。你就写了一份漂亮的软件规格说明,问他是不是他想要的,他回答是的。你要他在文件上签字并用命担保,他也签了。但是等你按照说明把软件做出来给他,他看到软件的时候却被吓坏了。事实上,你听命于大客户的实际效果,只是让销售人员指挥开发人员,达到他们个人销售佣金最大化的目标。

  • 不要因为有些事不得不做,你就去做,不得不做不是一个足够好的理由。