新工科背景下项目驱动的“软件工程”课程教学实践研究
2022-03-17姜磊文一凭
姜磊,文一凭
(湖南科技大学 计算机科学与工程学院,湖南 湘潭 411201)
为了应对新经济快速发展、新兴产业蓬勃兴起的迫切需要,教育部提出了培养新型工科人才的新工科战略[1]。新工科教育强调学生应该具备团队协作与沟通能力,同时特别注重培养学生解决复杂工程问题的能力。软件工程是一门讲述如何构建高质量计算机软件的一系列方法与过程的课程。它是计算机学科实现新工科教育任务的重要切入点。经过本课程的学习,学生能够掌握软件工程的基础知识,具备应用自然科学理论、计算机理论对工程项目进行软件设计与开发的专业能力。在课堂教学中,以项目驱动的形式对学生进行上述能力的培养是一个行之有效的方法[2-3]。当前以项目驱动方式进行软件工程教学实践的研究文献主要探讨了项目如何选题、组织以及过程管理[4-5],很少涉及项目构建具体方式与方法的讨论。这些文献基本没有阐述如何培养学生解决复杂任务、复杂工程问题,对于怎样在软件工程教学中培养符合新工科所要求的学生能力缺乏系统思考。此外,相当部分软件工程课程教师由于没有企业经历而缺乏工程经验,难以对学生进行规范、有效的实践能力指导。因此,本文试图以工程项目为抓手,为该课程的教师提供一套切实可行、规范的软件构建方法,并在此基础上提出新工科人才培养标准,培养学生能够解决复杂工程问题,提高沟通与管理能力[6],从而进一步推进计算机学科的新工科教学改革研究。
1 计算机类学生软件工程项目实践现状
通过对湖南科技大学计算机科学与工程学院2017级计算机科学与技术、网络工程两个专业302名学生的问卷调查分析以及多年的教学实践,笔者认为当前计算机类本科生在软件工程方面存在以下问题。
1.1 软件工程课程内容过于抽象
74.8%的学生认为软件工程课程内容过于抽象与理论化,难以应用到实际的工程项目设计与开发中。大部分学生在学习软件工程前都会有一些软件开发经验,但他们一般都没有按照软件工程规范进行开发,学生很难将课程内容与开发实践有效联系起来,于是常常会怀疑课程的实用性——认为自己不学习软件工程知识照样可以进行项目开发,从而产生一定抵触心理。如果教师在教学过程中不将软件工程设计实践与课程内容形象地联系起来,学生就会觉得抽象与枯燥。
1.2 缺乏工程项目设计经验,难以进行复杂问题求解与有效沟通
课程结束后,学生觉得分析问题的能力进步小,基本上不能进行复杂工程问题的设计与开发。对于一个新的工程问题,73.2%的学生觉得无从下手,不知如何将需求分析与软件架构中的建模、体系结构设计和原型设计结合起来。对于将工程项目中的具体业务按照软件工程中设计的步骤进行分解,大部分学生没有思路,只有少部分学生具备将具体的业务流程转化成相应的界面逻辑和相应数据结构的能力。学生缺乏沟通技巧与实践,在项目实践中,由于沟通太麻烦,往往由一个或两个高水平的学生完成,其他学生参与度很低。
1.3 学生掌握的软件工程设计工具少
在掌握软件工程设计工具方面,85.8%的学生了解UML,而掌握UML并能绘制正确图件的仅31.7%;数据建模工具PowerDesigner仅有35.1%的学生知道,利用其进行过数据建模和绘制数据流图的则不到8.3%;原型设计工具Axure的掌握率为72.2%;Apifox或Postman等接口设计工具仅10.9%的学生掌握;Git协同开发工具则有51.7%的学生使用过。
1.4 课程虽然以案例与项目驱动,但教学效果不明显
在以前的教学过程中,我们虽然主要以案例与项目两种方式组织教学,但存在如下问题:对于案例的方式,学生只知道大概流程没有亲自动手,在真正实施时感觉难以下手;对于项目的方式,学生主要追求的是前后端拉通、项目能够运行,这样实现的软件功能简单,最终产出的是一个demo版本,离上线运行的要求很远。这两种方式难以实现新工科要求的培养学生求解复杂工程问题以及团队协作与沟通能力的目标。
2 工程项目驱动的软件工程教学具体实施流程
为了帮助学生掌握解决复杂工程问题的软件设计与开发能力,根据新工科人才培养的要求,结合学生的现状以及原有项目驱动方式教学的不足,笔者为复杂工程项目的设计与开发制定了详细且行之有效的规范化流程。
2.1 工程项目驱动的软件工程教学组织
分析上述调查后,笔者在2018级采用了新的工程项目驱动方式引导学生进行软件工程课程学习。首先将学生分组,每组3~10人。然后要求他们在码云中创建项目小组,按规范化的流程进行软件项目的设计与开发。项目的来源分三种:一是学生根据日常遇到的问题进行设计与开发,二是学校各部门根据自身的业务提出需求,三是教师根据自己的项目或朋友的一些需求进行项目题目设计。每一阶段的工作由学生制作PPT在课堂上进行汇报与讲解。
2.2 软件工程项目设计流程
2.2.1 需求分析与建模
需求分析与建模主要是从项目业主方的角度进行构建,用于帮助业主从软件开发的角度厘清思路,整理出所要开发项目的功能与业务全貌。
(1)需求采集。一般而言,由业务部门或教师提出的题目都具有一定复杂工程项目的特征,需要对业务部门进行需求采集。采集目标主要是:①搜集项目具体有哪些角色;②每一个角色有哪些业务及其业务流程;③相关的数据。然后根据目标,要求学生制定需求采集计划。一般来说,业务人员在访谈时通常会讲述其工作的重要性与意义,对于具体的流程则描述得非常简略。因此,需要训练学生在与相关人员进行访谈时要注意将话题围绕需求采集的目标展开。
(2)用例设计。在需求采集后,就可以进行用例设计。首先,从需求中知悉该项目使用者的种类,然后将这些使用者设计为若干种角色。其次,根据每个角色期望项目为之完成的任务设计用例。这些工作任务还可以细分为子用例。用例图绘制完成后就得到了各角色对项目的期望与需要项目完成工作的全貌。最后,每一个用例需要用文字进行详细说明。
(3)行为设计。大部分的项目都有自己的行业领域,软件设计与开发人员不一定对其熟悉,因此需要对其业务逻辑进行梳理。同时,一些业务逻辑存在多个运行线路,也需要对其进行描述,以便于后续各工作模块的衔接与异常的处理。这些业务逻辑需要通过绘制顺序图、泳道图、协作图的方式与业务方进行确认,务必将各个业务处理分支描述完整清晰,方便软件开发人员理解。
2.2.2 构建设计模型
构建设计模型的任务就是将需求建模的输出转换成软件开发人员对项目的认识以及相应的数据模型、原型设计、体系结构与类图等。
(1)数据建模。首先根据需求采集与建模中的输出,使用PowerDesigner绘制数据流图,得到整个系统中需要存储与转化的数据表,然后以此为基础在PowerDesigner中进行项目的数据库设计。这里需要注意的是,数据流图中的数据表需要进行拆分,拆分的原则是:动静分离、存储空间大的数据需要与空间小的数据分离;部分经常使用但散布在各个数据表中的数据可以设计成视图;最后,再进行范式分析进一步分解,使每个表满足3NF或BCNF。
(2)体系结构设计。①部署结构设计:当前的项目一般采用B/S结构。如果访问量大就要采用高并发设计,此时设计者需要估算应用服务器的个数、数据服务器的个数以及考虑是否需要部署Redis数据库用来放置高频访问数据等。②开发结构设计:一般采用前后端完全分离的形式。前端需要考虑UI框架的选择,后端则可以从SSH、SSM或微服务等框架选取一种做进一步设计。③系统的功能模块结构:首先针对需求建模中的用例设计对各角色的用例与子用例进行分析与合并,得到初步的层次结构,然后根据系统是否完整再进行适当补充。对于不好划分的模块,则可以在数据流图中相应区域,根据事物流与变换流的方式进行模块结构的映射,最终得到完整的系统模块结构。
(3)原型设计与接口设计。原型设计一般采用Axure工具根据需求建模中的用例设计与行为设计进行前端页面的UI设计。UI界面主要由数据输入、表格与图形组成。但是很多学生由于缺乏经验,难以将业务逻辑中的行为转换成相应的页面元素。每个学校都有教务系统和一些面向学生的财务、图书管理、学生管理等系统。因此,我们建议学生根据自身使用经验去体会业务逻辑是怎样向具体页面转换的,然后再进行模仿。接口设计则主要根据原型设计的页面进行,即把页面要录入的数据作为接口函数的输入,页面上要显示的数据作为接口函数的输出。这样,设计者就可以在每个页面上得到一个粗糙的接口函数。所有页面上的接口函数经过消岐、组合、分解后,前端所需要的接口设计部分就完成了。设计者再根据后端数据处理情况做进一步优化就能得到整个系统的接口设计。
(4)类与工作包设计。首先,设计者根据需求建模文档得到部分类,然后再从接口设计文档确定接口类,最后从配合上述类工作以及后端必须要进行的数据处理与转换等方面做进一步设计得到初步的完整类图。随后,设计者根据设计模式对类图进行调整与优化,使之更加合理。工作包的设计是将类按功能模块、公用工具、前端接口、数据库交互、登录鉴权等方式对类进行组合放入工作包得到包图。
3 新工科背景下工程项目驱动的软件工程教学中学生能力培养初步思考
通过工程项目驱动的方式,软件工程课程可以进行计算思维能力和新工科软件人才能力的培养。这两种能力的培养着眼于学生毕业后的发展,与新工科教育考查学生毕业后五年的发展状况的理念非常契合。
3.1 计算思维培养
计算思维以设计和构造为基本特征,它是计算机学科学生在哲学层面必须要培养和具备的素质。但是学生通过长期的数学教育,主要得到的是理论思维培养。他们在面对问题时首先习惯考虑怎样通过直接运算与推理得到精确的答案。在这种惯性思维下进行项目设计与开发时,学生常常会从问题涉及的直接原理出发进行求解,并因此陷入相关理论的深入思考中,而忽略了要解决的工程问题本身。特别是对于那些直接设计、开发难度大的问题,他们常常陷入相关理论与技术的学习中,而忘记了采用近似的方法将会大大降低求解难度。其次,学生一味采用高精尖的技术而忽略时间与成本的约束。再次,他们还经常忽略项目本身的特点而采用不合理的复杂方案,从而带来了不必要的难度与时间消耗。例如,在一个派工管理项目中,各任务承担单位需经甲方认证资质后才能获准进入,费用结算另有系统。学生开始设计时采用了非常复杂的登录鉴权方案。但该系统实际是封闭运行,工作任务不涉密,系统攻破后黑客也不能获利。黑客即使更改任务分派,在实际工作运行时也能及时纠正。因此,教师发现后就更改为普通方案。最后,学生非常容易扎入细节中去,缺乏整体视角。
基于以上问题,我们通过以下方式进行处理,收到了较好的效果。(1)列出当前项目任务,并划分出优先级,要求学生按优先级进行解决,避免进入细节。(2)列举出当前项目的约束与允许范围,培养学生按照约束条件与误差范围寻找适当的解决方案的习惯。(3)碰到难题时,要求学生首先考虑简便的替代方案。
3.2 新工科软件人才能力培养
3.2.1 培养学生对项目全过程的整体观与发掘技术深度的能力
本科生毕业时入职的工作会偏重于一个方面,比如前端、后端、测试或小程序等。但对项目全过程的掌握与理解非常重要,这是决定他们发展高度的一个重要因素,同时也是跟新工科配套的工程认证的一个重要视角——学生毕业五年内的发展情况息息相关。因此,在我们的项目中每一个过程都尽量让不同的学生负责,让更多的学生能够得到锻炼。同时,教师需要提醒学生注意两件事情:一是完成本过程的工作并充分认识本部分工作承前启后的作用或意义;二是每位学生需要注意观察负责的同学是如何进行工作组织与前后过程衔接的,并对过程中出现的问题进行反思及如何改进。在整个项目完成后,每一位学生都要进行一次项目全过程的复盘思考与心得体会的描述。每一个项目的选择及其技术选型都是根据当前的技术主流而定,但大部分学生在表述时往往只是基本工作的描述,看不出技术亮点与深度。例如,他们会对一个采用了目前主流技术的项目描述如下:本项目前端完成了XX功能,后端采用Java编写。所以,教师需要引导学生进行正确的描述、发掘所做工作的技术含量。例如,上述的描述可以更改为本项目根据前后端完全分离的理念,前端采用Vue+ElementUI、后端采用SSM框架,使用Spring Security进行鉴权。
3.2.2 培养学生的复杂问题任务求解能力
新工科非常强调学生解决复杂工程问题的能力。但目前学生日常学习中较少碰到复杂问题,非常缺乏解决复杂问题的经验。因此,我们在开展项目设计与开发时要注意各角色的功能要求,杜绝学生简化功能只满足于拉通前后端技术,而忽略了详细的业务逻辑分析、异常处理等工作。这些工作是解决复杂项目的基础性方法,也是保证项目质量的重要手段。对于复杂问题以及难点技术,教师要引导学生进行问题分析和任务分解,找出当前能够解决以及难以解决的部分。对于难解决部分,教师需要组织优秀学生攻关或者寻求外援。
3.2.3 培养学生的团队沟通与协调能力
在小型项目中,学生主要以宿舍或关系亲近的2~3人作为小组,以一个技术能力强的学生为核心展开,这样的团队日常沟通比较方便。但是,学生在毕业初期进入一个较为陌生甚至并不和谐的团队的可能性较大,如何在这样的团队中生存并有所发展,协调与沟通能力尤为重要。因此,我们采取了以下措施:(1)有意识地打破班级界限组建6~10人的大团队,这样就有可能是相互之间并不熟悉的学生,甚至有部分关系较为恶劣的同学被分到一组。学生在这样一种氛围中,能获得重要的心态调适经验,并在有善意的教师监督与协调下收获关系的磨合经验与沟通经验。(2)进行有效沟通的训练,要求学生记录进行技术沟通的语句,然后讨论这些语句包含的信息是否足够,应该怎样改进才能包含充分的信息,降低沟通的次数。(3)在工作任务的更新与改变时记录协调工作时各方的反应,并探讨在哪些情况下协调是成功并恰当的、哪些地方需要改进。
4 结语
以新工科对学生能力培养的要求为指导,笔者在湖南科技大学计算机科学与工程学院18级网络工程专业组织了以工程项目设计与开发为特色的软件工程课程的教学实践,取得了较好的成绩。全专业总共分为10个小组,按企业设计标准衡量,其中5个小组可以达到优秀、4个小组良好、1个小组合格。学生以此开发的结果申请了3个软件著作权,设计与开发的科技处合同审批系统得到了学校的应用。教学中,我们发现本文介绍的流程与能力培养方法在四个方面取得了成果:(1)学生设计与开发的项目业务逻辑合理、异常处理恰当,能适应项目运行时的各种复杂状态;(2)通过数据建模与业务逻辑的迭代分析得到的数据库质量高,能够适应后期的各种异常与功能的调整,说明数据建模的成果能够应对复杂工况与复杂流程;(3)类图根据设计模式的要求进行优化后能提升整体项目的设计与开发质量;(4)学生能够在团队中进行有效沟通与完成一些比较复杂的工作。