一
我们公司的 Windows 版软体已经有十多年的历史,经过历代工程师的整治之后,内容已经凌乱不堪。过去三个月,我找时间自己重写了整个主程序。原本数万行的程序,被我重写的只剩下数千行,功能不变,效能更好,而且架构俨然。
前几天完成 Alpha 版之后,我不禁开怀大笑,笑声惊动整个办公室。
二
在重写这个程序的这段期间,前两个月,我每周花在这个程序上的时间应该不会超过四个小时。后来我趁着农历新年没事干,跑到公司加班数天,但是一天写程序的时间也不会超过四个小时。
通常我白天写两、三个小时的程序,遇到瓶颈就去忙别的事,或者干脆回家吃晚饭,晚上睡觉前,躺在床上用手机查一下资料,第二天上班走在路上,就会很自然的想到不错的解法。
写程序是一种创作,不是做苦工,不能每天在电脑前面枯坐十几个小时,否则超时工作,只会让自己的脑筋变得更糊涂。
我所认识的许多写程序高手,每天写程序的时间都不会太长。
三
1995 年的时候,有一天在美国盐湖城,我陪着趋势科技的创办人张明正扶着他爸爸过马路,他突然跟我说:「宜敬,我实在搞不懂,在软体这个行业,一个优秀的工程师的产出可以轻易抵得上一、二十个平庸的工程师,但是公司最多只要付他两、三倍的薪水。那为什么还有公司愿意付钱雇用那些很平庸的工程师呢?」
当时我博士刚毕业,当然不知道要如何回答他的问题;而现在过了这么多年,我还是不知道要如何回答那个问题。
而当时张明正会问我那个问题,应该是因为我介绍了几位同学跟朋友到趋势科技工作。那几位都是以一当十、以一当百的高手。趋势科技当时没有给他们十倍、百倍的薪水,但是对他们也不薄,给了他们不少的股票。
后来趋势在日本上市,我那几位朋友都成了亿万富翁,财富应该超过一般工程师的十倍、百倍吧?
四
写一个大型程序,并不是「人多好办事」。
如果是土木工程或是制造业,人越多、产出就越大。如果一个计划延误了,就多调一些人手过来帮忙。
但是在软体工程里,人越多,就越是难以协调,写出来的程序也往往品质越差、效能越糟糕。
这就是有名的”The Mythical Man-Month: Addingmanpower to a late software project makes it later"。
IBM在1960年代开发OS/360作业系统软体时,就发现了这个奇特的现象。
所以我也搞不懂,大型软体公司雇用了那么多的软体工程师干嘛?
五
我在当兵的时候,有一阵子在台中十军团的资讯中心担任资讯官。那时候我手下有两名资讯科系毕业的大专兵,但是我嫌他们两人写程序写的太慢,而解释给他们听更是费事,还不如我自己动手写比较快。
所以我就叫他们到一边凉快,所有的程序都由我来写就好。而他们两人觉得很不好意思,就泡了很好喝的奶茶给我喝。
后来我们成了很好的朋友。
六
写程序并不是写的越长越好、越厉害。
我年轻在台大资讯工程系的时候,会跟朋友炫耀说:「我写的程序语言编译程序,总共有一万多行耶。」
后来我去美国布朗大学读电脑科学博士,毕业的时候喜欢跟朋友炫耀:「我的博士论文那个程序,功能那么强大,但是我只用了七、八千行程序就搞定了耶。」
七
二流的软体工程师,喜欢把简单的问题弄的复杂,写出别人看不懂的程序。
一流的软体工程师,喜欢把复杂的问题简单化,写出架构清楚明白的程序,让人看了之后,觉得问题好像很简单。
三流的软体工程师会去崇拜二流的软体工程师,因为他们会觉得二流工程师写的程序都看不懂,一定是超级厉害;
三流的软体工程师不会去崇拜一流的软体工程师,因为他们会觉得一流工程师所做的事情都很好懂,好像都很简单。
只有一流的的软体工程师才会佩服一流的软体工程师,因为只有他们才能看的出来,其他的一流软体工程师厉害在哪里?
台湾的软体业如此,美国的软体业也大致如此。