问题:如何在有限的时间内创建大型的系统?
我们假设创建的大型系统需要5000人年。
观点一:
一拥而上的开发,相信人多力量大,增加人数,满足时间要求。
评:
1、这里错误地将软件开发和体力劳动等价了;
一个任务如果分配到单个人,而这个单个的人不需要和其他人沟通即可完成的任务,是可以通过增加人数来缩短劳动时间的。比如割麦子,每个人割自己分配的麦子,中间不需要和其他人沟通,割完自己的麦子即可。而软件开发却不能这么搞,不同的开发之间,不同的开发组之间是需要频繁地沟通的。
沟通又分两个层次:
1)相互的沟通与交流;
2)更正因为沟通不当引起的不良结果;
一个人闭门造车可能开发了重复的轮子,也可能开发了不满足其他人的要求的接口,或者开发的东西根本就不是别人想要的。
2、不同的人生产率是不一样的;
有开发组做过统计,最好的和最差的表现在生产率上平均为10:1,等于说同样的一个任务,分配到效率高的A,一天就可以完成;但分配到效率低的B,需要花费10天才能完成。
观点二:
由头等人才组成的小型的、精干的队伍,而不是几百人的大团队。类似于使用特种部队代替大兵团作战。因为人少,需要沟通过的成本就越少,又因为是特种兵,所以生产效率很高。
评:
我们先做一个推算,如上,5000人年的任务如果使用200人开发,则需要5000/200=25年。如果采用小型的、精干的队伍,我们假设为10人,因为精干,我们假设他们的生产率是普通职员的10倍;因为人数少,沟通成本少,我们假设沟通效率是200人团队的10倍,那么开发完5000人年的任务,需要5000/10*10*10=5年。5年后开发的产品会不会过时?还有人对这个产品感兴趣吗?
Mills的建议:
将大型项目的每一个部分由一个团队解决,而这个团队类似于外科手术的方式组建。由一个人进行问题的分解,其他人给予他所需要的支持。即外科手术团队,观点由外科医生单方面统一。
外科医生:相当于架构师,拥有极高的天分,丰富的经验和大量系统和应用的知识,是团队的核心。
副手:外科医生的后备,能完成任何一部分工作,但拥有较少的经验。相当于参谋,外科医生有问题可以找他商量,但不受他建议的限制。
管理员:外科医生是老板,在人员加薪、升值方面有决定权,但没必要在这方面浪费太多时间,他需要一个管理员来管理人员、财务等其他业务。
编辑:外科医生负责产生文档,但处于清晰度的考虑,需要配置一个编辑,编辑外科医生的草稿或者口述的草稿。
两个秘书:配备给管理员和编辑。
程序员:机器码的编写。
工具维护人员:管理文件编辑,调试工具,网络配置等。
测试人员:测试功能。
语言专家:外科医生主要负责系统的设计和系统的整体表现,而语言专家负责寻找一种简洁、有效的语言来解决复杂 、晦涩和棘手的问题。通常一个语言专家可以为两个或三个外科医生服务。
评:
这样似乎可以解决我们开头说的大型系统。还是200人的团队,我们划分为20个小组,每组10个人,每组都选取一个外科医生。对外,由外科医生负责对外沟通;对内,由外科医生统一意见。这样200人的团队只需要协调20个人。职责划分好后,原先200人沟通,现在20个人沟通,我们假设沟通效率提高了10倍,因为每组都有一个专家(外科医生)和语言专家搭配,我们假设生产效率提高了5倍。那么5000人年的任务需要5000/200*10*5 = 0.5年。