Function Decomposition Methods
先把目标改写成能力
NASA 将功能分解定义为:检查一个功能,识别完成它所必需的子功能,以及这些功能之间的关系与接口。其逻辑分解过程首先识别系统在每一层“应该实现什么”,再把父级需求下推成更详细的功能要求。[^nasa-logical][^nasa-handbook]
因此,“提升训练问题定位效率”仍然是结果目标,不是叶子功能。它至少还缺少用户、触发条件、输入、行为、输出和验收证据。功能分解就是把这块难以直接交付的目标,切成团队可以拿起来实现和验证的能力块。
用户给出的链路可以先改写成两张不同的图。第一张是包含关系:
1 | 目标:提升训练问题定位效率 |
第二张才是依赖关系:
1 | 完整采集 -> 多 Rank 聚合 -> 时间线对齐 -> 首错识别 -> 根因分类 -> 诊断报告 |
两张图可以包含相同节点,但不能混为一谈。树回答“整体由哪些能力组成”;箭头链回答“一个功能依赖哪个上游产物”。如果把所有父子边都画成先后箭头,读者会误以为“采集、聚合、报告”只是顺序步骤,看不到配置快照、指标关联、异常分支等并列能力。
一个可交付的叶子功能,至少应写成下面的契约:
| 字段 | 示例 |
|---|---|
| 用户与场景 | 训练工程师在分布式作业失败后发起诊断 |
| 输入 | job_id、Rank 列表、日志 URI、时钟偏移元数据 |
| 行为 | 采集所有可达 Rank 的 stdout、stderr 与结构化事件 |
| 输出 | 带 Rank、节点、时间戳和来源的标准日志记录集 |
| 验收 | 所有存活 Rank 均有日志;缺失 Rank 被显式列出;重复上传可幂等处理 |
| 异常 | 日志源不可达时返回来源、重试次数和最终状态 |
| 依赖 | 作业元数据服务、对象存储、身份认证 |
| Owner | 可观测性团队负责能力契约,采集代理只是一个实现分配 |
功能树
机制与对象
问题快照:目标只有一句话,团队便直接开始列服务、页面和算法,导致同级节点混入“能力、组件、动作、团队和里程碑”,既无法检查漏项,也无法向上解释价值。
一句话直觉:功能树像一张“做什么”的目录,把父功能递归分成同一抽象层级的子功能,直到叶子能够写出独立验收契约。
本文所说的功能树,是 NASA 式功能分解的树形表达,不是声称存在一套独立且统一的国际图形标准。三层边界如下:
- 概念:为完成父目标,系统必须具备哪些功能?
- 可复用机制:建立父子包含关系,保持兄弟节点同一分解口径,并另行记录接口与依赖。
- 本文落地:把训练诊断分成证据获取、标准化、诊断和交付四个能力域,再继续分到可验证叶子。
| 对象 | 标识 | 生产者 | 结构 | 消费者 | 生命周期 |
|---|---|---|---|---|---|
| 结果目标 | goal |
Stakeholder | Goal[metric, target, timebox] |
根功能、追溯矩阵 | 随目标版本存在 |
| 父功能 | parent_function |
功能分析 | Function[verb, object, purpose] |
子功能分解 | 设计基线 |
| 子功能 | child_functions |
递归分解 | Set[Function] |
覆盖检查、叶子契约 | 设计基线 |
| 功能接口 | interfaces |
兄弟关系分析 | Set[producer, artifact, consumer] |
依赖图、集成测试 | 随接口版本存在 |
| 叶子契约 | leaf_contract |
产品、研发、测试 | Contract[input, behavior, output, acceptance] |
实现与验收 | 发布基线 |
| 追溯关系 | traceability |
对账步骤 | goal -> function -> test |
变更影响分析 | 持续维护 |
伪代码与五视图
下面的伪代码是建模过程,不是运行时代码。decompose_by_user_outcome 必须使用用户结果作为主轴;代码模块只能在叶子功能稳定后进入 allocate_implementation。
1 | function build_function_tree(goal, scenarios, constraints): |
适用性与边界
- 适合:系统功能架构、需求分解、复杂产品范围梳理、测试覆盖设计。
- 优势:向上能解释业务价值,向下能连接接口、特性、工作包和测试。
- 劣势:树只能自然表达一个主包含轴;跨分支依赖、时序和共享能力必须另建关系图。
- 实现归属:产品或系统分析 Owner 维护父子语义,能力 Owner 维护叶子契约,架构师再把功能分配给组件。
- 迁移成本:换技术栈时功能树通常可以保留,但组件分配、接口约束和非功能指标需要重新校验。
- 效果契约:它减少的是功能范围与验收歧义,新增成本是模型、追溯和变更同步;应以漏项率、返工原因和验收争议衡量,不应直接声称缩短训练时间。
WBS
机制与对象
问题快照:功能已经明确,但项目仍以零散任务清单管理。设计、开发、测试、文档和上线工作互相重叠,成本、进度和责任无法汇总到一个稳定交付物。
一句话直觉:WBS(Work Breakdown Structure,工作分解结构)把已批准的总范围按产品和交付物逐层拆成可计划、可授权、可跟踪的工作包。
美国能源部 WBS 手册明确采用产品导向结构来组织和细分项目总范围;不同层级应汇总回项目总范围,并用 WBS Dictionary 说明每个元素的范围。手册还把“按职能经理、专业或跨多个产品的活动建立 WBS 元素”列为常见错误。[^doe-wbs]
这意味着 WBS 与功能树不是竞争关系:
- 功能树先回答“系统必须做什么”。
- WBS再回答“为了交付这些能力,完整项目范围包含哪些交付物和工作包”。
- “日志聚合能力”可以映射到采集代理、聚合服务、契约测试、迁移文档和上线演练等多个 WBS 元素。
| 对象 | 标识 | 生产者 | 结构 | 消费者 | 生命周期 |
|---|---|---|---|---|---|
| 授权范围 | authorized_scope |
项目章程、功能基线 | Scope[deliverables, exclusions] |
顶层 WBS | 项目基线 |
| 交付物 | deliverable |
产品与工程规划 | Deliverable[outcome, acceptance] |
子元素分解 | 项目阶段 |
| WBS 元素 | wbs_element |
交付物分解 | Element[id, parent, scope] |
计划、成本、进度 | 项目生命周期 |
| 工作包 | work_package |
控制粒度判断 | Package[owner, output, estimate] |
执行与跟踪 | 执行周期 |
| WBS 字典 | dictionary_entry |
范围定义 | Entry[content, boundary, acceptance] |
授权、变更控制 | 持续更新 |
| 范围校验 | coverage_check |
WBS 评审 | Set[missing, overlap, orphan] |
基线决策 | 评审周期 |
伪代码与五视图
1 | function build_wbs(authorized_scope, deliverables, reporting_constraints): |
适用性与边界
- 适合:范围基线、成本与进度控制、采购交付、跨团队大型项目。
- 优势:容易连接预算、进度、责任和风险,能检查授权范围是否完整落地。
- 劣势:如果在理解用户能力之前使用,团队很容易得到一棵“开发活动树”,却交付不了完整用户结果。
- 实现归属:项目经理维护 WBS 与字典,产品/系统 Owner 确认其与功能和交付物的映射。
- 迁移成本:范围或采购边界改变会重构 WBS;单纯更换内部算法未必改变顶层交付物。
- 效果契约:它减少的是范围、责任、成本和进度的失配;新增成本是控制粒度、字典和变更审批。效果应由范围漏项、计划偏差和未授权工作衡量。
FAST 功能分析
机制与对象
问题快照:团队把“ELK 日志平台”“时间线数据库”“LLM 根因模型”写成功能,讨论很快被当前方案锁死;当方案变化时,整个功能结构也随之失效。
一句话直觉:FAST(Function Analysis System Technique)先用简洁的“动词—名词”描述功能,再持续追问“怎样做到”和“为什么需要”,把方案名还原成功能逻辑。
SAVE International 将功能描述为项目、产品或过程为了满足客户需要必须做的事,强调“做什么”独立于“它是什么”和“如何实现”;FAST 则用 HOW-WHY 逻辑组织功能的依赖关系。[^save-guide][^save-glossary]
在训练诊断案例中,可以把方案词改写成功能词:
| 不推荐 | 推荐 | 原因 |
|---|---|---|
| ELK 平台 | 聚合日志 | 平台只是候选实现 |
| 时间线数据库 | 对齐事件 | 数据库不能说明用户获得什么结果 |
| LLM 诊断 | 分类根因 | 算法类型不等于功能边界 |
| 提升效率 | 缩短定位时间 | 前者是笼统目标,后者才可连接度量 |
FAST 横向链可以这样读:
1 | WHY <----------------------------------------------------------> HOW |
从右向左问“为什么聚合日志”,答案是为了对齐异常时间线;从左向右问“怎样缩短定位时间”,答案之一是识别首个因果信号。这是一条功能逻辑,不是运行时序保证;并行、等待、异常和循环仍应由流程图、状态机或时序图表达。
| 对象 | 标识 | 生产者 | 结构 | 消费者 | 生命周期 |
|---|---|---|---|---|---|
| 研究边界 | study_scope |
客户与引导师 | Scope[object, start, end] |
功能发现 | 研讨基线 |
| 功能语句 | function_statement |
跨职能团队 | Function[active_verb, measurable_noun] |
分类与连接 | 随图版本存在 |
| 基本功能 | basic_function |
价值判断 | Function |
价值改进重点 | 研究周期 |
| 次级功能 | secondary_function |
功能发现 | Function[classification] |
HOW-WHY 图 | 研究周期 |
| HOW-WHY 边 | how_why_edge |
追问与验证 | Edge[source, relation, target] |
逻辑走查 | 随图版本存在 |
| 评价指标 | function_measure |
客户与团队 | Measure[cost, performance] |
方案比较 | 决策周期 |
伪代码与五视图
1 | function build_fast(study_scope, customer_needs, candidate_elements): |
适用性与边界
- 适合:方案替代、价值工程、成本优化、复杂系统功能关系梳理、跨专业研讨。
- 优势:迫使团队暂时放下当前组件和技术名,暴露真正功能、缺失关系与替代实现空间。
- 劣势:依赖高质量引导和跨职能知识;大图容易出现一词多义、循环和伪因果。
- 实现归属:FAST 引导师维护规则,客户确认基本功能与边界,跨职能团队共同验证 HOW-WHY 关系。
- 迁移成本:实现方案改变时功能逻辑可以保留,但函数度量、成本分配和边界条件需要重评。
- 效果契约:它减少的是方案锁定和功能逻辑歧义,代价是研讨与模型校验;价值提升必须用受控方案比较证明,不能从图本身推导。
能力地图
机制与对象
问题快照:路线图按项目、团队和系统列清单。同一种日志诊断能力在多个平台重复建设,另一些战略能力却没有任何项目支撑。
一句话直觉:能力地图先稳定描述“组织或产品必须有能力做什么”,再把当前系统、流程、人员和投资映射到这些能力上。
The Open Group 的架构工具箱把业务能力描述为执行某项业务功能的能力,强调用“必须做什么”命名,并记录层级、定义、责任和上级对象。[^open-group-capability] 能力地图通常比项目和系统稳定,因为项目会结束、系统会替换,而“训练证据管理”“异常诊断”“诊断交付”等能力仍然存在。
三层边界如下:
- 概念:一个组织或产品必须稳定具备哪些能力?
- 可复用机制:建立能力域和层级,去重命名,评估当前/目标成熟度,再映射系统、Owner 与投资。
- 本文落地:用证据获取、证据标准化、问题诊断、诊断交付覆盖训练问题定位,而不是先列日志服务和报告页面。
| 对象 | 标识 | 生产者 | 结构 | 消费者 | 生命周期 |
|---|---|---|---|---|---|
| 战略结果 | strategic_outcomes |
业务负责人 | Set[Outcome, Measure] |
能力识别 | 战略周期 |
| 能力 | capability |
业务架构/产品 | Capability[name, definition, level] |
能力地图 | 稳定版本化 |
| 支撑关系 | support_map |
架构与组织盘点 | Map[capability -> people/process/system] |
差距分析 | 盘点周期 |
| 当前成熟度 | current_level |
证据评估 | Assessment[level, evidence] |
差距计算 | 评估窗口 |
| 目标成熟度 | target_level |
战略决策 | Target[level, deadline] |
投资规划 | 规划周期 |
| 能力差距 | capability_gap |
当前/目标对比 | Gap[delta, evidence, risk] |
优先级决策 | 规划周期 |
伪代码与五视图
1 | function build_capability_map(strategic_outcomes, scenarios, current_landscape): |
适用性与边界
- 适合:战略到技术对齐、产品线规划、重复建设识别、能力成熟度与投资组合讨论。
- 优势:对组织调整和技术替换不敏感,适合建立长期导航入口。
- 劣势:过度抽象后会停留在“具备某能力”的名词墙,无法直接指导接口、异常处理和验收。
- 实现归属:业务或产品 Owner 负责定义能力价值,架构团队维护支撑关系,投资与交付负责人维护差距证据。
- 迁移成本:系统更换主要改变支撑映射;战略结果变化才更可能改变顶层能力边界。
- 效果契约:它减少的是战略、投资与系统之间的错位,代价是统一词汇、成熟度证据和治理;应以重复投资、未支撑能力和差距关闭情况衡量。
Feature Breakdown Structure
机制与对象
问题快照:能力地图已经指出“需要训练问题诊断能力”,但这仍然无法直接进入迭代。若 Backlog 继续按后端、前端、数据库和算法组件堆放,用户价值与验收会再次断开。
一句话直觉:FBS(Feature Breakdown Structure,特性分解结构)把产品能力拆成用户可感知、可独立验收、可进入发布计划的特性和子特性。
Highsmith 在 Agile Project Management 中用 FBS 表达软硬件产品架构,强调它在客户和开发团队之间沟通,并形成用于发布与迭代计划的特性 Backlog。[^highsmith-fbs] 例如训练诊断产品可以拆成:
1 | 训练诊断工作台 |
| 对象 | 标识 | 生产者 | 结构 | 消费者 | 生命周期 |
|---|---|---|---|---|---|
| 用户结果 | user_outcome |
用户研究、能力地图 | Outcome[user, context, value] |
顶层特性 | 产品周期 |
| 特性 | feature |
产品分解 | Feature[user, behavior, value] |
子特性、发布规划 | Backlog 生命周期 |
| 子特性 | subfeature |
行为切片 | Feature[bounded behavior] |
验收与实现 | 迭代周期 |
| 验收条件 | acceptance |
Product、QA、研发 | Set[precondition, action, result] |
测试与发布门禁 | 随特性版本存在 |
| 依赖 | dependency |
跨特性分析 | Edge[predecessor, artifact, successor] |
排序、风险 | 持续维护 |
| 发布候选 | release_candidate |
优先级与可行性决策 | Set[Feature] |
迭代计划 | 发布周期 |
伪代码与五视图
1 | function build_fbs(user_outcomes, capability_map, constraints): |
适用性与边界
- 适合:产品特性架构、Backlog 整理、发布切片、客户—研发沟通。
- 优势:把抽象能力变成用户能看见、能使用、能验收的增量,便于排序与发布。
- 劣势:若特性只按界面页面或组件命名,仍会失去跨端到端行为;依赖过多时树结构也会失真。
- 实现归属:Product Owner 维护用户价值和特性层级,研发与 QA 共同确认可行性、依赖和验收条件。
- 迁移成本:后端替换通常不应改写用户特性;交互、能力边界或发布策略改变时需要重新切片。
- 效果契约:它减少的是 Backlog 与用户价值、验收之间的断裂,代价是持续切片和依赖维护;应以特性验收通过率、跨迭代返工和价值交付周期衡量。
五种方法如何选择
五种方法都可以画成树,但被分解的对象不同。先问当前最缺哪一种确定性,再选工具:
| 方法 | 核心问题 | 主分解轴 | 主要产物 | 合适的停止点 | 最常见误用 |
|---|---|---|---|---|---|
| 功能树 | 系统必须做什么 | 父功能 -> 子功能 | 功能层级、接口、叶子契约 | 叶子可独立实现和验证 | 用代码目录当功能树 |
| WBS | 完整项目范围怎样交付与控制 | 交付物 -> 工作包 | WBS、WBS 字典 | 可授权、估算和跟踪 | 在需求未清时先列开发任务 |
| FAST | 功能之间怎样/为什么关联 | HOW-WHY 逻辑 | 功能语句、逻辑图、度量 | 逻辑边界可双向走查 | 把 HOW-WHY 当运行时序 |
| 能力地图 | 长期需要具备什么能力 | 能力域 -> 能力层级 | 能力版图、成熟度、差距 | 能支持战略与投资决策 | 只做稳定名词墙,不落支撑证据 |
| FBS | 哪些用户特性进入产品和发布 | 产品特性 -> 子特性 | 特性树、验收、发布候选 | 叶子能独立验收和排序 | 固定套 Epic/Story 层级或按组件拆 |
它们最常见的组合不是“五选一”,而是:
1 | 结果目标 |
从目标到可验证子功能
一套可执行的功能分解流程可以按下面七步进行。
- 定义结果而不是方案。 写清用户、问题、基线、目标值和时间窗。例如把“提升定位效率”改成“将 P50 可用诊断结论时间从 45 分钟缩短到 10 分钟以内”,同时保留 P95 和误诊率约束。
- 固定场景与边界。 列出触发、输入、期望结果、异常和不做事项。区分训练失败、性能劣化、精度异常和基础设施告警,避免一个目标吞掉所有诊断场景。
- 画能力地图。 先识别证据获取、标准化、诊断、交付等稳定能力域,并标记当前/目标差距和 Owner。
- 建立功能树。 对每个能力域按用户结果向下拆,保持兄弟节点同一抽象层级;把包含关系放进树,把先后依赖放进单独的依赖图。
- 用 FAST 追问关键链。 对方案味很重或关系含糊的节点改写“动词—名词”,用 HOW-WHY 双向检查是否缺功能、伪因果或过早绑定实现。
- 生成 FBS 与 WBS。 把功能映射成用户可感知特性和验收条件,再把已批准范围映射成交付物、工作包、成本、进度和责任。
- 建立追溯并反向走查。 从每个测试向上找到特性、功能、能力和结果目标;再从目标向下检查是否存在没有实现、没有测试或没有 Owner 的孤儿节点。
训练诊断案例的最小追溯表可以是:
| 目标 | 能力 | 功能 | 特性 | 工作包 | 验收证据 |
|---|---|---|---|---|---|
G-01 缩短可用诊断时间 |
C-02 证据标准化 |
F-07 对齐异常时间线 |
FE-04 跨节点时间线 |
WP-12 时钟校正与排序交付 |
受控时钟漂移数据集上的顺序正确率 |
G-01 |
C-03 问题诊断 |
F-09 识别首错 |
FE-06 首错面板 |
WP-16 规则/模型与证据跳转 |
标注故障集上的首错命中率、误报率 |
G-01 |
C-04 诊断交付 |
F-12 生成报告 |
FE-10 一键诊断报告 |
WP-21 报告模板、导出与权限 |
报告完整性、生成时延、权限测试 |
依赖图必须为箭头命名。例如 F-07 -> F-09 的边不是模糊的“依赖”,而是“输出经校正的事件序列,供首错识别消费”。只有命名了中间产物,接口测试和失败定位才有落点。
拆到什么粒度
功能分解不是越细越好。拆得太粗,叶子仍不可实现;拆得太细,树会退化成函数调用和工单列表。合适的停止点,是团队能在不猜业务含义的情况下给出实现方案,并由测试或运营证据独立判断是否满足契约。
叶子功能通过下面七项检查时,通常可以停止:
- 单一结果:它只承诺一个明确用户或系统结果,而不是“采集、分析并展示一切”。
- 输入输出明确:关键对象、来源、格式和消费者可以命名。
- 异常可描述:缺失、重复、乱序、超时、权限失败等边界有明确行为。
- 验收可观察:成功、失败和质量阈值都有证据,不依赖“感觉可用”。
- 主责唯一:允许多人参与,但只有一个能力契约 Owner。
- 依赖显式:上游功能、传递产物和阻塞条件可追踪。
- 实现中立:替换数据库、模型或服务时,用户结果与验收通常仍然成立。
功能不要求都能独立部署,但必须能独立说明和验证。如果一个叶子只能通过另一个叶子的私有实现细节才能解释,说明边界或接口仍需调整。
质量检查
提交功能分解结果前,可以做七类走查:
- 价值检查:每个节点能否向上回答“它为哪个用户结果服务”?
- 同层检查:兄弟节点是否混入能力、组件、活动、角色和里程碑?
- 覆盖检查:所有场景、异常、数据入口、输出和运营动作是否都有归属?
- 重叠检查:两个节点是否承诺同一行为,却没有主从或共享能力关系?
- 依赖检查:树外依赖是否单独记录,并为箭头命名了传递产物?
- 验收检查:每个叶子是否存在可执行测试、审计记录、监控指标或人工评审证据?
- 变更检查:目标、能力、功能、特性、工作包和测试之间是否能双向追溯?
衡量功能分解效果时,应观察它直接改变的工作结果:
- 需求评审发现的漏项数与抽象层级错误数;
- 叶子功能具备完整验收契约的比例;
- 变更影响分析中漏报的下游特性、工作包和测试数;
- 因范围或接口歧义造成的返工次数;
- 从提出目标到形成可批准功能基线的周期;
- 训练诊断产品上线后的 P50/P95 可用诊断时间、首错命中率和报告完整率。
前五项主要评价分解质量,最后一组才评价产品效果。二者相关,但不能用“图画得完整”直接推导“定位效率一定提高”。
总结
功能分解的本质,是在高层目标和工程实现之间建立一条可验证的语义链。能力地图定范围,功能树定组成,FAST 查逻辑,FBS 定用户特性,WBS 定交付控制;依赖图和追溯表把这些视图连接起来。
最重要的纪律只有两条:第一,先按用户能力和业务价值拆“做什么”,不要先照着代码目录拆;第二,只有当叶子功能的输入、行为、输出、异常、验收、依赖和 Owner 都清楚时,才算真正拆到了可以实现和验证的粒度。
参考资料
- NASA, Logical Decomposition.
- NASA, Systems Engineering Handbook, Revision 2, Section 4.3.
- U.S. Department of Energy, Work Breakdown Structure Handbook, 2012.
- SAVE International, Function Analysis Guide.
- SAVE International, Value Methodology Glossary.
- The Open Group, Toolbox for Architecture Framework, p.95.
- Jim Highsmith, Agile Project Management sample chapter, printed p.102.
[^nasa-logical]: NASA 的在线《Systems Engineering Handbook》4.3 节说明,逻辑分解用于识别各层级“应该实现什么”,并把父级需求分解、分配到更低层级。
[^nasa-handbook]: NASA Systems Engineering Handbook, Rev 2, Section 4.3 与术语表 “Functional Decomposition”。
[^doe-wbs]: U.S. Department of Energy, Work Breakdown Structure Handbook, 2012,尤其是 pp.1, 7-15;其中将按组织职能建立 WBS 列为常见错误。
[^save-guide]: SAVE International, Function Analysis Guide,公开介绍页说明该指南覆盖功能识别、分类、FAST 图和逻辑验证。
[^save-glossary]: SAVE International, Value Methodology Glossary,词条 “Function” 与 “Function Analysis System Technique (FAST)”。
[^open-group-capability]: The Open Group, Toolbox for Architecture Framework, p.95。该材料是架构实践工具箱,不应被扩大解释为全部 TOGAF 标准的强制元模型。
[^highsmith-fbs]: Jim Highsmith, Agile Project Management, Pearson sample, printed p.102。本文采用其产品架构与特性 Backlog 语义,并明确不把 FBS 表述为 Scrum 官方工件。
Function Decomposition Methods
http://icarus.shaojiemike.top/2026/08/03/Work/software/Function-Decomposition-Methods/