费 宁,成小惠
(南京邮电大学通达学院 计算机学院,江苏 南京 210003)
软件人才的正常结构应该是宝塔型,呈倒三角,底层应该有大量的规范熟练的编程人员。然而,现在软件队伍的结构不合理,中间大、两头小,缺少高级软件设计开发和管理人才以及熟练的编程人员。当前,教学的开发模式为瀑布模型,但业界对于软件工程的研究不断更新。作为从事软件开发的毕业生,仅仅知道瀑布模型的几个阶段和特点并不能使人信服。要想使高校培养出来的学生能够满足企业的需要,就要不断紧跟企业,了解技术前沿,深入理解软件工程,这才是培养软件工程人才的根本。
软件工程包括项目管理、分析、设计、程序的编写、测试和质量控制。软件开发过程从早期的瀑布模型(Waterfall Model)模型演化到新兴的Scrum 开发方法(Agile),软件设计方法也可以简单分为重量级和轻量级的方法[1]。
重量级开发方法主要包括CMM、统一软件开发过程(RUP)和瀑布模型等[1]。瀑布模型把软件开发过程分成各种工序,每个工序根据软件产品的规模、参与人员的多少进一步细分成更小的工序,见图1。瀑布模型的用户很多,成为软件开发企业使用最多的开发模型[2],但已不能满足目前复杂多样的软件开发需求。其弊端有两点:①对反馈没有响应,对客户需求变化无所适应[3];②工作重复,开发者变成流水线上的机器,无法得到新的学习和锻炼。
图1 瀑布模型的流程图
轻量级开发方法主要包括极限编程和Scrum开发等。Scrum 开发主要有3 点:①迭代,Scrum开发强调软件开发应当能对未来可能出现的变化和不确定性做出全面反应,见图2;②小版本,兼顾快速功能的展现和复杂的客户需求[4];③快速,这既要求个性思维活跃,又要求通过结队编程、代码共有、团队替补等方式融合团队中所有人的智慧。
Scrum 开发避免了瀑布开发方式的种种弊端,吸收了各种新型开发模式的“动态”特性,关注点从文档转移到开发者,管理方式也从流水线转移到团队的协作式组织[4],同时注重发挥开发者的自我特长;并且更积极适应客户需求的变化,在反馈和迭代中,根据环境和需求的变化修改设计,是一个不断更新不断完善的软件开发模式。
图2 Scrum开发的过程模型
不同的软件开发方法展现出不同时代对软件产品开发过程的递进认识以及对不同类型项目的多样化的理解。当今的软件已经成为多人参与、分工明确、通力协作的大型工程,而高校对软件工程人才的培养严重滞后,跟不上技术更新和思想更迭的速度,主要体现在教材老化,内容老旧;教授软件工程的教师缺乏实践项目的经验;教学方式单一,更新速度慢。这些都决定了目前的培养方式不能适应企业对软件人才的要求。在实践教学中利用Scrum 开发模式是对高校的软件工程人才培养的一种新尝试。
真正的软件人才不再是写代码的程序员,而是整个体系结构的分析、设计、标准制订、协调人员。因此,在培养软件工程人才时,应该以人为中心,而不是以开发过程为中心,强调软件开发者能够对变化和不确定性作出全面反应,锻炼学生相互之间的协作能力以及作为一位项目负责人的总体设计、总体架构和分析协调能力和对人员的合理安排和配置能力。这也正是本课题的主旨。
在当前的软件人才培养的实践环节,让学生了解和学习相关知识,并在实践中验证Scrum 开发的优缺点和适用性,以满足未来企业的需求,旨在达到如下目标:①改革现有的软件工程实现流程;②培养学生项目开发能力、项目综合管理能力;③培养学生的科技创新能力;④培养学生更新技术、自我学习的能力。
软件工程涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等多个方面。Scrum 开发在教学过程中涉及教师和学生两个对象。整个执行过程包括教学预研、案例分析、教学实践和理论总结。这4 个过程中,教师全程参与,见图3。
图3 Scrum开发教学方法的实施过程
第1 步:教学预研。教师要收集大量资料并确定软件开发行业对Scrum 开发的定义和需求,跟踪技术前沿,研究Scrum 开发的开发思路、原则及其优缺点,分析当前Scrum 开发的方法和技术,研究Scrum 方法的适用性和用于Scrum 开发团队的项目管理工具,还须讨论如何在日常教学和实践环节中,将相关课程如程序设计语言、数据库、软件开发工具等和Scrum 开发相结合,并教授给学生。
第2 步:从企业界找到典型案例,并进行研究分化,找出适合于教学的项目课题;由此分析Scrum 方法的独特之处,比如迭代开发、关注互动沟通、减少中介过程的无谓资源消耗,引导学生从产品、从组织结构的角度衡量Scrum 方法的适用性。
第3 步:在实践教学环节中,指导学生实施Scrum 模型开发,具体步骤如下。
(1)分配任务:一个班级分若干组,分别按传统瀑布模型和Scrum 模式开发不同的项目,开发方法不受限制。每组分配一个观察员,记录该组在整个开发周期的进展、效率和协作情况等多个因素。
(2)明确细则:Scrum 开发小组选择一个Master,确保Scrum 的正确使用并负责整个项目顺利完成。其余成员构成团队,即负责开发软件的跨职能小组。团队是自我管理的[5]。
(3)制订计划:Scrum Master 按照优先级顺序逐条说明项目需求,并根据团员情况动态分配任务,同时负责补充项目描述或调整优先级。团队要对项目规模进行估算,这样有利于以团队的整体智慧和能力估算一个任务的工作量,从而避免错误理解或无法重用以往成果等问题[6]。
(4)定期举行站立会议:在Scrum 站立会议上,每个团队成员需要说明进度和遇到的问题,并限制时间。
(5)团队协作:任务即将到期或团队成员遇到困难时,其他成员可以参与帮忙。
第4 步:把成果转化成理论总结,并运用于理论课的教学。软件工程专业的课程体系中,有多个与软件开发相关的课程。例如,软件工程导论、软件工程、PLT、软件需求分析。其中,软件工程类实验提供软件工程系列课程的相关实验,包括基于C#的Windows 应用程序设计、软件体系结构、软件工程—Microsoft 软件开发方法、软件工程环境ROSE、CMMI 等级模型原理、CMMI 应用实施等,可在教学内容中增加Scrum开发。
在Scrum 实践教学过程中,引导学生不断提问:会选择什么语言,什么环境;选用什么算法,什么样的系统体系结构;在理解不同的开发模式的优劣之后,选择在何种情况下,应该使用何种开发模式。让学生在自我询问、自我回答中达到培养软件工程人才的目的。同时上升到理论的高度,将理解和认识形成理论知识,在多门相关课程中加入和渗透,这是教学主旨。实际上,软件开发方法的选择取决于很多因素,但未来发展趋势多为以人为本,必定会以尊重客户变化需求的Scrum 开发为主,周期性迭代性地修改软件,使成果日臻完善。这要求在教材内容、教学方法、教学模式等方面渗透新的观念、新的内容、新的方法。
采用的案例:①为一家在线B2B 公司开发一款类似谷歌的搜索服务,作为Web Service,该服务可以内嵌于网页中;②实现一个面向大学校园的二手物品交易网站;③嵌入式平台的中间件开发;④将企业网站迁移到Web 2.0。此类包括操作系统、算法、网页开发等的案例在学生实践中有很好的反馈。
在项目实训中,我们选取了③和④案例。在这两组研究对照组中,前一组需求复杂,但变化频率比较少;后一组需求简单,但用户的需求分析改动次数频繁,既有界面方面的,也有功能交互方面的。
在每个项目中,都分为Scrum 模型开发小组和瀑布模型开发小组;并行开发;每组人力资源均衡,人力资源的消耗以人×课时来计算;开发周期相同;一名学生每次项目承担角色不同;软件质量以测试出的bug 数和测试案例的比率来衡量。
比较过程依据变化的组合分别记录,根据每组观察员的记录,可以很明显地看出:①瀑布开发小组分阶段进行,如果前一个阶段的输出尚未给出,那么下一个阶段的学生就会无所事事,这不仅浪费资源,也会影响整个项目的进程,而Scrum 开发小组所有团员都是跨职能的,都在服务于项目,没有学生是闲置的;②Scrum 站立会议不仅让学生们说出自己的进度,还可以知道其他同学的进度,更可以顺利地进入项目的下一个阶段,瀑布开发小组的学生们在完成一个阶段的任务之后,又投入该阶段的大量文档工作,下一个阶段的学生又要花大量时间阅读这些文档,不仅造成项目的延迟,也极易造成错误;③瀑布模型小组的学生们非常反感客户提出的需求临时改变,因为这意味着大部分的工作全部作废,要重新做起;而Scrum 开发小组的学生反馈积极,并做出及时修改。
从以上两个典型项目可以让学生体会到:若项目需求固定,合适瀑布型;而对于创新型项目,需求更新比较快,则合适灵活的Scrum 开发模式。通过项目课题的多样性告诉学生实施一个软件工程,要选取适宜的开发模型,采用合适的设计方法。另外,要提供高效率的项目流程,要实现开发过程的有效管理,只有Scrum 模型或者只有瀑布模型是无法满足千变万化的需求的,可以让学生针对项目的特点将两种模型融合,发挥各自长处。
从项目实训等环节入手,在软件生命周期中的各环节渗透Scrum 开发,应努力提供技术支撑和实训案例,力求使构建的软件模型开发教学平台,最大化地接近企业的真实开发环境,目的就是希望培养的软件工程人才具备以下能力,以满足市场和时代的要求。
(1)扎实的专业理论基础。专业理论知识是进行软件开发的前提和承载。基于Scrum 开发的软件工程人才培养过程不仅强化了专业理论基础,完善了理论体系,也在实践中验证了专业知识。有了此基础,也能体现出专业上的自信。
(2)熟练的工程实践能力。这是软件工程着力培养的应用型人才的一个重要特征,也是Scrum 开发培养的专业人才不同于其他人才的地方,具体表现在对实际问题的发现、提出和解决的能力上。
(3)善于接受反馈和快速适应能力。Scrum开发过程是一个不断循环往复、不断反馈、不断更新的过程。在Scrum 开发中,软件需求、开发小组以及标准和目标等开发环境都不断变化,这都要求开发人员能虚心接受反馈,并具备快速适应、快速应变的能力。
(4)培养沟通和表达的能力。沟通既包括同组同学之间的沟通,也包括与软件产品需求者(教师扮演)之间的沟通。而表达能力通过简单的图表描述抽象复杂的代码和算法得到培养,也锻炼了学生口头表达和语言组织能力,让学生理解自己的开发思想,也更容易得到改进意见。
(5)团队协作能力。一个软件过程的开发是庞大的,不仅要求优秀的个人技术,也更强调团队协作能力。因此,团队协作能力是软件工程人才不可或缺的品质。Scrum 开发指出最好的架构、需求和设计都源自自我组织的优秀团队,团队要总结如何更有效率,然后相应地调整自己的行为。这里强调团队协作能力和自我约束、自我管理能力,正是在日常教学中要潜移默化地培养学生这种素质。
当前日趋扩展的软件工程Scrum 开发模式开创了软件全生命周期的协作化生产的组织、管理及运行新模式,将其介绍给学生,并让学生在实践中领会其意义,本身就是一个很大的创新。要想使学生满足市场的需要,要想使学生成为多层次、复合型、具有国际竞争力的高素质人才,必须要引进先进技术,更新教学内容,多尝试,多求证。虽然这不能改变全部,但至少能不断前进。