2018年7月北航举办软件工程师师资培训札记
2018年7月9日-11日,参加了由北航计算机学院联合微软邹欣老师、《构建之法》出版团队举办的为期三天的软件工程师师资培训会。
1. 培训背景
2018年春季学期,我承担了西北师范大学计算机科学与技术2015级两个班级(卓越班、民族班)的软件工程课程教学工作,为在教学中更有效地促进学生软件能力的发展,首次采用微软邹欣老师所出版的《构建之法》作为课程实验阅读教材,按照“构建之法”教学体系组织实施课程实践教学活动。教学实践中,一方面深切体会到“构建之法”对于学生软件工程能力发展重要的教学价值,同时也遇到了一系列较为棘手的问题迫切需要解决。2018年5月看到周筠老师发布的本次培训会公告,为更好掌握构建之法教学技能与方法、与来自全国各地的同行交流,求解教学中遇到的困惑以进行教学迭代改进,积极报名参加了本次培训会。
2. 培训内容概要:聆听了5个主题报告,2个知识讲座,参加2个软工项目实训。
主题报告一——微软邹欣老师:更有效的软件工程教学
要点1:采用构建之法教学体系讲授现代软件工程的目的:1)在开发使用软件的实践教学中,掌握现代软件工程理论和工具;2)培养的学生在专业水平上达到通过一流软件企业的用人要求。
要点2:软件工程教学师生三点共识:1)师生关系(教练与学生、导游与游客);2)课程的底线(如何处理参考别人的资料与抄袭、参考别人的软件模块-好事!);3)教学计划(个人、结对、团队项目、团队项目换人)。
要点3:教学要点:1)敦促学生带着明确的目的与问题进行学习;2)因材施教,即使是两个学生的困惑类似,也要给予不同的建议;3)保持自始至终的高要求;4)强调竞争;5)做有实际永户的项目;6)可视化进度管理;7)公开展示学生项目进展和产品;8)现场活动:写程序和写博客。
要点4:个人项目教学设计要求:1)要有一个展现个人能力的机会;2)测试用自动化测试,主要考察程序的正确性和速度;3) 对于基础差的学生,相当于编程课。
要点5:结对项目教学设计要求:1)两人互相学习;2)学会从别人的代码中学习;3)学会通过讨论交流自主解决编程小问题;4)学会用三明治方法给别人反馈;5)培养“同理心”。
要点6:团队项目教学设计要求:1)结构: Alpha阶段–评比-反思-换人– beta阶段-展示、评比–总结;2)题目选择:80% 做规定项目,20% 做自由选题;3)要做能快速验证的项目;4) 不要做需要长时间运营才能看到成效的项目。
要点7:关于助教:1)在国外绝大数大学行之有效、运行多年的制度;2)有付出,有要求,有报酬;3)助教:学生比例 1 : 30;4)助教教学职责:改作业、回答学生问题、打分、千帆竞发图;额外贡献:改进教案,工具;分享自己的实践(特别是工业界的角度);5)校外助教一样有效,陌生人社交更有效
主题报告二——北航罗杰老师:北航软件工程教学情况
要点1:课程基本教学信息:软件工程基础,三上开设,32学时,16周
要点2:软件工程课程能力培养目标:通过团队协作使用现代软件工具按照软件工程方法来开发高质量并且可用的复杂软件系统的能力。
复杂软件系统:具有一定复杂性、需要团队协作来完成的软件系统。
团队协作:两人协作、5-7人团队协作。
软件开发工具:充分利用现代工具来提高开发的效率和质量。
软件工程方法:构建一个有效协作的功能团队,综合运用极限编程、测试驱动、敏捷等软件工程方法和最佳实践,通过有效项目管理按计划的开发满足典型用户需求的可用软件方法。
高质量:能够使用技术性手段来确保所开发软件的质量。
可用:能够通过技术性手段来证明软件的可用性并获取用户的反馈。
要点3:课程教学目标:1)讲授高满意度的课程内容,评价标准:好的反馈;2)展示怎样交付一个实际的软件项目,评价标准:成功的项目和/或经验教训、项目的影响;3)从学生身上学习如何进一步改进课程;4)师生关系:健身教练/学员@ 健身俱乐部
要点4:课程讲授范式:1)开始维护以前同学开发出来的程序,理解程序;2)找bug,改bug,重构小部分代码,以满足用户的需求;3) 一部分同学可以开发测试用例;4)在现有版本的基础上做增量开发:a) 理解需求(这个时候理解了客户需求是什么);b) 设计;c) 开发;d) 回归测试(用到上面开发的测试用例来保证质量)
要点5:课程教学活动:1)课堂教学:研讨性教学、课堂练习、作业点评、讨论、团队项目汇报;2)课后作业:博客作业;3)项目实践:个人项目(1周)、结对项目(2周)、团队项目(8周)、总结回顾(2周)
要点6:教学考核:
1) 平时作业:每次作业满分10分;个人项目:项目35,博客15;结对项目:项目70,博客30。
2) 团队项目评分结构
3) 总评成绩计算方法
4) 评分规则
要点7:奖励:项目奖励(最佳个人项目、最佳结对项目、最佳团队项目)、博客奖励(最佳团队博客)
要点8:课程工作量统计(2012-2017)
- 个人项目的代码量一般在千行以下
- 结对项目的代码量在1-2千行左右
- 90%以上的同学能够积极的参与实践训练
- 团队项目的代码量一般在万行以上,优秀的项目一般达到了2万行左右
- 团队项目中个人的平均代码量~1700行,优秀团队中个人平均代码量超过了2000行
- 学生平均每周工作时间~12小时
- 通过一个学期的学习,大部分学生们对自己能力的评价上从“少量的书面基本知识” 提高到了“基本的理论和实践知识,可以通过企业的面试”;成绩优秀的同学对自己能力的评价达到“具有经实战考验过的技能,可通过最高水平企业的面试”
要点7:几个观点
- 从传统的软件工程教学转换为以实践为核心的软件工程教学是可行的
- 软件工程课程是复杂软件开发能力培养的重要环节,需要把能力培养嵌入到实践教学的各个环节,循序渐进
- 复杂软件开发能力的培养不能只依赖于软件工程一门课程,需要与其他前序课程一起进行系统化的改革,形成系统化的软件工程课程群,形成阶梯型的能力培养的体系
主题报告三——北航罗杰老师:个人与结对项目教学经验
个人项目教学要点:
1) 教学目标:通过个人项目来对学生的个人软件技能进行锻炼和评估;帮助学生进入状态,了解学生的编程能力;学习复杂程序构造、单元测试、个人软件过程、效能分析和优化。
2)时间:第一周
3)个人项目要求:代码量在千行以内命令行程序的开发;老师给定需求,学生进行设计和实现;除了功能需求,要求学生对程序进行性能分析,发现瓶颈并改进;要求进行单元测试;要求使用Git进行源代码管理,所有代码公开于Github上;将设计、实现和性能分析优化的过程用文字描述出来,写成博客。
4)个人项目评分规则
5)个人项目北航教学设计经验
• 提前控制个人项目题目的难度,在项目开始之后不能对学生妥协
• 个人项目的难度应随着学生能力的提高逐步提升
• 从学生身上发现项目设计的改进入手点,针对不同的学生特点进行定制
• 需要与前序的程序设计等课程协同改进,通过个人项目发现学生到当前阶段在程序设计能力上的不足,帮组前序课程有针对性的训练提升学生能力
•助教深度参与个人项目的设计:教师与助教协同设计有利于降低题目设计的难度,提升效率;助教对于题目的要求非常熟悉,利于解答同学们提出的问题;助教可以提前完成一遍个人项目以验证题目的设计,发现问题;助教可以提前考虑和设计测试用例、提交的格式、评分规则等
培训中,参会人员被要求从学生视角来理解结对项目和团队项目的任务要求,并进行动手实践。
结对项目教学要点:
1)教学目标:练习1对1合作;学习代码复审、结对编程、程序的模块化、异常处理、接口的单元;测试、松耦合设计
2)时间:第二周、第三周
3)结对项目要求:在已有的程序的基础上,重用已有代码进行程序的模块化设计,实现要求的接口,并对其进行单元测试,实现对各种异常情况的处理;实现核心功能模块与用户界面之间的松耦合;老师给定需求,学生进行设计和实现;除了功能需求,要求学生对保证程序的质量和用户体验;要求单元测试实现对代码的100%覆盖;要求使用Git进行分阶段的源代码管理,按照阶段分别进行检查;1对1进行结对编程练习,发现结对伙伴的优缺点,体会结对编程的优势和缺陷;将设计、实现和测试的过程用文字描述出来,写成博客。
4)结对项目题目选择建议
- 跟实际问题相关联,可以面向用户需求做成一个实用软件
- 有多种解决方案和优化方法
- 规模:能够用≤2000行代码实现
- 核心功能的模块化和接口设计:支持将核心功能抽象为接口,形成核心模块
- 核心模块、测试程序和图像用户界面等的松耦合设计:支持核心模块和测试程序、图像用户界面之间是松耦合的,不同的核心模块可以互相替换
- 接口测试:接口的覆盖测试,测试驱动的软件开发
- 复杂度:问题的输入规模对于程序效能影响明显,有利于效能分析
- 源代码管理:适合分步骤实现,通过对项目设计引导学生使用Git进行源代码管理
- 复用个人项目代码,强化对程序的设计问题的理解和代码规范意识
5)结对项目北航教学经验
- 以个人项目的结果作为结对项目的开始:在个人项目设计时不做过多的强制规范要求,允许学生在个人项目中犯一些错误,让他们在结对项目中承担后果;让学生从自己的错误中学会程序设计规范等
- 在设计结对项目的步骤时注意模块化:得学生在完成每一步骤的任务时不需要考虑其他步骤
- 根据学生的情况来调整各个步骤的难度以及提供合适的附加题:每一个学生都能完成基本的任务;每一个学生都能获得足够的锻炼机会
个人项目与结对项目关联
- 个人项目和结对项目应协同设计,将个人项目的结果作为结对项目的开始
- 如果可能,每年选择不同的题目
- 从每一年学生作业和反馈意见中发现发现新的需求和作业设计问题
- 针对学生的特点逐步完善作业的设计,明确作业的指导性要求
主题报告四——微软邹欣老师:AI与大学教育
知识讲座一——北航王辰昱同学:命名规范与Resharper
知识讲座二——北航陈彦吉同学:微软AI工具及应用
项目实训一——结对项目实训内容: 英文单词词频统计程序结对编程
项目实训二——团队项目实训内容:
团队项目名称:团队项目度量反馈平台
团队成员:北航软工暑期培训班团队项目1组,成员名单:夏大伟、尹志诚、刘颖、余秋哲、杨林、代祖华
团队项目成果:
1)项目需求说明文档
2) 项目规格说明书文档
3) 团队项目原型
团队总结陈述:尹志诚
团队获得奖励:最佳团队,尹志诚获最佳项目演讲者
3. 培训心得与总结
由于“构建之法”软件工程不同于传统软件工程教学,采用“构建之法”教学体系需要教师具备相应的教学法知识和能力,才能有效开展教学。根据本人教学体会与本期培训体会,从四个维度说明教师能力列表:
能力维度 |
能力说明 |
理解教学改革方向和内涵 |
理解“结果为导向,以能力培养为目标”的软件工程教学改革内涵和本质 |
教师素养 |
勇于变革,积极接受透明、公开的教学协作方式、反思、持续改进、沟通能力 |
专业能力 |
系统全面掌握软件工程教学内容 |
技术能力 |
了解各种软件CASE工具(git、IDE、文档协同工具、LMS),具备线上教学经验和软件工程实践教学经验 |
本次培训内容饱满,组织安排有序,通过主题报告学习、结对项目与团队项目实训体验、同行交流,更加深入全面地领会了倡导“做中学”的软件工程教学要领,结交了来自全国各自的同行朋友,形成了“构建之法”教学发展共同体,提升了构建之法教学能力。