《程序员修炼之道》读书笔记

《程序员修炼之道-从小工到专家》写的具有普遍意义的指导方法。很少有具体的开发讲解,更多的是告诉你,作为一个程序员,你应该具有哪些素质,以及怎么做。下面是我对书中印象比较深的一些记录。

关于心态

石头汤与煮青蛙

三个士兵从战场返回家乡,在路上饿了,他们看见前面有村庄,就来了精神(他们相信村民会给他们一顿饭吃)。但当他们到达那里,却发现门锁着,窗户也关着。经历了多年的战乱,村名们粮食匮乏,并把他们仅有的一点粮食藏了起来。

士兵们并没有气馁,他们煮开一锅水,小心地把三块石头放进去。吃惊的村民走出来望着他们。

“这是石头汤。”士兵们解释说。“就放这些吗?”村民们问。“一点也没错——但是有人说加一些胡萝卜味道更好…….” 一个村民跑开了,又很快带着他储藏的一篮胡萝卜跑回来。
几分钟后,村民们又问:“就这些了吗?”

“啊,”士兵们说:“几个土豆会让汤更实在。”又一个村民跑开了。

接下来的一小时,士兵们列举了更多让汤更鲜美的配料:牛肉,韭菜,盐,还有香菜。每一次都会有一个不同的村民跑回去搜寻自己的私人储藏品。

最后他们煮出了一大锅热气腾腾的汤。士兵们掉石头,和所有的村民一起享用了一顿美餐,这是几个月以来他们所有人第一次吃饱饭。

在石头汤的故事里有两层寓意。

士兵们戏弄了村民,他们利用村民的好奇,从他们那里弄到了食物。但更重要的是,士兵充当了催化剂,把村民团结起来,和他们一起做到了他们自己本来做不到的事情—— 一项协作的成果。最后每个人都是赢家。

另一方面,石头汤的故事也是关于温和渐进的欺骗的故事。它讲述的是过于集中的注意力。村民们想到了石头,却忘记了世界的其余部分。我们都是这样,每一天,事情都会悄悄爬到我们身上。

我们现在是程序员,那你的目标是什么呢?当然是软件的总设计师—— 项目经理。那又会有什么启示呢?你常常是否也可以效仿这些士兵,做一个聪明的项目经理呢?在有些情况下,你也许确切的知道需要做什么,以及怎样去做。整个项目就在你的眼前,完全在你的掌控之中—— 你知道它是对的。但随着项目的深入,问题的复杂化,你会遇到拖延和漠然。这时你将会怎么做呢?你可以把项目看成是石头,把我们的成员看成是村民,而把我们自己看成是士兵。因为每个人都会保卫他们自己的资源。这正是拿出石头的时候。设计出你可以合理请求的东西,好好的开发它。一旦完成就拿给大家看,让他们大吃一惊。然后说:“要是我们增加…….可能就会更好。”然后假装那并不重要。坐回椅子上,等他们开始增加你本来就想增加的功能。这时大家就会发现参与正在发生的成功更容易。让他们去创造未来,你就会让他们聚集在你的周围,最大化的发挥团队的作用。

再来看两个案例。

如果你抓一只青蛙放进沸水里,他会一下子跳出来。但是你把青蛙放进冷水里,然后慢慢加热,青蛙不会注意到温度的缓慢变化,会呆在锅里,直到被煮熟。

一扇破窗户,只要有那么一段时间不修理,就会渐渐给建筑物周围的居民带来一种废弃感。于是又一扇窗户破了,人们开始乱扔垃圾,出现了乱涂乱画,慢慢的更严重的结构破坏开始了。在相对较短的一段时间里,建筑就被损毁的超出了业主想象的程度,也超出了业主愿意修理的程度,而废弃感则变成了现实!

锅里的那只可怜的青蛙是谁?它没有注意到周围环境的渐变,最终被煮熟了。同样的事情也会发生在不警醒的人身上。在项目开发高涨的热度里,很难再用一只眼睛注意中周围的环境。这又引出了一个“破窗户”的理论。一扇破窗户,只要有那么一段时间不修理,就会渐渐给建筑物周围的居民带来一种废弃感。于是又一扇窗户破了,人们开始乱扔垃圾,出现了乱涂乱画,慢慢的更严重的结构破坏开始了。在相对较短的一段时间里,建筑就被损毁的超出了业主想象的程度,也超出了业主愿意修理的程度,而废弃感则变成了现实!那我们如何解决呢?很简单,当第一扇破窗户出现时就及时的修理。

当然我们也看到过这样的症状。项目慢慢的不可改变的完全失去控制。大多数的软件灾难都是从微不足道的小事情开始的,大多数项目的拖延也都是一天一天发生的。系统一个特性一个特性地偏离其规范,项目的目标也慢慢的偏离轨道,直到整个项目的失败。常常是小事情的积累破坏了士气和团队,因为众所周知的困难是不会导致失败的,只有那些微不足道的小事才会导致失败。这些小事并不会立即显现出来,它只会在积累到一定程度时才会爆发。

作为整体开发的团队更容易被煮熟。所以未来的项目经理们,我们要时刻,持续地检查范围的扩大,时间的减缩,新增特性,新环境 ——任何不在初期的约定中定义的东西。因为团队无需拒绝不在预计中的变化—— 只要你注意到它们正在发生。记住,当出现第一扇破窗户时就及时修理。否则,你就会置身于热水之中。

关于工具

文本编辑器

文本处理是每个程序员无法回避的问题。首先,要选择编辑器。一个好的编辑器应该具有以下的特性:

  • 可配置
  • 可扩展
  • 可编程

一旦你选择了一种编辑器,就彻底的了解它,并将其用于所有的编辑任务。如果你用一种编辑器进行所有的文本编辑活动,你就不必停下来思考怎样完成文本操纵。编辑器将成为你双手的延伸。
知道了这些应该怎么做?

如果你现在这样… 那么考虑…
我使用不同的编辑器,但只使用其基本特性。 选一种强大的编辑器,好好学习它。
我有最喜欢的编辑器,但不使用其全部特性。 学习它们。减少你需要敲击的键数
我有最喜欢的编辑器,只要可能就使用它。 设法扩展它,并将其用于比现在更多的任务。
我认为你们在胡说。notepad就是有史以来最好的编辑器 只要你愿意,并且生产率很高,那就这样吧!但如果你发现自己在羡慕别人的编辑器,你可能需要重新评估自己的位置啦。

推荐工具:Emacs,vi,CRiSP,Brief以及其他的跨平台软件。
珍惜生命,远离office哦。

源码控制

源码控制系统追踪你在源码和文档中的每一项变动。并且能在适当的时候进行undo操作。

把源码置于源码控制系统的保护之下具有一个很大,隐蔽的好处:可以进行自动的和可重复的产品持续集成构建。

关于编码

注重时效的程序员批判的思考所有代码,包括自己写的。要相信从来没有完美的软件。不能靠运气和偶然的成功,而要深思熟虑的编程。并且要考虑算法的效率。

适时的进行重构。Martin Fowler告诉我们如何进行利大于弊的重构。

  • 不要试图在重构的同时增加功能
  • 在开始重构之前,确保你拥有良好的测试。尽可能经常运行这些测试。这样,如果你的改动破坏了任何东西,你就能很快的知道。

重构需要良好的测试代码。测试代码的存在要求代码有很好的可测性。