分类: 敏捷

“鱼变慢”还是“技术债”:适合国人口味的比喻

为什么十几年前当私家车刚刚进入中国家庭时,国人那么喜欢三厢车?我想大概是因为在国人心目中,三厢车能比两厢车表现出更高的社会地位。想想看,历史上中国领导人们所坐的车——比如红旗、上海、大众——都是三厢的。而那些工程车、抢险车、救护车大多数是两厢的。当时的中国家庭买辆车不容易,要买就买有面子的三厢车。于是国外汽车厂商为了迎合国人这个心理,纷纷把国外畅销的两厢车改造为三厢车在国内销售。我家当年买的第一辆私家车,就是一辆经过这番改造的三厢赛欧。

与之类似的是,在国外软件开发行业很流行的一些比喻,比如“技术债”(Technical Debt),要想在国内软件开发团队中发挥作用,也需要根据国人的口味改造一下。

“技术债”这个比喻最早应该出现在美国程序员Ward Cunningham在1992年撰写的一篇博客[1]中。它的概念可以用下面微软Word的故事来很好地进行诠释。

早在1983年,微软就在其Windows上演示运行了后来大名鼎鼎的Word。2年之后,微软推出了Windows 1.0。但在此之后又过了4年,微软才发布了运行在Windows 1.0上的第一版Word,比原定计划晚了好几年。

30多年前微软开发第一版Word时,管理层有两个观念:1)估算不是估算,而是承诺;2)经理不应看代码(因为如果这样做,就犯了“微管理”的大忌)。

第一版Word发布延期好几年的原因,可以从下面这幅因果回路图(Causal Loop Diagram)[2]中找到答案。

01

0. 项目的目标是遵循原定计划按时发布第一版Word;

1. 项目的目标越大,试图遵循原定计划的压力就越大;

2. 试图遵循原定计划的压力越大,经理就越愿意使用速效方法(QF, Quick Fix),来劝告、贿赂和威胁程序员跟上计划;

3. 经理越愿意使用速效方法来劝告、贿赂和威胁程序员跟上计划,程序员使用“秘密工具箱”(快速地写烂代码)的百分比就越高;

4. 程序员使用“秘密工具箱”(快速地写烂代码)的百分比越高,从短期来看,添加新feature的时间越短、工作量越小(O, Opposite,即箭尾所连接的因素越多,箭头所指向的因素越少);

5. 添加新feature的时间越短、工作量越小,管理层就越认为“劝告、贿赂和威胁能让工作做得更快”;

6. 管理层就越认为“劝告、贿赂和威胁能让工作做得更快”,经理就越愿意使用速效方法,来劝告、贿赂和威胁程序员跟上计划,从而形成了恶性循环(即Positive Feedback Loop,正向反馈回路);

7. 程序员使用“秘密工具箱”(快速地写烂代码)的百分比越高,从长期(箭头上的双竖线表示“慢性发作”)来看,添加新feature的时间越长、工作量就越大;

8. 添加新feature的时间越长、工作量越大,工作进度变慢从而与原定计划的实际偏差就越大;

9. 工作进度变慢从而与原定计划的实际偏差越大,经理就越愿意使用速效(QF, Quick Fix)方法,来劝告、贿赂和威胁程序员跟上计划,从而形成新的恶性循环。

如果用“技术债”来描述上面的两个恶性循环,那么可以这样来解释:为了省时间赶进度快速地写烂代码,好比钱不够就向银行借钱而欠债;手上拿到借来的钱,自然能在短期让工作进展更快;但是随着时间的流逝,欠债所产生的利息会越来越高,如果不连本带利地归还欠债,就会令工作进度变慢从而与原定计划的实际偏差越大。

在社会信用体系相对健全的西方社会,把“快速地写烂代码”比喻为“欠债”,确实能令讲求信用的西方软件开发团队的管理层开始重视“偿还欠债”的代码重构工作。

但相比之下,在社会信用体系尚不健全的国内,“欠债”的比喻就不像在西方社会那样好用。一段时间以前在国内出现的“老赖”这个词就能说明这个问题。这些“老赖”们,一般是欠债的商人,他们虽然有偿还债务的能力,但就是拒不还钱。结果搞得欠债的“杨白劳”们个个儿像大爷,而借人钱的“黄世仁”们倒像孙子那样低三下四。

从上面微软Word的故事中能够看到,两个恶性循环最终导致软件交付的速度变慢了。那么在今天“快鱼吃掉慢鱼”的互联网时代,在“只争朝夕”的中国,为什么不用“鱼变慢”这个比喻来促使中国软件开发的管理层更加重视驯服烂代码而让“鱼变快”呢?

如果用“鱼变慢”来描述微软Word故事,那么可以这样解释:鱼为了省时间吃烂代码这些垃圾食品,从而中毒牺牲了健康导致再也游不快。

中国软件开发的管理层向来是很重视开发速度的,因为他们追求按时交付软件产品。但是如果了解到自己的软件产品,就像一条为了赶进度大量吃下烂代码而中毒的鱼,逐渐越游越慢,最后被竞争对手那条快鱼吃掉,那么他们肯定会感到如坐针毡。

另外,不读代码的软件开发管理者们,经常会忽视软件开发的“隐藏输入”。在他们看来,“编写代码”这个任务就是一个黑盒子。这个黑盒子只有一个输入,那就是“用户需求”。这个黑盒子也只有一个输出,那就是“准时且没有缺陷的构建好的软件”。但是实际上,这个黑盒子还有一个“隐藏输入”,那就是盒子中的“已有代码”。如果程序员们为了赶进度快速地写烂代码,那么盒子里的“已有代码”就会成为“有毒”的隐藏输入,再次输入给这个黑盒子。这就解释了为什么“程序员对工作的估算往往很乐观”,因为他们往往对这些“隐藏输入”的工作量考虑得很少。

02

在社会信用不如西方发达的国内,相比“技术债”而言,有毒的“隐藏输入”导致“鱼变慢”这个比喻,能更有效地提醒信奉“快鱼吃掉慢鱼”的中国软件开发管理者重视驯服烂代码这样的工作。

注:

[1]参见:http://c2.com/doc/oopsla92.html

[2]参见:Craig Larman, Bas Vodde著,精益和敏捷开发大型应用指南,机械工业出版社,2010年1月第一版

发表评论

评论