软件的制造过程是什么?需求收集、分析、设计、开发、测试、打包、发布;这些是软件的制造过程吗?好像没什么问题,这不就是从头开始做软件的过程吗?好吧,我们用下面这张图来比较一下:汽车的制造过程和软件的制造过程有什么区别。当汽车走到生产线上,工人们继续按照既定程序“重复”生产相同规格的产品。对于汽车,生产线上的同一批次汽车必须相同;对于软件,如果是同一个软件,制作过程可以简化为“复制”和“粘贴”。我们理解的所谓软件制造过程,其实对应的就是“原型车”的设计过程,因为每次走完这整个过程的软件,不再是统一的批次(版本)。从这个角度看,软件开发一直处于“设计”过程,从未进入类似于传统制造的“生产”过程。传统的软件项目管理瀑布模型实际上是通过管理不断重复的“生产”过程来管理一个不断变化的“设计”过程,这注定是不合适的。可能大家对汽车生产线还不太熟悉,那我们就举个做饭的例子吧。你要做一个西红柿炒鸡蛋,正常的流程是:炒鸡蛋,取出,放油,放葱,放西红柿,放糖,放炒鸡蛋,放盐,出锅。没有什么问题。这是一盘普通的西红柿炒鸡蛋。按照这个程序,任何人只要经过简单的训练,都可以轻松快速地复制这道菜。但是,假设你已经完成了加糖的步骤,客人说他得了糖尿病,你该怎么办?西红柿只能扔掉,炒鸡蛋还是可以用的。或者,顾客点了西红柿炒鸡蛋,到了餐桌上,顾客说这不对,我要的是黄瓜炒鸡蛋……作为厨师,你知道怎么用一句问候语来迎接顾客吗?刀?嗯,其实软件开发的过程远不止这么复杂,拆了重头来就好了。在软件行业中,建造建筑物后拆除地下室是常见的做法。用户分不清西红柿和黄瓜好不好。至少他承认他们想不通。很多用户会要求你把黄瓜做成番茄味的。现在你明白为什么程序员会暴力殴打产品经理了吗?这是软件开发的天然属性。它不是一门科学,更不用说工程学了。因为科学和工程都把解决的问题作为经验/定理,供大家重用;而软件开发更像是做饭,即使是最有经验的厨师,每次都得重新做菜,菜谱再详细也不能保证味道一样;环境、时间、材料甚至厨师的心情都会对味道产生影响。更糟糕的是,至少烹饪的材料和过程是可见的,但软件开发的过程是看不见的。你看到的只是设计师写了一堆菜谱,程序员不停地往锅里扔代码。而这些,似乎都与***菜无关。牢记这一点,这是软件开发的本质,任何试图用既定计划来约束流程,任何试图用代码工作者和管理流程取代开发人员的自主权和创造力的尝试都将失败;软件开发总是设计的,就像陆远说的:每个厨师都是设计师。我想说的是:不会做饭的程序员不是好设计师……但至少我们都是设计师,而不是码农。【本文为专栏作家“徐磊”原创稿件,转载请通过作者微信公众号devopshub获得授权】点此查看该作者更多好文
