熟知软件开发的人都知道这个行业里充满了一次次悲壮的失败,每一座成功项目的丰碑底下都埋葬着无数同类型的失败项目。大多数软件项目都像是一次典型的死亡行军。
在开拔前,项目经理向公司立下军令状,宣布自己打算用多少人员多少预算,在多少天内拿下客户方的全部需求。他坚信目前使用的开发模式完成这类作战任务,如同牛刀杀鸡,石头砸蛋。团队上下也自信满满,忘记了上一个项目带来的伤痛。
随着项目经理一声令下,程序员和其他项目组成员们一起抱着灭此朝食的决心,奋勇向前。第一波攻势异常凌厉,有效的甲乙方沟通、高效的团队合作、灵活健壮的系统架构以及高昂的战斗热情像四连杀一般轻松地把客户的前期需求分割包围、聚而歼之。团队士气从来没有这么高涨过,项目经理甚至偷偷地跟公司上层表示说"可以提前完成"。
可惜好景不长,坏消息终于还是传来了:"某某模块的代码效率欠高,在集成测试时,拖垮了整个工程。"怎么回事?是谁干的?怎么办?谁去援救?怎么补救?修改还是重写?会影响进度的吧?要告诉客户吗?……
所有相关问题瞬间堆满了桌面,程序员们面面相觑。有人建议说让他吃自己的狗食吧,随后有人反对说他那种水平吃下去的是狗食,挤出来的还是狗食;有人建议增派高手来,但马上又有人用《人月神话》里的名言反驳掉了;还有人说要么项目经理亲自上阵吧,急得项目经理直翻白眼,赶忙辩解说不写代码很多年了。大家吵吵嚷嚷,莫衷一是,最后还是一位资深程序员自告奋勇说"还是我加班来解决吧。"项目经理很高兴,又加了一句"我们不能辛苦一个好兄弟,大家一起加班吧,争取早日完成项目!"
加班是一种习惯,并会逐渐产生依赖。团队里的一些程序员开始像某种啮齿类动物一样爱上了昼伏夜出--白天上网聊天,晚上加班加点;而剩余一些人仍然维持着原来的生物钟,不合拍的气氛正在团队里四散弥漫。好在项目经理平时用聚餐的方式维系着兄弟情深,除了心里有点疙瘩外,也不太会计较半夜里接到同事的工作电话。
但是,从此坏消息成了常态,听到最多的是"用户的需求变了!"。拥抱变化?在书上看到过马丁叔叔讲拥抱变化,可大家都没实际地拥抱过,怎么办?只好用临时方案糊弄着过去了。《左传》曰:"一鼓作气,再而衰,三而竭。"现在整个团队就处于很"衰"的阶段。大家忘记了当初是如何快乐地为项目加班,也差点忘了自己是在开发什么软件,甚至还有几个人已经悄悄地退出这场战役,换上了懵懵懂懂的新兵蛋子。项目经理除了每天上班更早,下班更晚,坐在客户那里喝茶时间更多之外,也没什么良策应对。而公司上层看他们的眼神已经很不满了。没办法,硬着头皮干下去吧。
程序员们走在死亡行军的路上,个个精疲力竭,不知道什么时候能到达目的地,也许是明天,也许是明年。
《程序员必须知道的97件事》不属于《战场生存手册》系列,不能教你百分之百正确的东西,因为软件开发没有永恒的真理:有了"模式",还有"反模式";快速排序在小数据集上还不如冒泡排序;函数式编程在并行计算时代里又迎来了它的春天。但是,它们确实能提高在每一场项目恶战中的生存几率,这些共享的技巧、技能、知识和经验都是"运用之妙,存乎一心",需要你亲自在项目实践中去应用、去体会、去变通、去牢记。但是,一个人的时间毕竟有限,为了能学得更多,除了举一反三之外,更重要的是要能够从别人的经验教训中学习,达到事半功倍的效果。本书几十位作者给你提供了这样一个机会,他们现身说法,用实践经历来告诉你哪里会有陷阱,哪里会是弯路,如何做才能做得更好、更少犯错。
这份集体智慧的主题范围非常广泛,从分类目录中就能看出,它涵盖了用户需求、系统建构、代码风格、开发模式、开发实践、算法、编程思想、测试和程序语言文化等多方面的内容。老实说,这种水果拼盘式的内容组合不可能获得读者的全盘接受,但是,每位程序员,不管水平高低,不管来自哪个业务领域,都有可能从中读到自己感兴趣的内容,用批判的眼光加以取舍,必能弥补阙漏,有所裨益。而这正是本书编者和所有作者的本意。
本书由李军翻译,吕骏审校。在大约三个月的翻译过程中,得到了编辑徐定翔老师及刘唯一老师的莫大帮助,没有他们的支持,这本书可能仍然只在网上流传,无法让更多需要它的人读到,在此向他们表示深深的感谢。
本书的作者们善于旁征博引,所以,在翻译过程中,译者不得不四处寻找援手,在此要感谢于阳、李侠他们的专业知识,还要特别感谢柴杭飞小姐自始至终不厌其烦的支持。
由于本人学识有限,译文里总会有未尽"信、达、雅"之处,还请各位读者不吝赐教。
李军
2010年8月
浙公网安备 33010602011771号