1 软件开发流程1.1 软件工作流程为了便于对软件开发工作进行计划和控制,需要对整个软件开发的工作进行划分,抽象出几个相对独立的流程,它们分别是需求、分析、设计、实施、测试、部署、项目管理、配置与变更管理、环境支持9个工作流程,其中前6个为核心工作流程,后3个为附加流程,为前者更好的进行提供支持服务。每个流程都分别处理不同的工作,需要不同的技能。它们之间有明显的前后顺序。每个流程结束后都应做适当的评审,需求分析结束后必须做正式而严格的评审。
1.2 迭代式开发对于大多数软件系统,都存在需求和设计风险,仅靠一次开发过程就能完成项目开发的期望是不现实的,为此,我们可以采用迭代式开发方法,把整个项目开发过程,预先划分成2-5次迭代开发过程,每次迭代时间不少于1个月,迭代次数因项目规模和复杂程度而异,每次迭代都需要经历以上9个工作流程,每次迭代都得到一个可运行的版本,都完成了一定的功能,规避了一些风险,直到最后一次迭代完成时,实现了所有的功能,得到了用户需要的最终产品。
迭代式开发与传统的变更和恢复机制不同,前者承认需求和设计中必定存在风险,而主动划分多次开发过程尽早规避风险,后者力求需求分析和系统设计尽量准确,而通过变更和恢复机制处理意外因素。二者处理问题的角度不同,各有千秋,对于需求复杂或技术难度大的系统,适合采用前者。
每一次迭代都应作为一个重要的里程碑,解决了重要的问题和规避了重大的风险,都要进行正式的复审。
1.3 阶段评审 有效的管理需要有效的检查和控制,没有控制的计划不成为计划。在软件开发的几个关键流程中都需要严格的检查和控制,也就是常说的阶段评审。阶段评审必须由关键人员负责执行,切记开发人员自己评审,需求分析结束后,必须邀请用户参与评审,概要设计结束后必须邀请资深的系统设计师参与,如果没有足够的人员,项目组之间可以交叉评审。最重要的是要重视评审,要保证评审有效。
2 软件工程角色为保障软件工程的顺利实施,建立合理的角色管理体系是整个软件工程管理中一个重要的方面。我们采用角色分工的方法,首先划清角色职责,在具体的项目实施过程中为每位成员分配角色(根据项目规模和人员情况,可以一人兼多个角色和多人充当一个角色),以保证项目开发过程的各个环节责任明确、分工到人。角色数量与公司规模和项目规模有关,一般设置为项目经理、需求分析工程师、系统设计工程师、高级软件工程师、软件编码工程师、测试设计工程师、测试工程师、软件支持工程师8个角色。
通过划分软件工程角色,可以根据技术员的技能安排相关的任务,可以有目的的培训或招聘相关技能的人才,可以有重点的稳定高级人才,防止人员流动带来的风险。我有什么类型的业务,我就需要什么样的人,而不是,我有什么样的人,我就做什么样的业务。如果没有明确的角色划分,就没有合理的职责分配,一个人几乎什么都需要掌握(学习是有成本的),当他达到一定的水平之后,自然就追求更高的待遇,他具备高级软件工程师的水平,但我们更需要程序员,我们应该提供什么样的待遇呢?我们需要什么样的人,我们就提供什么样的待遇。
在传统的项目小组中,我们往往安排技术高超、经验最丰富的程序员做项目经理,这是一个误区,技术高超、经验丰富的人应该做系统分析和设计,他是技术专家,这是他的特长,项目经理应该是一个管理、协调和客户关系专家,有时,二者可以是一个人,但决不是一个角色,在大的项目中,二者更应当分开。技术人员一般不善于处理客户关系,很多项目的失败就是因为客户关系处理不好造成的。
一个人到底是什么角色,是在项目中根据项目特点和个人技能临时确定的,并不一定代表一个人的能力和未来,是因事就人,而不是因人就事。
2.1 项目经理l 负责制定并提报项目开发计划和迭代开发计划,负责项目小组成员的内部管理并对其工作进行绩效考核,其工作向技术中心经理负责。
l 根据项目开发计划,组织项目实施会议,安排及部署项目开发任务。
l 组织项目各阶段的阶段评审,并对各个阶段的进度和质量负管理责任。
l 管理、检查项目开发过程中的各个文档,管理并监督源代码、目标代码的交付工作,并按照软件配置管理的要求完成项目的配置管理工作。
l 按照项目进度表,保障项目小组内部各阶段的工作衔接。
l 协调好项目小组成员之间的关系,保证小组成员即时学习与了解与项目有关的技术要点,积极参与公司安排的科研活动和技术研讨活动。
l 在项目的售前、售中、售后加强与客户方主管人员的沟通、协调,维护良好的客户关系。
2.2 需求分析工程师l 根据商务合同的要求积极与客户的业务人员联系,全面、深入、细致地了解用户的业务流程及软件需求。
l 按照需求分析规范的要求编制需求分析文档。
l 协助项目经理制定项目开发计划。
l 参与需求分析、概要设计等过程的阶段评审,从是否达到需求分析要求的角度提出评审意见。
2.3 系统设计工程师l 根据需求分析结果及概要设计规范设计、编制概要设计说明。
l 保证概要设计的科学性、可行性,并与需求分析一致。
l 协助项目经理制定项目开发计划。
l 依照开发计划的要求保证设计进度。
l 参与需求分析、概要设计、详细设计等过程的阶段评审,从是否达到概要设计的角度提出评审意见。
2.4 高级软件工程师l 根据概要设计结果及详细设计规范设计、编制详细设计文档。
l 保证详细设计满足概要设计对功能界定、可靠性、用户界面等各方面的要求。
l 依照开发计划的要求保证设计进度。
l 参与概要设计、详细设计、软件实现等过程的阶段评审,从是否达到详细设计要求的角度提出评审意见。
2.5 软件编码工程师l 依照项目设计文档及项目经理的安排构造代码。
l 依照软件编码规范的要求保证软件开发的质量。
l 在模块开发过程中做好内部测试工作。
l 依照开发计划的要求保证开发进度。
l 依照软件编码规范做好代码注释。
l 参与相关模块的详细设计、软件实现、集成测试等过程的阶段评审,从是否达到软件实现要求的角度提出评审意见。
l 依照配置管理的要求做好源代码及目标代码的管理及交付工作。
l 协助软件支持工程师完成对用户的培训及售后服务。
2.6 测试设计工程师l 参与项目开发的全过程,充分理解项目需求,了解概要设计和功能完成情况,并能对产品的结构及功能提出建设性意见。
l 根据产品需求及功能设计,进行测试设计,并按照测试计划规范设计、编写测试计划。
l 组织测试工程师实施测试,对测试结果进行监督。
l 参与相关阶段评审,对测试设计负责,并对测试结果负管理责任。
2.7 测试工程师l 按照测试计划的要求设计测试用例,并且实施测试。
l 按照相关规范要求编写测试日志及测试报告。
l 参与相关阶段评审,对测试的准确性、可靠性负责。
2.8 软件支持工程师l 积极保持与客户方业务人员的联系,听取用户的意见,并保证与项目组的沟通。
l 参与阶段评审会及内部技术会议,并依据会议讨论要点及相应规范建立阶段评审和内部会议文档。
l 开发项目的“帮助”系统,依照用户手册规范编写用户手册。
l 协助项目经理做好项目配置管理工作。
l 对项目、产品进行后续跟踪,完成售后服务工作,对用户进行相应的培训及技术支持。
3 规范化开发过程文档 为了提高软件的可维护性,便于人员交流和项目复审,在软件开发过程中,应提供完备的开发过程文档,而且,所有的文档应保持统一的格式,可以根据项目规模对有些文档进行取舍。每种文档都提供了固定的模板,而且,对文档内容做了提示和约束。随着项目经验的积累,可以适当修改和优化文档模板,从可复用级别到达的自我完善级别。
已经提供的标准化文档如下:
l 项目可行性分析报告
l 软件开发计划说明书
l 需求分析说明书
l 概要设计说明书
l 数据库设计说明书
l 详细设计说明书
l 软件测试计划
l 测试日志
l 测试报告
l 工作日志
l 工作周报
l 会议记录
以上各文档的模板以独立文件的方式提供。
4 可复用型组织传统的软件开发组织采用项目小组制,签定软件开发合同后,公司临时成立一个项目小组,负责本软件项目的开发工作。从需求分析、系统设计到软件编码及系统测试等工作全部由项目小组成员独立完成,在项目开发流程中,影响项目成败的关键因素是需求分析和系统设计,需要由经验丰富的技术人员从事,但公司中具有这种技能的人往往不够,导致项目小组中无法进行职责分配,往往大家一块去调研、一块做设计、一块做编码,导致需求和设计风险较大、开发效率较低、开发成本较高,软件质量得不到保证。鉴于这种情况,我们可以成立软件工程小组、技术支持小组和客户服务小组三个可复用的组织,他们分别从事不同的工作,由不同技能的人组成,一个人可以参与多个组织。它们都为项目小组服务,并安排人员参与不同的项目小组,提供不同的技能,在某一方面可以做的更好。一个项目小组一般由软件工程小组和客户支持小组的部分成员,以及几名程序员临时组成,项目结束后,项目小组也随即解体。
成立三个小组具有如下好处:
l 可以有目的的培养相关的技能和人才;
l 相关技能的人可以互相学习,共同提高;
l 可以有目的的稳定和留住人才;
l 各项目小组之间可以复用一些技术和经验;
l 便于组建低成本的软件编码队伍或开发基地;
l 便于实施规范化的软件工程管理和控制。
与客户直接打交道的主要是市场部、软件工程小组和客户支持小组的成员,项目小组中的大多数人是不需要与客户接触的,可以采取在偏远地区建立软件开发基地或软件加工合作伙伴的方式,降低开发成本。公司应该发挥自己的优势,做好市场工作,接更多的项目,然后做好需求分析和概要设计,并对软件开发过程进行严格的控制即可。需求不稳定、不明确是影响该模式成功实施的关键因素,这可以通过两种途径加以克服:(1)需求分析工程师的经验,有经验的需求分析工程师,应该会听、会记、会引导、会分析,能够充分了解客户的业务流程;(2)客户有效的配合,多与客户沟通,做好客户关系,讲明利害,客户就会作好配合,让客户单位的技术人员参与项目小组(挂名),会起到事半功倍的效果。项目进行过程中,项目经理要不断的与客户沟通,搞好客户关系,很多项目的失败,不是因为项目做得不好,而是因为客户关系没作好。
成立共享小组并不意味着要加多少人员,只需要把现有的技术人员重新整合,用其所长,每个人都要在项目小组中工作,同一项目小组的人员可以有机会交流和沟通。在开发过程中,遇到了问题可以直接请教相关的小组,营造一种合作、互助、高效的工作环境,有些问题你考虑了一天可能还没解决,别人可能10分钟就会解决。
5 总结 项目管理的目标是保证项目以较低成本按期完成,同时还要满足用户需求。因此项目管理必须围绕着费用、工期和质量三个要素进行。合理分工和技术复用是降低开发成本的有效途径。工作流程划分和角色划分是合理分工的基础。成立软件工程小组、技术支持小组及客户支持小组可以对不同技能的人进行优化组合,实现有效的技术复用。迭代式开发流程和制定开发计划是保证工期的有效途径。完善的需求分析、阶段评审、测试及统一的软件工程文档是保证软件质量的有效途径。