《程序员修炼之道》——第一章 注重实效的哲学
注重实效的程序员的特征是什么?我们觉得是他们处理问题、寻求解决方案时的态度、风格、哲学。他们能够越出直接问题去思考,总是设法把问题放在更大的语境中,总是设法注意更大的图景。毕竟,没有这样的更大的语境,你又怎能注重实效?你又怎能做出明智的妥协和有见识的决策?
注重实效的程序员有这样几个特征:
(1)负责。(“我的源码让猫吃了”,“软件的熵”)。
(2)不断接受变化
(3)谨慎的权衡各种利弊。
(4)不断学习。
(5)多交流。
一、 我的源码让猫吃了(负责)
1. 在所有的弱点中,最大的弱点就是害怕暴露弱点。——J.B Bossuet, Politics from Holy Writ, 1709
2. (1)充分分析每项任务的风险,不能做到的事情不负责。一旦接受任务,就要负责到底。对可能存在的风险,要有相应的预案。比如代码丢失就完全属于自己的错误。
(2)错误总会发生,不要害怕自己的无知,要勇于承认自己的错误。当犯错时,不要责备别人或拼凑借口,不要把问题归咎于编程语言、管理部门、或是你的同事。应该冷静思考各种解决方案。
(3)不要着急寻求帮助,在告诉别人坏消息之前,应该自己思考还有没有试过其他的解决方案。实在无法解决时,再求助他人。
(4)不要说事情做不到,要能说明能够做什么来挽回局面。不要害怕提出要求,也不要害怕承认你需要帮助。
二、软件的熵(负责)
1. 不要留着破窗户,(低劣的设计、错误决策、或是糟糕的代码)不修。发现一个就修一个。如果没有足够的时间进行适当的修理,就用木板把它钉起来。或是你可以把问题的代码放入注释(comment out),或是显示“未实现”消息,或是用虚设的数据(dummy data)加以替代。采取某种行动防止进一步的损坏,并说明情势处在你的控制之下。
这的确是一个极端的事例,但我们必须以这样的方式对待软件。一扇破窗户—–一段设计低劣的代码、团队必须在整个项目开发过程中加以忍受的一项糟糕的管理决策——就足以使项目开始衰败。如果你发现自己在有好些破窗户的项目里工作,会很容易产生这样的想法:“这些代码的其余部分也是垃圾,我只要照着做就行了。”项目在这之前是否一直很好,并没什么关系。在最初得出“破窗户理论”的一项试验中,一辆废弃的轿车放了一个星期,无人理睬。而一旦有一扇破窗户被打破,数小时之内车上的设备就被抢夺一空,车也被翻了个底朝天。
按照同样的道理,如果你发现你所在的团队和项目的代码十分漂亮——编写整洁、设计良好,并且很优雅——你就很可能会格外注意不去把它弄脏,就和那些消防员一样。即使有人在咆哮(最后期限、发布日期、会展演示,等等)你也不会想成为第一个弄脏东西的人。
三、石头汤与煮青蛙(勇于接受变化)
在有些情况下,你也许确切地地知道需要做什么,以及怎样去做。整个系统就在你的眼前——你知道他是对的。但请求许可去处理整个事情,你会遇到拖延和漠然。大家要设立委员会,预算需要批准,事情会变得复杂化。每个人都会护卫他们自己的资源。有时候,这叫做“启动杂役”(start-up fatigue)。
这正是拿出石头的时候。设计出你可以合理要求的东西,好好开发它。一旦完成,就拿给大家看,让他们大吃一惊。然后说:“要是我们增加….可能会更好。”假装那并不重要。做回椅子上,等着他们开始要你增加你本来就想要的功能。人们发现,参与正在发生变化的成功要更容易。让他们瞥见未来,你就能让他们聚集在你周围。
四、足够好的软件(软件质量的权衡)
欲求更好,常把事情变糟。——李尔王 1.4
不要过度追求完美,要编写足够好的软件——对你的用户、对未来的维护者、对你自己内心的安宁来说足够好。你会发现,你变得更多产,而你的用户也会变得更加高兴。你也许还会发现,因为“孵化期”更短,你的程序实际上更好了。
短语“足够好”并非意味着不整洁或制作糟糕的代码。所有系统都必须满足其用户的需求,才能取得成功。我们只是在宣扬,应该给用户以机会,让他们参与决定你所制作的东西何时已足够好。
让你的用户参与权衡,你所制作的系统的范围和质量应该作为系统需求的一部分规定下来。
不要因为过度修饰和过于求精而损毁完好的程序。继续前进,让你的代码凭着自己的质量站立一会儿。它也许并不完美,但不用担心:它不可能完美。
五、你的知识资产(不断学习)
知识上的投资总能得到最好的回报。——本杰明·富兰克林
你的知识和经验是你最重要的职业财富。遗憾的是,它们是有实效的资产(expiring asset)。随着新技术、语言环境的出现,你的知识会变的过时。不断变化的市场驱动力也会使你的经验变得陈旧或无关紧要。考虑到“网年”飞逝的速度,这样的事情可能会非常快地发生。
随着你的知识的价值降低,对你的公司或客户来说,你的价值也在降低。
你的知识资产
我们喜欢把程序员所知道的关于计算技术和他们所工作的应用领域的全部事实、以及他们的所有经验视为他们的知识资产(Knowledge Portfolios)。管理知识资产与管理金融资产非常相似:
1. 严肃的投资者定期投资——作为习惯。
2. 多元化是长期投资的关键。
3. 聪明的投资者在保守的投资和高风险的、高回报的投资之间平衡他们的资产。
4. 投资者设法低买高卖,以获取最大回报。
5. 应周期性地重新评估和平衡资产。
要在职业生涯中获得成功,你必须运用同样的指导方针管理你的知识资产。
经营你的资产
- 定期投资。就像金融投资一样,你必须定期为你的知识资产投资。即使投资量很小,习惯自身也和总量一样重要。
- 多元化。你知道的不同的事情越多,你就越有价值。作为底线,你需要知道你目前所有的特定技术的各种特性。但不要就此止步。计算技术的面貌变化很快——今天的热门技术明天就可能变得近乎无用(或至少是不再抢手)。你掌握的技术越多,你就越能更好地进行调整,赶上变化。
- 管理风险。从高风险、可能有高回报,到低风险、低回报,技术存在于这样一条谱带上。把你所有的金钱都投入可能突然崩盘的高风险股票并不是一个好主意;你也不用太保守,错过可能的机会。不要把你所有的技术鸡蛋放在一个篮子里。
- 低买高卖。在新兴的技术流行之前学习它就和找到被低估的股票一样困难,但所得到就和那样的股票带来的收益一样。在Java刚出现时学习它可能有风险,但对于现在已步入该领域的顶尖行列的早期采用者,这样做得到了非常大的回报。
- 重新评估和平衡。这是一个非常动荡的行业。你上个月开始研究的热门技术现在也许已像石头一样冰冷。也许你需要重温你有一阵子没有使用的数据库技术。又或者,如果你之前试用过另一种语言,你就会有可能获得那个职位。
目标
关于何时以及增加什么到你的知识资产中,现在你已经拥有了一些指导方针,那么什么事获得智力资本、从而为你的资产提供资金的最佳方式呢?这里有一些建议。
- 每年至少学习一种新语言。不同语言以不同方式解决相同的问题。通过学习若干不同的方法,可以帮助你拓宽你的思路,并避免墨守成规。
- 每季度阅读一本技术书籍。书店里摆满了许多书籍,讨论与你当前的项目有关的有趣话题。一旦你养成习惯,就每个月读一本书。在你掌握了你正在使用的技术之后,拓宽范围,阅读一些与你的项目无关的书籍。
- 也要阅读非技术书籍。记住计算机是由人——你在设法满足其需要的人——使用的,这十分重要。不要忘了等式中人这一边。
- 上课。在本地的学院或大学、或是将要来临的下一次会展上寻找有趣的课程。
- 参加本地用户组织。不要只是去听讲座,而要主动参与。与世隔绝对你的职业生涯来说可能是致命的;打听一下你们公司以外的人都在做什么。
- 实验不同的环境。如果你只在Windows上工作,就在家玩一玩Unix(可以自由获取的Linux更好)。如果你只用过makefile和编辑器,就试一试IDE,反之亦然。
- 跟上潮流。订阅商务杂志和其他期刊。选择所涵盖的书与你当前的项目不用的刊物。
- 上网。想要了解某种新语言或其他技术的各种特性?要了解其他人的相关经验,了解他们所使用的特定行话,等等,新闻组是一种很好的方式。上网冲浪,查找论文、商业站点,以及其他任何你可以找到的信息来源。
持续投入十分重要。一旦你熟悉了某种新语言或新技术,继续前进。学习另一种。
是否在某个项目中使用这些技术,或者是否把它们放入你的简历,这并不重要。学习的过程将扩展你的思维,使你向着新的可能性和新的做事方式拓展。思想的“异花授粉” (cross-pollination)将十分重要;设法把你学到的东西应用到你当前的项目中。即使你的项目没有使用该技术,你或许也能借鉴一些想法。例如,了解面向对象,你就会用不同的方式写纯C程序。
学习的机会
于是你狼吞虎咽的阅读,在你的领域,你站在了所有突破性进展的前沿(这并不是容易的事情)。有人想你请教一个问题,答案是什么?你连最起码的想法都没有。你坦白承认了这一点。
不要就此止步,把找到答案视为对你个人的挑战。去请教古鲁。上网搜索。去图书馆。
如果你自己找不到答案,就去找出能找到答案的人。不要把问题搁在那里。与他人交谈可以帮助你建立人际网络,而因为在这个过程中找到了其他不相关问题的解决方案,你也许还会让自己大吃一惊。就有的资产在不断的增长。
所有的阅读和研究都需要时间,而时间已经很短缺。所以你需要预先规划。让自己在空闲的片刻时间里总有时间可读。花在等医生上的时间是抓紧阅读的好机会——但一定要带上你自己的杂志,否则,你也许会发现自己在翻阅1973年的一篇卷角的关于巴布亚新几内亚的文章。
批判的思考
最后一个要点是,批判地思考你读到的和听到的。你需要确保你的资产中的知识是准确的,并且没有受到供应商或媒体炒作的影响。警惕声称他们的信条提供了唯一答案的狂热者——那或许适用、或许不适用于你和你的项目。
不要低估商业主义的力量。Web搜索引擎把某个页面列到最前面,并不意味着那就是最佳选择;内容供应商可以付钱让自己排在前面。书店的显著位置展示某一本书,也并不意味着那就是一本好书,甚至也不说明那是一本受欢迎的书;它们可能是付了钱才放在那里的。
批判地分析你读到的和听到的。
和古鲁打交道的礼节和教养
随着Internet在全球普及,古鲁们突然变得像你的Enter键一样贴近。那么,你怎样才能找到一个古鲁,怎样才能找一个古鲁和你交谈呢?
- 确切地知道你想要什么,并尽量明确具体。
- 小心而得体地组织你的问题。记住你是在请求帮助;不要显得好像是在要求对方回答。
- 组织好问题之后,停下来,再找找答案。选出一些关键字,搜索Web。查找适当的FAQ
- 决定你是想公开提问还是私下提问。
- 坐回椅子上,耐心等候。人们很忙,也许需要几天才能得到明确的答案。
- 最后,请一定要感谢任何回应你的人。如果你看到有人提出你能够解答的问题,尽你的一份力,参与解答。
六、交流
我相信,被打量比被忽略要好。——Mae West, Belle of the Nineties, 1934
也许我们可以从West女士那里学到一点什么。问题不只是你有什么,还要看你怎样包装它。除非你能够与他人交流,否则就算你有最好的主意、最漂亮的代码、或是最注重实效的想法,最终也会毫无结果。没有有效的交流,一个好想法就只是一个无人关心的孤儿。
最为开发者,我们必须在许多层面上进行交流。我们把许多小时花在开会、倾听和交流上。我们与最终用户一起工作,设法了解他们的需要。我们编写代码,与机器交流我们的意图;把我们的想法变成文档,留给以后的开发者。我们撰写提案和备忘录,用以申请资源并证明其正当性、报告我们的状态以及提出各种新方法。我们每天在团队中工作,宣扬我们的主意、修正现有的做法、并提出新的做法。我们的时间有很大一部分都花在交流上,我们需要把它做好。
我们汇总了我们觉得有用的一些想法。
知道你要说什么
在工作中使用的更为正式的交流方式中,最困难的部分也许是确切地弄清楚你想要什么。小说家在开始写作之前,会详细地构思情节,而撰写技术文档的人却常常乐于做到键盘前,键入“1. 介绍···”,并开始敲入接下来在他们的头脑里冒出来的任何东西。
规划你想要说的东西。写出大纲。然后问你自己:”这是否讲清了我要说的所有内容?“提炼它,直到确实如此为止。
这个方法不只适用于撰写文档。当你面临重要会议、或是与重要客户通电话时,简略几下你想要交流的想法,并准备几种把它们讲清楚的策略。
了解你的听众
只有你是在传达信息时,你才是在交流。为此,你需要了解你的听众的需要、兴趣、能力。我们都曾出席过这样的会议:一个做开发的滑稽人物在发表长篇独白,讲述某种神秘技术的各种优点,把市场部副总裁弄得目光呆滞。这不是交流,而只是空谈,让人厌烦的(annoying)空谈。
要在你脑海里形成一幅明确的关于你的听众的画面。下面几条建议可能会对你有帮助。
1. 你想让他们学到什么? What do you want them to learn?
2. 他们对你讲的什么感兴趣? What is their interest in what you\’ve got to say?
3. 他们有多富有经验? How sophisticated are they?
4. 他们想要多少细节? How much detail do they want?
5. 你想要让谁拥有这些信息? Whom do you want to own the information?
6. 你如何促使他们听你说话? How can you motivate them to listen to you?
假设你想提议开发一个基于Web的系统,用于让你们的最终用户提交bug报告。取决于听众的不同,你可以用不同的方式介绍这个系统。如果可以不用在电话上等候,每天24小时提交bug报告,最终用户将会很高兴。你们的市场部门可以利用这一事实促销。支持部门的经理会以为两个原因而高兴:所需员工更少,问题报告得以自动化。最后,开发者会因为能获得基于Web的客户-服务器技术和新数据库引擎方面的经验而感到享受。通过针对不同的人进行适当的修正,你将让他们都为你的项目感到兴奋。
选择时机
这是星期五的下午六点,审计人员刚进驻已有一周。你的老板最小的孩子在医院里,外面下着滂沱大雨,这时开车回家肯定是一场噩梦。这大概不是向她提出PC内存升级的好时候。
为了了解你的听众需要听到什么,你需要清除他们的“轻重缓急”是什么。找到一个刚刚因为丢失源码而遭到老板批评的经理,向她介绍你关于源码仓库的构想,你将会拥有一个更容易接纳的倾听者。要让你所说的适得其时,再内容上切实相关。有时候,只要简单地问一句”现在我们可以谈谈吗?”就可以了。
选择风格
调整你的交流风格,让其适应你的听众。有人的是正式的”事实“简报。另一些人喜欢在进入正题之前高谈阔论一番。如果是书面文档,则有人喜欢一大摞报告,而另一些人却喜欢简单的备忘录或电子邮件。如果有疑问,就询问对方。
但是,要记住,你也是交流事务的一方。如果有人说,他们需要你用一段话进行描述,而你觉得不用若干页纸就无法做到,如实告诉他们。记住,这样的反馈也是交流的一种形式。
让文档美观
你的想法很重要。它们应该以美观的方式传递给你的听众。
太多程序员(和他们的经理)在制作书面文档时只关心内容。我们认为这是一个错误。任何一个厨师都会告诉你,你可以在厨房里忙碌几个小时,最后却因为饭菜糟糕的外观而毁掉你的努力。
在今天,已经没有任何借口制作出外观糟糕的打印文档。现代的字处理器(以及Latex和troff这样的排版系统)能够生成非常好的输出。你只需要学习一些基本的命令。如果你的字处理器支持样式表,就加以利用。学习如何设置页眉和页脚。查看你的软件包中包含的样本文档,以对样式和板式有所了解。检查拼写,先自动,再手工。毕竟,有些拼写错误是检查器找不出来的。
让听众参与
我们常常发现,与制作文档的过程相比,我们制作出的文档最后并没有那么重要。如果可能,让你的读者参与文档的早期草稿制作。获取他们的反馈,并汲取他们的智慧。你将建立良好的工作关系,并很可能在此过程中制作出更好的文档。
做倾听者
如果你想要大家听你说话,你必须使用一种方法:听他们说话。即使你掌握着全部信息,既使那是一个正式会议,你站在20个衣着正式的人面前——如果你不听他们说话,他们也不会听你说话。
鼓励大家通过提问来交谈,或是让他们总结你告诉他们的东西。把会议变成对话,你将能更有效地阐明你的观点。谁知道呢,你也许还能学到点什么。
回复他人
如果你向别人提问,他们不做出回应,你会觉得他们不礼貌。但当别人给你发送电子邮件或备忘录、请你提供信息,或是采取某种行动时,你是否经常忘记回复?在匆忙的日常生活中,很容易忘记事情。你应该总是对电子邮件和语音邮件做出回应,即使内容只是“我稍后回复你。”随时通知别人,会让他们更容易原谅你偶然的疏忽,并让他们觉得你没有忘记他们。
你说什么和你怎样说同样重要。
电子邮件交流
我们所说的关于书面交流的所有东西都同样适用于电子邮件。现在的电子邮件已经发展成为公司内部和公司之间进行交流的主要手段。它被用于讨论合约、调解争端,以及用作法庭证据。但因为某种原因,许多从不会发出低劣的书面文档的人却乐于往全世界乱扔外观糟糕的电子邮件。
我们关于电子邮件的提示很简单:、
- 在你按下SEND之前进行校对。
- 检查拼写。
- 让格式保持简单。有人使用均衡字体阅读电子邮件,所以你辛苦制作的ASCII艺术图形在他们看来将像是母鸡的脚印一样乱七八糟。
- 只在你知道对方能够阅读rich-text或HTML格式的邮件的情况下使用这些格式。纯文本是通用的。
- 设法让引文减至最少。没有人喜欢收到一封回邮,其中有100行是他原来的电子邮件,只在最后新添了三个字:“我同意”。
- 如果你引用别人的电子邮件,一定要注明出处。并在正文中进行引用(而不是当做附件)。
- 不要用言语攻击别人,除非你想让别人也攻击你,并老是纠缠你。
- 在发送之前检查你的收件人名单。最近《华尔街日报》上有一篇文章报道说,有一个雇员通过部门的电子邮件散布对老板的不满,却没有意识到老板也在收件人名单里
- 将你的电子邮件——你收到的重要文件和你发送的邮件——加以组织并归档。
总结
- 知道你想要说什么
- 了解你的听众
- 选择时机
- 选择风格
- 让文档美观
- 让听众参与
- 做倾听者
- 回复他人