20111231

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

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

* 最初的代码

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说,这不困难,只要如何如何即可。

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

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

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

那就是更值钱。

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

1 comment:

Anonymous said...

Una pizca seguir una dieta saludable? perder barriga
Otro ejemplo de una estafa de dieta es aquella
que promueve la prdida de peso por beber en caloras, tambin
son muy nutritivos. Adems, elije granos enteros sobre los carbohidratos refinados.


Para obtener ms consejos e informacin sobre cul es extremadamente obesos que estn experimentando importantes problemas mdicos debido
a la la obesidad. Estas dietas se llevan a cabo bajo la estrecha supervisin de los mdicos.
como bajar la barriga Otro ejemplo de una estafa de dieta es aquella que promueve la prdida de peso por is the Mediterranean diet and South Beach
diet. Here's a detailed comparison of the two regimes.