系统工程体系与实践 第 4 篇:系统生命周期与开发方法
摘要
本文将带你深入了解系统生命周期管理和开发方法的选择与应用,帮助你掌握从概念到退役的完整系统生命周期管理能力。你将学到系统生命周期的阶段与概念、顺序增量演进开发模式的特点、敏捷系统工程方法、精益工程原则与实践,以及如何根据项目特点选择和适应合适的生命周期模型。
学习目标
阅读完本文后,你将能够:
- 理解生命周期:掌握系统生命周期的基本概念、阶段划分和管理要点
- 区分开发模式:理解顺序、增量、演进开发模式的特点和适用场景
- 应用敏捷方法:了解敏捷系统工程的原则、实践和实施要点
- 实践精益工程:掌握精益工程的核心原则和消除浪费的方法
- 选择适配模型:能够根据项目特点选择和调整生命周期模型
一、系统生命周期概述
1.1 生命周期的定义
系统生命周期是指系统从概念形成到最终退役的整个过程。这个过程包括多个阶段,每个阶段有特定的目标、活动和交付物。理解系统生命周期对于项目规划、资源分配、风险控制具有重要意义。
系统生命周期不同于项目生命周期。项目生命周期关注项目的管理过程,从项目启动到项目结束。系统生命周期关注系统本身的存在过程,从系统概念到系统退役。一个系统生命周期可能包含多个项目——概念项目、开发项目、升级项目、退役项目等。
系统生命周期模型是系统生命周期的标准化表示,定义了生命周期包含哪些阶段、阶段之间的顺序关系、每个阶段的主要活动、阶段的准入和准出准则。生命周期模型为系统开发提供了框架,使得项目活动有序进行,阶段之间的转移有明确的准则。
传统的系统生命周期模型是顺序模型,也称为瀑布模型。瀑布模型将系统开发划分为一系列顺序阶段,每个阶段完成后才进入下一个阶段。瀑布模型的优点是结构清晰、管理简单,缺点是灵活性差、反馈晚。现代系统开发越来越多地采用增量模型、演进模型、敏捷模型等,这些模型强调早期交付、快速反馈、持续改进。
1.2 生命周期阶段划分
不同的生命周期模型对阶段的划分有所不同,但通常包括以下核心阶段:
概念阶段:概念阶段是系统生命周期的起点。在这个阶段,识别潜在的需求和机会,进行可行性分析,定义系统的初步概念。概念阶段的主要活动包括:利益相关者需求收集、市场和技术调研、概念方案探索、可行性分析(技术可行性、经济可行性、风险分析)、项目规划。概念阶段的交付物通常包括:概念方案、可行性报告、项目计划草案。概念阶段结束时需要做出”继续/不继续”的决策。
开发阶段:开发阶段是将概念转化为实际系统的阶段。开发阶段通常包括多个子阶段:需求分析(详细定义系统需求)、系统设计(定义系统架构和详细设计)、实现(构建系统组件)、集成(将组件集成为系统)。开发阶段的主要活动包括:需求规格化、架构设计、详细设计、编码/制造、单元测试、集成测试。开发阶段的交付物包括:需求规格、设计文档、代码/硬件、集成测试报告。
生产阶段:生产阶段是为系统交付做准备或进行实际生产的阶段。对于软件系统,生产阶段可能只是准备安装包和部署材料。对于硬件系统,生产阶段涉及制造过程、供应链管理、质量控制等。生产阶段的主要活动包括:制造准备、生产过程建立、质量控制、生产调度。生产阶段的交付物包括:生产系统、质量控制流程、产品。
部署阶段:部署阶段是将系统交付给用户并在用户环境中运行的阶段。部署阶段可能包括安装、配置、数据迁移、用户培训等。部署阶段的主要活动包括:系统安装、系统配置、数据迁移、用户培训、试运行。部署阶段的交付物包括:部署的系统、培训材料、操作手册。
运行与维护阶段:运行与维护阶段是系统实际使用和持续支持的阶段。这个阶段持续时间最长,可能持续数年甚至数十年。运行与维护阶段的主要活动包括:系统运行、系统监控、故障修复、性能优化、用户支持。运行与维护阶段的交付物包括:运行记录、维护记录、升级补丁。
退役阶段:退役阶段是系统结束使用的阶段。退役可能是因为系统过时、不再需要、或被新系统替代。退役阶段的主要活动包括:数据迁移、系统停运、资源回收、处置。退役阶段的交付物包括:退役报告、数据迁移记录、处置记录。
1.3 生命周期管理
生命周期管理是对系统生命周期各阶段进行协调和控制的过程。有效的生命周期管理确保系统在各个阶段都得到适当的管理,阶段之间的转移有序进行,风险得到控制。
阶段门控管理:阶段门控是生命周期管理的重要方法。在阶段结束时设置”门”(gate),需要通过门控评审才能进入下一个阶段。门控评审检查阶段是否完成了所有必需的活动,交付物是否满足质量标准,是否准备好进入下一阶段。门控决策包括:继续(进入下一阶段)、有条件继续(解决指定问题后继续)、重做(重新进行当前阶段的活动)、终止(结束项目)。门控管理确保项目在进入下一阶段前达到了适当的质量水平。
基线管理:基线是在某个时间点冻结的配置,作为后续工作的基础。在生命周期中,通常会在关键点建立基线,如需求基线、设计基线、实现基线。基线提供控制的参考点,任何对基线的变更需要经过正式的变更控制流程。基线管理确保项目在控制下演进,而不是无序变化。
并行工程:传统瀑布模型强调阶段顺序,一个阶段完全完成后才开始下一个阶段。并行工程则鼓励阶段之间的重叠,前一个阶段还未完全结束时,后一个阶段就可以开始。例如,详细设计阶段可以部分完成时开始实现,实现阶段可以部分完成时开始测试。并行工程可以缩短总周期时间,但需要更严格的接口管理和协调机制。
生命周期成本管理:生命周期成本包括从概念到退役的所有成本,包括开发成本、生产成本、运行成本、维护成本、退役成本。许多系统的运行和维护成本远高于开发成本,因此在设计阶段就需要考虑生命周期成本。生命周期成本管理的目标是在满足需求的前提下,最小化总拥有成本。
二、顺序开发模式
2.1 顺序开发的特点
顺序开发模式,也称为瀑布模型,是最早系统化的系统开发方法。顺序开发将系统开发划分为一系列顺序阶段,每个阶段完成后才进入下一个阶段。
顺序开发模式的核心假设是:需求可以在早期完全明确,需求在开发过程中不会变化,或变化很少。基于这个假设,顺序开发强调在早期阶段充分完成需求分析和设计,然后进行实现和测试。顺序开发认为,前期投入更多时间做好需求分析和设计,可以减少后期的返工,总体上更高效。
顺序开发的优点包括:过程清晰:阶段和活动定义明确,易于理解和沟通;管理简单:阶段顺序进行,进度和里程碑容易跟踪;文档完整:每个阶段生成完整文档,为后续阶段提供依据;质量可控:每个阶段结束时进行评审,确保质量达到要求再进入下一阶段。
顺序开发的缺点包括:需求明确要求高:要求在开发早期就完全明确需求,这对许多项目不现实;反馈晚:用户要等到很晚才能看到可运行的系统,发现问题较晚;变更成本高:后期的需求变更会导致大量返工;灵活性差:不能适应需求变化和技术变化;价值交付晚:只有到很晚才能交付价值,用户等待时间长。
2.2 顺序开发的阶段
典型的顺序开发模式包括以下阶段:
需求分析阶段:需求分析阶段的目标是完全明确系统的需求。这个阶段的活动包括:利益相关者访谈、需求收集、需求分析、需求规格化。需求规格说明(SRS)是这个阶段的主要交付物,描述系统的功能需求、性能需求、接口需求、约束条件等。需求分析阶段结束时进行需求评审,确保需求是完整的、一致的、可测试的。
系统设计阶段:系统设计阶段的目标是定义系统的架构和详细设计。这个阶段分为高层设计和详细设计。高层设计定义系统的架构:系统如何分解为子系统,子系统之间如何交互,接口如何定义。详细设计定义每个组件的内部设计:算法、数据结构、类定义等。系统设计阶段的主要交付物包括:架构设计文档、详细设计文档、接口设计文档。
实现阶段:实现阶段是将设计转化为实际系统的阶段。对于软件系统,实现阶段是编码;对于硬件系统,实现阶段是制造。实现阶段的活动包括:编写代码/制造硬件、单元测试、代码审查/工艺审查。实现阶段的交付物包括:源代码/硬件、单元测试报告、代码审查报告。
集成阶段:集成阶段将各个组件集成为完整的系统。集成阶段的活动包括:组件集成、接口测试、系统集成测试。集成测试验证组件之间能否正确协作,系统是否满足需求。集成阶段的交付物包括:集成的系统、集成测试报告。
验证与确认阶段:验证回答”我们是否正确地制造了产品?“,确认回答”我们是否制造了正确的产品?“。验证活动包括:审查、仿真、测试、分析。确认活动包括:用户验收测试、现场试用、实际使用评估。验证与确认阶段的交付物包括:验证报告、确认报告。
部署阶段:部署阶段将系统交付给用户并在用户环境中运行。部署阶段的活动包括:安装部署、用户培训、系统移交。部署阶段的交付物包括:部署的系统、用户手册、培训材料。
2.3 顺序开发的适用场景
尽管顺序开发有诸多缺点,但在某些情况下仍然是合适的选择。
需求明确且稳定:如果需求在开发早期就能完全明确,并且在开发过程中不会变化,顺序开发是合适的。这种情况常见于:对现有系统的升级改造(需求与现有系统类似)、成熟领域的系统开发(需求模式已知)、简单系统(需求本身就简单)。
安全关键系统:安全关键系统(如航空、核能、医疗设备)对安全性和可靠性有极高要求,需要严格的开发过程和文档记录。顺序开发的严格阶段控制和文档记录符合安全关键系统的要求。许多安全标准(如DO-178C、IEC 61508)实际上就是基于顺序开发模型制定的。
强监管环境:在强监管环境中(如金融、医疗、国防),开发过程需要符合特定的标准和规范,需要完整的文档记录和可追溯性。顺序开发的完整文档和明确的阶段符合监管要求。
固定价格合同:固定价格合同要求在项目开始时就明确范围、进度、成本,任何变更都需要重新谈判。这种情况下,顺序开发的明确需求和阶段控制有助于控制项目范围和成本。
分散团队:如果团队分散在多个地点,甚至多个国家,顺序开发的明确接口和文档支持分布式协作。增量或敏捷方法需要频繁沟通,对分散团队挑战较大。
但需要注意的是,即使在这些场景下,也不能完全照搬传统的顺序开发。需要适当引入迭代和反馈机制,以适应一定程度的需求变化和技术不确定性。
三、增量开发模式
3.1 增量开发的特点
增量开发模式将系统开发划分为多个增量,每个增量交付系统的一部分功能。每个增量都包含完整的开发周期(需求、设计、实现、测试),逐步构建出完整的系统。增量开发的核心理念是”分而治之”——将大系统分解为小系统,逐个开发,最后集成。
增量开发与顺序开发的主要区别在于:顺序开发一次性交付完整系统,增量开发分多次交付部分功能。增量开发与演进开发的主要区别在于:增量开发在早期就有完整的功能分解,每个增量是预定计划的一部分;演进开发根据反馈调整功能计划,增量的内容和顺序可能变化。
增量开发的优点包括:早期价值交付:第一个增量可以尽早交付部分价值,用户不必等待整个系统完成;早期反馈:用户可以早期试用系统,提供反馈,指导后续开发;风险降低:高风险功能可以安排在早期增量,如果出现问题可以早期发现;并行开发:不同增量可以并行开发,缩短总周期时间。
增量开发的缺点包括:架构设计挑战:需要在早期就设计好整体架构,以支持后续增量的添加;集成成本:每个增量都需要集成到已有系统,集成工作量增加;需求冻结压力:为了支持增量规划,可能在需求尚未完全明确时就需要冻结需求;管理复杂性:需要管理多个增量的并行开发和集成。
3.2 增量开发的方法
增量开发有多种实施方法,关键在于如何划分增量。
按功能优先级划分增量:这是最常见的增量划分方法。首先识别所有系统功能,按照功能的重要性和优先级排序。高优先级功能在早期增量交付,低优先级功能在后期增量交付。功能优先级可以根据多个因素确定:用户价值(哪些功能对用户最有价值)、技术依赖(某些功能需要依赖其他功能)、风险因素(高风险功能安排在早期)。按功能优先级划分增量的优点是早期交付高价值功能,缺点是低优先级功能的用户需要等待较长时间。
按系统层次划分增量:这种方法按照系统的层次结构划分增量。第一个增量实现核心平台或基础设施,后续增量逐步添加应用功能。例如,开发一个电子商务系统,第一个增量实现用户认证、数据库访问等基础功能,第二个增量实现商品浏览,第三个增量实现购物车,第四个增量实现支付。按系统层次划分增量的优点是架构清晰,后期增量可以利用早期增量的基础设施。缺点是用户需要等到较晚才能看到完整功能。
按用户角色划分增量:如果系统有多个用户角色,可以按角色划分增量。每个增量支持一类用户的完整工作流程。例如,开发一个企业管理系统,第一个增量支持普通员工的日常工作,第二个增量支持经理的管理功能,第三个增量支持高管的决策功能。按用户角色划分增量的优点是每个增量都能给某类用户提供完整功能。缺点是不同角色之间的功能可能有依赖,需要仔细协调。
按技术风险划分增量:这种方法将高风险或新技术放在早期增量,以早期验证技术可行性。例如,如果系统包含一个关键技术组件,第一个增量只实现这个组件,验证其可行性后,再开发其他功能。按技术风险划分增量的优点是早期发现技术风险,避免后期技术问题导致项目失败。缺点是早期增量可能对用户价值不大。
混合方法:实践中往往需要综合多种方法。例如,首先按技术风险划分一个技术验证增量,然后按功能优先级划分多个功能增量。混合方法可以兼顾多种考虑因素,但增加了规划的复杂性。
3.3 增量开发的实施要点
成功的增量开发需要关注几个关键要点:
架构设计:增量开发需要在早期就设计好整体架构,以支持后续增量的添加。架构必须具有可扩展性,能够容纳尚未开发的功能。架构必须定义清晰的接口,使得增量之间能够独立开发和集成。架构设计需要考虑未来的扩展点,避免后期增量需要重构已有架构。
增量规划:增量规划需要综合考虑功能优先级、技术依赖、资源约束、交付时间表等因素。每个增量应该有明确的目标和范围,增量的大小应该适当——太大失去增量开发的意义,太小增加集成和管理成本。增量规划需要在项目开始时制定,但也应该保持一定的灵活性,根据反馈和实际情况调整。
接口管理:增量开发的核心挑战之一是接口管理。每个增量都会添加新接口或修改现有接口,需要确保接口变更不会破坏已有功能。接口管理需要建立明确的接口定义和版本控制机制,接口变更需要经过影响分析,确保所有相关方都知晓变更。
集成策略:增量开发需要明确的集成策略。每个增量完成后如何集成到已有系统?是完全重新集成,还是增量式集成?集成后需要运行哪些测试?如何确保集成不会引入回归问题?集成策略需要在项目早期制定,并在每个增量后执行。
变更管理:增量开发过程中需求可能会变化。需要评估需求变更对增量规划的影响,是否需要调整增量的内容和顺序。变更管理需要在保持增量规划的稳定性(有利于并行开发)和适应性(响应需求变化)之间找到平衡。
四、演进开发模式
4.1 演进开发的特点
演进开发模式承认需求在开发过程中会演化,开发过程本身是需求理解和系统设计共同演化的过程。演进开发强调早期交付、快速反馈、持续改进,根据用户反馈不断调整开发方向。
演进开发与增量开发的主要区别在于:增量开发在早期就有完整的功能分解和增量计划,每个增量是预定计划的一部分。演进开发则没有固定的长期计划,而是在每个迭代后根据反馈决定下一步做什么。演进开发的计划是短期的、适应性的,而不是长期的、固定的。
演进开发的优点包括:适应需求变化:能够快速响应需求变化,不受固定计划的约束;早期用户反馈:用户可以早期试用系统,提供反馈,指导后续开发;降低风险:早期交付和早期反馈降低了开发错误方向的风险;持续价值交付:每个迭代都交付可工作的软件,持续提供价值。
演进开发的缺点包括:不确定性:由于需求演化和计划调整,项目的最终范围、进度、成本难以预测;架构挑战:需求不断演化,架构如何适应变化而不累积技术债务;管理难度:演进开发的管理更加复杂,需要适应性的管理方法而不是传统的计划控制方法;客户关系:演进开发需要客户的积极参与和持续反馈,客户关系管理变得更加重要。
4.2 演进开发的方法
演进开发有多种实施方法,共同特点是短周期迭代和反馈驱动。
螺旋模型:螺旋模型是演进开发的经典方法。螺旋模型将开发过程划分为一系列迭代,每个迭代包含四个阶段:确定目标(确定本轮迭代的目标)、风险评估(识别和分析风险)、工程实施(开发和验证)、计划下一轮(规划下一轮迭代)。螺旋模型的独特之处是强调风险管理——每轮迭代都识别和降低风险,高风险项目会进行更多的迭代以降低风险。螺旋模型适合大型复杂项目,特别是高风险项目。
原型方法:原型方法是快速构建原型,通过原型与用户交互,获取反馈,指导后续开发。原型可以分为抛弃型原型(原型只是为了获取反馈,不会成为最终系统的一部分)和演进型原型(原型逐步演进为最终系统)。原型方法特别适合需求不明确的项目,通过原型帮助用户澄清需求。
敏捷方法:敏捷方法是演进开发的现代形式。敏捷方法强调个体和互动高于流程和工具,工作的软件高于详尽的文档,客户合作高于合同谈判,响应变化高于遵循计划。敏捷方法包括Scrum、Extreme Programming(XP)、Kanban等多种具体方法。敏捷方法将在下一节详细介绍。
DevOps:DevOps是开发(Development)和运维(Operations)的组合词,强调开发和运维的紧密协作,实现持续交付和持续部署。DevOps通过自动化构建、测试、部署,实现从代码提交到生产部署的快速流转。DevOps是演进开发在运维方面的延伸,使得系统可以在部署后继续演进。
4.3 演进开发的实施要点
成功的演进开发需要关注几个关键要点:
短期迭代:演进开发采用短期迭代,通常为1-4周。短期迭代使得反馈周期短,可以快速响应变化。短期迭代还使得进度跟踪更加准确——不是预测遥远的未来,而是预测几周内的工作。短期迭代要求团队能够快速交付可工作的软件,这需要良好的技术实践支持。
优先级管理:演进开发需要持续的优先级管理。每个迭代开始时,根据当前的知识和反馈,重新评估待办事项的优先级,选择最有价值的工作进入下一个迭代。优先级管理需要产品负责人或产品经理的深度参与,确保团队始终在做最有价值的事情。
技术债务管理:需求不断演化,架构和代码需要适应变化。在快速变化的同时,可能产生技术债务——为了快速交付而牺牲的设计质量或代码质量。演进开发需要管理技术债务,不能无限累积。需要定期投入时间重构代码、改进设计,偿还技术债务。
持续集成:演进开发需要持续集成实践。每个开发人员每天多次将代码集成到主分支,每次集成自动运行构建和测试。持续集成确保系统始终处于可工作状态,能够随时交付。持续集成需要自动化构建和测试的支持,需要开发人员遵循良好的编码和集成实践。
客户协作:演进开发需要客户的积极参与。客户不仅是在项目开始时提供需求,而是在整个开发过程中持续参与。客户需要参与迭代评审,提供反馈;需要参与优先级决策,指导开发方向;需要参与验收测试,确认交付的功能。客户的积极参与是演进开发成功的关键。
适应性计划:演进开发的计划是适应性的,不是固定不变的。初始计划只是基于当前知识的最佳猜测,随着项目的进展和知识的增加,计划会不断调整。适应性计划需要在近期的详细计划(1-2个迭代)和远期的粗略计划(发布计划)之间取得平衡。计划的价值不在于预测未来,而在于指导当前行动和协调团队工作。
五、敏捷系统工程
5.1 敏捷的概念与原则
敏捷软件开发是在2001年提出的,作为对传统重量级开发方法的回应。敏捷不是指速度快,而是指对变化的敏捷响应能力。敏捷方法强调适应性而非预测性,强调人与互动而非流程与工具,强调可工作的软件而非详尽的文档。
2001年,17位软件开发专家聚会,发表了《敏捷软件开发宣言》,提出了敏捷软件开发的四个核心价值观:
个体和互动高于流程和工具:流程和工具固然重要,但更重要的是人与人之间的互动和协作。优秀的团队再差的流程也能成功,差劲的团队再好的流程也会失败。敏捷强调面对面的沟通、跨功能团队、客户协作。
工作的软件高于详尽的文档:文档有价值,但可工作的软件更有价值。文档是达到目的的手段,不是目的本身。敏捷不反对文档,但反对”为了文档而文档”。应该只生成有价值的文档,而且文档应该从模型或代码自动生成。
客户合作高于合同谈判:与客户的协作关系比合同条款更重要。合同只能规定初步的共识,实际情况会变化。敏捷强调与客户建立协作关系,共同应对变化和不确定性。
响应变化高于遵循计划:变化是不可避免的,应该适应变化而不是遵循过时的计划。计划有价值,但计划必须适应实际情况的变化。敏捷强调短期计划和适应性计划。
基于这些价值观,敏捷方法还提出了十二条原则,包括:通过早期和持续交付有价值的软件来满足客户;欢迎需求变化,即使在开发后期;频繁交付可工作的软件(几周而不是几个月);业务人员和技术人员在项目全过程中紧密协作;围绕有动力的个体构建项目;面对面沟通是最有效的沟通方法;可工作的软件是进度的主要度量标准;敏捷过程促进可持续发展;持续关注技术卓越和良好设计;简洁——最大化未做工作的艺术;最好的架构、需求和设计来自自组织团队;团队定期反思如何提高效率。
5.2 敏捷系统工程的特点
敏捷方法最初是为软件开发提出的,但其原则也可以应用于系统工程。敏捷系统工程是将敏捷原则和方法应用于系统工程领域,以适应现代系统的复杂性和变化性。
敏捷系统工程不同于敏捷软件开发。软件系统的变化成本相对较低——修改代码并重新部署即可。系统工程涉及硬件和软件,硬件的变化成本远高于软件。因此,敏捷系统工程需要在敏捷的灵活性和工程约束之间找到平衡。
敏捷系统工程的特点包括:
跨功能团队:敏捷系统工程团队是多学科团队,包含系统工程师、机械工程师、电子工程师、软件工程师等。团队需要跨功能协作,而不是按专业分开工作。跨功能团队减少了沟通成本,加速了决策和问题解决。跨功能团队要求团队成员具备”T型”技能——在某个专业有深度,同时对其他专业有广度了解。
短周期迭代:敏捷系统工程采用短期迭代,但迭代周期通常比纯软件项目长。软件项目的迭代通常为1-2周,系统工程项目的迭代可能为4-8周,这是由于硬件的构建和测试周期较长。迭代交付的不是完整的产品,而是可演示的增量——可能是虚拟原型、仿真、部分功能的物理原型。
持续验证:敏捷系统工程强调持续验证,而不是等到最后才验证。每个迭代都进行验证活动,包括仿真验证、原型验证、快速测试。持续验证早期发现问题,降低风险。现代技术如数字孪生、虚拟原型、快速成型等支持持续验证实践。
适应性的需求管理:敏捷系统工程承认需求会演化,采用适应性的需求管理方法。需求不是在早期完全固定,而是随着项目的进展不断细化。需求管理强调优先级排序,而不是完全冻结需求。高优先级需求优先实现,低优先级需求可能推迟或取消。
技术实践:敏捷系统工程需要一系列技术实践支持,包括:模型驱动开发(MBSE)支持快速建模和变更;仿真和虚拟原型支持早期验证;自动化测试支持持续集成;配置管理支持快速变更;持续集成支持频繁集成。
5.3 Scrum在系统工程中的应用
Scrum是最流行的敏捷方法之一,也可以应用于系统工程。
Scrum的核心角色包括:
产品负责人(Product Owner):产品负责人负责最大化产品的价值,管理待办事项(Backlog),决定功能的优先级。产品负责人需要理解用户需求和市场机会,将需求转化为用户故事,排列优先级,确保团队始终在做最有价值的工作。
Scrum Master:Scrum Master是服务型领导,负责确保Scrum流程得到正确执行,帮助团队移除障碍,促进团队协作。Scrum Master不是传统的项目经理,不分配任务,不控制进度,而是帮助团队自我组织和持续改进。
开发团队:开发团队是跨功能团队,包含完成工作所需的所有技能。开发团队自我组织,决定如何完成工作,决定每个迭代承担多少工作。开发团队通常为5-9人,这是为了保持沟通和协作的有效性。
Scrum的核心活动包括:
Sprint(冲刺):Sprint是固定长度的迭代,通常为2-4周。每个Sprint都有明确的目标,交付可用的产品增量。Sprint的长度一旦确定,应该保持一致,这有助于团队建立节奏感。
Sprint计划会议:每个Sprint开始时召开Sprint计划会议,决定这个Sprint要完成什么工作。产品负责人介绍待办事项的优先级,团队选择要完成的工作,并制定完成计划。Sprint计划会议通常为时间盒的(如4小时的一日会议)。
每日站会:每天召开简短的站会(通常15分钟),团队成员同步进展、讨论障碍、协调工作。每日站会不是状态汇报会议,而是团队自我协调的会议。每个团队成员回答三个问题:昨天完成了什么?今天计划做什么?有什么障碍?
Sprint评审:每个Sprint结束时召开Sprint评审,演示Sprint期间完成的工作。产品负责人和利益相关者参加评审,提供反馈。Sprint评审是获取用户反馈的重要机会,反馈将影响待办事项的优先级。
Sprint回顾:每个Sprint结束时召开Sprint回顾,团队反思过去Sprint的工作,讨论什么做得好、什么可以改进,并制定改进计划。Sprint回顾是团队持续改进的关键机制。
Scrum的工件包括:
产品待办事项(Product Backlog):产品待办事项是所有需要完成的工作的列表,按照优先级排序。待办事项以用户故事的形式表示,描述从用户角度的需求。待办事项是动态的,随着项目的进展不断细化和调整。
Sprint待办事项(Sprint Backlog):Sprint待办事项是当前Sprint要完成的工作列表,是产品待办事项的子集。团队选择要完成的用户故事,并进一步分解为任务。
产品增量:产品增量是Sprint期间完成的所有工作的总和,是一个可用的产品增量。增量应该”潜在可交付”——虽然可能不实际部署,但应该满足”完成的定义”(Definition of Done)。
5.4 敏捷系统工程的实施挑战
敏捷系统工程在实施中面临特殊挑战,这些挑战源于系统工程与纯软件开发的差异。
硬件约束:硬件的变更成本远高于软件。一旦硬件设计冻结和开模,变更成本非常高。因此,敏捷在硬件中的应用需要更多前期规划,硬件的敏捷主要体现在设计的早期阶段——使用虚拟原型、快速成型、3D打印等技术快速迭代。一旦硬件进入生产阶段,变更需要更加谨慎。
长周期活动:系统工程中的一些活动周期很长,如机械设计、硬件制造、测试认证。这些活动不能像软件那样频繁迭代。需要协调长周期活动与短周期迭代的关系——可能在早期迭代中不包含这些长周期活动,或使用仿真和原型代替。
法规合规:许多系统(如医疗设备、航空系统)需要满足严格的法规要求,这些法规通常基于传统的顺序开发模型。敏捷系统工程需要找到符合法规要求的方式,同时保持敏捷的灵活性。可能需要额外的文档记录和追溯性,这些需要与敏捷实践结合。
供应商管理:现代系统开发涉及多个供应商,敏捷需要跨组织边界。供应商有自己的流程和方法,不一定与主承包商的敏捷方法一致。跨组织敏捷需要建立共同的开发节奏,协调待办事项和集成点,建立信任和透明的关系。
分布式团队:敏捷强调面对面沟通,但现代系统开发往往涉及分布式团队。分布式团队的敏捷需要额外的工具和实践,如视频会议、共享工具、异步沟通。需要建立团队文化,建立信任和协作关系。
六、精益工程
6.1 精益思想概述
精益思想起源于丰田生产方式(TPS),是一种消除浪费、创造价值的方法论。精益生产在制造业取得了巨大成功,精益思想后来被扩展到软件开发、产品开发、服务等领域。精益工程是将精益思想应用于工程开发领域。
精益思想的核心原则包括:
定义价值:价值是由最终客户定义的,只有客户愿意为之付费的活动才是有价值的。工程开发中需要明确客户是谁,客户需要什么价值。价值定义不是从开发者角度出发,而是从客户角度出发。
识别价值流:价值流是创造价值所需的所有活动的序列。需要识别整个价值流,从需求到交付的所有活动。价值流映射是识别价值流的工具,可以帮助发现哪些活动创造价值,哪些活动不创造价值。
让价值流动:让价值在价值流中顺畅流动,不被中断、不被延迟、不被返工。流动被中断的原因包括:等待(等待决策、等待资源)、返工(缺陷导致重做)、过度生产(生产了不需要的东西)、库存(未集成的代码、未发布的功能)。让价值流动需要消除这些障碍。
拉动:让下游活动拉动上游活动,而不是上游活动推动下游活动。拉动意味着只在需要时生产,生产下游需要的数量。拉动减少过度生产和库存,提高响应速度。在工程开发中,拉动意味着需求拉动开发,测试拉动实现。
尽善尽美:持续改进,追求尽善尽美。精益不是一次性的活动,而是持续的文化。通过持续的小改进,逐步接近完美。持续改进需要建立学习文化,鼓励实验和反思,从失败中学习。
6.2 精益工程的实践
精益工程将精益思想应用于工程开发,包括以下实践:
价值流图:价值流图是可视化价值流的工具,帮助识别浪费和改进机会。价值流图包括当前状态图(展示当前价值流的状态)和未来状态图(展示理想的价值流状态)。通过对比当前状态和未来状态,识别改进的优先级。
看板:看板是可视化工作、限制在制品、管理工作流的方法。看板板通常分为几列:待办、进行中、已完成。工作项以卡片形式在看班板上流动,从待办到进行中到已完成。看板的核心实践是限制在制品——限制同时进行的工作数量,减少上下文切换,提高完成速度。看板使得工作流可视化,瓶颈和障碍一目了然。
限制在制品(WIP):限制在制品是精益工程的核心实践。同时进行太多工作会导致上下文切换频繁、完成速度慢、问题积累。限制在制品迫使团队先完成手头工作再开始新工作,提高了完成速度和质量。限制在制品需要团队有纪律,抵制开始新工作的诱惑。
持续改进:持续改进是精益工程的文化。持续改进可以采取多种形式:回顾会议(团队定期反思如何改进)、根因分析(分析问题的根本原因而不是表面症状)、实验(尝试新方法,评估效果)。持续改进需要建立学习文化,鼓励坦诚讨论问题,从失败中学习而不是指责。
精益启动:精益启动是精益思想在创业中的应用,强调最小可行产品(MVP)、快速迭代、客户验证。精益启动的核心假设是:市场需要什么不是靠规划预测的,而是通过实验学习的。通过构建MVP快速推向市场,获取真实反馈,决定下一步是转向还是继续。精益启动的方法也适用于新产品开发和创新项目。
6.3 消除浪费
精益工程的核心是消除浪费。在工程开发中,浪费有多种形式:
部分完成的 work:已经开始但未完成的工作。部分完成的工作不仅没有价值,还占用了资源。例如,编写了一半的代码、设计了一半的图纸。减少部分完成 work 的方法是限制在制品,鼓励先完成再开始新工作。
额外功能:开发了用户不需要的功能。额外功能不仅浪费开发资源,还增加了系统复杂度,增加了维护成本。减少额外功能的方法是理解真正的用户需求,优先实现高价值功能,推迟或取消低价值功能。
重新学习:忘记了之前学到的知识,需要重新学习。例如,换了人员后,新人员需要重新学习项目的背景知识。减少重新学习的方法是知识共享(文档、代码注释、知识分享会)、稳定的团队、持续集成(确保知识持续集成到代码中)。
交接:在人员或团队之间交接工作。交接过程中信息可能丢失,产生误解和错误。减少交接的方法是跨功能团队(减少交接的次数)、面对面沟通(比文档传递信息更有效)、共同工作(而不是交接后各自工作)。
任务切换:在不同任务之间频繁切换。任务切换有认知成本,降低效率。减少任务切换的方法是专注于少数任务,限制在制品,避免多任务处理。
等待:等待其他工作完成、等待决策、等待资源。等待导致时间浪费,延迟价值交付。减少等待的方法是识别瓶颈(等待的原因是什么)、解决瓶颈(增加资源、改变流程)、自组织团队(团队自我协调减少等待)。
缺陷:缺陷导致返工,浪费时间和资源。缺陷还可能损害客户信任。减少缺陷的方法是质量内建(开发人员负责质量,而不是测试人员负责)、持续集成(早期发现集成问题)、自动化测试(快速反馈缺陷)。
6.4 精益与敏捷的关系
精益和敏捷都关注价值交付和消除浪费,两者有共同的理念,但起源和侧重点不同。
精益起源于制造业,关注消除浪费、优化流程、提高效率。精益强调价值流分析、流程改进、可视化管理。精益的方法适用于任何有明确流程的工作,包括制造、服务、行政等。
敏捷起源于软件开发,关注响应变化、快速交付、客户协作。敏捷强调短周期迭代、自我组织团队、技术实践。敏捷的方法适用于知识工作,特别是创新性和不确定性的工作。
精益和敏捷不是相互竞争的,而是互补的。敏捷方法(如Scrum)吸收了精益思想,Scrum的许多实践与精益原则一致。例如,Scrum的Sprint评审对应精益的客户反馈,Scrum的回顾对应精益的持续改进,Scrum的待办事项管理对应精益的拉动系统。
在实践中,可以结合精益和敏捷的方法。例如,使用Scrum进行迭代开发,同时使用看板管理工作流;使用敏捷方法组织团队和工作,同时使用价值流图分析浪费;使用敏捷实践快速交付,同时使用精益原则优化流程。
七、生命周期模型选择与适应
7.1 生命周期模型选择框架
没有一种生命周期模型适用于所有项目。选择合适的生命周期模型需要考虑项目的具体情况。以下是选择生命周期模型的考虑因素:
需求确定性:需求在早期是否能够完全明确?如果需求明确且稳定,顺序或增量模型可能是合适的。如果需求模糊或可能变化,演进或敏捷模型更合适。
技术确定性:技术方案是否成熟?是否使用了新技术?如果技术成熟且有经验,顺序或增量模型可能是合适的。如果技术不确定或包含创新,演进或敏捷模型更合适,以便早期验证技术可行性。
复杂度:系统的复杂度如何?简单系统可能不需要复杂的迭代方法。复杂系统可能需要分解为增量,逐步实现。高度复杂的系统可能需要演进方法,因为复杂系统的需求和技术会随着理解的加深而变化。
紧迫性:项目的紧迫性如何?如果需要尽快交付价值,增量或演进模型可以早期交付部分功能。如果时间不紧迫,顺序模型的完整文档和阶段控制可能更合适。
风险:项目的风险因素是什么?高风险项目需要早期风险降低活动。演进或敏捷模型可以早期交付和验证,降低技术和市场风险。顺序模型的风险在于,风险可能在很晚才暴露。
团队能力:团队的技能和经验如何?如果团队不熟悉敏捷方法,强行实施敏捷可能适得其反。如果团队有敏捷经验,敏捷方法可以发挥更大价值。团队能力还包括自我组织能力、跨功能协作能力、技术能力等。
组织文化:组织的文化是否支持敏捷或精益方法?如果组织文化是传统的、层级分明的,敏捷或精益方法可能遇到阻力。如果组织文化是开放的、鼓励创新的,敏捷或精益方法更容易成功。
客户参与:客户能否积极参与?演进和敏捷方法需要客户的持续参与和反馈。如果客户不能或不愿积极参与,传统方法可能更合适。
法规要求:项目是否需要满足特定的法规要求?某些法规要求特定的开发过程和文档记录。需要选择符合法规要求的生命周期模型。
7.2 混合生命周期模型
在实践中,许多项目采用混合生命周期模型,结合多种模型的优点。
混合顺序-增量模型:项目采用顺序方法进行需求分析和架构设计,然后采用增量方法进行实现和部署。这种混合模型在需求和技术相对明确,但需要早期交付部分价值的项目中很常见。
混合增量-演进模型:项目有高层的功能分解和增量规划,但在每个增量内部采用演进方法,根据反馈调整增量的详细内容。这种混合模型平衡了可预测性和适应性。
前端-后端分离:项目前端(用户界面)采用敏捷方法快速迭代,后端(核心系统)采用顺序或增量方法。这是因为前端需求变化快,后端需求相对稳定。这种分离允许不同部分采用不同的生命周期方法。
硬件-软件分离:项目硬件部分采用顺序或增量方法,软件部分采用敏捷方法。这是因为硬件变更成本高,需要更多前期规划;软件变更成本低,可以快速迭代。这种分离需要协调硬件和软件的接口和集成。
阶段性方法:项目不同阶段采用不同的生命周期方法。概念阶段采用演进方法探索多种概念,开发阶段采用增量方法逐步实现,维护阶段采用敏捷方法持续改进。
7.3 生命周期模型适应
即使选择了某种生命周期模型,也不应该机械地套用模板,而应该根据项目情况进行适应。
调整阶段划分:标准的生命周期模型定义了典型的阶段,但可以根据项目需要调整阶段。例如,可以增加一个”概念验证”阶段,用于验证关键技术;可以合并某些阶段以简化流程;可以拆分某些阶段以更好地控制。
调整阶段时长:标准的迭代长度(如Scrum的2-4周Sprint)可以根据项目调整。对于硬件密集型项目,迭代可能需要更长周期以容纳硬件构建和测试。对于纯软件项目,迭代可能更短以加快反馈。
调整门控严格度:阶段门控的严格度可以根据项目风险调整。高风险项目需要严格的门控,每个阶段都要详细评审。低风险项目可以简化门控,快速推进。
调整文档要求:文档要求应该根据项目需要调整,不是所有项目都需要完整的文档套装。安全关键系统需要完整文档,探索性项目可能只需要最小文档。文档的目的是支持项目成功,不是为了满足流程要求。
调整团队结构:标准的敏捷方法建议小团队、跨功能团队,但实际项目可能有不同的团队结构。大型项目可能需要多个敏捷团队,需要建立团队之间的协调机制。分布式团队需要额外的沟通工具和协作实践。
7.4 生命周期模型转换
项目过程中可能需要转换生命周期模型。例如,项目开始时采用顺序模型,但发现需求变化频繁,需要转向敏捷模型。或者,项目开始时采用敏捷模型,但后期需求稳定,转向增量模型以加速交付。
从顺序到敏捷的转换通常比较困难,因为需要改变团队的工作方式、管理风格、客户关系。转换需要管理层的支持,需要团队培训,需要逐步试点而不是立即全面转换。
从敏捷到顺序的转换通常比较容易,因为敏捷模型已经产生了可工作的软件和灵活的团队。转换需要冻结需求,建立更正式的流程和文档。
生命周期模型转换应该谨慎评估。频繁转换会导致混乱,团队难以适应。转换应该有明确的理由和计划,应该与团队沟通并获得支持。
八、系统生命周期图表讲解
sequenceDiagram autonumber participant Stakeholder as 利益相关者 participant Concept as 概念阶段 participant Dev as 开发阶段 participant Prod as 生产阶段 participant Deploy as 部署阶段 participant Ops as 运行维护阶段 participant Retire as 退役阶段 Note over Stakeholder,Retire: 系统生命周期全流程 Stakeholder->>Concept: 1. 提出需求和机会 Concept->>Concept: 2. 需求收集<br/>可行性分析<br/>概念方案探索 Concept->>Stakeholder: 3. 概念评审 Stakeholder->>Dev: 4. 批准继续开发 Dev->>Dev: 5. 需求分析<br/>系统设计<br/>实现与集成 Dev->>Stakeholder: 6. 设计评审 Dev->>Prod: 7. 设计移交生产 Prod->>Prod: 8. 生产准备<br/>制造过程<br/>质量控制 Prod->>Deploy: 9. 产品交付部署 Deploy->>Deploy: 10. 系统安装<br/>配置调试<br/>用户培训 Deploy->>Stakeholder: 11. 系统交付使用 Ops->>Ops: 12. 系统运行<br/>监控维护<br/>故障修复 Stakeholder->>Ops: 13. 使用反馈 Ops->>Dev: 14. 改进需求 Dev->>Dev: 15. 系统升级与增强 Dev->>Ops: 16. 升级版本部署 Ops->>Retire: 17. 退役决策 Retire->>Retire: 18. 数据迁移<br/>系统停运<br/>资源回收 Retire->>Stakeholder: 19. 退役完成
图表讲解:这个序列图展示了系统从概念到退役的完整生命周期过程。这是一个长期的循环过程,可能持续数年甚至数十年。
流程开始于利益相关者提出需求和机会。概念阶段收集和分析需求,进行技术可行性、经济可行性、风险分析,探索多种概念方案。概念评审是重要的决策点,决定项目是否继续。如果概念被批准,项目进入开发阶段。
开发阶段是系统的核心构建阶段。开发阶段通常包含需求分析(详细定义系统需求)、系统设计(定义系统架构和详细设计)、实现(构建系统组件)、集成(将组件集成为系统)。开发阶段会有多个评审点,如需求评审、设计评审、集成评审等。这些评审确保开发在正确的方向上前进。
开发完成后,设计移交给生产阶段。对于硬件系统,生产阶段涉及制造过程建立、供应链管理、质量控制。对于软件系统,生产阶段可能只是准备安装包。生产阶段确保系统可以重复生产或部署。
生产完成后,系统进入部署阶段。部署阶段将系统安装到用户环境,进行配置调试,迁移现有数据,培训用户。部署阶段是系统交付的关键环节,部署成功与否直接影响用户体验。
部署完成后,系统进入运行维护阶段,这是生命周期中最长的阶段。运行维护阶段可能持续数年甚至数十年。在这个阶段,系统实际运行,需要持续监控、故障修复、性能优化、用户支持。利益相关者使用系统后会产生反馈,这些反馈可能产生改进需求。
系统不会一成不变。运行维护阶段会提出改进需求,开发团队进行系统升级和增强,然后部署新版本。这种开发和升级的循环可能重复多次。系统在运行中不断演进,适应新的需求和环境。
最终,系统会到达退役阶段。退役可能是因为系统过时、不再需要、或被新系统替代。退役阶段需要规划数据迁移(将数据迁移到新系统)、系统停运(有序关闭系统)、资源回收(回收可重用的资源)、处置(处理废弃物)。退役阶段也需要与利益相关者沟通,确保平稳过渡。
这个图强调了几点重要认识:第一,系统生命周期是一个长期过程,开发只是生命周期的一部分,运行维护往往占据大部分时间和成本。第二,生命周期不是线性的,而是包含多个循环——开发和升级的循环、使用和反馈的循环。第三,生命周期需要利益相关者的持续参与,不是一次性的需求提供,而是持续的反馈和协作。第四,每个阶段都有其特定的活动和交付物,阶段之间的转移需要明确的准则和评审。
flowchart TD A[开发模式选择] --> B[需求明确性] A --> C[技术确定性] A --> D[系统复杂度] A --> E[风险水平] A --> F[团队能力] B --> B1[明确且稳定] B --> B2[模糊或变化] C --> C1[成熟技术] C --> C2[新技术或创新] D --> D1[简单系统] D --> D2[复杂系统] E --> E1[低风险] E --> E2[高风险] F --> F1[传统团队] F --> F2[敏捷团队] B1 --> G[顺序开发模式<br/>瀑布模型] C1 --> G D1 --> G E1 --> G F1 --> G B1 --> H[增量开发模式<br/>分阶段交付] C1 --> H D2 --> H E1 --> H F1 --> H B2 --> I[演进开发模式<br/>螺旋/原型] C2 --> I D2 --> I E2 --> I F1 --> I B2 --> J[敏捷开发模式<br/>Scrum/XP] C2 --> J D2 --> J E2 --> J F2 --> J G --> K[选择原则<br/>需求和技术稳定<br/>系统简单<br/>风险低<br/>团队熟悉传统方法] H --> L[选择原则<br/>需求基本明确<br/>系统可分解<br/>希望早期交付<br/>风险可控] I --> M[选择原则<br/>需求不确定<br/>技术有风险<br/>系统复杂<br/>需要早期验证] J --> N[选择原则<br/>需求快速变化<br/>技术不确定<br/>需要快速响应<br/>团队具备能力]
图表讲解:这个流程图展示了如何根据项目的具体情况选择合适的开发模式。没有一种开发模式适用于所有项目,选择需要综合考虑多个因素。
需求明确性是首要考虑因素。如果需求在早期就能完全明确并且不会变化,顺序开发模式可能是合适的。顺序开发可以充分利用需求明确的优势,一次性完成系统。但如果需求模糊或可能变化,演进或敏捷模式更合适。演进模式通过原型和早期反馈帮助澄清需求,敏捷模式通过短期迭代适应需求变化。
技术确定性是另一个重要因素。成熟技术意味着风险较低,可以采用顺序或增量模式。新技术或创新意味着不确定性较高,演进或敏捷模式更适合。演进模式可以通过早期原型验证技术可行性,敏捷模式可以通过迭代实验降低技术风险。
系统复杂度影响开发模式的选择。简单系统可能不需要复杂的迭代方法,顺序开发就足够了。复杂系统往往需要分解为增量,逐步实现。高度复杂的系统(如系统之系统)可能需要演进方法,因为复杂系统的需求和技术会随着理解的加深而变化。
风险水平是关键考虑因素。低风险项目可以采用顺序或增量模式,高风险项目需要演进或敏捷模式以早期降低风险。演进模式特别强调风险管理,每轮迭代都识别和降低风险。敏捷模式通过早期交付和反馈,快速发现和应对风险。
团队能力是实际约束。如果团队不熟悉敏捷方法,强行实施敏捷可能适得其反。传统团队可能更适合顺序或增量模式。如果团队有敏捷经验,敏捷方法可以发挥更大价值。团队培训和能力建设是实施新方法的前提。
图的右侧总结了每种开发模式的选择原则。顺序开发适用于需求和技术稳定、系统简单、风险低、团队熟悉传统方法的项目。增量开发适用于需求基本明确、系统可以分解、希望早期交付、风险可控的项目。演进开发适用于需求不确定、技术有风险、系统复杂、需要早期验证的项目。敏捷开发适用于需求快速变化、技术不确定、需要快速响应、团队具备敏捷能力的项目。
需要强调的是,这些因素不是独立的,而是相互关联的。选择开发模式需要综合考虑所有因素,而不是单一因素。而且,选择不是一成不变的,随着项目的进展和知识的增加,可能需要调整开发模式。开发模式的选择应该服务于项目成功,而不是为了遵循某种方法。
flowchart TD A[敏捷系统工程] --> B[核心理念] A --> C[核心实践] A --> D[技术支撑] A --> E[实施挑战] B --> B1[个体和互动高于流程和工具] B --> B2[工作的软件高于详尽的文档] B --> B3[客户合作高于合同谈判] B --> B4[响应变化高于遵循计划] C --> C1[跨功能团队] C --> C2[短周期迭代] C --> C3[持续集成] C --> C4[优先级管理] C --> C5[客户协作] C --> C6[持续改进] D --> D1[模型驱动开发MBSE] D --> D2[仿真与虚拟原型] D --> D3[自动化测试] D --> D4[配置管理] D --> D5[数字孪生] E --> E1[硬件约束] E --> E2[长周期活动] E --> E3[法规合规] E --> E4[供应商管理] E --> E5[分布式团队] B1 --> F[价值体现<br/>提高沟通效率<br/>增强团队协作] B2 --> F B3 --> F B4 --> F C1 --> G[实施要点<br/>T型技能<br/>自我组织<br/>面对面沟通] C2 --> H[实施要点<br/>固定长度<br/>可演示增量<br/>节奏稳定] C3 --> I[实施要点<br/>频繁集成<br/>自动化构建<br/>快速反馈] C4 --> J[实施要点<br/>产品负责人负责<br/>价值驱动<br/>动态调整] C5 --> K[实施要点<br/>早期参与<br/>持续反馈<br/>共同决策] C6 --> L[实施要点<br/>定期回顾<br/>根因分析<br/>实验改进] E1 --> M[应对策略<br/>虚拟原型迭代<br/>快速成型技术] E2 --> N[应对策略<br/>协调长短周期<br/>仿真替代实物] E3 --> O[应对策略<br/>符合法规要求<br/>必要文档记录] E4 --> P[应对策略<br/>统一开发节奏<br/>接口管理] E5 --> Q[应对策略<br/>视频会议工具<br/>共享协作平台]
图表讲解:这个流程图全面展示了敏捷系统工程的核心理念、核心实践、技术支撑和实施挑战。
敏捷系统工程的核心理念继承自敏捷软件开发,但适应了系统工程的特点。“个体和互动高于流程和工具”强调面对面的沟通、跨功能团队协作、利益相关者参与,而不是过度依赖流程和工具。“工作的软件高于详尽的文档”不是反对文档,而是反对为文档而文档,文档应该有明确的目的,最好能从模型自动生成。“客户合作高于合同谈判”强调与客户建立协作关系,共同应对变化和不确定性,而不是严格遵循初始合同。“响应变化高于遵循计划”承认变化是不可避免的,应该适应变化而不是遵循过时的计划。
敏捷系统工程的核心实践包括跨功能团队、短周期迭代、持续集成、优先级管理、客户协作和持续改进。跨功能团队包含系统工程师、机械工程师、电子工程师、软件工程师等多学科人员,团队需要具备”T型”技能——在某个专业有深度,同时对其他专业有广度了解。短周期迭代通常为4-8周(比纯软件长,因为硬件周期长),每个迭代交付可演示的增量。持续集成确保系统始终处于可工作状态,能够随时交付。优先级管理确保团队始终在做最有价值的工作。客户协作通过迭代评审、反馈会议、共同决策实现。持续改进通过回顾会议、根因分析、实验实践实现。
敏捷系统工程需要技术实践的支撑。模型驱动开发(MBSE)支持快速建模和变更,模型是设计决策的主要载体。仿真与虚拟原型支持早期验证,不需要等到有物理原型。自动化测试支持持续集成,每次集成自动运行测试套件。配置管理支持快速变更,跟踪模型、代码、文档的版本。数字孪生技术是虚拟原型的延伸,创建系统的虚拟副本,支持全生命周期的仿真和分析。
敏捷系统工程在实施中面临特殊挑战。硬件约束是最大挑战之一,硬件的变更成本远高于软件。应对策略是在设计早期使用虚拟原型、快速成型、3D打印等技术快速迭代,一旦硬件进入生产阶段,变更需要更加谨慎。长周期活动(如机械设计、硬件制造、测试认证)不能像软件那样频繁迭代,需要协调长周期活动与短周期迭代的关系。法规合规要求特定的开发过程和文档记录,需要找到符合法规要求的方式,同时保持敏捷的灵活性。供应商管理需要跨组织边界应用敏捷,需要建立共同的开发节奏,协调待办事项和集成点。分布式团队需要额外的工具和实践,如视频会议、共享工具、异步沟通。
理解敏捷系统工程需要认识到,敏捷不是一种僵化的方法,而是一组原则和实践。敏捷的实施需要根据项目和组织的情况进行调整。敏捷不是银弹,不能解决所有问题,但对于需求变化快、技术不确定的项目,敏捷提供了有效的应对框架。
九、常见问题解答
Q1:瀑布模型真的过时了吗?什么情况下还应该使用瀑布模型?
答:瀑布模型没有过时,只是在很多场景下不是最优选择。在特定情况下,瀑布模型仍然是合适的选择。
瀑布模型适用的场景包括:
需求明确且稳定:如果需求在开发早期就能完全明确,并且在开发过程中不会变化,瀑布模型是合适的。这种情况常见于:对现有系统的升级改造(需求与现有系统类似)、成熟领域的系统开发(需求模式已知)、简单系统(需求本身就简单)。
安全关键系统:安全关键系统(如航空、核能、医疗设备)对安全性和可靠性有极高要求,需要严格的开发过程和文档记录。瀑布模型的严格阶段控制和文档记录符合安全关键系统的要求。许多安全标准(如DO-178C、IEC 61508)实际上就是基于瀑布模型制定的。
强监管环境:在强监管环境中(如金融、医疗、国防),开发过程需要符合特定的标准和规范,需要完整的文档记录和可追溯性。瀑布模型的完整文档和明确的阶段符合监管要求。
固定价格合同:固定价格合同要求在项目开始时就明确范围、进度、成本,任何变更都需要重新谈判。这种情况下,瀑布模型的明确需求和阶段控制有助于控制项目范围和成本。
分散团队:如果团队分散在多个地点,甚至多个国家,瀑布模型的明确接口和文档支持分布式协作。增量或敏捷方法需要频繁沟通,对分散团队挑战较大。
但需要注意的是,即使在这些场景下,也不能完全照搬传统的瀑布模型。需要适当引入迭代和反馈机制,以适应一定程度的需求变化和技术不确定性。例如,在需求分析阶段引入原型验证,在设计阶段引入早期评审,在实现阶段引入持续集成。
瀑布模型的价值在于其结构和可预测性,而不是其僵化的阶段划分。理解和应用瀑布模型的原理,同时适当引入现代实践,才是明智的做法。
Q2:敏捷和增量有什么区别?很多时候听起来是一样的。
答:敏捷和增量确实有相似之处,都强调分阶段交付,但在核心理念上有重要区别。
增量开发的核心思想是”分而治之”——将大系统分解为小系统,逐个开发,最后集成。增量开发在早期就有完整的功能分解和增量计划,每个增量是预定计划的一部分。增量开发回答的问题是”如何将大系统分解为可管理的小系统?”
敏捷开发的核心思想是”适应变化”——承认需求会演化,开发过程本身是需求理解和系统设计共同演化的过程。敏捷开发没有固定的长期计划,而是在每个迭代后根据反馈决定下一步做什么。敏捷开发回答的问题是”如何在需求不确定的情况下快速交付价值?”
具体区别包括:
计划固定性:增量开发有相对固定的长期计划,增量的内容和顺序在项目早期基本确定。敏捷开发的计划是适应性的,短期的(1-2个迭代)计划是确定的,长期的计划是模糊的,会根据反馈调整。
需求变化:增量开发假设需求基本明确,变化较少。敏捷开发假设需求会演化,变化是常态。
反馈机制:增量开发的反馈主要是验证功能的实现,不期望需求有重大变化。敏捷开发的反馈包括需求验证、优先级调整、方向调整,反馈可能影响后续的计划。
团队组织:增量开发的团队可能是按功能或按组件划分的,每个团队负责特定的增量。敏捷开发的团队是跨功能的、稳定的,团队承担多个迭代的工作,而不是只负责一个增量。
文档要求:增量开发通常需要比敏捷更多的文档,因为需要支持多个团队的并行工作和集成。敏捷开发强调可工作的软件高于详尽的文档,文档只生成有价值的。
在实践中,增量和敏捷经常结合使用。项目有增量的高层规划(哪些功能在哪个发布),但每个增量内部采用敏捷方法,根据反馈调整增量的详细内容。这种混合方法结合了增量的可预测性和敏捷的适应性。
理解增量和敏捷的区别,有助于我们选择合适的方法。如果需求相对明确、系统可以分解,增量方法可能更合适。如果需求不确定、需要快速响应,敏捷方法可能更合适。很多时候,混合方法是最佳选择。
Q3:硬件项目能做敏捷吗?硬件变更成本那么高。
答:硬件项目可以做敏捷,但需要与纯软件项目的敏捷有所调整。硬件的变更成本确实高,但这不意味着不能应用敏捷原则。
硬件敏捷的关键是将敏捷活动集中在变更成本低的阶段。硬件开发可以分为几个阶段:概念设计、详细设计、原型、生产。变更成本随阶段递增——概念设计的变更成本低,详细设计的变更成本中等,原型的变更成本高,生产的变更成本极高。
在概念设计阶段,可以充分应用敏捷方法。使用快速成型技术(如3D打印)快速构建多个概念原型,与用户交互,获取反馈,迭代概念。这个阶段的变更成本低,可以快速尝试多个概念。
在详细设计阶段,可以使用虚拟原型和仿真进行迭代。虚拟原型是计算机模型,可以快速修改和仿真。通过虚拟原型验证设计的可行性,发现和解决大部分问题,减少物理原型的返工。
在原型阶段,敏捷迭代的速度会变慢,因为物理原型的构建和测试周期长。但仍然可以采用增量方法,构建多个版本的逐步完善的原型。
一旦硬件进入生产阶段,变更就变得非常昂贵。这个阶段的敏捷主要体现在软件和固件上,硬件的变更需要非常谨慎,需要严格的变更控制和影响分析。
硬件敏捷需要一些特定的技术和工具支持:3D打印和快速成型支持快速物理原型;虚拟原型和仿真支持虚拟验证;模块化设计支持部分变更而非整体重新设计;配置管理支持硬件的版本控制。
硬件敏捷的另一个要点是协调硬件和软件的开发节奏。软件的敏捷迭代周期短(1-2周),硬件的敏捷迭代周期长(4-8周甚至更长)。需要协调不同节奏的集成和交付。
理解硬件敏捷,需要认识到敏捷不是一种僵化的方法,而是一组原则。硬件项目可以应用敏捷原则,但需要根据硬件的特点进行调整。硬件敏捷的价值在于早期验证和反馈,降低硬件开发的风险。
Q4:敏捷是不是不需要文档?
答:这是一个常见的误解。敏捷不是反对文档,而是反对”为了文档而文档”。
敏捷宣言说”工作的软件高于详尽的文档”,这意味着文档的价值次于可工作的软件,但不是说文档没有价值。文档有价值的情况包括:沟通需要(文档是沟通的工具)、知识传递(文档是知识传承的载体)、合规要求(某些标准要求文档)、长期维护(文档是维护的基础)。
敏捷对文档的态度是:
只生成有价值的文档:不是所有文档都有价值。一些文档可能很少被阅读,或者内容很快过时。应该只生成真正有价值的文档,能够解决实际的沟通、知识传递、合规、维护问题。
文档应该简洁:文档的长度应该与其价值匹配。简单的系统不需要冗长的文档。敏捷倾向于用图表、表格等简洁的形式表达信息,而不是长篇大论。
文档应该从模型或代码自动生成:如果文档可以从模型或代码自动生成,就应该自动生成。自动生成确保文档与设计保持同步,减少手工维护文档的工作。MBSE支持从模型自动生成文档。
文档应该适度:文档不是越多越好。过多的文档不仅浪费维护时间,还可能降低可读性。应该找到文档的适度水平——既满足需求,又不产生不必要的负担。
文档应该定期审查:文档可能过时,应该定期审查文档的准确性和必要性。删除过时或不再需要的文档,更新需要保留的文档。
实践中,敏捷项目确实比传统项目产生更少的文档,但这是有选择性的减少,不是盲目的减少。敏捷项目会生成需求文档(以用户故事形式)、架构文档(以模型形式)、接口文档(从模型自动生成)、用户手册(从需求和测试用例生成)等。区别在于,这些文档更加精简、更加聚焦、更加及时。
理解敏捷对文档的态度,需要认识到文档是达到目的的手段,不是目的本身。文档的价值在于支持项目成功,而不是满足流程要求。应该在文档价值与文档成本之间找到平衡。
Q5:如何判断一个项目是否适合敏捷?有没有判断标准?
答:判断项目是否适合敏捷,需要综合考虑多个因素。虽然没有绝对的判断标准,但可以参考以下考虑因素:
需求不确定性:如果需求在早期难以明确,或可能频繁变化,敏捷更合适。需求不确定性可以从几个角度判断:需求来源是否明确(是否有明确的需求方)、需求是否稳定(市场、技术、法规是否变化)、需求理解程度(团队是否理解需求)。如果需求来源不明确、需求可能变化、团队理解不深,敏捷的快速反馈和适应性会有价值。
技术不确定性:如果使用了新技术或创新技术,技术方案不确定,敏捷更合适。技术不确定性可以从几个角度判断:技术是否成熟(是否有成功案例)、团队是否熟悉(团队是否有经验)、技术风险(是否有高风险技术)。如果技术不成熟、团队不熟悉、有高风险,敏捷的早期验证和迭代探索会降低风险。
复杂度:如果系统复杂度高,敏捷可能更合适。复杂度可以从几个角度判断:系统规模(功能数量、接口数量)、技术多样性(涉及多种技术)、集成复杂度(多个系统集成)。复杂系统的需求和技术会随着理解的加深而变化,敏捷的迭代方法有助于逐步理解复杂性。
紧迫性:如果需要尽快交付价值,敏捷更合适。紧迫性可以从几个角度判断:市场竞争(是否需要抢先上市)、用户需求(用户是否急需)、时间压力(是否有明确的截止日期)。敏捷可以早期交付部分价值,而不是等到完整系统完成。
团队能力:如果团队具备敏捷能力,敏捷更可能成功。团队能力可以从几个角度判断:自我组织能力(团队能否自主决策)、跨功能能力(团队是否包含所有必要的技能)、沟通能力(团队能否有效协作)。如果团队能力强,敏捷可以发挥更大价值。
客户参与:如果客户能够积极参与,敏捷更合适。客户参与可以从几个角度判断:客户可用性(客户是否有时间参与)、客户意愿(客户是否愿意积极参与)、客户地点(客户是否在同一地点)。如果客户不能或不愿积极参与,传统方法可能更合适。
组织文化:如果组织文化支持敏捷,敏捷更可能成功。组织文化可以从几个角度判断:管理层支持(管理层是否支持敏捷)、开放性(组织是否鼓励创新和尝试)、信任度(组织是否信任团队)。如果组织文化是传统的、层级分明的,敏捷可能遇到阻力。
这些因素不是独立的,而是相互关联的。需要综合考虑所有因素,而不是单一因素。可以使用评分矩阵,对每个因素评分,综合判断项目是否适合敏捷。即使评分显示适合敏捷,也需要考虑实施敏捷的成本和风险。敏捷的实施需要团队培训、工具支持、流程调整,这些都需要投入。
理解项目是否适合敏捷,需要认识到敏捷不是银弹,不能解决所有问题。敏捷的价值在于应对不确定性和变化,如果项目没有这些挑战,传统方法可能更简单有效。
十、总结
本文系统介绍了系统生命周期管理和开发方法的选择与应用。系统生命周期是系统从概念到退役的完整过程,理解生命周期对于项目规划、资源分配、风险控制具有重要意义。
系统生命周期通常包括概念、开发、生产、部署、运行维护、退役等阶段。每个阶段有特定的目标、活动和交付物。生命周期管理通过阶段门控、基线管理、并行工程、生命周期成本管理等方法,确保系统在各个阶段都得到适当的管理。
顺序开发模式(瀑布模型)将系统开发划分为一系列顺序阶段,每个阶段完成后才进入下一个阶段。顺序开发的优点是过程清晰、管理简单、文档完整,缺点是需求明确要求高、反馈晚、变更成本高。顺序开发适用于需求明确且稳定、安全关键系统、强监管环境、固定价格合同、分散团队等场景。
增量开发模式将系统开发划分为多个增量,每个增量交付系统的一部分功能。增量开发的优点是早期价值交付、早期反馈、风险降低、并行开发,缺点是架构设计挑战、集成成本、需求冻结压力、管理复杂性。增量开发适用于需求基本明确、系统可以分解、希望早期交付的项目。
演进开发模式承认需求在开发过程中会演化,开发过程本身是需求理解和系统设计共同演化的过程。演进开发的优点是适应需求变化、早期用户反馈、降低风险、持续价值交付,缺点是不确定性、架构挑战、管理难度、客户关系。演进开发适用于需求不确定、技术有风险、系统复杂的项目。
敏捷系统工程将敏捷原则和方法应用于系统工程领域。敏捷强调个体和互动、工作的软件、客户合作、响应变化。敏捷实践包括跨功能团队、短周期迭代、持续集成、优先级管理、客户协作、持续改进。敏捷系统工程需要MBSE、仿真、自动化测试等技术支撑,也面临硬件约束、长周期活动、法规合规等特殊挑战。
精益工程将精益思想应用于工程开发,核心是消除浪费、创造价值。精益实践包括价值流图、看板、限制在制品、持续改进、精益启动。精益和敏捷有共同的理念,可以结合使用。
生命周期模型的选择需要综合考虑需求确定性、技术确定性、系统复杂度、风险水平、团队能力、组织文化、客户参与、法规要求等因素。没有一种模型适用于所有项目,需要根据项目情况选择和调整。混合生命周期模型结合多种模型的优点,在实践中很常见。生命周期模型转换需要谨慎评估,频繁转换会导致混乱。
理解系统生命周期和开发方法,有助于我们根据项目特点选择合适的方法,提高项目成功的概率。生命周期模型的价值不在于遵循某种模板,而在于为项目提供框架和指导,使得项目活动有序进行,风险得到控制,价值持续交付。
十一、核心概念总结
| 概念名称 | 定义 | 应用场景 | 注意事项 |
|---|---|---|---|
| 系统生命周期 | 系统从概念形成到最终退役的整个过程 | 项目规划、资源分配 | 包含多个阶段,持续时间长 |
| 瀑布模型 | 将系统开发划分为一系列顺序阶段的方法 | 需求明确、安全关键系统 | 反馈晚,变更成本高 |
| 增量开发 | 将系统开发划分为多个增量,逐步交付 | 需求基本明确、可分解系统 | 需要早期架构设计 |
| 演进开发 | 根据反馈不断调整开发方向的方法 | 需求不确定、高风险项目 | 计划不确定性高 |
| 敏捷开发 | 强调响应变化、快速交付、客户协作的方法 | 需求快速变化的项目 | 需要团队和客户能力 |
| Scrum | 最流行的敏捷方法,基于短周期迭代 | 软件和系统工程 | 需要跨功能团队 |
| 精益工程 | 消除浪费、创造价值的工程方法 | 流程改进、效率提升 | 需要文化转变 |
| 看板 | 可视化工作、限制在制品的管理方法 | 知识工作、敏捷项目 | 需要团队纪律 |
| 阶段门控 | 在阶段结束时设置评审点的管理方法 | 生命周期管理 | 需要明确的准则 |
| 生命周期成本 | 从概念到退役的所有成本 | 投资决策、价值评估 | 运维成本往往很高 |
十二、下篇预告
下一篇我们将深入探讨系统架构设计与实现,带你了解系统概念定义与需求分析、系统架构设计基础、多架构视图设计、系统分析与权衡研究,以及系统实现、集成与验证的完整流程。