1. 两个被混着叫的工程概念,到底在说什么
第一次听到 Harness Engineering 和 Loop Engineering 这两个词,是在一次内部技术分享会上。当时分享的同事在白板上画了两个圈,一个圈里写着"脚手架",另一个圈里写着"闭环",然后说了一句让我印象很深的话:很多人做项目失败,不是能力不够,而是把这两个东西搞反了。
这句话我琢磨了很久。后来自己带项目、做交付、复盘踩过的坑,才慢慢理解他说的"搞反"是什么意思。简单讲,Harness Engineering 关注的是"怎么把一件事稳稳地跑起来",Loop Engineering 关注的是"怎么让这件事跑完之后能自己变好"。前者是骨架和轨道,后者是反馈和迭代。两者不是对立的,而是先后关系——没有 Harness,Loop 就是空转;没有 Loop,Harness 就是死水。
这篇文章我想把这两个概念彻底拆开讲清楚。不管你是做软件开发的、做硬件调试的、做内容运营的,还是做手工制作的,只要你的工作里涉及"搭一套流程"和"让流程持续变好"这两件事,这两个概念都用得上。我会从它们各自的定义、核心要素、实操方法、常见误区几个角度展开,尽量用生活化的例子把抽象的东西讲明白,也会给出可以直接抄作业的步骤和参数。
先给一个最直白的类比。Harness 这个词本意是"马具"——缰绳、鞍具、挽具那一整套东西。它的作用不是让马跑得更快,而是让骑手能控制马往哪跑、跑多快、什么时候停。放到工程里,Harness Engineering 就是为某个任务搭建一套可控、可重复、可观测的执行框架。而 Loop 是"环",Loop Engineering 就是设计一个能自动收集反馈、自动调整、自动收敛的循环机制。
这两个词最近被频繁提起,很大程度上是因为自动化工具和智能辅助系统越来越普及,大家发现光有"能跑"不够,还得"跑得好、跑得久、跑得越来越准"。于是 Harness 和 Loop 就从幕后走到了台前。
2. Harness Engineering:把不确定性关进笼子里
2.1 它解决的核心问题是什么
任何一个稍微复杂点的任务,只要涉及多个步骤、多个输入、多个输出,就一定会遇到"不确定性"。同样的操作,今天跑通了,明天换个环境就报错;同一个人做,上午做的和下午做的结果不一样;换个人接手,完全不知道从哪下手。这些问题的根源,都是缺少一套稳定的执行框架。
Harness Engineering 要解决的就是这个。它的核心目标可以概括成三句话:让任务可重复、让过程可观测、让结果可验证。注意这三个词的顺序,是有讲究的。可重复是基础,可观测是手段,可验证是目的。很多团队一上来就追求"可验证",搞了一堆测试用例,结果发现任务本身都跑不稳定,测试用例今天过明天挂,最后大家都不信测试结果了。
我见过一个很典型的反面案例。某团队做一个数据处理流程,脚本是拼凑出来的,中间步骤依赖手动改参数,输出结果存在本地某个文件夹里,文件名还带日期。结果每次要复现一个历史结果,都得翻聊天记录找当时的参数。后来他们花了大概两周时间做了一件事:把整个流程封装成一个带配置文件的命令行工具,所有中间产物统一命名、统一存放,每一步都打印带时间戳的日志。做完之后,复现任何一个历史结果只需要一条命令加一个配置文件。这就是最朴素的 Harness Engineering。
2.2 一套完整 Harness 的四个组成部分
根据我的实践经验,一套能称得上"合格"的 Harness,通常包含四个部分。这四个部分缺一不可,缺了哪个都会在某个阶段出问题。
第一部分是入口层。也就是"怎么启动这个任务"。它可以是命令行参数、配置文件、图形界面上的几个输入框,或者一个 API 接口。入口层的设计原则是:输入越少越好,默认值越合理越好。我见过太多工具要求用户填十几个参数才能跑,结果用户根本不知道每个参数什么意思,只能照抄别人的配置。好的入口层应该做到"不填任何参数也能跑出一个合理结果,想精细控制再逐项覆盖"。
第二部分是执行层。这是真正干活的环节,也是 Harness 的躯干。执行层的关键设计点是步骤的原子化和顺序的显式化。什么意思?就是把整个任务拆成若干个独立的、可单独执行的步骤,并且明确写出步骤之间的依赖关系。这样做的好处是,当某一步出错时,你能精确定位,而不是面对一个几百行的脚本抓瞎。原子化的另一个好处是,某些步骤可以并行执行,能显著缩短整体耗时。
第三部分是观测层。这是最容易被忽略、但价值最高的一层。观测层负责记录"任务执行过程中发生了什么"。最基础的观测是日志,但好的观测远不止日志。它应该包括:每一步的耗时、每一步的输入输出摘要、资源占用情况、异常堆栈、以及关键中间结果的快照。我个人的习惯是,任何一个超过五分钟的任务,都必须有进度输出,否则用户会以为程序卡死了。观测层的设计原则是:出问题时能靠它定位,不出问题时它不干扰。
第四部分是验证层。这是判断"任务是否成功"的依据。验证层可以是自动化的断言检查,也可以是人工确认的检查清单。关键是要有明确的成功标准和失败标准。我见过很多流程,跑完了没人知道结果对不对,只能靠"看起来差不多"来判断。这种流程一旦出问题,排查成本极高。验证层的最低要求是:每个关键输出都有对应的检查项,检查项要么自动通过,要么有明确的人工确认动作。
把这四层串起来,一个完整的 Harness 就成型了。用一张表来对照会更清楚:
| 层级 | 核心职责 | 常见实现方式 | 缺失后的典型症状 |
|---|---|---|---|
| 入口层 | 接收输入、提供默认值 | 配置文件、命令行、界面 | 每次跑都要手动改代码 |
| 执行层 | 按序完成实际任务 | 脚本、流水线、任务编排 | 步骤混乱、无法定位错误 |
| 观测层 | 记录过程、暴露状态 | 日志、指标、快照 | 出问题只能靠猜 |
| 验证层 | 判定成功与否 | 断言、检查清单、对比 | 结果对错无人知晓 |
2.3 搭建 Harness 的实操顺序
很多人搭 Harness 的顺序是反的。他们先写执行层,跑通了再补日志,最后才想起来要加配置。结果就是执行层里硬编码了一堆东西,后面想抽出来特别痛苦。我推荐的顺序是从外往里搭:先定入口,再定验证,然后写执行,最后补观测。
为什么先定验证?因为验证标准决定了执行层需要产出什么。如果你先写执行,很可能产出了一堆验证用不上的中间结果,或者漏掉了验证需要的关键数据。先把"什么算成功"想清楚,执行层就知道该往哪个方向使劲。
具体到操作层面,我通常按这个流程走:
- 写一份"成功清单":列出任务完成后必须满足的所有条件,每条都要可检查。比如"输出文件存在且行数大于零""关键字段无空值""总耗时小于十分钟"。
- 设计入口参数:把成功清单里涉及的变量抽成参数,给每个参数设一个合理的默认值。参数数量控制在七个以内,超过就考虑分组或配置文件。
- 实现执行步骤:按原子化原则拆分,每步只做一件事,步骤之间通过明确的中间产物传递数据。
- 插入观测点:在每个步骤的开始和结束打日志,记录耗时和关键状态。中间产物统一命名规则,统一存放路径。
- 接上验证逻辑:任务结束后自动跑一遍成功清单,输出检查报告。
这个顺序走下来,Harness 的骨架就立住了。后面再根据实际使用中的反馈去调整,成本会低很多。
注意:不要追求一次把 Harness 做到完美。先让它能稳定跑起来,再逐步加观测和验证。过度设计是 Harness 搭建中最常见的浪费。
3. Loop Engineering:让系统自己找到更好的答案
3.1 闭环的本质是反馈
如果说 Harness 是"把事做对",那 Loop 就是"越做越对"。Loop Engineering 的核心是建立一个从结果回到输入的反馈通道,并让这个通道自动运转。
生活里最常见的 Loop 例子是空调。设定目标温度,温度传感器实时测量,测到的值和目标值有偏差就调整压缩机功率,调整后再测量,如此循环。这个循环不需要人干预,自己就能把温度稳定在目标附近。Loop Engineering 做的就是设计这样的循环。
但工程里的 Loop 比空调复杂得多,因为很多任务的"目标"不是单一数值,而是多维度的、甚至模糊的。比如内容推荐系统,目标是"用户满意度",但满意度怎么量化?点击率、停留时长、完播率、分享率,每个指标都只反映一部分。这时候 Loop 的设计就变成了一个多目标权衡问题。
我个人的经验是,Loop 设计的第一步不是设计循环本身,而是定义"反馈信号"。反馈信号选错了,循环转得越快错得越远。选反馈信号有三个原则:一是要能真实反映目标,二是要能及时获取,三是要不容易被"刷"。第三条特别重要,很多系统上线初期指标很好看,后来发现是被某种取巧行为刷上去的,真实效果并没有提升。
3.2 一个 Loop 的五个关键环节
一个完整的 Loop,我把它拆成五个环节:采集、评估、决策、执行、再采集。这五个环节首尾相连,形成一个环。任何一个环节断了,Loop 就退化成一条直线,失去了自我调整的能力。
采集环节负责获取反馈信号。它可以是自动埋点、人工标注、用户调研、A/B 测试结果。采集的关键是口径一致——同一个指标在不同时间、不同批次的采集方式必须完全一样,否则前后数据没法比较。我见过一个团队,前后两次调研的问卷选项都不一样,结果数据完全没法对比,白白浪费了两周时间。
评估环节负责把原始信号转化成"好还是不好"的判断。这一步需要设定基准线和阈值。基准线可以是历史平均水平,也可以是竞品水平,还可以是理论最优值。阈值决定了"多大的偏差才值得调整"。阈值设得太敏感,系统会频繁震荡;设得太迟钝,系统反应不过来。我的经验是,阈值先设宽一点,观察一段时间再收紧,比一开始就设得很紧要好。
决策环节负责决定"下一步怎么调"。这是 Loop 里最考验设计功力的地方。简单的决策规则是"朝着目标方向调一步",复杂的决策可能涉及多变量优化、探索与利用的平衡。决策环节最容易犯的错误是调整幅度过大,导致系统在目标附近来回震荡,永远收敛不了。稳妥的做法是每次只调一小步,宁可多转几圈,也不要一步跨过头。
执行环节负责把决策落地。这一步通常和 Harness 的执行层对接。执行环节的关键是可回滚——如果调整后效果变差了,要能快速退回到调整前的状态。没有回滚能力的 Loop 是危险的,因为它可能把系统带到一个越来越差的方向而无法自救。
再采集环节就是下一轮循环的开始。这里要注意的是采集的时机。调整之后不能立刻采集,要等系统稳定下来再采,否则采到的是过渡态的数据,会误导下一轮决策。等待时间的长短取决于系统的响应速度,需要根据实际情况标定。
把这五个环节画成表,对照着看会更清晰:
| 环节 | 核心问题 | 关键设计点 | 常见错误 |
|---|---|---|---|
| 采集 | 拿什么数据 | 口径一致、及时性 | 前后口径不一致 |
| 评估 | 好还是不好 | 基准线、阈值 | 阈值过紧或过松 |
| 决策 | 怎么调 | 调整幅度、方向 | 一步调太大 |
| 执行 | 落地调整 | 可回滚 | 无法退回 |
| 再采集 | 下一轮开始 | 等待稳定 | 采到过渡态数据 |
3.3 Loop 的收敛性与震荡问题
Loop 能不能收敛,是判断它设计得好不好的核心标准。收敛的意思是,随着循环次数增加,系统的表现越来越接近目标,波动越来越小。如果循环转了很多圈,表现还在大幅波动,那这个 Loop 就是失败的。
导致不收敛的原因通常有三个。一是反馈延迟太大。你这一轮做的调整,要等好几轮之后才能看到效果,那你的决策就是基于过时信息做的,自然会出错。解决办法是尽量缩短反馈链路,或者引入预测模型来补偿延迟。二是调整幅度和反馈强度不匹配。反馈很弱的时候调整幅度很大,就会过冲;反馈很强的时候调整幅度很小,就会收敛太慢。三是存在多个相互冲突的目标。优化 A 指标导致 B 指标恶化,优化 B 又导致 A 恶化,系统就在两个目标之间来回摇摆。这时候需要引入优先级或者加权,把多目标问题转化成单目标问题。
我踩过的一个坑是,早期做一个参数调优的 Loop,每次根据上一轮结果调整参数,调了二十多轮还在震荡。后来发现问题出在采集环节——我采集的是单次运行的结果,而单次运行本身波动就很大。改成采集连续五次运行的平均值之后,Loop 很快就收敛了。这个教训让我明白,反馈信号的噪声水平直接决定了 Loop 能不能稳定工作。噪声大的信号,要么多采几次取平均,要么加滤波器,不能直接拿来用。
4. 两者怎么配合:先搭骨架,再装神经
4.1 为什么不能只有 Harness
只有 Harness 没有 Loop 的系统,我称之为"僵化系统"。它能稳定地执行既定流程,但流程本身是固定的,不会随着环境变化而调整。短期看没问题,长期看一定会落后。
举个身边的例子。某团队维护一套数据报表流程,每天定时跑,输出固定格式的报表。这套流程的 Harness 做得很扎实,几年都没出过大问题。但后来业务方需求变了,报表的维度和口径都需要调整,团队发现改起来特别费劲——因为流程里到处是硬编码,改一个地方要动好几个文件。这就是典型的"有骨架没神经",系统不会自己感知变化,只能靠人被动响应。
Loop 的价值就在于让系统具备自适应能力。环境变了,反馈信号会变,Loop 会自动调整执行策略。当然,Loop 能调整的范围是有限的,它只能在 Harness 允许的范围内调整。所以两者是配合关系:Harness 划定可调整的空间,Loop 在这个空间里寻找最优解。
4.2 为什么不能只有 Loop
反过来,只有 Loop 没有 Harness 的系统,我称之为"漂浮系统"。它有一套反馈调整机制,但底层执行不稳定,每次调整的效果都被执行层的波动淹没了,根本分不清是调整起了作用还是运气好。
这种情况在早期项目中特别常见。团队急于做"智能化""自适应",上来就搞了一套复杂的反馈循环,但底层的执行流程还是手工拼凑的,每次跑的结果都不一样。结果就是 Loop 采集到的信号全是噪声,决策完全靠猜。最后团队得出一个错误结论:"自适应没用",其实是 Harness 没搭好。
我的建议很明确:先把 Harness 做扎实,再考虑加 Loop。判断 Harness 是否扎实的标准很简单——同一个输入,连续跑十次,结果是否一致(或者在可接受的误差范围内一致)。如果做不到,先别碰 Loop。
4.3 两者配合的典型架构
当 Harness 和 Loop 都到位之后,它们的配合方式通常是这样的:Harness 负责单次任务的完整执行,Loop 负责在多次任务之间做调整。Harness 的观测层为 Loop 提供反馈信号,Loop 的决策结果通过 Harness 的入口层注入下一次执行。
用一个具体的场景来说明。假设你在做一个自动化的图像处理流程。Harness 负责:读取图片、按参数处理、输出结果、记录处理日志。Loop 负责:对比处理结果和目标效果、计算偏差、调整处理参数、触发下一轮处理。Harness 的入口层接收参数,Loop 的决策环节产出参数,两者通过参数文件对接。Harness 的观测层记录每轮的处理指标,Loop 的采集环节读取这些指标。
这种架构的好处是职责清晰。Harness 不需要知道 Loop 的存在,它只管把当前参数下的任务执行好。Loop 也不需要关心 Harness 内部怎么实现,它只管根据反馈调整参数。两者通过一个明确的接口(参数文件)交互,任何一方内部改动都不会影响另一方。
提示:Harness 和 Loop 的接口要尽量窄。接口越窄,两者的耦合度越低,单独升级或替换的成本越小。我通常只用一个配置文件作为接口,Harness 读它,Loop 写它。
5. 实操中容易踩的坑与排查方法
5.1 Harness 搭建中的三个高频问题
问题一:日志打了但没人看。这是最普遍的问题。日志文件越积越大,真出问题的时候没人愿意去翻。解决办法是分级输出——正常信息打到文件,异常信息同时打到文件和终端,关键指标单独汇总成一行摘要。这样日常扫一眼摘要就够了,出问题再去看详细日志。
问题二:配置项散落各处。有的在代码里,有的在环境变量里,有的在命令行参数里。时间一长,没人说得清到底有哪些配置项。解决办法是单一配置源——所有配置集中在一个文件里,代码只从这个文件读。环境变量和命令行参数只用来覆盖这个文件里的值,不引入新的配置项。
问题三:中间产物没有清理机制。跑一次产生一堆文件,跑一百次就占满磁盘。解决办法是给中间产物设生命周期——要么在任务成功结束后自动清理,要么按时间或数量滚动删除。保留策略要写进文档,让所有人都知道哪些文件可以删、哪些不能删。
5.2 Loop 调试中的典型症状对照
Loop 出问题的时候,症状往往比较隐蔽,因为它是多轮循环之后才显现的。我整理了一张症状对照表,方便快速定位:
| 症状 | 可能原因 | 排查方向 | 处理建议 |
|---|---|---|---|
| 指标来回震荡 | 调整幅度过大 | 检查每轮调整量 | 减小步长 |
| 收敛太慢 | 调整幅度过小 | 检查每轮调整量 | 适当增大步长 |
| 越调越差 | 反馈信号方向反了 | 检查信号定义 | 修正信号符号 |
| 调了几轮没变化 | 反馈信号没接上 | 检查采集环节 | 确认数据流通 |
| 前期好后期差 | 过拟合或环境漂移 | 检查数据分布 | 引入滑动窗口 |
| 偶尔抽风 | 反馈信号噪声大 | 检查信号稳定性 | 取平均或滤波 |
这张表是我自己踩坑总结出来的,实际排查时按顺序过一遍,大部分问题都能定位到。
5.3 一个真实的排查记录
说一个我印象比较深的排查过程。当时有一个 Loop,目标是自动调整某个处理流程的参数,让输出质量稳定在某个水平。上线初期效果不错,但运行了大概两周之后,质量开始缓慢下滑,而且怎么调都调不回来。
我先检查了采集环节,发现反馈信号本身没有异常,采集的数据和之前一致。然后检查评估环节,基准线和阈值也没变。接着检查决策环节,发现调整方向是对的,但调整幅度越来越小,最后几乎不动了。顺着这个线索往下查,发现是执行环节的问题——参数的可调范围被逐渐压缩了,因为每一轮调整都在前一轮的基础上微调,累积下来参数已经漂移到了边界附近,再调也调不动了。
解决办法是给参数加一个回归机制:每轮调整之后,参数向初始值方向回拉一小步。这样既保留了调整的效果,又防止参数无限漂移。加上这个机制之后,Loop 恢复了正常,而且长期运行也更稳定了。
这个案例给我的启发是:Loop 不仅要考虑"怎么调",还要考虑"怎么防止调过头"。回归机制、边界约束、调整量上限,这些都是保证 Loop 长期稳定运行的必要设计。
6. 从概念到落地:给不同角色的上手建议
6.1 如果你是开发者
开发者的优势是动手能力强,劣势是容易一头扎进实现细节,忽略整体设计。我的建议是先画图再写代码。把 Harness 的四个层级和 Loop 的五个环节画在一张纸上,标出每个环节的输入输出,然后再开始写。这张图不用很正式,自己能看懂就行,但它能帮你避免"写到一半发现漏了一层"的返工。
另外,开发者要特别注意可测试性。Harness 的每个步骤都应该是可单独测试的,Loop 的每个环节也应该是可单独验证的。如果某个步骤必须依赖前面所有步骤的产出才能测试,那说明拆分得不够原子化。
6.2 如果你是项目管理者
管理者的关注点通常不在技术细节,而在进度和风险。对于 Harness 和 Loop,我建议管理者关注两个指标:Harness 的复现成功率和Loop 的收敛轮数。前者反映执行框架的稳定性,后者反映反馈机制的有效性。这两个指标如果持续恶化,说明底层设计出了问题,需要及时介入。
管理者还要注意一个常见误区:不要用 Loop 的指标去考核 Harness 的搭建者。Harness 搭建阶段,Loop 还没上线,没有反馈指标可看。这时候应该看的是复现成功率和执行耗时,而不是最终效果指标。
6.3 如果你是刚接触这两个概念的新手
新手最容易犯的错误是把两个概念混为一谈,或者试图一步到位。我的建议是分两步走:第一步,先找一个你熟悉的、重复性高的任务,把它改造成一个合格的 Harness,体会"可重复、可观测、可验证"这三个词的实际含义。第二步,在这个 Harness 的基础上,加一个最简单的 Loop——比如根据每次执行的结果,自动调整一个参数。不要贪多,一个参数就够了。
等你把单参数的 Loop 跑通了,再扩展到多参数。这个过程可能需要几周甚至几个月,但每一步都走得扎实,后面就不会返工。我见过太多人一上来就搞复杂的多目标优化,结果连基础的 Harness 都没搭好,最后不了了之。
6.4 一个可以立刻上手的小练习
如果你想立刻体验一下这两个概念,我推荐一个练习:用 Harness 和 Loop 的思路,优化你的日常文件整理流程。
Harness 部分:写一个脚本,输入是一个文件夹路径,输出是整理后的文件夹结构。脚本要支持配置文件,能记录整理日志,能验证整理结果(比如检查是否有文件丢失)。
Loop 部分:每次整理之后,记录"整理耗时"和"整理后查找文件的平均时间"两个指标。根据这两个指标,调整整理规则(比如分类粒度、文件夹命名方式)。跑几轮之后,你会看到指标逐渐稳定在一个较好的水平。
这个练习的好处是成本低、反馈快、不涉及复杂工具。做完之后,你对 Harness 和 Loop 的理解会比看十篇文章都深。
7. 一些容易被忽略的细节
7.1 命名规范的重要性
Harness 和 Loop 都涉及大量的中间产物和配置项,命名规范如果一开始没定好,后面会非常痛苦。我的命名原则是三段式:类型_对象_版本。比如config_pipeline_v2、log_step3_20240101、result_final_v1。类型在前,方便按类型排序;对象在中,方便识别用途;版本在后,方便追溯变更。
Loop 相关的命名还要加上轮次标识。比如param_round05、metric_round05。这样一眼就能看出是第几轮的数据,排查问题时特别有用。
7.2 时间戳的处理
时间戳看起来是个小问题,但处理不好会引发大麻烦。我踩过的坑包括:时区不统一导致前后数据对不上、时间格式不一致导致排序错乱、时间精度不够导致同一秒内的多条记录无法区分。
我的处理原则是:统一用 UTC 时间,统一用 ISO 8601 格式,精度到毫秒。显示给用户的时候再转成本地时间。这样存储和计算都不会出问题,展示也灵活。
7.3 异常处理的分寸
Harness 和 Loop 都需要处理异常,但处理的分寸不一样。Harness 遇到异常,原则是快速失败——出错了就停下来,把现场保留好,等人来处理。因为 Harness 是执行框架,它不应该自作主张地"绕过"问题。
Loop 遇到异常,原则是隔离影响——某一轮出问题,不要让整个循环崩溃。可以跳过这一轮,记录异常,继续下一轮。因为 Loop 是长期运行的,偶尔的异常不应该中断整个进程。但跳过的轮次要有记录,如果连续多轮异常,就要停下来报警。
这个分寸的把握,需要在实践中慢慢体会。我的经验是:Harness 的异常处理偏保守,Loop 的异常处理偏宽容。保守是为了保证执行质量,宽容是为了保证循环持续。
7.4 文档的写法
Harness 和 Loop 的文档,不需要写得很正式,但一定要写清楚三件事:怎么启动、怎么判断成功、出问题怎么排查。这三件事对应入口层、验证层和观测层。其他的实现细节可以少写,但这三件事必须写,而且要写在最显眼的位置。
我见过很多项目,代码写得不错,但文档只写了一句"运行 main 函数即可"。结果换个人接手,光搞清楚怎么启动就花了一天。文档的价值不在于全面,而在于让接手的人能在半小时内跑起来、判断结果、定位问题。
8. 我个人的几点体会
做工程这些年,我越来越觉得 Harness 和 Loop 这两个概念的价值,不在于它们有多新颖,而在于它们提供了一种结构化的思考方式。遇到一个复杂任务,先问自己:执行框架搭好了吗?反馈机制有了吗?这两个问题一问,思路就清晰了。
我也见过很多团队,工具用得很先进,但底层思路是乱的。今天上个新框架,明天换个新平台,但 Harness 的四个层级始终没搭全,Loop 的五个环节始终缺一两个。结果就是工具越换越勤,效果始终上不去。工具是表象,结构是本质。把结构想清楚了,用什么工具都能搭出好系统;结构没想清楚,用什么工具都是白搭。
最后分享一个我自己的小习惯:每接手一个新任务,我会先在纸上画两个东西——一个是任务的执行流程图,一个是任务的反馈循环图。执行流程图对应 Harness,反馈循环图对应 Loop。两张图画完,任务的难点和重点基本就清楚了。这个习惯坚持了好几年,帮我省下了大量返工的时间。如果你还没试过,不妨从下一个任务开始,画一画这两张图。