reading-notes

张俊的读书笔记

View project on GitHub

cover

作者:  [美] Joel Spolsky 
出版社: 人民邮电出版社
副标题: 程序员部落酋长Joel谈软件
原作名: More Joel on Software
译者: 阮一峰 
出版年: 2009
页数: 292
定价: 49.00元
装帧: 平
丛书: 图灵程序设计丛书
ISBN: 9787115216342

豆瓣链接

2 寻找优秀的程序员

我能得到他们吗?有3个实现这个目标的基本方法:

  1. 走出去(参加技术会议)
  2. 实习生
  3. 建立自己的社区

3 寻找优秀的程序员之实战指南

有两件事情是确凿无疑的:

  1. 私人办公室意味着更高的地位;
  2. 小隔间和其他共享的空间会带来某些尴尬和不便。

正是因为存在这样两个事实,所以基本判断是:如果提供私人办公室,程序员就有更大的可能接受你的工作邀请。如果这间办公室有一扇可以关上的门,有一扇窗,有良好的视野,就更好。

至少两块大(21’‘)液晶屏幕,自由地在Amazon.com上订购任何他们想要的技术书籍。

如果你不尊重程序员,你就不会得到优秀的程序员。

让程序员干有趣的活是吸引优秀程序员的最好方法之一。许多程序员也会关注他们服务的公司的社会价值。大多数程序员很高兴有机会使用令人激动的新技术。

他们要的是工作所能带给他们的意义。思考你的公司代表了怎样的追求,这种追求是怎样形成的,又是怎样才能被别人感受到。管理好你的公司的品牌不仅对营销很重要,对招聘新人也同样重要。

他们实际不在乎钱,除非你在其他事情上搞砸了。

4 三种管理方法

  1. 军事化管理法
  2. 经济利益驱动法
  3. 认同法

5 军事化管理法

用这种方法管理高科技团队,有3个缺点。

  1. 人们并不喜欢被这样管,尤其是那些对智商很自负的程序员。
  2. 在操作层面上,没有足够的时间用在微观管理上,原因很简单,因为经理的人数不够。军队的通常情况就是每个人都在做同一件事。在软件开发团队中,每个人干的活都不一样。
  3. 在高科技公司中,负责干活的人总是比“领导者”有更多的信息,所以他们其实是做决策的最佳人选。

6 经济利益驱动法

这种方法的一个最重大的问题是,它将内部激励变为了外部激励。内部激励是指你内心想将事情做好的天然愿望。外部激励是指来自外界的激励,有人付钱让你干某事就是外部激励。

内部激励比外部激励强得多。人们会为那些他们真正想做的事格外努力地工作。“过度合理化效应”:“我要写出没有bug的代码,因为我喜欢钱,我想要奖金。”当你停止支付奖金或者他们变得不太在乎钱时,他们就不再关心自己写出的代码是否没有bug了。

另一个重大问题是,人们有追求局部利益最大化的倾向。他们会想出办法将你支付给他们的报酬尽量最大化,但是实际上却没有达到你真正想要的结果。如果你使用经济利益驱动法,你就是在鼓励程序员与制度博弈。

你的目的是让程序员写出可靠的代码,但是你不是去训练他们,而是付钱让他们自己想办法完成,你逃避了自己的责任。作为一个经理,设计一个有效的系统是你的职责。这就是你拿到高薪的原因。

7 认同法

这种管理法的目标是使得人们认同你希望达到的目标。

9 在耶鲁大学的演讲

老式的微软公司测试员要做很多事情,包括检查字体是否协调和清晰,检查对话框中控制按钮的位置是否合理和对齐,检查用户操作时屏幕是否闪烁,观察用户界面的流程,考虑软件是否容易上手,判断用词是否合适,评估软件的表现,检查所有错误信息的拼写和语法。他们花费大量时间确保软件的不同组成部分中用户界面都保持一致,因为协调的用户界面会让用户更容易上手。

所有这些事情,没有一件可以用程序自动完成。微软公司向自动测试靠拢的政策导致的后果之一就是,Window Vista发布出来的时候,这个产品是极端不协调的,很多细节处都没有处理好。

13 大构想的陷阱

Chandler的原始设想基本上就是要开发一个“革命性”软件。……唯一比较具体的开发设想是“点对点”、“杜绝信息孤岛”和“日期的自然语言解释”。

为什么你要买微软公司的Exchange Server来进行客户端日程的同步呢?“点对点”同步就行了。但是,结果却是“点对点”太难实现,或者还有其他原因,最后这个功能就被砍掉了。

“杜绝信息孤岛”的意思是,在其他软件中,你的电子邮件以一种形式管理,你的日程表以另一种形式管理,你的备忘录则是第三种形式管理。但是在Chandler中不是这样,只有一种统一的形式,所有数据都用这种形式管理。……如果你将电子邮件和日程表放在一起,那应该怎么放?假定星期五我收到了200封广告邮件,请问怎么才能不让它们掩盖当天有一个非常重要的股东大会的安排呢?

“杜绝信息孤岛”这个想法被设计者改成了“邮票”。你能为任何文档、备忘录和日程表贴上“邮票”,这样你就能把它们以电子邮件的形式发送给任何人。这个想法大概10年前就在微软的Office软件中实现了。最后,微软公司在Office 2007中去掉了这个功能,因为根本没人用。用电子邮件给别人发东西,世界上有很多方法可以很容易地实现,犯不着这么麻烦。

“杜绝信息孤岛”对架构太空人具有吸引力。那些人看到子类,就会想到抽象的基类,他们喜欢把功能从子类移到基类中,但是又说不出实际的好处,唯一的理由就是这样符合软件架构上的美学。……如果你想尝试将两个在真实世界中差别极大的对象(电子邮件和日程安排)合并在同一种用户界面中,那么你的软件的可用性将一塌糊涂,因为软件中的数据关系在真实世界中根本不适用。

18 为什么Microsoft Office文件格式如此复杂(以及一些对策)

首先,你要理解,二进制文件格式的设计目的完全不同于非二进制文件格式。为了能够在很老式的计算机上快速打开文件,二进制文件格式才被设计出来。

  • 因为文件格式是二进制的,所以读取一个记录往往就是单纯地从磁盘向内存复制一些字节而已,你直接就得到了一个C语言下的数据结构。
  • 这些文件格式中还有一些特别的设计,在必要的时候,可以使常见操作的速度变得更快。

这些设计没有考虑到数据的可交换性。设计者假定Word文件格式只能被Word读写。这些设计格式能够反映应用程序所包含的所有复杂性。每一个复选框,每一个格式选项,Microsoft Office的每一种功能,都必须在文件格式中有反映。这些设计必须能够反映应用程序的历史。在这些Office文件格式中,大量的复杂之处反映了许多过时的、难懂的、不受欢迎的、少有人使用的功能。为了同以前版本兼容,它们依然被保留在文件格式中。

用一种更简单的格式生成文件。如果你只是想利用程序生成Office文档。几乎一定可以找到比Office二进制格式更好的格式,它能够被Word和Excel顺利打开,不会出任何差错。

不管你要解决的到底是什么问题,最浪费人力的方法可能就是直接读取或生成Office二进制格式了。只有一种例外,那就是你确实要写出自己的软件,它能与Office竞争,能够完美地读取和生成所有的Office文件。

19 要挣钱,就别怕脏

目前,许许多多样子可爱的创业公司都有一个共同点,那就是他们所有的产品就是一个小小的站点,背后的技术就是一些ruby-on-rails和ajax,不解决任何“麻烦事”,而且别人很容易做出复制品。这类公司中相当一部分,给人的感觉就是不实在和空洞,因为他们没有解决实际中迫切需要解决的任何困难问题。只有等到他们解决了困难问题,他们对用户才是有用的。用户只向解决困难问题的公司付钱。

21 关于战略问题的通信之六

第一条路是往软件中加入更多的功能,比如文字处理功能。这就是Symphony这个产品的由来。第二条看上去很显然的路是做一个3D电子表格软件,这就是后来Lotus 1-2-3的3.0版本。

一个大麻烦:在古老的DOS环境中,内存占用不得超过640KB。花了18个月才将Lotus 1-2-3的新版本塞进了640KB的内存。他们不得不放弃了3D功能,因为内存不够了。Symphony的遭遇也差不多,许多功能都被砍得干干净净。

当Lotus 1-2-3的3.0版本上市的时候,每个人家中都已经有了一台80386芯片的电脑,配备了2MB或者4MB的内存。

一些像微软这样的公司开始注意到摩尔定律。它们认识到,不必太在意软件的效率问题和内存占用……只要把很酷的功能做出来,然后等着硬件升级就可以了。

眼下的许多ajax应用程序有一百万行甚至更多的客户端代码。现在的瓶颈已经从内存和CPU,转移到了带宽和编译时间。你必须想尽办法进行优化,这才能使复杂的ajax程序有良好的表现。

历史正在重演。带宽正在变得越来越便宜,即使这样,还是有人在考虑如何对Javascript进行预编译。

C语言的原始设计目标就是为了让编写跨平台的应用程序变得更容易。后来又出现了Java,它的通用性甚至超过C语言。在跨平台这出连续剧中,正出现有一个高潮。客户端JavaScript的兼容性问题——在Firefox、IE6、IE7、Safari和Opera上一一测试。

使用p-code虚拟机或者Java虚拟机模型,你在底层系统之上建立一个小小的沙箱,再将软件的运行建立在沙箱之上。沙箱有很多缺陷,它们非常慢而且错误百出,这就是Java applet都死光光的原因。你得到的运行速度只有底层系统的1/10.

获胜的一方所采取的策略正是贝尔实验室在1978年做出的决定,那里的科学家决定开发一种跨平台的、高效的编程语言,这就是后来的C语言。这种语言可以将程序编译成不同平台、不同系统可以理解的“本地”码。

25 Mirco-ISV:From Vision to Reality的前言

  1. 如果你说不清楚你的软件解决了什么棘手的问题,就不要去开软件公司。你要问自己,它解决了什么问题?谁需要这个软件?为什么它能解决这个问题?为什么客户愿意付钱让这个问题得到解决?
  2. 不要独自一人开办公司。我知道很多人单枪匹马创业成功,但是失败的例子更多。如果你无法说服任何一个你的朋友,他们都不觉得你的注意是可行的,那么也许它就是不行的。除此之外,一个人创业还十分孤独和压抑,没有任何人与你交流思想,为你出谋划策。
  3. 一开始不要抱太高期望。当产品上市的第一个月,没有人知道未来会赚多少钱。

26 飙高音

最好的工作条件-》最好的程序员—》最好的软件-》利润!

27 仿生学办公室

  1. 个人办公室,带有可以关上的门,这是绝对必需的,不能协商。
  2. 程序员需要许多电源接口。
  3. 我们需要可以方便地转接各种数据线。
  4. 办公室可以用来“结对编程”。
  5. 整天对着一台显示器工作就需要通过注视远方,使眼睛得到休息,所以显示器不应该靠着一整堵墙摆放。
  6. 办公室应该是个窝,一个能够很愉快度过时间的地方。

29 简化性

简化性的拥护者会举出37signals和苹果公司iPod播放器作为津津乐道的证据,证明简化的产品十分畅销。我会争辩说,在这两个例子中,商业成功来自于许多因素的共同作用,比如培养追随者、传播理念、简洁明快的设计、感情上的诉求、美学成就、很快的反应时间、及时的用户反馈、与用户行为相对应的程序模型、整体上高度的易用性、让用户感到控制权都在自己手中等。所有这些因素都是用户非常喜欢、愿意为之付钱的优点,从这个角度看,它们都可以被视作产品的某种“功能”。但是,它们中没有一种可以被看作是“简化性”的表现。