现代软件工程 习而学的软件工程教育

茅于轼先生写了一篇博客 ( http://blog.sina.com.cn/s/blog_49a3971d0102dufj.html ) 纪念茅以升先生提出的 习而学的工程教育:

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

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

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

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

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

image

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

 

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

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

 

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

从我有限的了解来看, 大学的管理人员比较在乎自己的学校是哪个级别 (某部直属/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.

 

表一是所有专业必修课的安排:

软件工程 习而学的教学计划各学期周学时分配
一年级二年级三年级四年级
类别名称学分总学时授课实验上机实践学期安排
计算机导论1.52418 6 11.5          
数据结构 (C 语言)46448 16 14          
计算机新技术与产业发展11616   11          
数字逻辑2402416  12          
C/C++ 程序设计3.56448 16 2 4         
汇编语言程序设计23216 16 2 2         
软件测试技术入门1168 8 2 1         
限选Java语言程序设计23216 16 2 2         
C++ 高级程序设计35640 16 3   3       
计算机组成原理4645212  3   4       
限选C# 与 .Net框架基础23216 16 3   2       
限选Web 前端技术开发34824 24 4    3      
操作系统实践 (基于 Linux)23216 16 4    2      
限选人机交互技术23216 16 4    2      
高级软件测试技术23216 16 4    2      
限选移动平台应用开发23216 16 5      2    
数据库原理及应用34832 16 5      3    
计算机网络34832 16 5      3    
限选算法分析23224 8 6       2   
软件工程46432 32 6       4   
信息安全技术23224 8 6       2   
操作系统原理34840 8 7         3 
编译原理35640 16 7         3 
软件项目管理23224 8 7         2 
毕业设计(论文或实际项目)1216周    8          12

限选意味着学生必须在几门课中选择。

 

表二是专业选修课的安排 (课程是学校提供的):

 课程学分总学时授课实验上机实践学期
科技英语(英)A1.52416  84
计算机软件日语基础23232   4
嵌入式程序设计23224 8 4
人工智能23224 8 5
计算机视觉23224 

8

 5
图像处理 23224 8 5
科技英语(英)B23216  165
数据仓库与数据挖掘23224 8 6
虚拟化技术与云计算 1.53216 16 6
地理信息系统导论23224 8 6
系统仿真与虚拟现实23224 8 6
形式化方法2.54040   7
计算机图形技术23224 8 7
并行计算23224 8 7

科技英语也要增加实践的内容, 学生为什么不能用学到的科技英语读论文,写摘要, 做翻译, 写博客, 做英语课件?

 

表三是数学物理课程的安排:

软件工程 习而学 教学安排 (数学物理)各学期周学时分配
一年级二年级三年级四年级
类别名称学分总学时授课实验上机实践学期安排
高等数学2A58080    23         
高等数学2B69696          33   
线性代数及其应用3.55656             3.5 
离散数学导论134848    3          
概率论与数理统计134848           3   
大学物理2A-B7112112        4 3    
物理实验A127324         1    
物理实验B127 27          1   

 

 

不应该忽略的还有必须学习的各种政治思想课:

课程性质课程名称课程编号学分总学时授课学时实验学时上机学时实践学时各学期周学时分配
第一学年第二学年第三学年第四学年
12121212
 16352311  41           
思想道德修养与法律基础510005534848   3          
中国近现代史纲要211113923230  2 2         
马克思主义基本原理211114034848      3       
毛.泽.东思想、邓.小.平理论与“三个代表”重要思想概论211114169657  39       3   
形势与政策教育5100045-522128128   0.50.5 0.50.5      

 

我对于政治思想课是外行, 唯一的建议是:  在上 <三个代表> 课程的时候, 要求学生针对校内的 IT 系统, 采访群众, 搞清楚下面的问题:

我校的信息服务系统是否代表了先进生产力的发展要求?

是否代表先进文化的前进方向?

是否代表我校广大师生的根本利益?

具体表现在哪里?

然后发表博客。

 

------------------------------------------------

注1:

“Learning by Doing” :

     我以前接触过韦钰老师的 “做中学”/ “Learning by Doing” 理念, 虽然它强调的是儿童和少年时期的学习, 但是我想这种方法对于任何年龄的人都适用。

 

注2:

大马哈鱼洄游模型, 三文鱼模型 见博客:

http://www.cnblogs.com/xinz/archive/2011/12/03/2274445.html 

 

注3:

有些人也许觉得这种方式太创新了,  其实加拿大的 滑铁卢大学 计算机系 早就在做类似的事情, 甚至更工业化, 更系统化。 他们计算机系的学生本科就是一年有三个学期,  一个学期 (4 个月) 的课程学习, 然后接着一个学期的工作 (Co-op, internship, 实习生),  我的一个同事就是这样完成本科教育 -  上了8个学期的课, 穿插了6 个学期的实习生工作。 官方介绍:

http://cecs.uwaterloo.ca/about/

 

注4:

我们都知道要练习,  但是怎么练习?  这里有探讨:  http://www.douban.com/note/260623954/ 

引文: 学习科学大量研究表明,成人的最佳学习方式并非独自练习,而是在情境中学习。有效学习是进入相关情景,找到自己的【学习共同体】,然后学习者刚开始围绕重要成员转,做一些外围的工作,随着技能增长,进入学习共同体圈子的核心,逐步做更重要的工作,最终成为专家。

这就是学习科学日益主流的观念:从【情景学习】出发,当一名【认知学徒】,它的要点有:

* 找到学习共同体:因为大量知识存在于学习共同体的实践中,不是书本中,所以有效的学习不是关门苦练,而是找到属于自己的学习小团体。如程序员在类似于github这样的网站练习编程。
* 隐性知识显性化:隐性知识是使人们有能力利用概念、事实以及程序来解决现实问题的知识。
* 模仿榜样:榜样可以是现实生活中的导师,也可以是网上的导师;
* 培养多样性:在多种情境中实践,以此强调学习广阔的应用范围。如裁缝出师并不是已经练习了一万小时,而是能够缝制出足够好的,各种各样的衣服。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代软件工程 教课心得

现实世界是最好的老师, 我们这些叫 “老师” 的人, 充其量是个助教。 但是有些助教却不让学生见到老师。 **************** 老师都想把课教好, 学生都想把课学好. 但是我们常常看到一个学期过后, 老师, 学生都有很多抱怨 (例如: 各种良好愿望和计划在实施中的问题). 看了上…

微软学术搜索项目 10个版本的历程

这是我在微软亚洲研究院参与的项目之一, 从 2009 年秋天开始, 我们小组把它从一个研究原型发展为涵盖全学科的学术搜索门户。 它索引了 4千万论文, 2千万作者, 6 大实体类型, 8 种数据可视化功能, 具有开放的API 平台和手机客户端. 下面说说项目的发展: 2009/8: 内部发布 alp…

以实际产品为例, 进行软件工程训练的作业

每个小组 (结对) 从下列产品中选一个, 按照下面的说明写软件测试报告, 分析并提出建议, 写一篇博客 (包括四部分)即可。 产品1. 必应词典客户端 (http://dict.bing.msn.cn/) 产品2. 必应缤纷桌面 (http://desktop.bing.msn.cn/) 产品3. 微软学术搜索 (http://academic.researc…

现代软件工程讲义 9 测试 QA 的角色和分工

测试的角色 (Test) 要独立出来么 ? 独立出来的测试角色怎么才能发挥作用? 有些成功人士和成功的公司号称没必要有独立的测试角色 (Test), 你怎么看? 最近又看到一些关于开发人员要不要负责测试的讨论。 例如: http://www.aqee.net/on-testers-and-testing/ 大多数的开发…

程序设计作业: 车模+数模 = ?

我上学的时候只听说过 “航模”, 没听说过“数学建模”这门学问. 这几年在简历里看到过不少人号称数模得过什么奖之类的, 我都没好意思问太仔细。 在帝都开车经常遇到堵车, 我于是想到了一个车模的问题。 我想请大家帮着给这个车模搞个数模, 求个解法: 想象帝都北四环或北五…

计算机考研的调查和改进建议

几星期前, 我在微博上讨论考研的事, 有专家建议不如把意见整理出来, 说不定可以转告给相关方面。 我没有考过研, 问了公司的同事们, 绝大多数都是保研的, 也没考过。 我从网上下了一份模拟题, 好像还挺难&#xff0c;有一种要翻书的冲动。 全国有多少学生为了考研而奋斗? …

2012 夏季高校微软俱乐部活动 - 开门创新

创新啊创新, 大家都在讲创新。 一般的理解, 创新就是公司内部关起门来想, 实验, 内部评审, 然后申请专利什么的, 其实也有开门创新的办法: http://www.innovationexcellence.com/blog/2012/08/13/40-examples-of-open-innovation-crowdsourcing/ it is about bringing extern…

笔记 - 高等教育的创新

教育是一个社会发展的支柱, 你和我能看到并理解这个博客, 教育功不可没。 高等教育的形式并不是一成不变的, 高等教育一直在演进, 变革中, 最近一股“online higher education” 的浪潮在美国兴起, 貌似突兀, 其实有规律可循。 在关注最近的在线教育浪潮之前, 我们看看美国高等…

现代软件工程讲义4 Scrum/Sprint

Advanced Software Engineering, Development Process, Scrum/Sprint 软件开发的流程有很多 (看 各种方法论概述), 我也写过一篇博客 (酒后的敏捷) 谈了谈最近比较时髦的开发流程。 今天我们不喝酒, 正襟危坐地说说敏捷这一路 Scrum/Sprint 开发方法. 从理论上看, 这个方法真…

北航 2012 秋季 现代软件工程 两人结对 作业要求

Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] Design and implement an Elevator Scheduler to aim for both correctness and performance, in managed code. Skills to learn and practice: a) Peer to peer collaboration b) Requirement …

北航 2012 秋季 现代软件工程 团队项目要求

同学们的小组要在下次课上 (10/15) 决定做哪一个项目 (按次序挑选), 确定之后写团队博客描述他们要做的究竟是什么系统 (不懂的地方可以在博客上提问)。 这次课程有10 个学生团队, 我们有 10 个备选项目. 各个团队玩了一次黄金点游戏, 决定了挑选的次序。 第一组项目 : …

现代软件工程 学生阅读和调查作业

大学生都是读书人, 要多读书&#xff0c;多向前人学习, 多思考。下面的读书和调查作业必须在截止日期前发表在个人博客上 (也可以转发到团队博客)。 同学们的博客都在这里: http://www.cnblogs.com/xinz/archive/2012/11/05/2754729.html 博客1: 阅读下列博客/文章/教材,…

北航 2012 秋季 《现代软件工程》 博客列表

如果你写了代码, 但是从来没有实际运行过, 那你究竟写了代码么, 还是在软件工程课上做的梦? 如果你写了文档, 但是从来没人读过, 那你究竟写了文档么? 在我们的课程中, 我们通过实际的项目和公开的博客向世界证明同学们真的写了代码和文档。 团队博客 (5-7人的团队要花10…

现代软件工程讲义 7 设计阶段 Spec

在前一个博客里 (典型用户), 我们讲了怎么收集, 分析和验证用户的需求。 这里我们讲 spec – specification Specification, 又叫spec, 有两种: a) functional spec, 软件功能说明书, 主要用来说明软件的外部功能, 和用户的交互情况 (把软件当作一个黑盒子) b) technical spec…

北航 2012 秋季 软件工程课 M2 要求

祝贺同学们完成了第一个里程碑 M1. 经过报告/评论/Postmortem, 大家对各自项目在M1 的优缺点都应该有很深的了解, 也理解到做一个好的软件和实现一个算法的差别。请把这些对于软件工程的感悟体现在M2 的具体工作结果中。 关于转会 - 软件工程师换工作是常有的事&#xff0c;…

现代软件工程 2012 北航 项目复审模板

这是现代软件工程课在北航的项目复审要求。 这次我们有下列 10 个团队, 他们做了一些有意思的项目&#xff1a; 有七个小组合作&#xff0c;携手打造一个叫 学霸 的网站: 100Years 网页收集和归类工具76er 网页收集和归类工具FightingSnail 网页元数据抽…

现代软件工程讲义 8 软件的血型

[这是 现代软件工程讲义 的一篇] 一个软件团队经历了计划/设计/开发等阶段, 达成代码完成 (Code Complete) 这一目标&#xff0c;似乎后面的事情就水到渠成了. 其实不然, 软件生命周期的最后阶段往往是最考验团队的&#xff0c;不但考验团队项目管理水平&#xff0c;应变能力…

现代软件工程讲义 6 用户调研

[现代软件工程讲义 的一部分] 软件开发的过程, 就是 “用户最需要的东西” 在下面这一链条中传送&#xff0c;转换&#xff0c;实现&#xff0c;扭曲或丢失的过程。 用户最需要的 > 用户表达出来的 > 软件团队能理解的 (老板/PM) 团队的商业目标 > 软件团队成员具…

软件工程讲义 0 微博上的软件工程

[现代软件工程讲义] 有舌尖上的美味, 也有微博上的软工。舌尖上的美味各有千秋, 而微博上对软工的抱怨都是相似的。 下面是我在新浪微博收集到大学生对软件工程教学的反馈: 师生关系&#xff08;不限于软件工程&#xff09; 教材 上课 & 老师 实践 & 作业 考试 考完…

现代软件工程讲义 5 团队合作的阶段

[现代软件工程 讲义] 团队合作要经历的阶段 1 萌芽阶段 萌芽&#xff08;Forming&#xff09;阶段&#xff0c;就像小苗破土而出&#xff0c;柔弱但充满希望。在这个时候&#xff0c;团队成员刚刚接触到团队的宗旨&#xff0c;同时很可能刚刚互相认识。在学校的环境中&#x…