软件工程实践训练设计与实践

2018-07-03 06:21俞昊然杨博洋
实验技术与管理 2018年6期
关键词:工单代码文档

俞昊然, 杨博洋

(北京矩道优达网络科技有限公司 计算教育与技术研究院, 北京 100080)

近年来,中国高等教育阶段的人才培养围绕工程教育不断发展,规模已高居世界首位[1]。随着互联网、大数据与人工智能等信息技术领域的快速发展,相关领域的人才培养质量亟待提升。信息技术领域的学生,在毕业后往往无法直接进入生产岗位为企业带去价值;继续深造的学生,表现也不尽如人意,学生的学术写作能力弱、创新意识差,专业能力只局限在有限的专业技术领域[2]。

软件工程作为软件工程专业的基础核心课程,对于提升学生的综合能力起到了至关重要的作用[3]。在高校以往的软件工程专业教学中,“理论多、实践少”的问题一直存在。软件工程专业中的理论都是软件工程实践中总结出的正确经验,在面向无软件工程实践经验的学生时,理论内容难以理解,使得学生在学习过程中丧失了学习软件工程专业的积极性[4]。相比之下,在“校企合作、工学结合,产教融合、知行合一”模式指导下,把企业中软件研发工程师和提出需求的实际客户“请进来”,按照企业中的软件工程方法与流程在高校软件工程专业中展开实践,更有助于培养高水平软件工程人才。

Judith[5]在他的研究中讨论了将企业引入软件工程专业的课堂后,对于客户管理、团队管理、项目评估和课程开展过程的设计。Judith特别指出,明确地定义客户有利于对项目进行评估。Bernd, Stephan, Lukas提出了一种提升学生技能的同时产出让真实客户满意结果的课程设计。他们的教学效果展示出,针对真实的客户需求进行教学设计不但有助于学生提升技术技能和非技术技能,同时还可以为学生今后进入企业工作打下坚实的基础。

针对现有软件工程专业教学的现状,基于前人在软件工程专业教学领域的研究,和清华大学软件工程课程的教学实践经验,本文提出了一套完整的软件工程实践训练教学方案,并在南开大学软件学院进行了实践。在本文介绍的软件工程实践训练方案的实践过程中,参与课程的学生均为南开大学软件学院2015级本科生,已经学习过“高级语言程序设计”“数据结构”“数据库系统”等软件工程专业的基础课程。学生在参与软件工程实践训练课程之前没有与企业中真实的客户接触过,不了解现代软件行业的规范与流程。因此,在本文介绍的软件工程实践训练方案中定下了5个主要目标:

(1) 训练学生快速学习并使用新技术的能力。

(2) 让学生体会需求获取与过程管理,学习使用思维导图、用户故事工具。

(3)了解开源技术,体验技术调研、技术选型过程。

(4) 深入参与软件过程,学会使用版本管理工具、开发协作工具、文档管理工具。

(5) 培养良好的软件开发习惯,感受以团队为单位进行开发的讨论、协调、展示的过程。

在课程设计中,通过选用学生熟悉场景下的真实项目或与计算机领域教学有一定相关性的仿真项目,有助于避免学生难以理解课程设计中提出的需求[6-7]。由于互联网场景对学生而言更为熟悉,在本文介绍的课程设计中,均选用了与网络技术相关的项目,并引入了规范化的软件开发过程管理。为了提升学生快速学习并使用新技术的能力,挖掘学生的潜力,在本文介绍的软件工程实践训练方案中,采用了集中授课、敏捷迭代、高频展示、持续修正、全过程监控的方式进行授课。

问卷调查结果表明,经过工程实践训练后,超过半数的学生在新技术学习、文档阅读、工程代码调试等方面的能力获得了显著提升,并掌握了需求梳理工具的使用方法,了解了技术调研和选型方法,学会了简单的架构设计,在项目迭代过程中熟悉了软件过程。除此之外,大多数学生也在团队协同、文档撰写、项目展示等方面得到能力提升。

1 课程设计

1.1 先修内容实践

由于学生在参与课程学习之前没有接触过Web开发,在软件工程实践训练课程的第一周里,为学生设计了由企业工程师讲授的每天4~5 h密集的Web开发技术课程。在每天的课后时间,学生还需要在17 h内完成1~2个与当天课程介绍的开发技术相关的单人实践作业,见表1。

大强度的实践训练旨在训练学生短时间内快速学习新知识、使用新技术的能力。在软件工程实践训练过程中,为学生提供了课后至晚22 h的教师答疑,确保学生在解决问题时遇到困惑可以及时提出,将问题在有限的时间内解决。

表1 Web开发技术课程信息

1.2 项目设计与分组选题

遵照软件工程实践训练的主要目标,在进行选题设计时充分考虑了项目真实性、需求对学生而言的理解难度、项目与专业课程的结合性这3方面因素。我国的多位学者在软件工程专业课程项目选题时都提出,选题应来自于或接近于真实企业的真实项目[8]。Bernd、 Stephan、 Lukas在他们的研究中指出,学生更容易接受发生在他们熟悉场景的项目,或是有主动探索意愿的项目,如计算机游戏开发、编程工具等。Vincent曾发现,参与开发计算机科学教育相关项目,能对学生的软件工程能力有显著提升。

结合软件工程实践训练的主要目标和前人的教学经验,在软件工程实践训练的项目设计中,引入了3个项目供学生选择(见表2)。

表2 软件工程实践项目列表

这3个项目的类型各不相同,基本覆盖了就业市场中的企业运营业务的主要类别——面向终端消费者、面向开发者、面向机构消费者。

“编程教育游戏项目”将学生熟悉的程序语言教学过程与学生感兴趣的游戏开发相结合,涵盖了“在线支付”“地图编辑器”等面向终端消费者的项目所独有的需求;“在线客服系统”在当下在线服务越来越发达的背景下,已成为学生熟悉的场景,在与这一项目客户沟通的过程中,客户提出了“多种接入方式”“API文档”等面向开发者的项目所独有的需求;“计算机专业课直播”项目将学生熟悉的计算机类专业课的课堂搬到了线上,除了视频直播和在线聊天,还要求学生实现“互动白板”“PPT同步播放”“互动代码编辑”等对计算机类专业课教学有直接帮助的需求,是面向机构消费者的项目所独有的需求。

在“编程教育游戏”项目中,将客户提出的“将用户代码执行并播放对应动画”需求引入了编译原理课程的知识点;在“在线客服系统”项目中,将客户提出的“自动问答机器人”需求引入了自然语言处理和信息检索的知识点;“计算机专业课直播”项目中,将客户提出的“视频与白板录制”需求引入了多媒体编码和流式传输的知识点。这些项目旨在让学生在软件工程实践训练过程中,对于今后要学习的专业课的存在意义建立一个基础的认知,强化学习专业课的动机。

为了提高学生在完成实践项目时的主观意愿,在软件工程实践训练过程中,遵循了自由组队的基本原则。在此基础上,结合Bernd、Stephan、Lukas提出的“性别平衡性、背景多样性”设计,部分学生经过沟通进行了分组调整,确保了每小组均同时包含男性成员和女性成员、每小组均有在“先修内容实践”阶段前端作业完成度高的成员和后端作业完成度高的成员。

在完成实践项目阶段,每天分为2个时段。其中,白天10—19点为集中开发时间,学生会被集中在软件工程实践教室里进行软件开发;其他时间段为非集中开发时间,学生可以自由选择场地进行软件开发。通过本设计给出的分组策略,可以在非集中开发时间促进学生提高远程协作能力,增进了软件工程实践训练与真实企业工作模式的相似性。

小组形成后,学生通过讨论进行自由选题,选题的结果进一步验证了Lukas的研究中的观点。将发生在与自身熟悉场景的计算机专业课直播项目作为第一选择的学生是最多的,而有一定趣味性且与专业有一定关联性的编程教育游戏则是2/3学生的第二选择,2/3的学生将在线客服系统作为了自己最不倾向的选择(见图1)。本着每个项目都有等量小组参与、尽可能满足学生选择的原则,确定了参与每个项目的3个小组。

图1 小组项目选题意愿统计

1.3 需求获取与分析

为了让学生体会需求获取与管理过程,软件工程实践训练第2周设计了为期半天的以“需求、思维导图、用户故事”为主题的讲座,为学生介绍了需求获取过程和思维导图、用户故事这2个工具[9-11]。讲座帮助学生在完全没有需求分析基础的情况下理解需求,并引导学生借助工具完成简单的需求分析。

在软件工程实践训练的第2周,学生与模拟客户进行了访谈。模拟客户由有经验的项目经理扮演。在开展软件工程实践训练前,扮演客户的项目经理已与类似项目的真实客户进行了多次密集沟通,在获取需求的同时对真实客户的常见模糊表达、矛盾表达进行了记录。在学生与模拟客户进行访谈的过程中,模拟客户会在确保需求被传递的过程中尽可能还原真实客户的表达方式。

与此同时,现场另一位观察员教师会及时引导学生发现模拟客户的模糊表达、矛盾表达,并引导学生通过增加有针对性定量访谈问题的方式明确需求细节。

在学生小组完成客户访谈后,会组织各个小组进行讨论,将访谈获得的信息转变为一系列的用户故事,并利用思维导图工具对客户的需求进行梳理,初步明确软件设计的“应用—页面—模块—功能”层次。

1.4 调研选型与架构设计

为了帮助学生理解软件行业工业化、规模化后的生产模式,软件工程实践训练的设计中引入了以“调研和选型”为主题的讲座,其中涵盖以下内容:

(1) 工业生产中从作坊生产到制造业分工。

(2) 开源技术发展趋势下,软件行业的工业化情况和分工类别。

(3) 如何理解开源协议。

(4) 如何选用开源技术(方式包括直接引入、继承上游并二次开发、抛弃上游并二次开发)。

在需求明确并完成梳理后,要求学生对项目相关技术进行调研,决定哪些功能通过自己开发的方式完成、哪些功能通过选用第三方开源技术的方式完成,并调研所需第三方开源技术的使用方法。在学生确定选型后,需要完成选型报告,并在完成技术选型的基础上进行初步的架构设计。

图2与表3展示了一个小组的架构设计和选型结果。

图2 架构设计

选型用途开源协议Vue.jsweb前端核心MIT LicenseDjangoweb后端核心Django Software FoundationWebpack前端打包工具MIT LicenseGoogleBlockly用于模块式程序设计部分Apache License v2.0CodeMirror用于代码编辑器MIT LicenseTwilio +smtplib用于短信发送第三方服务

1.5 迭代过程与考评

自软件工程实践训练第3周起,学生需要使用Git进行软件开发的版本控制和代码管理,使用GitLab工具进行项目管理与协作,并在每周的周初进行一次开发例会。Git是一个分布式版本控制软件,最初由Linus Torvalds创作,于2005年以GPL发布。Git的协作模式如图3所示,每一个仓库有一个主分支,学生也可以根据需要创建功能分支;主分支应该是受保护的,学生无法直接将代码提交到主分支上,而只能将代码提交到功能分支上;功能分支应该与工单一一对应,可以将代码合并到主分支。GitLab 是基于Ruby on Rails的一个开源版本管理系统,基于 Git进行代码管理,可以通过Web页面访问公开或私人项目。GitLab包含代码仓库管理、工单管理、分支合并评审[12]、用户权限管理等功能[13]。

在第3周的开发例会上,学生被要求对第3周、第4周、第5周的开发过程进行规划,根据产品需求明确第3周、第4周、第5周结束时应该达成的里程碑,确保在第5周结束时完成产品的实现。

自第3—5周的开发例会上,学生按照此前完成的用户故事拆分待开发的功能点对当前这一周的里程碑进行进一步的细分,并将其定立为一系列处于看板上“积压中”状态的工单。每一个定立的工单中具体描述了需求背景、具体的实现方案以及是否与其他的工单存在依赖关系。工单建立后,各小组成员对工单进行认领,并明确截止日期和预估完成这个工单所需用时。

在每周的开发例会结束后,各组学生开始进行开发。开发开始后,学生被要求在完成每一个工单工作的过程中,先将工单移动到看板上的“开发中”状态,使用一个Git功能分支,学生每完成这一工单描述的部分信息,就会提交修改并传送修改至GitLab中的代码仓库,并将这次提交关联到工单,并在工单中记录完成这部分工作所花费的时间。学生完成一个工单的开发工作后,则被要求在GitLab上发起一次将功能分支合并到主分支的请求,并将工单移动到看板上的“待评审”状态。图3对这一协作流程进行了形象描述。

图3 基于Git和GitLab的协作流程

在上述过程中,本次软件工程实践训练提出了几个关键的协作习惯考核点:

(1) 每一个分支是否只做了与工单相关的内容,不包含其他与工单无关的修改。

(2) 每一个提交的信息是否是清晰明确的完整句,而不是无意义的单词或无法理解的表达。

(3) 每一个提交的信息是否通过类似“#100”的形式关联到与提交相关的工单中。

(4) 每一次提交后是否及时在工单上通过类似“spend 10h”的命令记录了与体积相关的时间开销。

(5) 每一个合并请求的信息是否通过类似“closes #100”的形式说明了合并后应自动关闭的工单。

(6) 每一个合并请求是否指定的要参与评审的人员。

(7) 每一个工单是否在截止日期前被关闭。

(8) 每一个工单的状态发生变化时,是否在看板上完成了对应的移动。

1.6 单元测试与代码质量控制

自第4周开始,实践项目训练增加了单元测试和代码质量控制的要求。学生对开发完成的功能点添加了单元测试,对完成的代码添加了代码风格检查。学生被要求使用 Git 的钩子功能,在每一次代码提交前执行代码风格检查,在每一次向 GitLab 传送前执行单元测试;对于部分开发经验丰富或学习能力强的小组,学生可以选择使用“GitLab 流水线”的功能,搭建一个runner,在学生发起合并到主分支的请求后,在runner上执行该分支的代码风格检查、单元测试,并与主分支进行集成测试。在上述过程中,本次软件工程实践训练提出了2个关键的协作习惯考核点:

(1) 代码风格检查是否完备,是否出现代码风格问题。

(2) 单元测试意识是否形成,是否有合并进主分支的功能分支出现单元测试不完备的情况。

1.7 文档

随着项目迭代过程的推进,在第5周,实践项目训练增加了文档和自动化(或半自动化)部署要求。学生被要求引入自动化文档工具,并按照自动化文档工具要求在各方法前添加注释,用于生成技术文档。学生被要求根据技术选型和架构完成部署脚本并根据需要撰写部署文档。

(1) 技术文档是否覆盖了公有方法。

(2) 依照部署文档是否可以正常完成部署过程。

1.8 交叉功能测试

在实践项目训练的第6周,各小组项目已经基本处于交付状态。在这一周中,每一个小组根据用户故事撰写了功能测试文档,并将自己在GitLab上的代码仓库开放给另外2个项目需求一致的小组。各小组在这一周中被要求交叉进行功能测试:

(1) 按照其他小组的部署文档在本地部署其他小组的项目。

(2) 参考其他小组的功能测试文档,结合自身小组对于项目需求的理解,对其他小组的项目进行模拟验收测试。

(3) 发现其他小组项目的功能缺陷时,向其他小组提出工单。

(4) 被其他小组提出工单时,需要及时解决与这一工单关联的问题。

这一交叉功能测试的做法意在帮助学生感受项目在部署后接受反馈并进行进一步迭代、修正的过程。这一过程中引入了一些游戏化的设计,当学生为其他小组提出有效工单的情况下,会得到一定的加分,如果被提出工单的小组未能及时迭代、修正则会被扣除一定的分数。

1.9 学生展示

在实践项目训练的第3—6周,每周会有一次项目展示,让学生对自己过去一周的工作进行20 min的展示(见表4)。这一展示过程意在提高学生的展示、表达能力,同时加强对于项目的成就感和对于开发小组的归属感。每一周小组的展示成员均为不同的学生,且展示重点有所差异。

表4 每周项目展示重点

项目相同的小组会在同一时间段依次进行展示,一个小组在展示的过程中,其他同时间段的小组可以在展示过程中提出问题,促进小组间的思考和学习,也为学生营造一个可以感知到同伴竞争的氛围。

2 评估

这一部分对实践项目训练的效果进行了客观及主观数据的分析和展示。

2.1 过程数据评估

经过4周的实践项目训练,多数小组按时完成工单的比例均有不同幅度的上升(见图4)。

图4 分组工单按时完成率

图5展示了第3—6周工单被学生进行了时间预估的比例。让学生养成进行工单完成时间预估的习惯是一个困难的过程,特别是在出现非计划内的新增需求时,保持良好时间预估的习惯更为困难。

图5 预估时间工单比例

而在预估了工单完成时间的情况下,随着开发时间的增加,预估时间和实际发生时间的偏差有了明显改进(见图6)。可见,让学生在实践过程中进行时间预估是必要的,它可以有效地提高学生对自身能力的认知水平和对于工单规模评估的准确率。

图6 工单预估与实际偏差

在使用Git工具进行版本管理和协作开发的环节上,随着训练周数的增加,问题出现的数量明显减少。其中,分支使用的问题的集中爆发主要出现在第1周,第2周后明显得到了改善。随着训练周数的增加,未正确将提交关联到与提交相关的工单的问题的数量也明显减少(见图7)。可见,版本管理和协作开发的训练是必要且有效的。

图7 提交信息不符合要求比例

对于所有发起的合并请求,大部分组在时间训练第1周内的代码评审意识不足,项目普遍缺乏有效的评审过程。进入第2次开发迭代后,大部分组的评审过程有了明显的改善。在随后的几周中,总体评审质量有所回落(见图8)。这一现象的主要原因是部分小组在出现需求未按期完成的情况下降低了对于评审过程的重视程度。因此,在教学中强调代码评审过程是有必要的,而且需要持续强化对代码评审过程的要求。

图8 经有效评审后再进行合并的比例

2.2 学生反馈

在实践项目训练结束后一周,参与软件工程实践训练的全体43名学生填写了调查问卷,其中38名学生在各个问题上均给出了正面反馈,认为软件工程实践训练对提升学生软件开发技能与过程管理上产生了明显的帮助。如图9所示,多数学生认为这次软件工程实践训练对于他们在前后端开发技术和开发环境配置上的帮助明显。由于学生在此前进行过与数据库技术相关的专项训练,又由于课程内没有对服务器技术做详细介绍,因此学生在这2项上的收获相对较少。

图9 经过实践训练,在开发技术方面的收获

对于学生学习过程的感受,问卷收集到的反馈情况见表5。

表5 问卷题目及平均分数

在工程实践训练最后,邀请学生对工程实践训练过程进行了总结,并根据学生总结中的词频进行统计。从表6中可以看到,学生对于教师和自己的参与感受都很强烈。“收获”“学到”“感谢”等词的频繁出现也表现出学生较为正面的情绪反馈,而“熬夜”“辛苦”“团队”等词的频繁出现则反映出学生参与工程实践训练的积极性。

表6 工程实践训练总结高频词汇总

3 结语

随着软件行业的飞速发展,软件人才的培养质量亟待提升。本文设计了一套完整的软件工程实践训练方案,并通过在南开大学软件学院的实践论证了方案的可行性和有效性,通过过程数据评估和学生反馈,说明本文提出的方案对提升学生软件工程各方面能力均有显著的效果,解决了以往软件工程专业教学中“理论多、实践少”的问题,有助于软件工程相关专业培养高水平的软件工程人才。

致谢:本文实践项目训练的设计部分参考了清华大学白晓颖老师、刘强老师、张力老师在“软件工程”“Web前端技术实训”“程序设计实践”课程中的教学设计,感谢各位老师给予的支持与帮助。感谢南开大学软件学院师生对于本项教学研究的大力支持。

[1] 朱泓,李志义,刘志军.高等工程教育改革与卓越工程师培养的探索与实践[J].高等工程教育研究,2013(6):68-71.

[2] 伍春香,刘斌,李小红.基于能力培养的软件工程教学实践[J].计算机教育, 2017(8):38-42.

[3] 刘强,陈越,骆斌,等.“软件工程”课程教学实施方案[J].中国大学教学, 2011(2):41-44.

[4] 胡劲松,张亮,黄海军.项目驱动的启发式教学在软件工程课程中的应用[J].计算机工程与科学,2016,38(增刊1):228-231.

[5] Judith W C,Bair B,Lethbridge T C,et al.Client sponsored projects in software engineering courses[C]// Sigcse Technical Symposium on Computer Science Education. ACM, 2003:401-402.

[6] Bruegge B,Krusche S,Alperowitz L.Software Engineering Project Courses with Industrial Clients[J].Acm Transactions on Computing Education, 2015,15(4):1-31.

[7] Cicirello V A.Student developed computer science educational tools as software engineering course projects[J].Consortium for Computing Sciences in Colleges, 2017,32(3):55-61.

[8] 孙明,田蜜,康文杰.设计型项目驱动的软件工程实践教学改革[J].计算机教育, 2016(3):156-159.

[9] Matthies C,Kowark T,Uflacker M, et al.Agile metrics for a university software engineering course[C]// Frontiers in Education Conference. IEEE, 2016:1-5.

[10] 刘燕,刘慧琳.思维导图在软件需求描述中的应用[J].教育界,2010(22):114.

[11] Cohn M. User Stories Applied: For Agile Software Development[M]. Addison Wesley Longman Publishing Co Inc,2004.

[12] Sripada S,Reddy Y R,Sureka A.In Support of Peer Code Review and Inspection in an Undergraduate Software Engineering Course[C]// IEEE, Conference on Software Engineering Education and Training. IEEE Computer Society,2015:3-6.

[13] Haaranen L,Lehtinen T.Teaching Git on the Side: Version Control System as a Course Platform[C]// ACM Conference on Innovation and Technology in Computer Science Education. ACM,2015:87-92.

猜你喜欢
工单代码文档
客服工单监控技术的开发与研究
浅谈Matlab与Word文档的应用接口
基于量化考核的基层班组管理系统的设计与应用
有人一声不吭向你扔了个文档
创世代码
创世代码
创世代码
创世代码
基于HANA的工单备件采购联合报表的研究与实现
基于RI码计算的Word复制文档鉴别