🛠️ 第4章 Codex 的任务地图
📄 一句话概括

三个判据,顺序不能换:碰不碰本机、跑多久、要不要边跑边看。 换一次顺序,十五条任务里有六条判断翻掉——而且是同一类。 第一问答错不是慢一点,是这件事根本做不到。

📝 本章和前面几章的关系

这一节是本章最该记的一节。3.2 讲过一张二问判断表(碰本机、要密钥), 这一节加进第三个维度,并且强调「顺序」。 Demo 用十五条真任务跑了三遍:一遍按正确顺序、一遍按错误顺序、一遍数翻掉几条。 结果很干脆:翻掉六条,全是同一类。

一、按碰不碰本机环境分

本机有什么? 装好的依赖、配好的环境变量、本地跑着的服务、显卡、公司内网。 云端有一个干净容器,但没有上面这些。 所以第一问问的是「能不能」,不是「划不划算」。 这一问答错了,后面的判断全都没有意义——因为那件事在云端根本做不到。 一个具体的反例:查一个依赖为什么装不上。 本机有那个坏掉的缓存,云端是干净的,它永远复现不了。 这类任务放云端,得到的是「在我这儿是好的」。 还有一个隐性依赖:网络位置。 能连内网数据库的只有你的机器,云端容器连不上——这也是「碰本机」的一种。

二、按跑多久分

十分钟是一条经验线,不是标准。 短任务在本地秒出,长任务在本地占着终端——而终端只有一个。 但这条线只在第一问之后才有意义。 一个要跑四十分钟、又要碰本机的任务,放云端等于「跑得很快地做错」。 它确实不占你终端了,但它做的事是错的。 长任务放云端还有个隐性好处:它不打断你。 在本地跑四十分钟,你的终端就废了四十分钟,这期间你连 git status 都得另开一个窗口。

三、按要不要你用眼睛看分

要边跑边看的:调样式、看日志滚动、反复改一个参数试效果。 这类活的特点是「看一眼改一下」,放云端等于每改一次等一轮。 只看结果的:批量改、跑测试、生成文档。跑完给个结论就够,中间过程你不需要看。 三问的顺序,其实就是代价的顺序: 做不成 > 干等 > 事后调。 先排除代价最大的那种失败,这就是为什么第一问必须是「能不能」。

四、动手 Demo:三问顺序不能换:换一次,六条判断翻掉

这个 Demo 是纯判断,但它比很多真跑的 Demo 有说服力—— 因为它把「顺序」这个抽象的东西,换成了「翻掉几条」这个数。 十五条任务,每条三个属性:碰不碰本机、大概跑多久、要不要边跑边看。 先按正确顺序判一遍,再按「先看跑多久」判一遍,最后数差几条。

def _judge(t):                       # 正确顺序
    name, ben, mins, eye = t
    if ben:      return u"本地", u"要碰本机环境"
    if mins > 10: return u"云端", u"跑得久,别占着终端"
    if eye:      return u"本地", u"要边跑边看"
    return u"云端", u"快,且只看结果"

flip = [(TASKS[i][0], right[i], bad[i]) for i in range(len(TASKS))
        if right[i] != bad[i]]

实跑输出:

--------------------------------------------------------------------
三问顺序不能换:换一次,六条判断翻掉
--------------------------------------------------------------------


  ① 十五条真任务,三个维度各问一遍
  --------------------------------------------------------------------
| 任务 | 碰本机 | 分钟 | 要眼睛看 |
|---|:---:|:---:|:---:|
| 跑一遍全量测试 | 是 | 18 | 否 |
| 批量给 30 个文件加版权头 | 是 | 25 | 否 |
| 全量重跑一遍数据迁移 | 是 | 35 | 否 |
| 构建一次生产镜像 | 是 | 22 | 否 |
| 把三年日志导进本地库 | 是 | 40 | 否 |
| 对整个仓库跑一遍类型检查 | 是 | 14 | 否 |
| 把 dist 目录清掉重打 | 是 | 3 | 否 |
| 改一个函数名 | 是 | 2 | 否 |
| 把旧分支 rebase 到最新 | 是 | 6 | 是 |
| 改 CI 配置让构建缓存生效 | 是 | 9 | 否 |
| 通读 payment 模块讲清退款流程… | 否 | 12 | 是 |
| 分析线上日志找 500 的来源 | 否 | 30 | 是 |
| 给新接口写文档 | 否 | 8 | 否 |
| 生成一份测试数据 | 否 | 4 | 否 |
| 审一遍这个 PR 的 diff | 否 | 20 | 是 |


  ② 按「能不能 -> 划不划算 -> 需不需要人」的顺序判
  --------------------------------------------------------------------
| 任务 | 放哪 | 依据 |
|---|---|---|
| 跑一遍全量测试 | 本地 | 要碰本机环境 |
| 批量给 30 个文件加版权头 | 本地 | 要碰本机环境 |
| 全量重跑一遍数据迁移 | 本地 | 要碰本机环境 |
| 构建一次生产镜像 | 本地 | 要碰本机环境 |
| 把三年日志导进本地库 | 本地 | 要碰本机环境 |
| 对整个仓库跑一遍类型检查 | 本地 | 要碰本机环境 |
| 把 dist 目录清掉重打 | 本地 | 要碰本机环境 |
| 改一个函数名 | 本地 | 要碰本机环境 |
| 把旧分支 rebase 到最新 | 本地 | 要碰本机环境 |
| 改 CI 配置让构建缓存生效 | 本地 | 要碰本机环境 |
| 通读 payment 模块讲清退款流程… | 云端 | 跑得久,别占着终端 |
| 分析线上日志找 500 的来源 | 云端 | 跑得久,别占着终端 |
| 给新接口写文档 | 云端 | 快,且只看结果 |
| 生成一份测试数据 | 云端 | 快,且只看结果 |
| 审一遍这个 PR 的 diff | 云端 | 跑得久,别占着终端 |


  ③ 把顺序换成「先看跑多久」
  --------------------------------------------------------------------
| 任务 | 放哪 | 依据 |
|---|---|---|
| 跑一遍全量测试 | 云端 | 跑得久,别占着终端 |
| 批量给 30 个文件加版权头 | 云端 | 跑得久,别占着终端 |
| 全量重跑一遍数据迁移 | 云端 | 跑得久,别占着终端 |
| 构建一次生产镜像 | 云端 | 跑得久,别占着终端 |
| 把三年日志导进本地库 | 云端 | 跑得久,别占着终端 |
| 对整个仓库跑一遍类型检查 | 云端 | 跑得久,别占着终端 |
| 把 dist 目录清掉重打 | 本地 | 要碰本机环境 |
| 改一个函数名 | 本地 | 要碰本机环境 |
| 把旧分支 rebase 到最新 | 本地 | 要边跑边看 |
| 改 CI 配置让构建缓存生效 | 本地 | 要碰本机环境 |
| 通读 payment 模块讲清退款流程… | 云端 | 跑得久,别占着终端 |
| 分析线上日志找 500 的来源 | 云端 | 跑得久,别占着终端 |
| 给新接口写文档 | 云端 | 快,且只看结果 |
| 生成一份测试数据 | 云端 | 快,且只看结果 |
| 审一遍这个 PR 的 diff | 云端 | 跑得久,别占着终端 |

  翻掉的 6 条:
    跑一遍全量测试              本地 -> 云端
    批量给 30 个文件加版权头    本地 -> 云端
    全量重跑一遍数据迁移        本地 -> 云端
    构建一次生产镜像            本地 -> 云端
    把三年日志导进本地库        本地 -> 云端
    对整个仓库跑一遍类型检查    本地 -> 云端
  ! 翻掉的全是同一类:要碰本机、又要跑一会儿的任务。
  先问时长,它们就被推到云端——而云端根本没有你本机那个环境。
  顺序不是风格问题。第一问是「能不能」,答错了不是慢一点,是这件事根本做不到。
  所以「能不能」必须排在最前面。

  ④ 三问各自在问什么
  --------------------------------------------------------------------
| 顺序 | 问题 | 答错会怎样 |
|---|---|---|
| 第一问 | 要不要碰你本机 | 任务做不成 |
| 第二问 | 要跑多久 | 占着终端干等 |
| 第三问 | 要不要边跑边看 | 改到一半没人管 |

  ! 三问都有答案之后再看成本。先问成本,等于先给自己找借口。

翻掉的六条全是同一个类型:碰本机,又跑得久。 错序那版把它们全推到了云端。 云端没有那些依赖,所以这些任务根本跑不起来。 注意「查一个依赖为什么装不上」这种任务:它既碰本机、又要跑一会儿。 按错序判,它会被推到云端——然后在干净的容器里一切正常。 第三问在什么时候才起作用? 在第一问是否、第二问是「不到十分钟」的时候。 所以它排最后不是因为它最不重要,是因为它只在前面都通过时才轮得到。 三问都有答案之后再看成本。 先问成本,等于先给自己找借口——人会为了「省事」把不该上云的任务也推上去。

30 秒实验

  1. 挑三个你最近做过的任务,按三问各判一次。 判完回头看:你当时实际是怎么做的?差在哪?
  2. 找一个「碰本机又跑得久」的任务,试着拆成两半。 前半在本机取数据,后半在云端分析——这是最常用的一种拆法。
  3. 把「十分钟」换成你自己的线。 你手上什么任务算「值得让它自己跑」?这个阈值每个人不一样。

常见误区

  1. 「云端更快,都放云端。」 云端没有你本机那个环境。 快是快,可它做的是另一件事。
  2. 「本地最安全,都放本地。」 长任务占着终端,你一天干不了别的。 安全不等于划算。
  3. 「三个判据无所谓顺序。」 Demo 里换一次顺序,十五条翻掉六条。 顺序不是风格,是「先排除做不到的方案」。
自测三问(点开对答案) 1. 三个判据的正确顺序是什么?为什么第一问必须排最前面? —— **碰不碰本机、跑多久、要不要边跑边看。** **第一问问的是「能不能」,答错了这件事根本做不到**——**后面两问再优也没用。** 2. 「查一个依赖为什么装不上」为什么必须放本地? —— **本机有那个坏掉的缓存或坏掉的环境变量,云端是干净的。** **干净环境里复现不了,你得到的答案是「在我这儿是好的」。** 3. 第三问什么时候才会起作用? —— **只在第一问是否、第二问是「不到十分钟」的时候。** **它排最后,是因为它只在前两问都通过时才轮得到。**

下一篇 4.5 讲三个工具:Review、Automation、Worktree,它们各治一个病。

相关笔记