当我首次在软件领域提出“牛仔程序员”这个问题时,我并没有意识到会产生如此之大的影响,现在看来,就像捅了马蜂窝一样。所谓牛仔程序员,指的是软件开发界中那些拒绝任何形式的规范,摒弃方法、模型以及管理的程序员。对他们来说,与其让他们参与合作,还不如让他们辞职来的痛快;至于在编码前先行设计的想法,更是让他们感到恐怖。我提出了一个建议,让这些以男士为主的程序员向女性同事学习如何与他人合作,结果就引发了一场沙尘暴似的抗议。这些抗议者几乎都是男性。他们向我提出了种种非议,所以,我一直拖着没有就这个话题再多做一些解释。但是,现实看起来非要我再次考虑一下这些处于编码前沿的强人们。
从哪里说起呢?我的小女儿从大学毕业了。人们用柯达照片记录了毕业典礼的每一瞬间。我记得特别清楚的就是在我女儿获得心理学学位的那一刻,我作为一个父亲的自豪感极度膨胀,然后所有那些在她大学生活中的不快、痛苦都被抛在了大学里。我记住了那个毕业演讲。
通常来说,毕业演讲一般是很难让人留下深刻印象的,大部分毕业演讲要么是虔诚的,要么是陈腐的,或者是场面性的,有一些甚至三者都有。但是,威敦(Wheaton)大学的新校长说服了一个以前她在康奈尔大学的同事Carl Sagan来帮忙,从而成就了该校长的第一个威敦大学毕业班,并使得毕业演讲令人难忘。在Carl Sagan的讲话中洋溢着才华、智慧,并且十分简短。这个毕业班是威敦大学中第二个经历过四年男女同校生活的班级。Sagan从这个班级中得到了灵感,开始注意性别和行为之间的关系。他首先通过对黑猩猩的观察,逐步将注意力放在了男性和女性以及他们的所作所为上。当然了,从遗传学上来说,黑猩猩是我们的兄弟姐妹,人类和黑猩猩99.6%的基因是相同的。但人类和黑猩猩的行为表现自然不是遗传的,但也不是说都是通过学习获得的。只需看看我们的父母,我们就会对自己有所了解了,我们还能通过比照灵长类来了解智人(现代人)。
当雄性黑猩猩感到周围空间狭小时,就会变得越来越具有侵略性和竞争性,它们会四处投掷石块以便和其他黑猩猩保持一定的距离。Sagan描述了一只雄猩猩,它举着石头面对一只十分安静的雌猩猩,而那只雌猩猩只不过是挡住了它的去路。慢慢地,雌猩猩很温柔地掰开雄猩猩的指头,让石头落到地上,然后走开了。对于某些雄性来说,这样就足够了,它们会渐渐将注意力转移开。但是对有些雄猩猩来说,并不是这样的,慢慢地我们知道,在让它们真正了解这种信息前,必须多次温柔地重复这种行为。这让我想起了我认识的一些男士。
Sagan将话题从黑猩猩转回到人,并讲述了男孩和女孩在游戏时的不同表现,以及女性更愿意合作而男性更愿意竞争的倾向。他提出了一个观点,如果在这个世界上,女性获得了真正平等的地位和权力,那社会会不会变得更加具有合作性?他指的不是那种只有几个象征性的女性议员或者CEO,而是在领导岗位上男女比例为1:1的情况。
我一直想知道Sagsn去年在哪里,那时我是多么需要他。当时我正受到一群软件界的“黑猩猩”的围攻,几乎都是雄性的,他们的表现与黑猩猩简直是一样的。我想,他们一定是感到合作编码限制了他们的工作空间。
如果所有的牛仔程序员都是单独工作,那么他们就不会面对如此多的难题了。因为他们中的大部分是非常棒的。在一种孤立的环境下,面对独立可以解决的问题,牛仔们能够充分发挥他们的能力。在一个大型项目组中,有这么一个或两个牛仔,甚至可以调剂整个项目组的气氛。如果能正确地处理系统中的软件接口以及和其他人员的联系,牛仔的存在可以在不破坏系统完整性的前提下,为系统增加一些独特的观点和建议。
遗憾的是,牛仔们不仅仅是以喜欢聚集在竞技表演赛和围猎上而出名,他们也喜欢聚集在大型软件开发中,这样他们可以开发复杂的系统软件——请注意,他们热衷的是系统的复杂性。这样看起来,下面二者之间很有可能是存在一定联系的,其一是不断延期的项目计划以及困扰客户的充满隐含错误的软件;其二是不守规范的牛仔程序员以及放纵他们的管理者。
毫无疑问,牛仔程序员是非常具有创造性的,但这并不总是好事。在系统软件中,压倒一切的是系统的可靠性,这是系统具有优越性能的前提。有时候,软件性能是能够通过牛仔的某些技巧来实现的,但是软件的可靠性一般是通过规范和纪律来实现的,而这些恰恰是牛仔所蔑视的。只有严格地按照优秀的软件工程实践进行软件开发,才有可能得到高效、无错的代码。
大量的牛仔程序员就意味着大量的代码——无论这些代码是否都需要。这也意味着大量的非结构化的代码,这些代码是随灵感而发并且独立地开发出来的,各不相同,分别被打上了各自开发者的风格烙印。
如果你愿意,可以试想由你来组织开发一个庞大的新的操作系统,而且不要使用那些具有良好职业规范素养的能够紧密合作的开发团队,而是让一群牛仔程序员来开发。管理一小撮牛仔已经够困难的了,想想怎么管理一群牛仔吧,光是考虑吸引他们的注意力就够你受的了。
我们可能应该同情Windows NT项目组的领导,他不得不经常对着组员长篇大论,甚至恨不得在办公室的墙上戳个洞出来。也许作为一名声名远扬的超级程序员,他能够理解那种特立独行的心态。
只有理解是不够的。就像《华尔街》月刊(1993年5月26日)中所描述的一样,整个项目的最终结果必然是一个庞大的、极其复杂的、隐含众多缺陷的系统。200多个程序员疯狂地按照随意编写的规范修改代码,最后,项目变成了一场极不和谐的混战。
程序员和测试员,就像过去的牧场主和羊倌,变成了竞争的对手,相互间展开了一场激烈的战斗。测试部门的存在可以有效地降低软件中的缺陷和错误,但是在项目进行过程中,程序员——大部分是男性,而且许多都像公鸡一样骄傲——是占主导的。当程序员抱怨测试员太严厉而拒绝修改时,测试员就不得不面临选择:是为了让项目按期交付而放行,还是为了系统的性能而坚持己见?
随着进度的不断延期和问题的不断增长扩散,NT项目组成员进入了一种“乘船状态”——这种状态持续了将近2年。大家都感到疲惫和压力大,错误率不断上升,长时间地处于压力下工作只会在代码中形成更多的错误。通过几周的时间,他们发现并解决了错误列表上的上千个错误,但是,即使是采用最好的回归测试方法,也只能检测出部分错误。未发现的错误只好留在那里,等着由未来的软件用户来发现了。
其实,这种情况是可以改变的。那就是:规范化的工作。像Al Pietresanta在波士顿1989年软件开发大会上的演讲中所提到的,通过“净室”(clean room)编码技术和持续的过程改进,在大型软件系统开发中,代码错误率甚至可以降低到一万行代码的错误少于一个。
成熟度也会对此有帮助的。对于一个成熟的软件组织,如果使用成熟的软件过程来开发一个大型项目,与采用自由的松散开发方式相比,可以降低20%~30%的开发费用。
在牛仔程序员阵营中,可能会有许多类型的顽固分子,但是对Rancho Redmond来说,现在,这些类型都是有案可查的。NT项目的总负责人Mitchell Duncan说过一句话,已经被《华尔街》月刊引用了,“我们这儿有所有类型的牛仔程序员,他们像疯了一样编写代码。”
他们编写了430万行的代码。小心,你会走向何方呢?
摘自《软件开发》,第1卷,#10,1993年10月