构建之法,运用之妙,存乎一心:读邹欣《构建之法》
1. 构建之法,存乎一心
史学理论与史学史,是把历史自己作为研究对象的学科,前者讨论历史本身所研究的内容,后者讨论历史研究本身的历史。这种对于抽象的抽象的研究,正符合计算机领域 meta... 这样的思想。当年 xml 刚出来时,不少计算机和图书情报的大学生照本宣科地提到,xml是关于数据的数据,是 meta-data。
史学理论与史学史专家周老师在谈到史学理论的时候说到 (大意) ,学习史学理论与史学史,必先有历史的修养,要努力了解更多的史实,也就是先了解历史所研究的对象,然后才能涉及到以历史本身作为研究。
我想,周老师的意思是,没有"肤浅的"认识之前,先不要着急讲深刻。
一个例子事实与推论的例子。在网上在现实生活中,都有人跟我提到过,我国人民的善良与热爱和平;作为旁证,中国自古以来就没有杀战俘和屠城这样的事。这时,我愿意以一个建议结束讨论,就是请他去读一下五代十国那段历史。如果连基本史实都还缺乏,遽然得一结论过于草率了。
在讲授软件工程类课程时,我也面临这样的难题,正如《构建之法》作者所说,是同学们对此毫无感觉,既不觉得有用,也不觉得有趣。这大致就是夏虫不可语冰的意思。很多同学在学到软件工程的时候,代码量总计可能不到1000行,单一项目最大代码量不到200行。如果去除语言类或算法课作业,代码量就更少得可怜。
软件工程所讨论的是当代码量巨大、当涉及人数众多、当项目需求多变时所要解决的问题。而同学们在学习时根本就没有这样的需求。200来行的小程序,没有软件工程思想,也能完成,甚至更快捷。
所以,《构建之法》的作者在教学中,要求学生完成大量的代码,让亲身的经验证实软件工程的手段是必要和有效的。除此以外,别无他法。
在教学中,可能最大的问题还不是学生积累的代码量小,而是教师也是如此。作为实践类课程的教师,你又写过几行代码,读过几本软件工程著作呢。
我的偶像YMH曾经考虑过一个问题,算法课该让哪些老师上呢。我提议:这个好办,找几道ACM题,凡是申请上算法课的老师在线答题,谁答得好谁上。偶像说,那有些老师不会编程序啊。我说:不会编程上什么算法课。偶像大笑。
我坚信,一个优秀的将军,也许并非战场上最勇猛的那个战士,但是至少是合格的士兵。软件工程教学,教师须是身经百战,学生须亲力亲为,否则,玩具性质的项目、几行代码的实验课、走走过场不关心实用的工程,都是耍流氓而已。
实践类课程,理论如何应用,只能以真实案例呈现 (如果需要规模,那就应该有规模),而无法用形成上学的方式推演--否则就意味着工程可以自动化,无须人的创造性参与。运用之妙,存乎一心。
2. 阵而后战,兵法之常
如果工程思想的教学只能依靠师傅带徒弟,口口相授,那么教材和经典著作还有什么意义呢?
如果是这样,面对软件工程书,明白的就是明白了,不明白的还是不明白。已经受过苦的人,有过相同经历的,能会心一笑;没吃过苦没糟过罪的,仍然鲁莽行事,事后一拍大腿,"哎呀邹欣已经说过这事儿啦,我当时怎么没明白呢,古人诚不我欺啊"。事实上,即使事后诸葛亮,也是亡羊补牢,尤未晚也。我们有多少知识是本科的时候学了,毕业以后多年才发现,原来在某个意想不到的地方才能用到。与课本相印证,能告诉你,你的失败并非偶然,你的境遇并不孤独,未避免同样的悲剧再次发生打下很好的基础。
它还会告诉你,所经历的痛苦,可以用更形式化的方法,或者"最佳实践"得以解决。这比你自己另搞一套,闭门苦苦钻研十年,一抬头发现古人早完成了要好得多。我本科的时候写过一个程序,打印出来,把打印纸抻开,比我还长。用的语言是 BASIC,用行号编辑出来的。随着程序的生长,我越来越为"某些功能在好几个地方用到"感到痛苦--我用的那版本里或者我当时的知识里,还没有函数和过程。后来我终于艰难地完成了那个程序,在读一本1980年代的书的时候,发现了"结构化程序设计"思想。如遇故人,如蒙大赦。没有先前的经验,固然不会让我体验这么深刻,如果没有读到前人的总结,我们就不过是一次次重复失败而已。
我们一生,一共也完成不了几个项目。以岳飞之善战,据统计,他一生经历不过几十战役。他的经验或者理论,想来大多是熟读孙子兵法和分析别人的战例得来的。
所以说,阵而后战,兵法之常。前人的总结,现有的理论,适合的技术,优秀的paradigm,能给我们一定程度的行为约束,帮助我们更好地解决问题。技术犹刀也,是我们手臂的延伸,而且那上面还附着前辈杀手的灵魂。
3. 武穆遗书 有多厚
教师在选择教材时,除了受自己学识所限,要考虑学生的专业基础预备知识,还有一个有些无厘头的压力。
就是教材的价格。
领导们说,教材太贵了学生买不起,教材太厚了学生就不看了。图书馆采购的时候,鲜有优秀的国外教材和经典著作,而多是高校教师混成果用的薄册子。问为什么不多买些 o‘reilly 这样的优秀作品呢?答:太贵。
同学们也不怎么买书,原因也是太贵。对于抱怨书贵的,侯捷颇有微词,书是用纸张还是用知识来衡量价值。最近,我还看到一个说法,深以为然:你的第一份工作的薪水,与你大学期间所买的技术书总价相抵。其实一本书能有多贵,一场电影,一顿大餐?这些都是过眼云烟,而好的知识,越早了解,受益时间越长,在你剩余的生命之中全都可以发挥作用。请邹欣讲一门课程需要多少钱,请K&R当面给你讲讲C语言,请SICP作者给你剖析一下lambda算子构造邱奇数需要多少钱?上网打游戏感受快乐,你的青春值多少钱?
软件工程经典教材,《软件工程:实践者的研究方法》,还有《代码大全》,都非常厚,《构建之法》相对来说薄多了。我想,这是作者的一个妥协的选择。
作为大学本科的软件工程,不如叫做软件工程导论更合适,因为受课时和此时学生的经验所限,能涉及的知识都是蜻蜓点水,不得深入。导论类课程,到底是应该罗列完整的概念,这些名词学生们都听说了,从而"知识完整性"得到保证,还是浅显地了解其中的思想 (也许用了完全不同的名字),还是把徒弟领进门,让有兴趣的同学自行继续深入,没兴趣的同学就此止步,从思路上得到此许受益。这种争议见仁见智。
不过如果我是一个学生,我更愿意像读小说或者看电影一样,看到一些故事,以后用于类比,作为模板;而不希望接受高大上抽象的概念,如果能用非常好使,但是正如初高中背政治题,答案很清楚,唯独不知识该用在哪个问题上。
如果教材还要再薄一些,我希望它们是科幻小说。我根本不关心这些方法如何具体实施,理论依据是什么,你就领我去看它绚烂的效果,让我亲眼见到它好使得不得了。剩下的,当问题横在我的面前,解决问题的迫切会让学习的艰难、参考书搜集、教材的价格、案例什么的,所有这一切困难迎刃而解,不复存在。
这种效果的反面也正是现实,作为教师,你都不会编码,你都不会用软件工程的这些方法,怎么说服你的学生相信你学习你。所谓 learn from, 学生所学习的,不是教师的知识,而正是教师本人。
4. 题外话
从瀚哥开始,每届新同学都会问我一个问题:老师,你为什么这么关心项目的结果。
我知道,言下之意也包括,你为什么不更关心对我们的教学。
因为,我们以真实工程作为教学的工具。这是因为,没有人乐意做假的工程,仅仅为了学习目前还不确定是否有效的知识。这意味着,真实的工程必须存在,才可能用于教学,而真实工程不同于假的实验的是,如果它失败一次,以后就不会再有真实的工程了。也就不会再有真实的工程用于教学。
训练猎人的时候,要求师傅把猎物捆个结实,为了防止学徒害怕或怜悯它挣扎,还要给猎物打上麻醉剂,再给学徒穿上防磕碰的盔甲防溅血的服装,你为什么不再戴上护心镜和老花镜躲到绣楼里去。
所以,当你要求或接受真实工程训练的时候,你就给了我你的承诺。我把武器交给你,你要像我保护你那样保护你。无论这个承诺有多么的小,一旦你说出来,它就是我的,不再属于你;我有权放弃我的权利,你没有权利背弃你的诺言。
你,你们,背弃对我的诺言,我非常失望。我知道你并不在乎我失望与否,我也并不在乎你给我造成的损失,我在乎的是我所面对的我所关心的,是这样的世界。如果承诺不可信赖,未来还有什么可以期待。
------------------------------------------
博客会手工同步到以下地址:
[http://giftdotyoung.blogspot.com]
[http://blog.csdn.net/younggift]