关于“习而学的软件工程教育”的批判性思考
关于“习而学的软件工程教育”的批判性思考
邹欣老师的文章很有意思,文章分析了国内软件工程教育的主要问题:学习抽象的理论到底有什么用?我想这个问题,每一位计算机系、软件学院的学生都应该想过,我是计算机系的,理论上来讲,跟“软件工程”专业还有些区别。邹老师的文章是站在“软件工程”专业的角度来写的,那我就以一名计算机系学生的角度分析之。
文章给出了一个近乎“颠覆式”的课程体系,具体表现在:实践课在前,理论课在后,实践课时多于理论课时。先不看这样安排正确与否,我们首先来考虑一个问题:为什么在本科会有“软件工程”这样一个专业?
为了回答这个问题,我们首先来看下,计算机学科位于全美前3的CMU与MIT是否在本科开设了Undergraduate program of software engineering.
一番bing之后,我只找到了面向master的专业,在CS专业的本科阶段,只有关于软件工程的概论性课程。
既然全美顶尖的两所大学没有在本科开设软件工程专业,那么,我们在探讨如何进行本科阶段的软件工程教育之前,是否应该首先解决一个问题:为什么需要单独将软件工程开辟为一个专业?
文章中提到的设立软件工程一级学科一事确实令人深思。其受到阻碍,原因除了文中提到的因素之外,是否考虑过另外因素?比如:“软件工程”一方面太过工程性,一方面与计算机科学重叠过多,导致受阻。
“软件工程”是个特殊的专业,跟“计算机科学与技术”有着说不清道不明的关系,这种关系,较之其他学科而言,应属罕见。比如,“桥梁工程”作为一门一级学科无可厚非,因为没有一门“桥梁科学与技术”与之争宠。而“软件工程”脱胎于行业需要,想在学术领域占据一席之地难免有阻力,同时,考虑到中国国情:学校开设新专业需要教育部审批,文章中提到的各种“怪相”,也就不难解释了。
我认为,“软件工程”作为一门学科,无可厚非,问题在于他是否应该面向本科。我想,这也取决于中国国情,学生太多,让所有的人去学过多的理论不合适,不如让部分专攻工程,部分专攻理论与技术,将来各自的毕业生分别安排工作,到也不失为一种好的方案。
但是,问题就在于,目前国内大部分的软件学院在课程设计上,缺乏特色,说严重了,它们教的,就是计算机学院课程的简化版,以某航为例,数学分析(计算机)对高等数学(软件学院),线性代数对高等代数,离散数学(3学期)对离散数学(1学期)。。。列举这些不是贬低任何一方,只想表达:没有课程特色,毕业生如何具有竞争力?
从这种角度来看,博文中的课程体系就有一定进步意义了,具体体现在:
- 大量的实践安排,所有的理论课时安排较少,实践课时比例增加,有利于学生在实践中领悟理论,巩固理论。
- 将软件工程领域中作用不大的课程,如“形式化基础”改为选修,将“人机交互”等与软工联系密切的课程设为必修,体现了“软工”专业的特色。
- 有硬性的实习要求,让学生到企业实习,经历真正的软件开发、项目管理流程,这才是“软件工程”专业的真正目的所在。
说了这么多优点,我们也不能够忽视某些潜在的问题,如:理论课放到大三、大四,是否合理?
文章中提到了一点:《考研》
但是,学习理论课真的是为了考研么?至少笔者不那么认为。下面列举理论课在大一大二教授的原因:
- 高等数学、线性代数等与高中数学的基础知识联系较为密切,如果将其放到大三、大四教授,到时同学们很可能已经忘记这些基础知识,同时考虑到课程的理论性较强,这种情况下很难保证学习质量。
- 在大三、四阶段,同学们可能会忙着职业规划,找工作,做毕设等,在这种情况下,能否保证大家可以安心学习理论知识?而学生在大一、大二阶段,能够拥有学习理论课的良好环境,更能够心无旁骛地吃透理论知识。
- 另外,考虑学习理论知识的终极目的:训练思维能力。常识告诉我们,掌握一门技术比掌握一门理论难得多,在低年级教授理论知识,学生能够有充足的时间来理解、消化。同时,学习理论课程对思维能力的提升,是掌握一门测试技术或其他软件工程技术带来的益处所无法比拟的。
- 如果说:“等到大家学会技术后再学理论,会更容易理解理论,那么就能够更快的学习理论。”但这忽视了一个问题:为了技术而学习理论,容易造成理论学习的碎片化,同时,大家掌握了技术,可能会觉得理论不过如此,自己早已见识,这反而会造成理论学习肤浅、片面;又再者,如果先学技术再学理论,怎么能保证大家不会在学习技术的同时,由于不懂理论,而做出违背理论的傻事?
文章还提到了滑铁卢大学的教育实践,我认为,文章中提到的滑铁卢大学的例子不具备代表性,不能因为人家采用了这种方案,就说明它好,世界上更多的大学,包括最顶尖的,还是在采用着传统的教育模式,但它们每年仍旧会培养精英人才。滑铁卢大学的例子只能说明这样的方案是可行的,而不是最好的。
在博文没有反驳以上观点的情况下,我们仍旧不能保证博文中课程方案的可行性,同时,考虑到“软件工程”专业自身的特点,我们仍旧需要在计算机系保持目前的软件工程教育模式,或者说只进行课程自身的改良。