杨贵福
首发于杨贵福
当一名战士就是一支军队,那些软件不需要工程的时候

当一名战士就是一支军队,那些软件不需要工程的时候

* 最初的代码

1994年,当我开始对编程感兴趣的时候,还没有软件蓝领这一说法,但是我已经有了后来软件蓝领流行起来以后的困惑。

我第一次做的比较大的程序,是用GW-BASIC写的,没有IDE界面,需要按行号插入,黑底绿字的显示器,单个软驱倒腾用两张盘。 (感谢我们的导员刘春光老师
每天中午借我用他的计算机) 要编的程序是自己想出来做着玩的,一个DOS界面下CGA显示模式,菜单方式的……班费管理程序。如同齐同学的那个定票系统,这个软
件并没有实际应用,不过,它对我来说,比此后所有写的程序都更难。

代码后来参加一个比赛的时候,打印了唯一的一份纸质版,打印纸抻开比我举起手还要高。我当时遇到了程序设计中的核心问题--大量的代码,复杂的逻辑。

我当时使用了GW-BASIC提供的一个非BASIC的功能 gosub,类似于函数调用,它帮助我逃过了程序彻底混乱的厄运。后来当我学到模块化思想的时候,如遇故人。
我毫不费力地就接受了这个观念,因为痛过,所以印象深刻。

后来经常见到有初学的同学函数写得超出两三屏,还很得意自己逻辑控制能力。我就在心里撇嘴,你那是还没受够罪。

大量的代码,复杂的逻辑。软件工程给了我们某个答案,就是软件蓝领,它声称大量的人工、短期培训、重复地简单劳动,能够解决--以工程的方法--大量代码
和复杂逻辑的问题。

是的,我们这么干过,好几千看前就这样做。埃及盖金字塔,是没有起重机的,而是靠几千几万人力完成的;中国的古长城 (不是当代的) ,也没有等待现代电
子计算机和通信技术的发展,而是靠万喜良们的双手堆砌出来的。

那个时候,他们一定期待一种东西,可以用燃油作为动作,稳妥精确地运输沉重的材料。

但是他们没有。因为是时代是父亲是民族选择我们,而不是反过来,所以很多时候很多事情都不能一蹴而就。

有的时候,智力或自然的法则也参与限制。

* 他们说,没有解析解

在数学当中,有一种解题的方法得出的结论称为解析解。我们解一个方程,得到结果,如果我们所做的常见运算只需要 有限次,那么,这个结果就称为解析解。

这是什么意思呢?就是说,你可以通过公式,只需要一个大式子,可能非常大,但是最终可以计算出结果,直接地。

难道不都是这样么?不幸的是,还有一些方程,伟大的牛人数学家们告诉我们,有些方程就是不能通过公式求出来。而我们在工业生活中还需要求解。

数学家牛人们还是有办法的。他们创造了另一种方法,用猜测-比较-再猜测,大致这样的方法,逼近我们寻找的那个数。这些牛人们中的第一位就是著名的牛顿。

但是,我们得到的是那个"数",是整个方程中的一段,而且是粗糙的。精细的完全一致的解,可能永远也无法求得,我们得到的就是对于当前的应用"足够"精确
的个案。

人类是多么地热爱形而上,热爱一次性解决所有问题啊。可是,数学牛人们说,有时候,你哭也没有用,就是不行。

在程序设计中也是一样,只有工程方法,有人说,就是蓝领方法,才能解决大量代码和逻辑复杂的问题。

如果没有燃油,没有热功当量,除了征服更多的奴隶,又有什么方法能够赢得自己的自由呢?

但是,我们是否已经判定程序设计一定没有解析解,所以只能靠人力逼近?

* 解析解

我和李记者曾经对刘典同学怀有偏见,认为他(没有虽然技)技术极好 ,但是却从不注重软件中的工程,也不怎么注重合作。

今天,关同学用事实给了我强烈的教育。她用事实告诉我:软件工程为什么有时可以忽略?因为有的程序员,她一个人可以完成超过100个程序员的。

就像有的战士,一个人就是一支军队。

刘典同学讲过他写数据库的程序用了编译原理生成代码,讲过写手机游戏的时候用虚拟机。前几天,我刚刚写了3千多的代码生成器,吐出来近6万行代码。这些
给我的印象也都没有今天这样深刻。

程序设计,是一种创造工作,就像写小说。与写小说不同的,你所创造的是一台机器,它可以做很多事,你甚至可以制造一台机器,它以代替你写作最终需要的
代码。

在所有的计算机本科都开设了相关的课程,叫做编译原理。在一定程度上,这是一个解析解。

* 关同学

今天我CIAC的导师请大家吃饭,辛苦一年。导师本人想参加,我托包师弟说:不欢迎他。如果导师出现,今天稍微拘谨的场面,就可能令聚会完全不同。

我们讨论了,我们吃午饭了,我们唱歌了,我们又吃晚饭了。

刚开始吃晚饭没多久,包师弟说:2012的上半年,我们有一些任务要完成,相当于本年度完成任务的40倍工作量。

他说:这些工作都是相似的。

可是这些相似的工作如果不能抽象出其中相同的部分,就没有一点相似。我们人类看到的相似,对于构造代码而言,毫无用处。

我看不出来相似。然后我想了几个方案,又都推翻--我在想从哪里抓那么多奴隶来,又用什么报偿他们,工程本身于他们何益。其实,同学们并非奴隶,必须保
证同学们有足够利益和受益,否则除了我自己,一个人也派不出来。

我说:包师弟啊,你能不能别在吃饭的时候说这个,我都吃不下去了。我真的吃不下去了。焦虑。而且,从这以后,我真的几乎没吃啥。

奇迹时刻。

关同学说:老师其实我想了,这些方案都是类似的。

我说:啊?

她说:所有的界面都可以……根据配置文件,new 出 一个 label来……

是的,不熟悉关同学的,对女生能否写好程序有疑问的,请仔细看一下,她,不是他。

而且,她也不必再解释这个方案,因为软件组可以全体解散,而剩下的工作,只需她一个人短时间就可以完成。

这就是抽象的力量。

她没有写GUI,而是解析配置文件生成了GUI;她绕过了令我头疼的C#如何表示GUI--这样就可以生成RC文件,在编译前,我考虑过的方案--而是在运行时,new
出所有的GUI控件来,相当于解释执行的。

* 后来

后来,全体软件组成员加入了硬件组,将承担下位机的代码。很好,我终于不用再讨厌他们用的IDE了,因为再也没有他们熟悉的VS什么的了。我们都开始进入
单片机或ARM的世界。

后来,关同学对我的赞不绝口指出:这个方案是你告诉我的啊。

我说:啊?

她说:就是大仪网的时候,你告诉我blabla。

我想起来了。不过,这仍不是我的方案,而是她的。一个方案之所以好(像这个,好到如此突出,以致你一眼就能看到,绝不可能错过,如果你看到了的话),是
因为它被应用在一个恰好合适的领域,恰好解决了一个难题。至于这个方案有多难有多容易,有多高科技,其实不是多重要。

关同学刚毕业的时候,我们在CIAC讨论一个框架,当时我说:这个倒是可以再抽象,不过我的方案有点耍赖了。

关同学说:你是不是要用函数指针。

是的。而且我非常欣慰了一下,因为学生优秀。

黄同学当时认为:函数指针,也没啥难的啊。

是的。函数指针一点也不难,能想到用函数指针解决这个问题,是一个高度。

关同学在此刻想到了一个如此好的方案,所以接下来的半年,我们都不必那么焦虑了。

这就是解析解。

关的方案,不是减轻了劳动,不是像我以工程的方法、各种测试 (关今天还提出用MATLAB生成测试数据,也很好,后来给齐同学用上了) 来控制代码质量,用框
架规范程序员的行为,这些都不是,关同学直接替代十来个人把40个用例生成了出来。

代码质量如此一致和优秀,是由图灵保证的。

* 后后记

上午,与一位技术人员和一位经理谈话。

我提到 通用的CMS > 定制的站点 > 使用CMS。

那位技术人员不认可。我说:我刚刚说错了啊,我不是指复杂,而是指困难。

那位技术人员blabla说,这不困难,只要如何如何即可。

我说:其实我们也不必达成一致意见。我的意思不是说我们无法实现,我说的我会收更多的钱。

争执略去,我同意那位技术人员的下面这个观点 (大致意思,我翻译过的) ,但是当时没有时间表达:这不是工作量,而是更高的高度。

是的,那不是更复杂,不是更消耗时间,甚至不是更困难。

那就是更值钱。

关同学用事实告诉我:一名战士完全可以是一支军队。没错。

以上首次发布于[2011-12-31 01:19],三年多来,我们又有进步,以后再细说。
编辑于 2015-06-06

文章被以下专栏收录