你从没想过要当一名开发经理。和我认识的大多数软件开发者一样,如果能一直坐在那里安静地写代码,你可能会比现在快乐得多。但你是最棒的开发者,自从团队之前的老大奈杰尔发生了那场不幸的事故(与蹦极绳和笔记本电脑有关),作为团队技术明星的你,被顺理成章地提拔为了开发经理。
现在,你有了自己独立的办公室(而不是和那些赖着不走的暑期实习生挤在一个小隔间里),不得不填写每年两次的绩效考核表(而不是每天盯着CRT显示器来自毁双目),还得经常想办法满足明星级程序员们的各种古怪要求,和过分亲热的销售人员称兄道弟,和异想天开的“用户界面设计师”们(天啊!他们是以图形设计师的身份被招进公司的)讨论设计稿——他们想让确定和取消按钮闪闪发亮并且带有倒影效果,天啊,“倒影效果”对应的RGB颜色值是多少?还要硬着头皮回答高级副总裁提出的各种愚蠢问题,他们对于软件的那点了解全部来自于旅途中翻阅达美航空公司提供的旅行杂志。“我们为什么不用Java来代替Oracle呢?听说它一致性更好。”
恭喜你荣升管理岗位!你猜怎么着?软件项目管理和编程其实一点关系都没有。如果这辈子除了写代码什么都没干过,你可能会突然发现,人类行为比最普通的Intel CPU还难以预测。
其实,之前的团队老大奈杰尔也不是非常称职。“我并不想变成一个整天泡在无聊会议里的经理,”他在发表这种宣言的时候总显得有些虚张声势,“我认为自己还是可以把85%的时间花在编程上,剩下的时间用来管理团队。”
奈杰尔其实想说的是:“我完全不懂如何管理项目,但愿只要像被委以重任之前一样老老实实地写代码,所有事情就都能顺利地完成。”这当然不可能。这种心态可能有助于解释,为什么奈杰尔会在命中注定的那一天,带着一台IBM ThinkPad去蹦极。
故事的细节不必多说,总之后来奈杰尔奇迹般地恢复了健康,与一起玩蹦极的朋友合开了一家小公司,出任CTO。这家公司叫“今夕何夕”(WhatTime- IsIt.com)。他只有六个月的时间,要从头编写一个新系统,而且这次再也不能靠事故来脱身了。
管理的艺术
软件项目管理是一门很少有人了解的艺术。没有人获得过软件项目管理的相关学位,这方面的图书也很少。只有极少数人带领软件开发项目取得了真正的成功,其中绝大多数都在发财后早早退休去钓鱼,没来得及把积攒的经验教训传给下一代项目经理。剩下的人燃烧尽了自己的青春,改行去做其他压力稍小一点的工作,比如帮市中心的小混混辅导英语。
这导致了许多软件开发项目都因为种种原因而中途夭折,有的失败得轰轰烈烈,有的则无声无息,原因是团队里没有人知道如何带领一个软件项目走向成功。有太多的开发团队无法交付像样的产品,或者拖了太久才交付,或者交付了一个谁都不想用的软件。但是最让我感到愤怒的,是那些在团队中闷闷不乐,痛恨每一分钟工作时间的人。人生苦短,怎么可以浪费时间去痛恨自己的工作。
几年前我在网站上发表了“乔尔测试”,这份清单包含优秀软件团队必须要做到的12件事,包括维护一个bug跟踪数据库,让面试候选人现场写代码,等等(不要着急,这本书会拿出大量的篇幅来介绍这些内容)。让我感到惊讶的是,很多人发来电子邮件,说自己所在的团队只能在满分为12分的测试中得到2~3分。
2~3分!
这太不可思议了!就好像一群木匠聚在一起做家具,结果谁都没听说过螺丝钉。他们只会用踢踏舞鞋把钉子敲进木头里,因为没人告诉他们世界上还有一种东西叫锤子。
要做好软件项目管理工作,需要一整套和写代码完全不同的工作技能和技术储备。项目管理和软件开发是两个完全不同、几乎没有交集的领域,二者之间的差别几乎相当于脑外科手术和烹饪椒盐卷饼之间的差别。一名脑外科手术医生完全想不到,自己会被传送到一个制作椒盐卷饼的工厂里,这很可能是时空裂隙造成的结果。即使是接受过哈佛医学院教育的外科医生,也完全对如何烹饪椒盐卷饼没有一点概念。但是人们通常认为,一位顶尖的开发者不经过任何岗前培训,就能自动胜任项目管理工作。
和刚刚提到的脑外科医生一样,你和奈杰尔都被安排到了一个新岗位——管理。这个岗位要求你和人类而不是编译器打交道。如果你觉得现在的Java编译器bug丛生、行为不可预料的话,说明你还没有作为开发经理和团队中的明星程序员打过交道。管理由人类组成的团队,难度要大大超出编写C++模板函数。
要实现成功的软件项目管理,也并非无迹可寻。这门艺术发展到今天,已经脱离了钉子和踢踏舞鞋的阶段。我们现在有锤子、螺丝刀和双斜面组合条锯。本书的目标就是介绍我知道的所有管理方法和技术,涉及各个层面,包括团队管理者需要预估时间和开发计划,软件公司CEO要筹划市场竞争战略,等等。你将学到:
如何聘用并激励最优秀的人才——这是软件项目取得成功的最关键因素;如何让开发时间预估和进度规划变得切实可行,以及为什么有必要这样做;如何设计软件的功能,写出能真正指导开发的规格说明书,而不是制造那种“一次编写、永不阅读”的无用文件,只能拿来把办公室隔间的隔板垒得更高;如何绕开软件开发中常见的陷阱,以及为何程序员编程的时候总喜欢犯“推倒重来”的错误;如何组织和激励团队,为什么程序员需要独立的工作空间和关闭的门;在哪些情况下必须从头开始写每一行代码,抵制从网上下载足够好用软件的诱惑;为什么软件项目总是在过了最初的几个月之后,看起来像是陷入了停滞状态;对于软件公司,发展战略意味着哪些思考和行动,为什么BeOS从一开始就注定了失败;除了以上几条之外,还有更多内容。
本书的观点带有强烈的主观色彩。为了行文简洁,我无法在每句话的开头加上“在我看来”这几个字,但实际上你要知道,这本书里的每句话都是我个人的观点。本书也许并不完善,然而是一个不错的开头。
啊,你是我网站的读者……
本书的很多内容都来自我个人网站上的专栏文章,这些文章统称为“乔尔谈软件”,记录了我在这几年中的很多思考。希望这本让你捧在手中的书,能比网站上松散的文章在形式上显得更为紧凑,这个词的另一个含义是,“可以在浴缸里阅读而不用担心遭到电击”。
我们把本书分为三大部分。第一部分从小处着眼,探讨了软件开发的方方面面:要想开发出不危害人间的软件,每一个开发团队都应该遵循哪些良好的开发习惯。第二部分包含了一系列关于如何管理程序员和编程团队的文章。第三部分的内容则更松散一些,但大致上围绕着“如何长久地在软件开发行业生存下去”这一主题。你将了解到为什么“膨件”(bloatware)大行其道,为什么本杰瑞公司(Ben & Jerry’s)和亚马逊公司如此不同,以及为什么软件开发方法论的出现标志着这个行业缺乏足够数量的优秀人才。
本书的内容当然远不止以上介绍的这些,所以闲言少叙,书归正传。