记得在学期的一开始,辅导员曾说过:“面向对象建模是教你如何写代码,软件工程是教你如何让别人写代码”。我认为这句话虽然听起来像外行人的评论,但在一定程度上也说明了软件工程课程的教学目的。软件工程课程开在第三学年,在我们上完了高级程序设计语言、JAVA、数据结构和面向对象建模后。也就是说,软件工程课程不再关心我们是否懂得怎样编写代码(因为在上过先修课程后,我们已经有了一定的面向对象编程能力)。

  软件工程与计算机科学是两门有一定联系却有着诸多不同的学科。

  Software Engineering ≠ Computer Science(http://blog.sina.com.cn/s/blog_553f355101017g6l.html)这篇文章中罗列了关于软件工程和计算机科学的一些名词:

  Usability可用性, Maintainability 可维护性, Requirement 可需求性, Safety 安全性, portability 可携带性, Estimation可评估性, testability 可测试性, Modifiability 可修复性, Scalability可量测性, Team Process团队过程, Architecture Styles 架构风格, Design Patterns 设计模型。

————————————————————————————————————————————————————————————————————————————————

  Computability  可计算性, Queuing Theory排队理论, Algorithms 算法规则, Formal specification形式规, language syntax/semantics 语言语法/语义, Cryptography 密码学, Correctness proofs正确性证明, Automatic Programming 自动化编程, Network analysis 网络分析, Machine Learning机器学习, Compilers 编译原理, OS Paging Scheduling操作系统的页面调度, Complexity 复杂性。

  红色的横线将软件工程和计算机科学分开。很明显,在软件工程中我们可以看到可用性、可维护性、可评估性、可修复性这样的词汇。从某些方面来说,这些“性能”可能并没有一个严格的标准来评判。从表面看上去,这些词汇就带着一些“感性”。而红线以下,我们可以看到诸如排队理论、算法规则、密码学、正确性证明、编译原理这些词汇。这可以从一个侧面说明计算机科学是一门严谨的、理论性的学科。这是软件工程与计算机科学的区别。

  是什么造成了这种区别呢?Software Engineering ≠ Computer Science说道:“Software engineering will never be a rigorous discipline with proven results, because it involves human activity.(软件工程从来不是一门缜密的学科,因为它涉及到人类活动)”。而人类是可塑性的,并且不可预知。软件工程需要人与人之间较频繁的交流,这是计算机科学的学习中不具备的。一个理解上的错误、一个表达上的不同,可能造成严重的后果。这也是软件工程为什么这么辛苦和具有可塑性(Software Engineering ≠ Computer Science)。

  怎样才能教好软件工程?The reflective practitioner perspective in software engineering education(http://blog.sina.com.cn/s/blog_553f355101017j8q.html)中给出了一种方法——工作室学习方式。基本的假设是,工作室是一个学习环境,学生可以在这个富有意义的学习环境中学习,这意味着他们将成为一个反思性的实践者。密集的学生与老师之间的互动(导师指导学生进行反思和审视自己的思维方式,他们的架构决定,和他们考虑的类型)逐步变成一个非常系统的反思性实践者。从建筑学科的专业人士看来,这是实现这一目标的唯一的教育方式。

  工作室的方法注定需要控制学生的人数,The reflective practitioner perspective in software engineering education中举例建筑工作室的人数在20人左右,这样每个人都能有充分的空间发挥。设想一个200多人的课堂,分成40个小组,教师不太可能给予每个小组充分的照顾,每节课的内容也不会很充实。最终的结果就是所有人“得过且过”,收获并不大。我想这也是国内多数大学在进行软件工程课程教学时所采用的不恰当的方法。

  作为北京航空航天大学的学生,我目前所接受的软件工程教学还算是较为理想的状态:一个教学班60-70人,分成10个以内的小组。这样每个组6、7个成员,能基本保证每个人都有工作,不会出现过多“打酱油”的情况。每次上课,教师也能有时间对每个小组进行点评;课后,教师也不会因为小组数量过多而无法监控每一组的情况。但是无奈的是,由于每个学校的情况不同,这种工作室式的方法无法普及。大班的填鸭式教学依然存在,当然这也与国情有很大关系。目前的国情要求我国的高等教育的目标是培养合格的、务实的工程师而不是“思考者”。

  要说北航软件工程课程需要进行的改进,我认为最好还是请本校的教师任教。从大企业来的人员固然经验丰富,但正因为如此,其不可避免的带来过多的那个企业软件开发方式和思维。