软件研发流程
软件研发是需要遵从一套成熟的产品研发过程体系,才能做出质量较好的产品。
当然,产品研发过程体系也需要按照业务的实际时间要求而变化,不要拘泥于一定按照瀑布开发方式、或是敏捷开方式进行管理,凡事都需要找到契合自己的方式。鞋合不合脚,只有脚知道。软件研发流程在以下所描述的各个阶段、在项目执行前都要明确各个阶段的目标、既定计划、及时沟通,并确保各个时期所有成员对项目理解一致
一、项目启动会
项目启动会是要明确该产品研发项目的目标。目标不是孤立存在的,目标与计划相辅相成,目标指导计划,计划的有效性影响着目标的达成。所以在执行目标的时候,考虑清楚自己的行动计划,怎么做才能更有效地完成目标,是每个人都要想清楚的问题,否则,目标越是不清晰或是过高,都会影响项目的实际结果。
项目启动会需要说明***项目目标、阶段划分、组织结构、管理流程***等关键事项,将这些内容写成文档并达成一致。
二、用户需求
软件研发前需要确定研发代价和所获得价值的对比,确定需要研发,再安排一系列的资源来支撑这个软件的生存。用户需求由用户提出,对技术一般不描述,只描述项目目标。用户需求关注的是系统如何支持业务流程,背后的需求是“实现业务目标”。
三、产品需求
产品需求是根据用户需求转化而来的技术实现需求,需要针对用户提出的产品目标进行细分,总结出具体的功能点,再对功能点细分为各种不同的操作流程。产品需求关注的是合理技术方案,背后的需求是“工作量”、“实现难度”和“系统性能”。产品需求一般包括产品需求规格说明书和产品需求矩阵。产品需求矩阵一般按照子系统、功能集、执行单元的结构列出所有的功能需求,每列则对应每项功能的工作步骤以及每个步骤的工作量。产品需求完成后,需要进行评审。在需求评审会上,产品、技术详细评审需求是否完整,产品功能的正常场景是什么?是否形成闭环?异常场景是什么?是否考虑周全?需求评审后,开发和测试负责人,分别编写技术方案和测试用例。技术方案评审,开发负责人拉上涉及到其他系统的负责人一起讨论,技术方案中必须要有业务流程图和时序图,业务流程图是为了梳理开发对业务的理解,是否和需求一致。时序图是为了梳理本次需求涉及的系统交互。技术方案评审通过后,确认工作量和交付时间,反馈给产品。
四、总体设计
设计阶段的目标是对待开发的系统构架进行分析和设计,为之后的实施工作提供一个稳定的基础。
设计阶段包括了系统架构的输出,好的系统架构设计可以帮助梳理业务逻辑且抓住核心需求,设计稳定可扩展的业务系统,评估业务开发周期和开发成本,有效的规避风险。总体设计是整个系统的框架型设计,一般情况下不能省略(只有维护项目可以省略总体设计,因为项目前期已经设计完毕)。所有研发项目均需要首先进行总体设计,它是设计首要步骤,决不允许本末倒置,不能出现先编码后设计的情况,这是软件研发的第二大痛点(第一大是需求不明确、任意变更需求)。
总体设计分为三个阶段:
1.初始设计。在对给定的数据流图进行复审和精化的基础上,将其转化为初始的模块结构图。
2.精化设计。依据模块“高内聚低耦合”的原则,精化初始的模块结构图,并设计其中的全局数据结构和每一模块的接口。
3.设计复审阶段,对前两个阶段进行复审,必要时还可能需要对软件结构做一些精化工作。
五、概要设计
概要设计的目的是描述系统的每个模块的内部设计,对总体设计和详细设计承担承上启下的作用。
概要设计按照结构化设计方法进行。在概要设计阶段,应最大限度地提取可以重用的模块,建立合理的结构体系,节省后续环节的工作量。
概要设计文档最重要的部分是分层数据流图、结构图、数据字典以及相应的文字说明等。以概要设计文档为依据,各个模块的详细设计就可以并行展开了。
六、详细设计
详细设计阶段就是依据概要设计阶段的分解,设计每个模块内的算法、流程,为每个模块完成的功能进行具体的描述,要把功能描述转变为精确的、结构化的过程描述。
详细设计文档最重要的部分是模块的流程图、状态图、局部变量及相应的文字说明等。一个模块对应一篇详细设计文档。
详细设计最终是将软件系统的各个部分的具体设计方法、逻辑、功能采用文字方式进行表述。这样在实现过程中,编码人员原则上严格按此进行代码实现即可。
七、代码编写
编写代码可以遵循以下几点原则:
1.做好核心模块压测:做好这一点需要懂一些业务,要知道业务压力在哪里,业务请求的重心在哪里。
2.确保过程可控:代码执行时要保持中间的输出,比如说,每处理 10 万条日志,写一条状态日志,记录处理的日志条目数和当前的执行时间。
3.多写注释:多写注释,说明代码实现业务情况及优化思路等。
4.简单易懂的逻辑:千万不要把自己绕进去了,时间一长,谁都看不明白你的逻辑。如果逻辑真的很难在一个函数内完成,尝试切分。
5.使用熟悉、成熟的技术:使用新技术前,建议全面了解该技术的特征、适用范围、不适用的范围。
八、代码审核
团队代码审查可以提升代码质量,分享项目知识、明确责任,最终达到构建更好的软件、更好的团队。
代码审核及其重要,一般来说每周都要做一次代码审核。
代码审核有利于你跟踪项目进展情况,首先,我们能真实地看到研发人员进展如何,并且更早发现他们是否误入歧途。
九、单元测试
所谓“单元”指的是代码调用的最小单位,实际上指的是一个功能块(Function)或者方法(Method)。所以单元测试指的就是对这些代码调用单元的测试。
单元测试是白盒测试,就是必须要对单元的代码细节很清楚才能做的测试。所以,单元测试的编写和执行都是由软件工程师来做的。
十、集成测试
集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。一些局部反映不出来的问题,在全局上很可能暴露出来。
集成测试是黑盒测试,主要是由测试人员根据软件的功能手册来进行测试,需要有专门的测试环境配合。集成测试又分功能测试、回归测试等。
十一、系统测试
系统测试阶段包括系统测试方案及用例编写、功能性测试、性能测试、稳定性测试。
为了验证需求确定的功能是否齐全并被正确实现,同时还要对安装、部署、适应性、安全性、界面等非功能性需求进行测试。系统测试也由测试人员负责,应该在需求分析完成后进行设计,在集成测试完成后进行实施。
功能性测试一般由独立测试小组采用黑盒方式来测试,主要测试系统是否符合“需求规格说明书”。
在经过以上各阶段测试确认之后,把系统完整地模拟客户环境来进行的测试。系统测试是将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起,进行信息系统的各种组装测试和确认测试,其目的是通过与系统的需求相比较,发现所开发的系统与用户需求不符或矛盾的地方,从而提出更加完善的方案。
性能测试验证系统的稳定性和效率,检查系统是否满足规定的性能要求。性能测试通常选择一些典型的功能,检验这些功能在大量用户同时使用系统时系统是否稳定。性能测试由测试人员负责,可以在系统测试完成后进行,也可以对重要模块先进行性能测试,可以贯穿整个测试周期,目的是尽早发现系统的性能瓶颈并提早解决。
稳定性测试和性能测试都必须等到系统基本没问题、趋于稳定时再进行才有效果,否则很难顺利测下去,出现异常也不能定位究竟是系统架构的问题,还是功能上的缺陷。
稳定性测试(亦可称可靠性测试)通过给系统加载一定的业务压力,让系统持续运行一段时间(一般为 7x24 小时),检测系统是否能够稳定运行。
十二、产品发布
产品发布是系统测试结束后的最后一步,产品发布前需要通过产品发布说明会形式,对整个产品开发过程从立项开始回溯过程,指出整个过程中的不足点,总结经验,为下一个项目提供经验案例。
这一会议可以通过正式会议形式召开,需要召集产品经理、主要开发人员、测试人员、上级领导等参与,准备充分,尽最大可能说清楚这个产品发布之后的效果、效益,为上线后的价值评估做准备。
十三、开发过程复盘
只有带着问题去思考才会有收获,这就是复盘。
总结项目经验教训的目的,在于及时总结问题、解决问题并分析原因,避免以后犯同样的错误,而不是追究谁的责任。
|