以实践能力为中心的软件工程教学方法探索

2024-01-02 08:35沈立炜
软件导刊 2023年12期
关键词:代码工具软件

沈立炜,彭 鑫

(复旦大学 计算机科学技术学院,上海 200433)

0 引言

软件工程是一门关注复杂软件系统开发、维护与运行相关方法与技术的基础性课程,在新工科建设中具有重要地位,其教学方法与模式改革受到了广泛关注[1-3]。软件工程课程涉及的理论知识和概念众多,学生由于缺少相关实践经验和背景知识导致理解上存在困难。因此,如何借助课程实践帮助学生理解软件工程相关概念和理论并掌握相关实践能力,成为软件工程课程教学的一个关键问题[4-5]。

作者所在教学团队早期的软件工程教学模式普遍围绕软件生命周期,并以瀑布模型等经典软件开发模型为主线,按照需求分析、软件设计、实现与测试、软件维护几个部分展开。整个课程以结构化方法和面向对象方法为核心内容,在教学过程中穿插与各部分内容相关的习题,最后以一个面向特定项目的软件开发文档作为主要课程实践提交物。总体而言,这种教学方法较为注重经典软件工程方法以及软件开发过程与文档,弱化了软件构造与维护等实践内容,导致学生难以获得关于软件工程方法与技术的切身体会和深刻理解,遑论软件工程实践能力,在课程教学中经常会获得诸如“教材和教学内容过于抽象”“照本宣科、条条框框”“缺少实践能力培养”等评价。

近年来,企业软件开发实践围绕云原生(Cloud Native)与开发运维一体化(DevOps)已经取得了长足的发展和进步,敏捷开发、持续集成、持续部署、微服务、演化式设计等开发实践得到了广泛应用,同时软件开发工具与环境也在面向基于云的一体化开发平台迁移。以上对软件工程课程教学提出了新的要求:一方面课程教学内容需要反映软件工程实践最新发展;另一方面课程教学方式与方法需要突出相关实践能力培养。

针对以上问题,教学团队围绕以实践能力为中心的软件工程教学方法持续开展探索与实践,以交付可运行软件的构造活动为中心开展实践化教学,同时通过一种增量、迭代的过程融入软件开发与交付过程中关键能力的培养。与传统软件工程教学方法相比,这种方法更注重以代码为载体的软件工程实践能力培养,同时按照编码、设计、需求的顺序从低到高逐步融入不同层次的软件工程能力要求。这种新的教学方法已经在复旦大学计算机科学与技术以及软件工程专业的软件工程课程教学中进行了实践,其效果已经得到初步验证。

1 以实践能力为中心的教学设计

选修软件工程课程的本科生一般对Java、C++等程序设计语言和基本数据结构有一定了解,但这些基础能力还不足以使其完成一个相对复杂的、具有完整需求的软件开发项目。软件工程课程的目标是培养学生解决复杂工程问题的能力[6],因此要在前序课程内容的基础上从一个相对完整的工程实践视角组织课程教学与实践[7]。首先需要让学生理解和思考软件开发所面临的各方面挑战,因此除理论知识讲授外还需通过课程实践项目使学生切身体验开发过程中与软件质量、运维演化等相关问题的解决方法;其次针对这些实际问题引导学生强化具体实践能力,从而在实践项目中解决各种突发问题;最后通过实践项目中开展的测试、度量等手段评估学生理解问题和应用相关能力解决问题的能力。

基于以上对教学内容和体系的规划,教学团队与华为公司共同编写了一本新的软件工程教材——《现代软件工程基础》[8]。其在经典教学内容的基础上结合现代软件工程广泛涉及的基于云的软件开发及运维等领域知识,同时将华为多年来在信息通信技术领域积累的软件开发实践与相关工具使用经验合理融入其中。该教材的一大特点是从一个具备基础开发技术的初级程序员视角出发,按照软件工程师的学习和成长过程对教学内容进行了编排,具体如表1 所示。基于该教材的教学方案优先培养学生的团队开发意识,使其理解个人在软件开发过程中的角色定位,以及团队协作的各个环节、协作方式与可用工具;随后着重训练个人开发技能,强调从开发小的软件模块起步,从而使学生深刻理解高质量软件编码应达到的细节要求;接着放大视野,使学生考虑软件的整体设计,合理应用面向对象设计模式,重复利用开发框架,并持续考虑软件重构;最后培养学生把握全局需求的能力,培养其需求分析、系统测试、发布部署的高层次能力。

Table 1 Teaching content arrangement表1 教学内容编排

围绕以上知识点,相应的工程实践安排如表2 所示。不同阶段的任务循序渐进,使学生从基本的团队协作技能出发,逐步掌握前后端分离软件的开发、测试、发布和部署等能力。同时依托华为云软件开发生产线CodeArts(原华为软件开发云DevCloud)构建开发流水线,使学生体验复杂软件系统的开发过程并掌握相关工具的使用方法。整个实践方案强调对学生高质量编码能力的训练,培养其代码检查、缺陷管理、构建部署、设计重构等进阶能力。最后从需求分析和系统测试两方面评价学生对目标软件需求的理解情况。

Table 2 Arrangement of engineering practice表2 工程实践安排

2 实践化教学内容实施

2.1 实践内容与工具应用要求

以在线Web 购物系统的实践项目为例,要求学生设计一款简易的、采用前后端分离架构的购物系统,涵盖商户开设店铺、设置店面、商品管理,用户购买商品、资金管理、订单管理,系统管理员审批开店、商品上架请求等学生较为熟知的系统功能。学生以4 人为一组自由成团,在实现商户、用户和系统管理员3 个角色功能的过程中,重点强调编码能力以及团队协作能力的训练。

表3 列举了该实践项目的分阶段任务及相应要求。在团队开发过程中,学生需逐步熟悉并使用代码托管平台完成分支开发与合并,并解决可能出现的合并冲突问题;需确保开发代码的质量,包括代码风格、注释、各类可靠性编程细节。此外,团队同学间需要进行持续性讨论,共同设计系统架构、后端接口,梳理系统需求,完成核心模块测试。教师通过项目演示以及在CodeArts 等工具中留存的开发过程记录对小组完成情况进行评价,并根据个人贡献程度给出成员的具体实践得分。

Table 3 Project phased tasks and corresponding requirements表3 项目分阶段任务及相应要求

应用于项目实践的工具主要分为两个部分:①开发环境与相关技术栈工具。该部分工具可由学生自主选择。通常情况下,学生会根据所使用的编程语言选择VSCode、IntelliJIDEA 或PyCharm 作为开发环境,选择Vue.js 作为前端框架,Spring Boot 或Flask 作为后端框架,并使用MySQL进行数据存储;②应用于团队协作、代码质量管理、设计、测试等环节的工具。要求学生依托CodeArts 相关工具进行代码托管、版本管理、代码检查和缺陷管理等;应用主流UML 建模工具完成对设计与需求的描述,应用单元测试和接口测试工具进行系统验证。

2.2 实践过程

以下通过案例的形式介绍某小组的软件开发过程以及对相关工具的使用情况。

2.2.1 制定开发规范

在实践项目启动阶段,安排助教参与实践小组关于开发规范的讨论,共同制定团队协作与编程规范,具体包括团队分工与工作流程、分支与合并工作规范、代码提交规范等,其中对代码提交信息的规定能使团队通过统一的词句规则解释所提交代码的意图[9-10]。图1 为实践小组借鉴其他成熟项目并经过内部讨论后形成的代码提交信息格式范例。

Fig.1 Format specification example of code submission message图1 代码提交信息格式范例

2.2.2 使用CodeArts代码托管平台支持团队协作

CodeArts 的在线代码托管平台能使学生体验团队协作的工作模式。学生分别在本地进行代码开发并将代码提交至仓库,从而提高协同开发效率。实践小组则在预先定义的时间节点通过分支合并对不同成员编写的代码进行整合。图2 展示了CodeArts 代码托管平台中的分支界面 与提交记录界面。

Fig.2 Branch and record submitting interface in CodeArts code hosting platform图2 CodeArts代码托管平台中的分支与提交记录界面

2.2.3 高质量软件编码

高质量软件编码是项目实践的重点[11-12]。学生通过学习课堂理论知识以及代码案例理解存在问题的编码方式以及保证代码质量的编码技术。图3 为代码命名与注释规范、防御式编程以及异常处理方面的实践示例。首先,实践小组自定义后端接口开发时的注释规范,例如要求每个函数都要在开头使用""" 3 个引号的形式注明函数功能、参数类型及返回值类型;其次,在编写具体方法代码时需考虑方法的各种可能输入,并在代码中进行必要的数据验证,从而提高方法的可靠性;最后,建立并封装ServiceException 类来负责集中构造具有不同含义的异常,从而提高可扩展性。

Fig.3 Examples of high-quality software coding practice图3 高质量软件编码实践示例

2.2.4 使用CodeArts代码检查工具支持代码质量控制

使用CodeArts 的代码检查工具能够发现代码中存在的缺陷,并获得相应的质量报告。实践小组能根据缺陷位置及修改建议进行修复,从而提高代码质量。图4 为CodeArts代码检查工具的缺陷详细信息界面。

Fig.4 Defect details interface of CodeArts code inspection tool图4 CodeArts代码检查工具的缺陷详细信息界面

2.2.5 使用CodeArts缺陷管理平台记录缺陷处理流程

CodeArts 的缺陷管理平台能够记录和跟踪实践小组在开发过程中发现的缺陷以及缺陷的后续处理情况。图5为CodeArts 缺陷管理平台界面。

2.2.6 软件设计与测试

实践小组采用面向对象的设计方法定义购物系统的实现类,规划其属性和操作。基于此,将后端服务操作封装为RESTful 接口,以实现前后端交互。此外,实践小组主要采用单元测试工具(如Junit、PyUnit 等)对类方法进行测试,使用接口测试工具(如APIFox、Postman 等)对RESTful接口进行功能性验证。

2.3 实践效果及存在的主要问题

为考察实践效果,将以实践能力为中心的教学方式与前期课程采用的围绕软件生命周期的教学方式进行比较(布置类似项目目标),结果如表4 所示。在文档维度,早期围绕软件生命周期的教学与实践注重文档规模,涵盖需求分析和系统设计两阶段内容,学生撰写的文档内容细致、页数较多;而以实践能力为中心的项目更强调文档的精简性,重视系统核心模块的设计与需求建模,以及接口的详细定义,平均文档规模较小。在代码维度,早期实践方式并不强制要求系统实现,部分小组实现的代码规模较小,且不关注代码质量;以实践能力为中心的项目要求团队持续开发,完成阶段性布置,并需在开发过程中基于自动化工具发现、记录并修正代码bug。在过程维度,早期实践中学生花费较少时间完成文档编撰;而以实践能力为中心的项目贯穿整个学期,学生充分发挥代码提交、合并等协作能力。总体而言,以实践能力为中心的教学与实践能使学生体验到较为完整的复杂软件系统开发过程,培养其利用成熟工具辅助开发软件以及团队协作的能力。此外,以实践能力为中心的教学方式将高质量软件编码贯穿项目各个环节,着重锻炼学生开发可读、可靠、可信代码的能力。

诚然,不同实践小组的技术背景和成员能力各不相同,因此在实践过程中也存在进度落后、遇到较大阻力的小组。具体问题主要体现在以下两个方面:首先,课程主要面向计算机专业具有初级开发能力的学生。对于部分学生而言,他们第一次接触前后端分离的Web 应用开发项目,第一次尝试前端代码开发,更是第一次通过团队协同完成项目开发。这些“第一次”使其无法迅速融入实践节奏,需要教师和助教提供主流开发框架与技术栈的讲解与指导,引导学生以最小代价快速入门;其次,部分小组在项目初期沟通并不顺畅。由于分工原因,实践项目起步时负责后端的同学可能不了解前端同学的需求,且其对同一接口功能和命名规范的理解尚未统一,可能会造成前后端之间接口频繁修改等问题。因此,在实践过程中教师和助教需及时了解小组工作进度,及时发现问题,协助学生间沟通。

3 结语

本文介绍了以实践能力为中心的软件工程教学方法,将学生视为初级软件工程师,从成长路径的视角教授其从低到高不同层次的软件工程知识要点,并强化以交付高质量软件代码为核心的增量、迭代、团队式实践训练,使学生切身体验团队软件开发流程。在未来的教学工作中,首先需要跟踪软件工程实践最新进展持续探索并优化教学设计,同步调整教学内容和项目实践侧重点;其次需要不断巩固教师个人实践能力,敦促其掌握主流软件开发环境和工具的使用方法,沉淀具有特色的实践案例。

猜你喜欢
代码工具软件
禅宗软件
波比的工具
波比的工具
软件对对碰
创世代码
创世代码
创世代码
创世代码
“巧用”工具
谈软件的破解与保护