经常会听到某某领导一拍桌子说,“干不完就加人、加班。”这话听起来似乎理直气壮,但如果是软件公司的领导,这就大错特错了,这说明这人根本不懂软件。软件开发就如同女人生孩子,10月怀胎,加再多的人也不能让她提前分娩。
不是我们程序员太矫情,软件开发不比其他行业。软件工程虽然也叫工程,但跟土木工程无法相提并论。软件工程师虽然也是工程师,但跟建筑工程师干法完全不同。引用《软件工程的变迁》里的话,你能明显软件工程的不同之处:
当一个土木工程师去修建一座跨河大桥来连接河两边的道路时,工程师会非常清楚的知道道路跨河的精确地理坐标位置。行驶的车辆在数年里也不会发生重大的改变。桥梁工程师只需要按照之前已经被上千次的验证过的建筑工艺把河两边的路连接到一起。
对于软件系统,因为技术或业务发生了变化,在建设过程中(在所有需求和设计文档完全完成后)需求需要做重大修改的情况并不罕见。如果把这种情况放到修桥的事情上,相当于当桥的地基打好后,再把桥的搭建位置往河的下游移6公里。
不仅如此,软件开发里还有一些让其他行业里人无法理解的现象。比如程序员夜猫子的习惯,想想如果建筑工人也是昼伏夜出会是什么景象?比如“结对编程”,如果建筑工人结对砌砖会是什么效果,不仅不会提高速度和质量,而且很有可能会被开除。特别是“持续交付(Continuous delivery,开发一块,给用户交付一块)”,如果盖房子也“持续交付”,没有屋顶的房子一定会漏雨。但如果换成造飞机时也边造边运营,这就是奇迹了。大家想看奇迹吗,那就看看下面这个视频吧,看看如果像软件开发那样去造飞机,会是一个什么样的壮举。