美国的学校喜欢动不动就让你来一篇课后专题设计。从小学开始这里的孩子就有这样那样的专题设计。孩子们普遍倒是拿专题设计挺当回事儿的,也挺喜欢和享受这样的动手或实践机会。但是,大学里的专题设计就往往会把你搞得筋疲力竭,苦不堪言。我们在学习一门叫计算机编译器(Compiler)的课程时,对专题设计就有刻骨铭心的感受。
那是一个在暑假短学期中开的课。讲课的K教授是七十年代宾夕法尼亚大学毕业的博士。他对学生的严格在我们计算机系里是出了名的。本来总共就只有六周十一次的上课时间,K教授却给我们安排了四个课后的专题程序设计。你可以用任何程序语言,分阶段完成词汇分析(Lexical Analysis) 、语法分析(Syntax Analysis)、剖析器(Parser)和编码器(Code Generator) 等四个部分,最终产生你自己的程序编译器。从第二周开始,一礼拜一个。每一个设计,不仅要有程序编码,还要附上你的输出结果。为防止作弊行为,他要求学生把程序存入软盘,一并上交,以便于他的抽查。另外还对课程设计的包装也做了严格的规定,非得用某某牌子的文件夹装订方可。否则自动下调一个分数段。
那次的专题程序设计是四个姊妹式的题目。就是说,只要是你第一个设计失败,后面的设计你就不会走得通。结果是你的成绩会不及格,下次还得重修。即浪费时间,又浪费金钱。所以,每一个学生都是加着十二分的小心听课、记笔记。
那时,我们有很多人都是非计算机专业的人改行的。之前,还没有写过大型的软件。甚至有人连微软的可视C++编程器都是第一次使用。要在短短的四五个星期内完成编译器的编程,无疑是一次巨大的挑战。大家根据K教授给出的一段有五十几行程序指令的题目,开始了我们的第一个程序设计。K教授要求我们在三天后交设计。允许三人一个小组进行讨论。但是,三个人必须独立完成各自的编程设计。
K教授给出的题目,是一环扣一环。而且尽是那种墙角旮旯儿都难得找得到的程序表述方式。“这整个是一个变态,题目出的如此刁钻。” 有同学们在忿忿地抱怨着。
为了最大限度地节约时间,我与另外两个同学组成了一个小组。我们一起分析题目,一起设计程序流程。当时,我们对计算机编程还没有象现在这样的概念理解及经验。一切设想,都要经过反复的摸索,反复的实验。很少有一次就通的程序。有时,为了排除一个逻辑错误,要反复调试上几十次。深夜两三点钟大家还在电话上交流讨论,更是家常便饭。
第三天上课时,人人都交上了一本厚厚的、装订精良的程序设计。每一个人红肿的眼睛,告诉我们在过去的三天里,大家都没有怎么休息。不止一个的同学在课间几分钟的休息时间里,就把自己送入了梦乡。
在K教授给出第一个设计的成绩后,本来有二十七个学生的教室,只剩下了十九个人。那些同学都知难而退了。
在接下来的几个编程设计中,我们小组的几个人又是没日没夜地写程序,一条一条地调试指令。没有一个人能在凌晨三点钟以前休息的。有一次,我们在调试指令剖析器时,大家对如何解释记号模式(Token)时有了分歧。大家的工作也随之停了下来。有人提议给K教授发电子邮件问问。
令我们感到意外的是,K教授几乎是立即就回答了我们问题。当时已经是早上三点半了。“很高兴你们仍然在工作,注意休息。”
“没想到老K也没有睡啊。还在网上趴着哪。” 我们在心里对K教授有了一些别样的感觉。
“实在是盯不住了。这次就自动下调到B吧”有几次,我们中有同学想放弃。
“再试试,说不定能通” ,“既然老K能出出这种题来,咱们就能给他做出来。” 我们又相互鼓励着。
最后一次的编码器设计我是在交设计的截止日期当天的清晨四点钟左右才基本完成的。虽然,还有些结果输出方面的问题,但已经是我当时所能得到的最好结果了。我有些激动地拨动电话给我的同学。对方拿起了电话,却是已经累得无力在电话里分享我的快乐了。
我们小组的三个同学最终都顺利地通过了K教授的考评。尽管后来大家对K教授的评价有褒有贬,但我心里总是非常地感谢K教授。是他给了我第一次大型编程的机会,也是他第一次教会了我们用软件工程师的思路来考虑问题,使我们的逻辑思维方式、程序语言知识和编程技能等方面都得到了很好的锻炼。使我们又一次体会了挑战自我、战胜自我的感觉,自信心也增强了许多。为我在日后的工作奠定了良好的基础。
小组同学的紧密合作,即让我们充分体会到了团队合作的真谛,也使我们之间产生了一种同甘共苦的朋友之谊。其中的两位后来还结成了表亲。
“嘘嘘,告诉你一个小秘密,老K没查出我设计中的错误。嘿嘿。”
金一
2005年3月于美国康涅狄格州