至少20年前,领导们就希望软件开发机械化,因为他们了解怎么做好机械化工作。所以,有的领导会认为软件工程师就是就是在软件工厂里进行编码的工人。
在这个领导想象的软件工厂中,软件工程师坐在流水线旁自己的座位上,把Java的部件组合在一起,或者在软件车床上打磨一个VB的应用程序……软件组件随着流水线向下流动,有个测试员每天以同样的方式测试这些组件并盖章以示合格。J2EE设计师设计J2EE的应用,C语言的编码师在C语言编码环境下编码。一切都井井有条。
但是,这个类比并不成立。软件工厂中的机械化模式并不适合软件开发。具体有以下几个原因:
机械化模式无法适应需求变化
软件必须满足用户需求,而如今用户需求经常会发生改变。这也就意味着软件的设计、编码和测试环节也要相应地变得更加灵活,这些都是机械化开发模式无法满足的。在需求经常变化的环境下,灵活的软件开发才能满足要求。
机械化模式难以应对突发问题
软件开发过程中经常会遇到各种各样的问题,而且很多问题是我们无法预测的。机械化模式遇到突发问题,就会导致整个流水线瘫痪,导致工期延误。我们需要有更灵活的机制来应对这些风险。
机械化模式难以敏捷
机械化模式要求每个岗位都是熟练工种,是专才,但是如果一个环节出现问题,就只有该岗位的专才能够处理,其他环节只有停下来等待。这种开发方式难以提高效率。按照敏捷团队的观点,团队中的每个成员应该是“一精多专”,这样很容易做到“一方有难八方来援”,软件开发的效率才会提高。机械化模式的分工无法做到这一点。
机械化模式无法适应软件项目的循环性
软件项目通常是具有循环性的,不仅项目的流动是循环的,一个项目内部的工作也是循环的。负责编码的程序员要做好编码工作,不是只会接收上一个环节传送过来的设计文档,就能在IDE环境下写出好的代码来,他也必须要依赖前后流程和经验。如果程序员不懂这个系统是用来做什么的,他就不能很好地实现这个系统。由于前后流程的问题,程序员像机械化模式中那样同时参加多个项目并不可行。
总之,需求经常变化,突发的无法预测的问题,僵硬的分工模式以及软件项目的循环性,使得机械化模式并不适合软件开发。
这正是:
机械难施软件工,需求多变预测空
分工僵硬循环扰,灵活应对方为聪
参考书目:我编程,我快乐:程序员职业规划之道,作者:(美)Chad Fowler,译者:于梦瑄,出版社:人民邮电出版社