
简介ISO/IEC/IEEE 12207:2017《系统与软件工程——软件生命周期过程》完整英文电子版由ISO、IEC与IEEE联合发布面向系统架构师、软件项目经理、质量与过程改进人员以及需要引用国际标准撰写课程论文、过程规范或参与认证审核的师生与从业者。标准以全生命周期视角组织内容覆盖范围与目的、适用领域与限制、规范性引用文件、术语定义与缩略语、符合性判定以及协议、组织级、技术管理、技术等各类过程的活动与任务可用于搭建开发、获取、运行与维护环节的过程框架。资源为1个PDF文件共155页压缩包约1.54MB单文件便于全文检索与离线查阅。已有263人学习适合需要对照条款原文梳理过程模型、编写过程裁剪说明或做标准比对的中高级读者参考。1. 12207:2017 不是流程模板而是一份过程契约的公共语汇团队里真正难对齐的从来不是技术选型而是“这件事该谁负责、何时算完、留下什么证据”。需求评审谁签字、缺陷该不该进变更控制、系统下线要不要写退役计划每个团队都有自己的答案跨组织协作时就开始互相拉扯。ISO/IEC/IEEE 12207:2017 处理的正是这一层它给出系统与软件生命周期过程的公共语汇说明行业公认要覆盖哪些过程、每个过程的目的是什么、应当产生哪些可验证的结果却不指定你用瀑布、迭代还是持续交付。155 页英文电子版的门槛不在语言而在于它是名词表加结果清单顺序通读容易睡着按项目里的具体问题反查才有效。适合正在建过程体系、准备过程评估或者要给多方协作定契约的人。2. 拆开 12207:2017 的过程骨架四类过程组与 30 个过程2.1 四类过程组各自管什么12207:2017 把全部过程收进四个组里。理解这四个组的分工比背下 30 个过程名重要得多因为它直接决定了在组织结构里该把责任分给谁协议组面向外部关系组织级组面向公司层面的能力建设技术管理组面向项目经理和 QA技术组面向工程团队本身。过程组面向对象典型过程常见责任角色协议过程组织与外部供方获取、供应采购、商务、项目总监组织级项目使能过程公司级能力生命周期模型管理、基础设施管理、组合管理、人力资源管理、质量管理、知识管理管理层、过程改进组技术管理过程单个项目项目规划、项目评估与控制、决策管理、风险管理、配置管理、信息管理、测量、质量保证项目经理、QA技术过程产品本身业务或使命分析、干系人需求定义、系统/软件需求定义、架构定义、设计定义、系统分析、实现、集成、验证、转换、确认、运行、维护、处置架构师、开发、测试、运维这张表是分组不是执行顺序。技术过程里从“业务或使命分析”到“处置”确实存在天然时序技术管理过程则横贯始终项目一开始就要规划、测量、管配置直到退役都还在跑。12207:2017 与系统侧的生命周期过程标准保持了对齐软件过程被当作系统过程的一个特化视角所以同一个过程在系统级和软件级都能落到同一套结果上。这个设计对做软硬一体产品的团队尤其省事不用维护两套流程文档。2.2 每个过程条款内部的三段结构每个过程在标准里都是同一套骨架目的、结果、活动与任务。这个统一结构是它能被检索、能被审计的根本原因也是读这份 155 页 PDF 时最该抓住的东西。目的一句话说明这个过程的立足点用来判断“要不要做”。结果可观察、可验证的状态清单是审计和自评的抓手比活动更适合当判定依据。活动与任务达成结果的手段粒度到可以分配给角色标准本身也说明这些活动可以裁剪、可以合并。我一般会把“结果”单独抽成一张表。原因很实际活动是过程性的做了不等于做对结果是状态性的达到了就是达到了。评估时对方问“你们做没做风险管理”答“每周开风险会”远不如直接拿出风险登记表及已关闭项来得有力。把结果清单当作验收标准过程落地就不会滑向打卡。2.3 把标准抄成一份可入库的过程清单155 页 PDF 不适合在评审会上翻。实际好用的做法是把跟自己相关的过程抽成机器可读的 YAML放进版本库跟着项目分支走。下面是一份最小示例只抽了两个过程# docs/processes/12207-2017/technical.yaml - id: SN-REQ-DEF group: technical name_zh: 干系人需求定义 purpose: 定义干系人对系统或软件在其生命周期内的需求与期望 outcomes: - 干系人及其需求被识别并分类 - 需求被记录且可追溯到来源 - 需求变更的受理路径被定义 evidence: - 干系人登记册 - 需求规格基线 - 需求评审记录 owner_role: 业务分析师 gate: M1 - id: VERIFICATION group: technical name_zh: 验证 purpose: 证明产品或服务满足其规定需求 outcomes: - 验证准则与需求一一对应 - 验证结果被记录且偏差被闭环 evidence: - 验证计划 - 验证报告 owner_role: 测试负责人 gate: M3逻辑说明id用短横线大写的稳定标识避免中文名改名后引用锚点失效outcomes直接抄标准里的结果条目保持可追溯evidence是本团队自己补的标准只说“应有客观证据”不规定文档叫什么名字落到自己的模板上是自己的活gate是本地字段把过程和里程碑挂上标准里没有这个概念。参数取值的约束是group只有四种用来做统计和渲染owner_role写角色不写人名人员流动时不用改gate留空表示这个项目不设卡点但仍然保留过程条目便于后续审计时说明“做了但未设卡”。提示抽 YAML 时只抽真正会执行的过程。一上来把 30 个全抽完维护成本会立刻超过收益。3. 裁剪把 12207:2017 从 155 页压到项目可执行的范围3.1 裁剪的判定输入有哪些裁剪不是删减而是要能证明删掉的部分不影响结果。实际操作时我会准备四类输入项目类型新建、维护、集成、交付模式一次性交付还是持续交付、外部约束合同是否指定条款、是否有行业监管、风险等级失效是否牵涉人身安全或资金损失。这四类输入给出的答案差异极大。一个内部数据看板的小工具处置过程可以整段不要一个嵌进医疗设备的固件验证、确认、配置管理、风险管理的证据要求都得拉满。判断标准很直接如果某个过程的某个结果在整个生命周期里永远不会被任何人查看或依赖它就可以被裁掉。判断过程要留痕写清判定依据、判定人和复核周期否则事后无法证明裁剪是有意为之而不是漏了。3.2 一张可复用的裁剪决策表过程判定问题保留简化裁掉获取是否从外部采购系统或服务有正式合同内部服务协议全部自研供应是否向外部交付有验收节点内部团队交付无外部交付组合管理是否与其他项目共享资源与预算有组合评审季度预算对齐单项目独立决策管理是否存在不可逆的技术决策有决策记录且评审只记录决策结论无重大决策处置是否有数据与资产退场要求有退役计划下线检查单无托管资产测量是否被要求向上报指标有指标基线只留交付类指标无外部报告这张表是决策辅助不是标准原文。真正的裁剪记录要能回答“为什么是这个结论”而不是只留下一个结论。同一个项目在不同阶段结论也可能变比如从自研转向引入外部组件之后获取过程就要从裁掉改回保留。3.3 用脚本生成裁剪后的过程基线手工维护裁剪表容易漂移。下面这段 Python 把过程 YAML 和一份项目画像合起来输出该项目实际需要执行的过程清单import yaml def load_processes(paths): procs [] for p in paths: with open(p, encodingutf-8) as f: procs.extend(yaml.safe_load(f)) return procs # 项目画像三个维度决定裁剪力度 PROFILE { delivery: continuous, # once | continuous regulated: True, # 是否有外部监管约束 external_supply: False, # 是否有外部供方 } # 裁剪规则返回 keep / simplify / drop RULES { ACQ: lambda p: keep if p.get(external_supply) else drop, SUP: lambda p: simplify if p.get(delivery) continuous else keep, MEASUREMENT: lambda p: keep if p.get(regulated) else simplify, DISPOSAL: lambda p: simplify if p.get(regulated) else drop, } def tailor(procs, profile): baseline [] for proc in procs: rule RULES.get(proc[id]) state rule(profile) if rule else keep # 未定义规则的默认保留 if state drop: continue baseline.append({ id: proc[id], state: state, evidence: proc.get(evidence, []), owner_role: proc.get(owner_role), }) return baseline if __name__ __main__: procs load_processes([docs/processes/12207-2017/technical.yaml]) for row in tailor(procs, PROFILE): print(row)逻辑说明load_processes只负责合并多个 YAML不做任何裁剪好处是过程定义和裁剪逻辑解耦换项目画像不必动过程文件。RULES用字典映射到函数新增一个过程的判定只要加一行不用改主循环。tailor里对没有命中规则的统一按keep处理这是刻意的取舍默认保留会让基线变长但避免了因为忘写规则导致过程被静默裁掉。参数说明PROFILE的键要和 lambda 里读的键完全一致否则只会拿到 KeyError不会给出友好提示这是简化版的已知短板用p.get(..., 默认值)会比p[...]稳一些。state只有三个取值simplify的含义是过程保留、证据形式简化例如把独立的测量报告改成每月一张汇总表而不是把测量这件事本身拿掉。3.4 裁剪最容易踩的三个坑第一个坑是把裁剪做成整段删除。过程之间是有输入输出关系的砍掉配置管理之后验证过程拿不到受控的基线版本整条链条会在某一刻散架而且散架的时候通常离裁剪已经过去很久很难追责。第二个坑是只裁过程不裁证据。过程少了但证据清单照旧团队会补齐一堆没人看的文档形式主义大概就是这么长出来的。裁剪时要连证据形式一起改能合并的合并能自动生成的自动生成。第三个坑是裁剪结论没进项目计划。裁剪决定应该跟里程碑一起被复核否则出了事故复盘时没人能说清某个过程当初是被有意省略还是被忽视了。注意裁剪结论一旦定了就写进项目计划里跟里程碑一起复核不要单独存成一份没人再打开的表格。4. 把 12207:2017 映射到敏捷与 DevOps 的研发流程4.1 映射的原则过程不变载体可变经常有人问 12207:2017 是不是要求瀑布完全不是。它描述的是要产出什么结果而不是分几步走。敏捷团队做迭代、平台团队做流水线本质上只是把同一批结果换了节奏和载体去实现。稳定的映射方式是三层一个过程对应一组实践一组实践对应一套可自动产出的证据。以配置管理为例传统载体是配置管理计划和受控库迭代团队仍然要做配置管理只是载体变成分支策略、制品仓库和不可变镜像。这里有一个判断标准很好用如果换掉工具之后你没法再证明那个结果存在说明你依赖的是工具本身而不是过程。4.2 过程与敏捷、DevOps 载体的对照12207:2017 过程敏捷或 DevOps 里的载体可查证据项目规划迭代规划会、季度目标迭代目标、燃尽数据项目评估与控制每日站会、迭代回顾站会记录、回顾行动项风险管理风险条目进看板风险条目及关闭记录配置管理分支策略、制品仓库提交记录、镜像摘要验证单元测试、静态扫描流水线报告确认迭代验收、用户验收测试验收记录与签署测量服务指标、交付效能指标指标看板与快照信息管理文档即代码仓库内 Markdown质量保证流水线质量门禁门禁配置与执行日志这张表的用法不是替换标准而是给评估人对口径。评估时能拿出对应证据过程就算落地不存在“必须有一份叫某某计划的文档”这种要求标准本身也没有规定文档名称和格式。4.3 用流水线承载验证与配置管理配置管理和验证这两个过程是工程团队最容易自动化落地的部分。下面是一段把验证准则和持续集成阶段绑定的配置用常见的流水线语法作为载体# .github/workflows/lifecycle-verify.yml name: lifecycle-verify on: [pull_request] jobs: verify: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 with: fetch-depth: 0 # 保留完整历史供需求追溯使用 # 对应「验证」证明实现满足规定需求 - name: run unit tests run: pytest -q --junitxmlreports/unit.xml # 对应「验证」的静态检查分支 - name: static analysis run: semgrep --configauto --sarif -o reports/semgrep.sarif # 对应「配置管理」把本次构建的制品与提交指纹绑定 - name: record artifact fingerprint run: | echo commit$(git rev-parse HEAD) reports/trace.txt echo build$(date -u %Y%m%dT%H%M%SZ) reports/trace.txt - uses: actions/upload-artifactv4 with: name: verify-evidence path: reports/逻辑说明fetch-depth: 0不是可有可无的浅克隆会让跨提交的需求追溯断掉评估时拿不出“这条需求对应哪次提交”的证据。把单元测试和静态检查放在同一个 job 里是为了让两类验证结果落在同一次构建的上下文里避免两份报告时间戳对不上。最后一步把提交哈希和构建时间写入trace.txt正是配置管理过程最核心的那条结果制品可以被唯一标识并回溯。参数说明--junitxml输出的结构化格式适合被后续的质量门禁消费换成纯文本就得再写一层解析。semgrep --configauto用的是内置规则集团队稳定下来之后应换成自己维护的规则目录否则规则随上游变动不能当基线使用。制品保留天数默认是 90 天合规项目要显式调长别指望默认值能覆盖审计周期。4.4 转换与运行过程为什么常被漏掉迭代节奏里最容易漏掉的是转换、运行、维护、处置这四个。前三个被漏是因为它们发生在上线之后迭代计划里没人给它们排工处置被漏是因为系统和数据通常没有明确的退场责任人。补救办法并不复杂把上线检查单明确对应到转换把值班与告警响应对应到运行把缺陷修复和技术改造对应到维护把下线评审对应到处置。这四件事本来就在做只是没人把它们挂到过程上于是评估时说不出话。挂上去之后工作量没有增加可解释性增加了。5. 用 12207:2017 做符合性自评与差距分析5.1 自评的三个维度与打分口径对每个保留的过程按三个维度打分结果覆盖哪些结果已经有客观证据、职责落实有没有明确责任人及交接方式、可重复性换个人做能不能复现。每项取 0、1、2分别对应没有、部分、完整。权重给结果覆盖 0.5是因为没有客观证据的过程职责和可重复性再好也只是口头承诺。维度权重0 分1 分2 分结果覆盖0.5无任何证据有证据但不全结果全部有据可查职责落实0.3无人负责有人负责但交接不清角色、交接、升级路径明确可重复性0.2依赖个人有步骤但不成文有可执行步骤或自动化5.2 一份可以直接跑的自评脚本import csv WEIGHTS {outcome_coverage: 0.5, ownership: 0.3, repeatability: 0.2} THRESHOLD 1.0 # 受监管项目建议提到 1.4内部工具类可降到 0.8 def gap_report(path): rows [] with open(path, encodingutf-8) as f: for r in csv.DictReader(f): score sum(WEIGHTS[k] * int(r[k]) for k in WEIGHTS) rows.append((r[process_id], round(score, 2))) return sorted(rows, keylambda x: x[1]) # 得分低者优先补 if __name__ __main__: for pid, s in gap_report(assess/self-assessment.csv): flag GAP if s THRESHOLD else ok print(f{pid:24s} {s:4} {flag})自评表按process_id, outcome_coverage, ownership, repeatability四个字段组织和过程 YAML 共用一个标识体系评分结果就能直接映射回具体过程条款不用人工翻译。脚本按得分升序输出第一行就是最该补的过程。参数上阈值建议随项目类型调整并把调整理由写下来否则每年换个人接手阈值就会变成拍脑袋的数字。CSV 跟过程定义一起放进版本库差距分析就能按迭代对比看出某条差距是在收窄还是在扩大。如果一年只做一次自评我会先只跑技术管理那一组。技术过程的结果通常有代码和测试兜底出问题很快被看见技术管理过程的结果埋在会议纪要和表格里没人评估就没人发现它已经断了半年。本文还有配套的精品资源点击获取