有感于今天软件工程课程教学研讨所涉及的话题。
其实在多个场合和来自不同学校的老师讨论过本科或者研究生的软件工程课程,大致回想一下,有如下几个有趣之处:
(1)几乎所有人都承认软件工程课程难上;
(2)很多人都说在校学生(或者说没有工作经验/经历的同学)认识不到软件工程理论知识的重要性,上课难以听进去;
(3)很多人都说那些有工作经验/经历的同学(或者在职学生,或者在外面工作实习的学生),对课上所讲工程理论知识很有认同感;
(4)几乎所有人都认为实践训练很重要。
其实“有趣”这个词用的并不准确,我想表达的是,作为授课老师,在感性和直觉经验层次获得了这么多共识,本身已经很能说明问题了,但是似乎没有人从实证的角度来回答这些问题。不止如此,这种特征的问题在软件工程领域似乎还不少。比如:
(1)大家都认为没有丰富工作经验的人很难整理清楚需求;
(2)代码量不够的人很难做好质量控制工作。等等
这些问题的讨论可以引出几乎没有尽头的问题,动辄就会有人从管理、技术、人员、项目等多个维度来系统性分析。不管哪个维度,想说的都是软件工程有什么。翻开任意一本软件工程教材或专著,都会从这些维度展开论述。这说明这构成了这个领域的共同知识,于是就有了软件工程知识体系(Body of Knowledge),而且还专门配合知识体系定义和建议了相应的课程大纲。但凡讨论软件工程知识的系统性时,就离不开这个知识体系。我以前没搞明白,现在仍然还糊涂的是,如何应用那个知识体系来解决工程问题呢?我总觉得,这其中还少了点什么。打个也许不恰当的比喻,知识体系好比是某套经典拳术,比如太极拳,从起式到最终收尾,一环扣一环,缺一招一式都不可以,练拳者必须严格遵守。而解决工程问题呢,就好比是搏斗,对手是工程问题。如果你是高手,对手就变得弱,于是无招胜有招,随意使用招式,哪怕是笨拙的招式,也可以很好的解决问题。但如果你的道行不够,那么对手就很难缠,你会不断的陷入沉思和被动,对手这样变化,意味着什么呢?后续又会怎样呢?我该用探手,还是撩腿来应对呢?......
从这个类比出发,软件工程教学和少林武术学校本是同源。小时候喜欢看武侠书,痴迷到就想不读书而去武校练本领。武校所教和所练,大致包括三个方面:
(1)锻炼身体基本素质,包括力量、速度、耐力等;
(2)学习多种术:拳术、刀术、棍术等;
(3)组合对打和搏击。
毫无疑问,学员最感兴趣的一定是(3),最枯燥的一定是(1),(2)介乎其间。最容易出问题的是(2),搞不好搞成表演性的学习和训练了,动作潇洒漂亮,但是一到实战就歇菜。前段时间热潮的自由搏击对战太极,大概就是如此。写着就扯远了,回到软件工程。我们仍可以类比来分析问题:
(1)基本素质:编程和测试;
(2)N术:各种需求分析方法、设计方法、测试方法、管理方法等;
(3)搏击:解决工程问题。
这似乎就有点意思了,知识体系其实定义了一套拳谱,当然都是前辈大师们留下的宝贵财产,其权威性和价值不容置疑。但我现在是菜不能再菜的入门者了,再厉害的招法,在我看来都和广场上的大爷大妈练的把式差不了多少,我只能看出那只是一个姿势,其中蕴含的深奥道理,我看不出来,更不懂。
所以,软件工程课程之难在于:
(1)学生需要达到什么样的基本素质,以及如何才能具备相应的素质,从而领会和掌握(2)中的道?
软件工程课程不能自己扛下所有问题。必须要依赖于前序的编程、算法等课程。换句话说,要看看前序课程都把学生的素质练到了什么程度,否则让只能跑2000米的人上来练马拉松,要么是无法达成目标,要么是直接折了,要不然中间搭了别人的车,反正你可能也不知道。所以这带出来两个问题:
(a) 基于你的学生所具备的素质,你如何设计(2)和(3);
(b) 你很清楚你需要学生具备的素质,尝试让前序课程为你服务。
(2)诸多道如何选择(没办法所有都讲授或学习)?总不能对敌时他打他的,我打我的,不管对手做什么,先来一套72路长拳吧......
须知前辈们基本都是在为了解决某些特定问题的场景中提出/悟出了某些道,然后加以抽象和一般化处理,公布出来。换句话说,如果尝试学习所有的道术,其结果只能是不伦不类。选择就必须要有目标,任何一门课程,其本身就是一个系统,没有目标就不存在系统。只能围绕目标来选择相应的道术加以讲授和训练。其他的道术,其精神要义基本相仿,相信学生具备这个意识和能力,将来可以自己根据情况去学习的,特别是干不倒敌人时......
(3)如何既能干倒对手,而且还自觉且优雅的使用一种或多种道?
在两个人实力相差太悬殊时,就不会有自觉和优雅的问题。一个张无忌般的武林高手对战一个普通来百姓,需要摆弄招式吗?拜托,直接一伸手就解决战斗了。所以,必须针对学生具备的素质情况,设计相适应的对手来练他,且要随着学生素质和能力的提升,不断提升对手的水平。好的设计应该是让学生能够到,但是必须垫着脚尖,还得用力向上蹦。
归纳下来,软件工程课程之难,难于条条大道,且都无形;难于如何让学生够得着相应的道;难于如何学生在够得着一种道的情况下,能举一反三来悟出其他的道。