几千行代码就能搞定,你为什么要写几万行?

新闻
本文是一位从业多年的软件工程师分享的经验和看法,他提到的一些现象,槽点颇多,应该是从业人员都会遇到的,不知你是否能有共鸣。

本文是一位从业多年的软件工程师分享的经验和看法,他提到的一些现象,槽点颇多,应该是从业人员都会遇到的,不知你是否能有共鸣。

[[246023]]

01

我们公司的 Windows 版软体已经有十多年的历史,经过历代工程师的整治之后,内容已经凌乱不堪。

过去三个月,我找时间自己重写了整个主程序。原本数万行的程序,被我重写的只剩下数千行,功能不变,效能更好,而且架构俨然。

前几天完成 Alpha 版之后,我不禁开怀大笑,笑声惊动整个办公室。

02

在重写这个程序的这段期间,前两个月,我每周花在这个程序上的时间应该不会超过四个小时。

后来我趁着农历新年没事干,跑到公司加班数天,但是一天写程序的时间也不会超过四个小时。

通常我白天写两、三个小时的程序,遇到瓶颈就去忙别的事,或者干脆回家吃晚饭,晚上睡觉前,躺在床上用手机查一下资料,第二天上班走在路上,就会很自然的想到不错的解法。

写程序是一种创作,不是做苦工,不能每天在电脑前面枯坐十几个小时,否则超时工作,只会让自己的脑筋变得更糊涂。

我所认识的许多写程序高手,每天写程序的时间都不会太长。那么,我的职业经历是怎样的呢?

03

1995 年的时候,有一天在美国盐湖城,我陪着趋势科技的创办人张明正扶着他爸爸过马路。

他突然跟我说:“宜敬,我实在搞不懂,在软体这个行业,一个优秀的工程师的产出可以轻易抵得上一、二十个平庸的工程师,但是公司最多只要付他两、三倍的薪水。那为什么还有公司愿意付钱雇用那些很平庸的工程师呢?”

当时我博士刚毕业,当然不知道要如何回答他的问题;而现在过了这么多年,我还是不知道要如何回答那个问题。

而当时张明正会问我那个问题,应该是因为我介绍了几位同学跟朋友到趋势科技工作。那几位都是以一当十、以一当百的高手。

趋势科技当时没有给他们十倍、百倍的薪水,但是对他们也不薄,给了他们不少的股票。

后来趋势在日本上市,我那几位朋友都成了亿万富翁,财富应该超过一般工程师的十倍、百倍吧?

04

写一个大型程序,并不是「人多好办事」。

如果是土木工程或是制造业,人越多、产出就越大。如果一个计划延误了,就多调一些人手过来帮忙。

但是在软体工程里,人越多,就越是难以协调,写出来的程序也往往品质越差、效能越糟糕。

这就是有名的:"The Mythical Man-Month: Adding manpower to a late software project makes it later"。

IBM 在 1960 年代开发 OS/360 作业系统软体时,就发现了这个奇特的现象。

所以我也搞不懂,大型软体公司雇用了那么多的软体工程师干嘛?

05

我在当兵的时候,有一阵子在台中十军团的资讯中心担任资讯官。

那时候我手下有两名资讯科系毕业的大专兵,但是我嫌他们两人写程序写的太慢,而解释给他们听更是费事,还不如我自己动手写比较快。

所以我就叫他们到一边凉快,所有的程序都由我来写就好。而他们两人觉得很不好意思,就泡了很好喝的奶茶给我喝。

后来我们成了很好的朋友。

06

写程序并不是写的越长越好、越厉害。

我年轻在台大资讯工程系的时候,会跟朋友炫耀说:「我写的程序语言编译程序,总共有一万多行耶。」

后来我去美国布朗大学读电脑科学博士,毕业的时候喜欢跟朋友炫耀:「我的博士论文那个程序,功能那么强大,但是我只用了七、八千行程序就搞定了耶。」

07

二流的软体工程师,喜欢把简单的问题弄的复杂,写出别人看不懂的程序。

一流的软体工程师,喜欢把复杂的问题简单化,写出架构清楚明白的程序,让人看了之后,觉得问题好像很简单。

三流的软体工程师会去崇拜二流的软体工程师,因为他们会觉得二流工程师写的程序都看不懂,一定是超级厉害。

三流的软体工程师不会去崇拜一流的软体工程师,因为他们会觉得一流工程师所做的事情都很好懂,好像都很简单。

只有一流的的软体工程师才会佩服一流的软体工程师,因为只有他们才能看的出来,其他的一流软体工程师厉害在哪里?

中国的软体业如此,美国的软体业也大致如此。

[[246024]]

08

直到 1980 年代末期,IBM 一直是世界上最大的电脑公司。而当时 IBM 找了一些原来是做硬体制造的高阶主管来管软体部门。

那些高阶主管依照他们管理制造部门的经验,决定用 KLOC (thousands linesof code),也就是每位软体工程师每年写出多少行程序来计算软体部门的效率。

结果软体工程师们都「短话长说」,写出一堆长又没有效率的软体程序。

09

要成为一流的软体工程师,必须熟悉了解电脑科学的各种基础理论,也必须累积长时间的实务经验。

我在布朗大学电脑科学系读博士修课的时候,程序作业的份量非常重。上作业系统(Operating System)课的时候,教授要我们每个人独立写一个包含 File System 与 Process System 的迷你 Unix 作业系统。

上编译程序(Compiler)课的时候,教授要我们每个人独立写一个 Compiler,而且每一个模组还必须用两个以上的方法写,然后互相比较。

而上 Andy Van Dam 教授的电脑图学,那简直就是人间炼狱。当时助教发问卷调查,发现每位学生每周花在写那堂课的程序的平均时间超过四十个小时,学生们几乎要群起造反。

但是修过上述那三门课而没有被当掉、又拿高分的,就成了懂理论又懂写程序的高手、高高手。

[[246025]]

10

当年我在布朗大学读博士的时候,我估计我们系上像我这种等级的写程序高手,大概有十来个吧?

但是我们系上公认最厉害的写程序高手,还是我的指导教授 Prof. Steve Reiss。他一个人大概抵得上五到十个我们这种等级的工程师。

关于他的传说很多。有一次我去他的办公室找他,看到他正在玩接龙游戏。

他被我发现了,有点不好意思,赶紧跟我说,他觉得 Windows 上的接龙游戏很好玩,但是他没有 Windows 电脑。

所以他就花了四、五天,利用零散的时间在他自己的 Sun Work Station 上面写了一个类似的接龙游戏,包含彩色的图像接口等等。

想玩电玩就自己写一个?我很想笑,但又差点在我师父面前跪了下来。

11

我在布朗大学认识的那些软体高手,后来真正以写程序为志业,然后写出伟大又广泛被使用的程序的,应该不多。

因为有些人后来去当大学教授,教授通常是不会自己写程序的。久了之后,我不知道他们的功力剩下多少?

有些人后来为了拿高薪,去一些大公司写一些很没营养又很无趣的程序。久了之后,我不知道他们的功力剩下多少?

有些人后来进入产业界工作,没多久就升上了管理职,而管理职人员通常是不会自己写程序的。久了之后,我不知道他们的功力剩下多少?

所以程序高手原本就不多,而一直继续在写程序的程序高手就更是稀有了。

12

美国的软体业有一个老笑话:如果有两个工程师在同一个团队,一个很会写程序,另一个很不会写程序,那后来升上经理的,一定是那个不会写程序的。

因为团队需要那个会写程序的留下来写程序。

13

我写程序的功力最高的时候,应该是二十多年前我刚拿到博士的时候,那时候我又懂理论、又累积了大量的写程序经验。我不敢说自己能以一当百,但是以一当十应该是绰绰有余的。

只可惜,没多久之后我就升上了管理职,而当上了经理、协理、总经理之后,如果还自己写程序的话,那是会被别人笑的。

所以我就不再写程序了,而且我也学会,要在自己的部门多摆一些工程师,否则阵仗不够大,会被别的部门瞧不起,也会被我的上司瞧不起。

二十年下来,我的功力大概只剩下两三成。

[[246026]]

14

我现在终于自己当了老板。而当上了老板之后,最大好处之一,就是我高兴写程序就可以写程序。就算有人要笑我,我也可以不理他们。

15

我趁过年期间重写了我们公司的 Windows 主程序,完成之后,自觉功力已经恢复到当年的三、四成,不禁大乐。

不过我还是觉得,软体工程还真是一门很难以理解的行业。虽然我本身就是一个软体工程师,虽然我的博士论文研究的就是程序开发环境(Programming Environment),主题就是我在这边所说的这些问题。

留 言 有 礼 活 动

作为程序员,你对自己的代码满意吗?扫描下方二维码,关注51CTO技术栈公众号。欢迎在技术栈微信公众号留言探讨。小编将精选出最有价值的三条评论,分别获得 50、30、20 元 的 红 包 奖 励,活动截止时间 10 月 19 号 12 时整。

责任编辑:武晓燕 来源: 电子工程师时间
相关推荐

2018-05-13 15:24:33

工程师程序windows

2021-03-02 13:56:24

Linux 5.12代码驱动

2019-01-03 09:29:15

Linux 系统 数据

2009-07-21 08:44:14

微软Linux内核开源操作系统

2020-02-24 16:27:19

开源大数据计算引擎

2015-08-17 10:42:13

2014-12-01 11:15:40

2019-11-26 10:50:47

代码编程语言重构

2023-10-27 12:46:08

数字化转型

2015-09-01 16:26:18

Linux内核

2020-05-27 14:10:50

代码开发工具

2009-07-21 08:51:33

微软发布Linux设备微软开源虚拟化

2017-03-23 14:07:55

代码程序员

2022-07-13 17:56:09

Bug率产品经理系数

2023-06-28 14:18:06

2011-05-03 09:10:12

项目管理程序员

2009-08-20 16:34:50

Linux源代码红帽Linux内核

2024-03-13 15:48:43

点赞
收藏

51CTO技术栈公众号