把颠倒了的工程教育顺序恢复过来,即他称之谓“习而学的工程教育”。

以桥梁建筑专业为例,大学一年级先学施工条例,二年级则学设计规范。这些学习内容不必解释条例和规范的理论基础,只说明其内在的联系。到三年级可以学结构力学,四年级则学微积分、线性代数、概率论和普通物理。但桥梁专业的微积分和物理学可以不同于机械系的,它们各有侧重点,有各自的例题和习题。学生越是到高年级,越是明白自己在低年级所学的道理,也就明白还有哪些道理至今在科学上还没有办法解释。于是学习成为一个自然的延续过程,成为一种终身的事业:活到老、学到老。

从我个人的学习和教学经历来看, 我认为给学生具体的, 能实践的, 能马上看到因果关系的教材和练习, 是激发学生兴趣, 好奇心, 求知欲的好方法。 我就是这样学习编程和软件开发的 (见下面的注解 三文鱼模型)。  所以我对 “习而学”的方法很有好感。软件工程有理论的部分, 有工程的部分; 有艺术的部分, 有手艺的部分; 在同学们达到理论/艺术的阶段之前, 大量的练习是必须的。

大家不妨看看这个陶艺课的故事,把学生分成两组,一组以出产的陶罐的量来评分,一组不要求数量, 纯粹以质评分。一个学期后,真正好的陶艺作品反而是出现在那以量评分的组里。各种道理值得大家思考。

抽象的理论和推导, 不是不能学, 但是我在学习和教学的过程中, 总是有 “学这些抽象的理论到底是为什么? ” 的疑问。 有些学生非常喜欢理论, 或者有些学生能克服自己的厌恶情绪, 把理论和推导学好, 记牢, 至少到考试结束前,  像下面这个图那样。 这些学生的考试成绩很好, 理论基础也很扎实, 也许能在广阔的 IT 行业找到自己的发展道路 (希望如此!)。

现代软件工程 习而学的软件工程教育_结构力学

对于工程类的学科来说, 教导学生理论本身并非终点,引导学生将所学技能自如运用于现实世界才是我们的目标。 那怎么引导呢? 大学老师们关心此事么? 

 

最近软件工程这一门学问在中国提升到了 “一级学科”, 我想起几年前去某大学开会, 某软件学院的老教授对大家说, 他一直在忙“一级学科” 的事儿, 大家问此事为何如此重要。 他说, 如果搞到一级学科, 他的博士生们答辩就不用去计算机系, 不用穿别人给的小鞋了!  我当时似懂非懂。 其实这事不光计算机界有,我所尊敬的科学家韦钰老师在回忆她科研的经历时说: ...

中国这个问题是很严重的。我们建立第一个学科的时候,我遇到了很大的困难。这些困难都不是来自政治界的,而是来自学术界本身,来自学术界某些权威。有位权威就是不同意给我立题和资助,说“你怎么能研究这个,你怎么能进到我的领域来” ...

 

后来看到更多中国高校的情况, 其实大家都在争一个自己可以占山为王的地界罢了。 至于科学啊, 培养人才啊, 技术的浪潮啊, 社会的进步啊... 呵呵. 

从我有限的了解来看, 大学的管理人员比较在乎自己的学校是哪个级别 (某部直属/211/985/...),  一些大陆的科学家比较在乎自己的学科是局级还是厅级,  我不知道世界级的科学家是否在乎自己的学科是一级、二级、还是三级, 我也有幸和一些世界级的计算机科学家接触过, 这个话题好像没人提起过。 作为一个写软件为生的工程师, 我倒是想实验一下, 如果我们用茅以升先生的 “习而学的工程教育”方法来改进软件学院的教育模式, 会有什么样的情况。

 

我用一个中国211大学的软件学院的本科教学计划为基础 (此大学以工科见长, 印象中此学校水平应该在中国大陆排十名左右), 做了如下修改:

 

  1. 把基础实践课放到大一, 一开始就要动手.

  2. 所有的课程的上机时间都加倍, 相应减少授课时间。老师在讲台上反复讲 “数组从0开始…”,不如在电脑上试试。 

  3. 把 <计算机新技术与产业发展> 放到大一上学期, 并用 <浪潮之巅>, 等反映行业变化, 生动活泼的著作作为教材 (原教学计划无教材)。  希望能让大一的同学知道 “学计算机软件能做什么?”   “计算机行业是怎样一个有意思的行业”。

  4. 把基本的测试技术作为 “软件测试技术入门”,  放到大一。 其余的部分作为 <高级软件测试技术>

  5. 针对软件工程的毕业生职业发展, 调整了两门课程的 必修/选修性质。 (例如: 把 <形式化方法> 变为选修课, 把软件项目管理, 人机交互技术变成必修课 )

  6. 大部分数学和物理课都推迟一到两个学年上课,  这样到了大三同学们可以根据实践的体会, 更好地学习。  另外有同学在大三时决定考研, 他们正好可以好好学习高等代数, 争取考个好分数。如果是大一就学了, 那大四都忘了, 还要从头学一遍, 浪费时间。 离散数学对于计算机软件专业的学习还是很有用的, 仍然保持在第一学期。

  7. 专业选修课放到大二下学期 - 大四上学期。

  8. 在软件工程课中, 强调团队合作 (见讲义) , 在其它编程语言课程中适当引入结对编程, 代码复审等方法。 [注4]

  9. 对学生学习编程语言有明确代码量的要求.  (每种语言 3000 行以上.  程序行数不包括空行, 注释行, 单字符行)。

  10. 对学生要有明确的实训/实习要求, 要到高水平的企业去, 而不是去低水平的企业混日子。 可以在短学期安排, 学生也可以自行安排。 [注3]

  11. 争取所有学生能用主流程序设计语言 (C, C++, Java, C#, 网页前端语言 JS, php, 基本数据库, 基本文件系统) 写实用的软件。

  12. 要求所有学生在入学时就建立一个自己的专业博客, 记载自己的作业, 专业上的成长与体会, 毕业找工作时展现这个博客即可。 

  13. 教学资源的建设, 老师和学生一起, 持续地把关于这门课的课件/资料/问答 都汇集起来形成结构化的wiki.