OSCHINA答读者问之一:“软件工程”的学法与用法

我曾经去给OSCHINA做过一期有关“软件工程实践”的有奖高手问答 (奖是给提问者的,哈哈),现在来看,许多问题仍然可读之处,因此整理成文字,以为众赏。

原贴在这里:http://www.oschina.net/question/12_78459

本篇的问题是:软件工程要怎么学,学了有什么用、怎么用?

答:

首先,软件工程是学不得的。是所谓“学之不得”,通过死学,是得不到什么有价值的东西的。我们必须自己提一些问题,然后来求解,通过这个求解的过程,来学习与领会它。我想第一个要问的问题,就是“什么是工程”。我们学工科、理科、文科之类,为什么要这么分呢?工程为什么是“工科”的一部分呢?更有趣的问题是,为什么没有所谓的“文学工程”呢?

工程就本意,指向的就是“产出一个东西”。工科,也偏向于“实做一个东西”。你不能去找理论数学或理论物理的人,去做一个实际的产出来。工科,以及这里谈的工程,就是要“做出一个东西”。而软件工程,无非就是要讨论“做一个软件”这件事的做法,而已。

但是我们要看到,“做一件事”,要确定做法,所以说要谈到“软件的开发”,于是有了写软件的代码工人,写软件的技术与方法等等。但这个问题不是软件工程本身讨论的,它被归在了“工具”这个范畴内。同样,“做一件事”,还涉及到“人”,但也不归在软件工程本身讨论,而归在了管理中。等等类似这些的东西,都因为有各自的学科,而被划分出去了,“软件工程”这门功课的本身,就只剩下了一个“纯学术”的东西,它只讨论“软件该怎么做”的问题,而放弃了具体做法中的具体的人、具体的技术和具体的研发对象。这个“软件怎么做”的问题,被学“工科”的思想用了一个简单的模型来讲,就是:软件工程=(做一个面向软件开发的工程的)过程+方法+工具。

但是有趣的事情是,凡工科,凡“做一个东西”,要把这个事情工程化,好象它的结论都会“用一个过程,找一些方法,拿一些工具,来做”。所以,将软件工程化,与将任何事情工程化,并没有本质的区别。从工业革命开始到现在,前辈们都是这样做的。纯理论的来说,做的模式都是如此。换而言之,上面那个公式/模型,也可以简而言之为“软件工程=用工程化的方法,来做软件”。

你再看那本叫《软件工程》的书,写的就是没用嘛。因为这纯粹不需要讲,懂了“将一件事工程化,都不过是如上的方法”,那么整本书也就成了个备查手册——查查别人都用了什么过程、方法与工具,以及有什么效果。

学“软件工程”,学得懂了上面的这点东西,就够了。在工科来说,剩下的就是“练习”了。如同操刀杀牛,同一个过程,练3、5遍不行,练3~50遍总是行的。学“软件工程”也不过如此,一套过程、方法与工具用熟了,不过是把工夫做足了,做纯熟了而已。

而对于一个具体的工程(例如一个具体的项目)来说,上面的东西几乎完全无用。为什么呢?因为我们前面说过,《软件工程》这样的一门学科把“什么东西”、“什么人”、“做的技术”这些东西清理了出去,变成了一门纯粹的“工学”。而事实上,一个具体的工程项目,却正好是包含在这些东西、人、技术上面的。所以做具体工程的,碰到人的问题,就要谈管理,而“我学了软件工程”并不表明我会管理;碰到东西的问题,就要谈产品,而“我学了软件工程”并不表明我会产品设计;等等如此。我们的一个具体的工程,并不一定具有一个“面面俱到”的团队,所以实作工程的时候,总是这方面不足哪方面不够,碰到的问题总不在书里。

但,你再看看,你面临的这件事、这个项目,这个具体的工程,就解决问题的法子来说,也不过是“找到一个过程,用一些方法,拿一些工具”来做,而已。所以,真懂软件工程的人,知道这个原理——这个在《软件工程》这本书中讲的核心原理,就够了。其它的,神见杀神,佛见杀佛,自个去做便是了。哪有在一个具体的工程里谈什么RUP的,谈XP的?就好象说,你明明已经在千军万马里了,还从太极的起手式耍起!开玩笑嘛!见一个砍翻一个,砍错了该Y的倒霉,就是如此嘛。

套路有没有呢?原则有没有呢?还是有的,《大道至简》里说过,千军万马里面用剑,不要去砍,剑身是用来挡的,剑尖是用来刺的,刺死砍伤,用最有效的法子,就好。这就是些基本原则了。到一个具体的工程里了,对A员工到软声细语,对B员工要敲敲打打,对C员工的测试一定要复测……等等这些,你在工程中去总结就好。因人、因事、因环境、因目标对象一一应对,然后你就成功了,就牛人了,就项目精英了,就50多岁了。

练就。不练,怎么有成就呢?《软件工程》只讲一个核心原理,真到做了,还是一个项目、一群人、一个产品目标。三个方面的东西,一个不可少地去照顾到了,去找到他们的方法、过程与工具了,去磨过去拼过,才有结果的。

我从来不相信学完《软件工程》就去做工程的那个人。