(中国联通海南省分公司,海南 海口 572500)
过程模型建立了工程中各种活动的顺序,从这方面看,它体现了一个工程项目中整个生命周期。当前各种工程项目中都有各自的过程。MSF过程模型起始于微软开发软件应用程序的过程。它经过演化,与一些其他流行的过程模型中最为有效的原理相结合,形成一个模型。MSF过程模型可以跨越所有的工程类型,例如,基于阶段类型的、里程碑驱动的、基于迭代模型等类型的工程。主流的软件开发过程模型有瀑布模型、螺旋模型、喷泉模型、RUP模型等。
瀑布模型:使用里程碑作为整个过程管理中的转换或评估点。在瀑布模型中,每一个任务在下一个任务开始前,必须完成。也就是说必须将当前阶段的任务完成后,才可以进行下一阶段的任务。瀑布模型的优点是有利于大型软件开发过程中人员的组织、管理,有利于软件开发方法和工具的研究,从而提高了大型软件项目开发的质量和效率;缺点是开发过程不能逆转,导致客户需求变更时难以响应,并且客户只能在项目后期才能看到软件的实际情况。
螺旋模型:螺旋模型的焦点集中在需要对项目需求进行持续不断的精练和对项目连续不断的评估上。螺旋模型是一种非常简单的过程模型,它没有所谓的里程碑,它就是对软件按周期不断地重复构建。螺旋模型的优点:第一,设计上的灵活性,可以在项目的各个阶段进行变更;第二,以小的分段来构建大型系统,使成本计算变得简单容易;第三,客户始终参与每个阶段的开发,保证了项目不偏离正确方向以及项目的可控性;第四,随着项目推进,客户始终掌握项目的最新信息,从而能够和管理层有效地交互。螺旋模型的缺点是需要相当丰富的风险评估经验,若不能及时识别风险,将造成重大损失;并且过多的迭代次数会增加开发成本,延长交付时间。
MSF过程模型将上述瀑布模型和螺旋模型的最优秀的原理结合起来组成一体。瀑布模型中由于有基于里程碑的计划,因此,它有可以预测项目的未来优点;而螺旋模型则有快速反馈和有创造力的优点。MSF过程模型继承了它们的优点。
MSF模型是一种基于阶段和里程碑的方法。MSF中用里程碑来计划和监控项目的进程。MSF中的里程碑分为“主里程碑”和“中间里程碑”。主里程碑是项目阶段的转换点。MSF中主里程碑有“项目范围认可”“项目计划认可”“范围完成”“发布就绪认可”“部署成功”。中间里程碑是指两个主里程碑之间的小的工作目标指示物或工作成果。
“迭代开发”是MSF中一个重复发生的主题。代码、文档、设计、计划和其他的工作成果都是以迭代的形式出现的。MSF建议一个解决方案可以先构建、测试、开发出一个核心的功能。然后,其他的功能特征可以被加入,这就是通常所说的发布策略。对于一些小的工程来说,它通常只需一个版本。功能复杂时把它们分成多个版本,从而可以找到改进的机会。版本发布没有必要按顺序进行,成熟的软件产品经常会有多个版本重叠的发布周期。版本发布之间的间隔时间,根据项目的规模、类型、用户要求和策略的不同而不同。一个解决方案在没有完全被部署到生产环境中之前,是没有办法提供价值的。由于这个原因,MSF认为只有在开发完成后成功部署并交付价值以后,才开始下一个迭代过程。
MSF模型分为:需求分析、设计、软件开发、测试验证、部署实施五个阶段。
需求分析:接到需求后,首先需要进行业务评估。如果确定承接该项目,则要详细了解用户需求和业务流程。整理客户需求后,可以制作产品原型和业务流程图,给客户进行确认,这是一个反复修改和确认过程。通过沟通,确定最终的原型和需求。软件开发团队根据资源,制定开发计划、产品路线图表。
设计:确定需求和原型后,可以进行产品的功能逻辑设计,包括详细和概要设计。设计师要参与原型评审,了解必要业务需求。
软件开发:按照既定的技术路线和开发计划进行软件开发。在开发过程中需要重视代码评审和版本管理。开发团队需在对应的时间节点完成任务,保证项目的进度。
测试验证:测试人员在初期参与需求分析、需求评审,确定测试哪些模块、使用哪些测试用例、输出哪些测试文档。发现BUG后,要返回开发人员进行修改。测试通过后出具测试报告用于业务部门进行功能验收。
部署实施:当前迭代周期的版本开发完成后,应与客户进行沟通,对当前版本进行功能验收,验收通过后更新版本进行发布部署运行。部署阶段是促进解决方案从项目团队到运营团队的顺利过渡的过程。客户仍有功能升级需求时,可以进入下一次迭代周期。
从上面的总结中可以看到,MSF中的里程碑式过程管理方面还是很值得学习的。它通过一步一步地达到预先设定的目标,从而使整个软件过程变得可控。同时,也会及时发现项目中潜在的危险因素,便于风险的管理。它把软件过程分为几个阶段以后,可以针对某一阶段中存在的问题进行定位、分析和解决,为提高软件开发的成功率提供了有效保障。
同时,也可以看到该过程管理模型中对过程划分得比较细。可以根据项目的规模和类型对这个过程管理模型进行优化,使之更加适合于公司实际的项目开发。
战略是实现企业目标的过程。因此,作为公司中的IT部门发展规划一定要服从于集团的整体战略与中长期规划。
软件研发部门应以信息化和数字化推动管理创新,软件研发部门的建设,需要对集团公司的管理模式、业务流程进行根本性的思考,结合业务流程重组、项目管理技术以及“云+网+大数据”等技术,对集团公司的整个业务体系进行系统优化与改进的支撑作用,以信息化和数字化为契机推动管理创新,全面提升公司的管理水平和业务水平,增强公司在国内的领先地位。立足实际,持续打造IT核心能力,IT是一种工具,信息化和数字化的根本目的是为了改善管理,推动高质量发展,进而满足集团公司的发展战略的需要。因此,软件研发部门建设需要从自身业务及管理需求出发,认真选择切合公司实际的产品方向和技术架构,持续打造IT核心能力。
整体规划、分步实施、循序渐进,软件研发部门建设需要从集团公司的整体发展战略及业务需求出发,明确方向与目标、现状与差距,并结合当前信息技术的发展趋势,勾画公司数字化转型的IT系统应用蓝图,制定合理的实施策略,对整个建设工作进行统筹规划。在统筹规划的基础上,根据实际情况分步实施、稳步推进。通过软件研发部门建设规划,可统一公司对信息化和数字化的认识,明确方向与目标,避免盲目和重复的无效投资,有效降低IT建设的风险,提高IT投资回报。
需求管理是一种对系统需求进行启发、组织、文档化的系统的方法;是在客户和项目组之间对变更的系统需求建立和维护一致意见的过程。在CMMI的定义里面,需求管理的目的是在客户和项目组之间建立关于软件项目要实现的客户需求的共识。控制软件需求,为软件工程和管理工作建立基线。软件计划、产品和各项活动应当与软件需求保持一致。软件需求规格说明文档是软件生产中最重要的技术文档,它不仅是进行软件设计的依据,而且是整个软件生产工作的基础。如果需求管理不善,会增加软件开发的迭代次数,从而导致成本失控。因此,需要开发设计人员尽早介入与客户的需求沟通,明确需求,精简需求模型,从而减少开发成本,缩短开发周期,提升用户的满意度。
海南省的整体信息化水平不高但发展迅速,叠加自由贸易港政策影响由此带来了大量的软件开发需求。但许多客户在初始阶段的软件需求往往不够明确,需要不断升级优化、叠加功能。但对于开发团队而言,假如不停地往其中堆功能,产品就会很臃肿,失去拓展性、易维护性,最后难以运营,甚至是丢失客户。因此,技术上建议采用微服务架构。微服务架构具备易拓展性、易维护性、易复用性,在业务上具有高度的差异化可配置性;在运行上具有容错性,能够在某一功能发生问题时不影响整体运行。设计时通过将每个业务流程,都做成颗粒度很小的服务,提供可配置的选项,这样便可以通过需求配置出适合的产品形态。目前的中国联通统一软件平台底座,已经完全支持微服务架构的研发、测试、部署、运维的全生命周期管理。因此,目前笔者所在的研发团队采取了当前最先进也最科学的微服务架构及前后端分离技术进行软件开发:后端采取基于java的j2ee/springboot软件架构,前端采用VUE等基于javascript的一体化门户技术。采用云原生的DevOps开发模式,快速开发,快速测试,快速部署,快速交付。运营与运维人员直接参与项目团队,可有效促进部门之间的沟通、协作与整合,并提高产品化的成熟度,提升产品研发质量。同时,研发过程要遵循微服务设计,将各类应用进行有效拆分,提前设好配置选项,预留扩展接口,以支撑在产品遇到的各类情况。
依托海南联通整合本地及全国资源的能力,集成各行各业的龙头应用厂商、软件外包团队,共同打造及完善产品,以最大程度地满足客户需求。公司应根据自身的业务特点,现有重点客户的需求,集中力量打造在某几个领域内的优势产品。在项目的需求分析、开发计划设计阶段,做好任务分解,将本团队不擅长或非核心优势的工作划分出去,以缩短开发周期,节省成本。同时,加强质量管理,经过严格测试评审后将外部团队的开发成果整合到项目中进行交付,以保证产品功能特性在本团队的掌控之中。
基于分级分类客户的需求不同,通过不同的差异化产品版本,推进产品的规模推广。持续服务,项目迭代方面,针对项目个性化需求多,通过研发与交付队伍分离,不断进行快速开发持续交付。产品迭代方面,当项目共性需求达一定阈值触发产品迭代,发布新功能到整个产品线,逐步完善产品能力。通过市场洞察、产品研发、制定营销策略、持续服务运营等各环节,体系化地推动产品运营、打通产品运营全流程各环节责任边界。产品交付后,发挥本地团队在持续服务运营当中的优势,获取客户对已交付产品的反馈信息,及时转化,从中不断发掘出新的商机。
产品运营体系构建如图1所示:
图1 产品运营体系架构图
在DevOps的流程下,在项目开发期间就需要整合销售队伍、集成队伍和研发队伍。通过团队整合,打破部门间壁垒,实现能力流通,形成研发交付一体化。项目实施方面,通过虚拟化BU项目制的方式,将销售、解决方案、运维与运营等交付实施团队并入研发队伍,前置参与研发,发挥运营商属地化交付的天然优势,增强项目交维能力。同时,设置产品运营中心,以产品为核心,通过精准运营策略引导市场销售,以市场前端持续运营牵引后端研发。
根据上述的软件工程基本原理及研发实践,笔者团队形成了一套行之有效的组织架构,并且基于该架构成功地开发了海南省的多个大型软件项目。
研发经理(技术总监),对系统方向和团队中一些决策性的事进行管理,包括日常事务,虽然他不需要编码,但能担任技术总监,他经历了设计开发,产品的实施,并对系统的战略性发展都有相当的见解,对整个系统的所有流程都面面俱到,不单单局限于技术层面,因为他需要主导整个团队运作。可以跟客户交流需求、根据需求分派任务。
Leader,管理项目组成员、技术难点分析,编写详细设计文档,技能特色很突出,有创新能力,不是什么都是从网上拿下来一改就用的,其他方面都可以讲出一二,对行业内的动态都很关注,有一定的交际能力。可以跟客户交流需求。
项目经理,项目经理负责分配资源,确定优先级,协调与客户和用户之间的交往。总而言之,就是尽量使项目团队一直集中于正确的目标。项目经理还要建立一套工作方法,以确保项目工件的完整性和质量。懂开发,知识面广,针对项目,对系统进度的控制,风险评估进有把控,根据反馈的客户需求,分派具体工作内容,项目中日常事务调配,人员配置,具有一定的沟通能力。可以跟客户交流需求。在我们的设置中,基本保证项目经理和研发经理岗位基本类似,并且资历和年龄相仿,并且有过合作经验的为佳。
项目助理,对会议、文档、日常事务的跟踪进行管理,这不只是助理一职,这个职务在整个项目中,启着至关重要的位置,他贯穿于团队中、每个职务之中,其他职务是针,他就是一根线,他可以对项目中每个人的工作进度监控、总结和传达任务。
系统架构师:可以由研发经理兼任,对系统进行构架设计、技术评估、开发环境,编写概要设计文档与设计规范文档,对各类技术点进行分析,要求技术全面,并掌握熟练,有丰富的项目经验,在各种环境下,给出最佳的解决方案。首先,业务分析员通过概括和界定作为建模对象的组织来领导和协调业务用例建模。例如,确定存在哪些业务主角和业务用例,他们之间如何交互。通过描述一个或几个用例的需求状况以及其他支持软件的需求来获取系统功能某一部分的规约。还要负责用例包并维护该用例包的完整性。其次,构架设计师负责在整个项目中对技术活动和工件进行领导和协调。构架设计师要为各构架视图确立整体结构:视图的详细组织结构、元素的分组以及这些主要元素组之间的接口。因此,与其他角色相比,构架设计师的见解重在广度,而不是深度。
产品经理:可以由项目经理兼任,负责对系统功能需求分析、用户体验设计,编写需求文档,如果我们接到任务,我们的产品需要做哪些功能,产品经理必须给出需求,将功能项目实际的列举出来,不但要知道自己做什么样的东西,还要了解我们做出来怎么用,分析产品在实际运营中的一些需求,制定项目的功能开发阶段,现在一般的开发团队中还没有这个职位,其实这个职位对一个产品的好坏影响很大,我们在产品开发完成后,常常遇到一个问题,就是产品刚出来就感觉已经落后了。
高级软件工程师(主程):以后台为主,负责完成架构师的设计意图,根据设计文档编写代码;根据设计文档编写单元测试代码,根据测试报告BUG己录修订BUG完成包或子系统的开发。熟练相关开发技术例如:JAVA、C#(.net)、C++、C、汇编、3D方面等,负责项目的核心模块开发,编写模块设计文档,不需要培训就可以直接进入开发状态,是团队模块开发引领者和衔接者,一般经历过几个项目的人都可以担当。
初级软件工程师(辅程):以前端为主,懂java、javascript、C#(.net)、C++、C能开发一些简单的模块,在技术上需要提高,现在大部程序员都喜欢写后台代码,逻辑思维强,写服务、API代码比较好,做小型项目外包都没问题。高级初级的项目配比为1:2至1:3之间。
UI设计、美工,界面设计人员通过以下方法来领导和协调 Web界面的原型设计和正式设计:获取对 Web界面的需求(包括可用性需求),构建Web页面原型,使Web界面的其他涉众(如最终用户)参与可用性复审和使用测试会议,复审并提供对Web界面最终实施方案(由其他开发人员员创建,如设计师和实施工程师)的适当反馈。UI设计、规范,切割并排好界面,有很多美工只懂设计切割,会设计还要什么html、css、js,还要懂一些接口规范,有很多美工怕写代码,所以在招聘的时候可以招两个,一个设计切割,一个排版处理,两个结合处理。
DBA,搭建好数据库环境,准备数据规范,更新数据以及数据文档,对数据系统性能分析、迁移、管理等工作。
测试工程师,测试工程师负责执行测试,其中包括设置和执行测试,评估测试执行过程并修改错误,以及评估测试结果并记录所发现的缺陷。完成测试用例,文档,编写测试文档。
实施工程师,负责软件产品安装调试和部署,完成项目相关系统工程工作,负责客户技术支持,负责编写系统部署方案和使用手册、维护手册,负责系统实施计划和规划。