什么是软件的生产制造过程?需求收集,分析,设计,开发,测试,打包,发布;这些是软件的生产制造过程吗?
看上去好像没有问题,这不就是将软件从无到有制造出来的过程吗?好吧,那让我们用下面这张图来比较一下:一辆汽车的生产制造过程和一个软件的生产制造过程有什么区别。
汽车上到生产线,工人按照既定的程序不停“重复”的生产着同样规格的产品,对于汽车来说,生产线上同一批次的汽车一定是一样的;对于软件来说,如果是同样的软件,生产的过程可以被简化为“复制”和“粘贴”。而我们所理解的所谓软件的生产制造过程其实对应的是“原型车”的设计过程,因为每次经历这整个过程的软件都不再是统一批次(版本)。
从这个角度来说,软件开发其实一直处于“设计”过程,而从来不会进入和传统制造业类似的“生产”过程。传统的瀑布模式的软件项目管理思路其实就是在用管理不停重复”生产“过程的方法来管理一个不断变化的“设计”过程,注定是不适合的。
也许大家对汽车生产线还是不够熟悉,那我们来举个做菜的例子。你要做一道西红柿炒鸡蛋,正常的工序是:炒蛋,拿出,放油,放葱,放西红柿,放糖,放入炒好的蛋,放盐,出锅。没毛病,这就是一盘正常的西红柿炒蛋,按照这个工序,任何经过简单培训的人都可以很容易的快速复制这道菜。但是,假设你已经完成了放糖的步骤,这时候客人说他有糖尿病,怎么办?你只能倒掉西红柿从来,还好炒好蛋还可以用。又或者,客人点了西红柿炒蛋,上了桌客人说这个不对,我要的是黄瓜炒蛋 … … 作为大厨的你是否会提刀见客?好吧,其实软件开发的过程远比这个复杂,推倒重来算好的,盖好了大楼再拆掉地下室这种事在软件行业也是家常便饭,用户搞不清西红柿和黄瓜算好的,至少他承认搞不清,很多用户会要求你把黄瓜做成西红柿的味道。现在你理解为什么会有程序员暴打产品经理的事情出现了吧?
这就是软件开发的自然属性,它不是一门科学,更不是一门工程;因为科学和工程都是把已经解决的问题作为经验/定理,供大家重复使用;而软件开发更像是炒菜,就算是最有经验的大厨,每次的菜也都要重做,再详细菜谱也无法保证炒出一样的味道;环境,时间,材料甚至大厨心情的都会对味道有影响。更糟糕的是,至少做菜的材料和过程是可见的,软件开发的过程是不可见的,你看到的只是设计人员写了一堆菜谱,程序员不停的把代码扔到锅里,而这些好像和***那道菜都没啥关系。
牢记这一点,这才是软件开发的本质,任何希望用既定的计划去约束这个过程,任何希望用代码工人和管理流程代替开发人员的自主性和创造性的努力都将失败;软件开发永远在设计,就像陆远说的:每个厨子都是一名设计师。
我要说的是:不会做菜的程序员不是好设计师 … … 但至少我们都是设计师,不是编码工人。
【本文为51CTO专栏作者“徐磊”的原创稿件,转载请通过作者微信公众号devopshub获取授权】