—我们公司的Windows版软件已有十多年的历史。经过历代工程师的整改,内容已经变得杂乱无章。在过去的三个月里,我抽出时间自己重写了整个主程序。本来几万行的程序,我只重写了几千行,功能不变,性能更好,结构也一样。前几天做完alpha版,忍不住笑得整个办公室都在笑。二在改写这个程序期间,前两个月,我每周花在这个程序上的时间不应该超过四个小时。后来过年没事干,就去公司加班几天,但每天写程序的时间不会超过四个小时。一般白天写两三个小时的程序,遇到瓶颈就去做别的事情,或者干脆回家吃晚饭,晚上睡觉前用手机看看里面的资料睡觉,第二天再去上班路上。想到好的解决方案是很自然的。写程序是一种创造,不是辛苦的工作。每天坐在电脑前的时间不能超过十个小时,否则加班只会让你的头脑更加混乱。我认识的很多高手程序员,每天写程序的时间都不会太多。1995年,在美国盐湖城的一天,我陪着趋势科技的创始人张铭政,帮助他的父亲过马路。他突然对我说:“易静,我真的不明白。在软件行业,一个好的工程师的产出量很容易等于10个或20个平庸的工程师,但公司只付给他两到三倍的工资。薪水最多。那么为什么公司愿意支付和聘请那些平庸的工程师呢?“当时我刚博士毕业,当然不知道如何回答他的问题;而现在,这么多年过去了,我仍然不知道如何回答这个问题。当时张铭政问我这个问题,可能是因为我介绍了几个同学朋友到趋势科技工作。那几个,都是以一敌十,以一敌百的高手。当时趋势科技没有给他们十倍、一百倍的工资,但也没有亏待他们,给了他们很多股票。后来Trend在日本上市,朋友们都成了亿万富翁。他们的财富应该是普通工程师的十倍、一百倍吧?把一个大型程序写四遍,并不是“人多则易”。如果是土木工程或制造业,你的人越多,你能生产的东西就越多。如果计划被推迟,就会召集额外的人来提供帮助。但是在软件工程中,人越多越难协调,写出来的程序往往质量和性能都比较差。这就是著名的“神话般的人月:为已延迟的软件项目增加人力使其更晚”。IBM在1960年代开发OS/360操作系统软件时发现了这个奇特的现象。所以我也不明白为什么大的软件公司会聘请那么多的软件工程师?5在部队时,曾在台中第十军情报中心当过一段时间情报员。当时我身边有两个信息系毕业的大专兵,但是我觉得他们两个写程序太慢了,给他们解释就更麻烦了。如果我自己写的话会更快。所以我就让他们到一边去凉快凉快,我来写所有的程序。但是他们两个觉得很不好意思,就泡了好喝的奶茶给我喝。后来我们成了很好的朋友。第六,写程序不是写的长,写的越厉害。小时候在台大信息工程系,我会跟朋友炫耀:“我写的编程语言编译器一共一万多行”。后赴美国布朗大学攻读博士学位。在计算机科学中。毕业时,我喜欢跟一个朋友炫耀:“我博士论文的程序这么牛逼,我却只用了七八千行程序就完成了”。七流、二流的软件工程师喜欢把简单的问题复杂化,写出别人看不懂的程序。一流的软件工程师喜欢把复杂的问题简单化,写出结构清晰的程序,让人看了就觉得问题好像很简单。三流的软件工程师会崇拜二流的软件工程师,因为他们会觉得二流的工程师写的程序看不懂,自己一定超级牛逼;三流的软件工程师不会崇拜一流的软件工程师,因为他们会觉得一流的工程师所做的每一件事都很容易理解,看起来很简单。只有拔尖的软件工程师才会佩服拔尖的软件工程师,因为只有他们才能看到其他拔尖的软件工程师有什么好?台湾的软件业如此,美国的软件业大致如此。8直到20世纪80年代后期,IBM一直是世界上最大的计算机公司。当时,IBM找了一些原本从事硬件制造的高管来管理软件部门。那些高管根据管理制造部门的经验,决定用KLOC(千行代码),即每个软件工程师每年写多少行代码来计算软件部门的效率。结果,软件工程师“短而长”,写了一堆又长又低效的软件程序。第九,要成为一流的软件工程师,既要熟悉计算机科学的各种基础理论,又要积累长期的实践经验。我在布朗大学计算机系读博士的时候,编程作业的分量很重。在操作系统课上,教授要求我们每个人独立编写一个miniUnix操作系统,包括文件系统和进程系统;在Compiler的课上,教授让我们每人独立写一个Compiler,而且每个模块都要写两个以上的方法,然后相互比较;而AndyVanDam教授教授的计算机图形学简直就是人间炼狱。当时,助教发了一份问卷调查,发现每个学生平均每周要花四十多个小时写那门课的程序,学生几乎要造反了。但是,修完以上三门课程且没有被辞退并获得高分的人,将成为懂理论、懂程序的高手、高手。十年前,当我还是一名博士时。布朗大学的学生,我猜我们系里跟我这个级别的程序员大概有十几个吧?但是我们部门最厉害的程序员是我的主管。史蒂夫赖斯教授。他一个人就抵得上我们这个级别的五到十个工程师。关于他的传说很多。有一次我去他的办公室看他,看到他在玩纸牌游戏。他被我找到了,有点不好意思,赶紧告诉我,他觉得Windows下的纸牌游戏很好玩,但是他没有Windows电脑,就在自己分散的SunWork里呆了四五天时间。Station上写了一个类似的纸牌游戏,包括丰富多彩的图形界面等等。想玩电子游戏就自己写一个?我想笑,却差点跪在师父面前。十一我在布朗大学认识的那些软件大师,后来真正把写程序当成职业,然后写出伟大的、被广泛使用的程序的,应该不多。因为有些人后来成了大学教授,教授一般不会自己写程序。时间长了,也不知道他们的本事还剩下多少?有些人后来为了拿高薪去一些大公司写了一些很没营养很无聊的程序。时间长了,也不知道他们的本事还剩下多少?有些人后来进入这个行业工作,没多久就被提拔到管理岗位,而管理人员通常不会自己写程序。时间长了,也不知道他们的本事还剩下多少?所以高手并不多,持续写程序的高手更是凤毛麟角。12美国软件界有个老笑话:如果同一个团队有两个工程师,一个擅长写程序,一个不擅长写程序,那么后面晋升为经理的必须做一个不会写程序的人。因为团队需要会写程序的人留下来写程序。13写程序最高功夫的时候,应该是20多年前,我刚拿到博士的时候,那个时候知道了理论,积累了很多写程序的经验。我不敢说我??能以一数到一百,但以一数到十应该绰绰有余。可惜没多久就被提拔到管理岗位,当了经理、助理、总经理之后,如果还自己写程序,会被别人笑话的。所以我不再写程序了,我也学会了在我的部门多放一些工程师,不然团队不够强大,会被其他部门和上级看不起。二十年后,我的技能只剩下大约20-30%。十四我现在终于是自己的老板了。而且当了老板之后,最大的一个好处就是写程序开心了就可以写程序了。就算有人想笑话我,我也可以无视。15号趁着过年,重写了我们公司的Windows主程序。做完之后感觉自己的技术又恢复到了当年的30%到40%,心里不禁感到很开心。但是我还是觉得软件工程真的是一个很难理解的行业。虽然我自己是一个软件工程师,虽然我的博士论文研究的是编程环境(ProgrammingEnvironment),但是主题就是我这里讲的问题。
