开发向专区
灯是绿的,活是错的
六个机件,堵住「我以为验过了」和「实际验到了什么」之间的缝。
上一页讲的是:用 AI 写代码的人,一整天真正在做的动作是验。那页末尾留了一句话——绿灯不等于「对」,绿灯等于「我设的那几项检查没有报警」。这一页从那句话接着讲:验出来的灯,怎么读。我们一家四个人的公司,前后不到两周攒出十七条判据教训,每一条都有当场证据:绿灯下漏了文件、红灯下其实没错、本地看不见就说远端没有、把「删一个加一个」和「改名一个」当成两件事而工具记成一件、命令块跑第二遍就报错。每一条,都是「我以为验过了」和「实际验到了什么」之间的一道缝。这些缝有规律,规律能写成纪律。这一页把它拆成六个机件,每个机件堵一类缝,末尾如实写这张表验过什么、还没验过什么。
这十七条只在一家公司、几个大脑和两只手之间攒出来;表还没有被第二家公司用过,也还没攒出一次「因为有表,所以没犯」的反向证据。
一、灯不是判据,闸给出的理由才是
绿灯不等于对,红灯不等于错
先讲两件事,它们一红一绿,错的方向相反,病根却是同一个。
头一件:一次入库前,判据写的是「几个文件被动过」。灯绿了,入库了,事后发现少了一个文件。原因不复杂:提交这个动作只取暂存区里的东西,那个文件改了、没进暂存区,判据数的是「动过的」,动作取的是「暂存的」,两个面不是一个面。灯是绿的,活是错的。
另一件:另一次入库前,判据写的是「删了几个、加了几个」。灯红了,停手了,回头一看改动零偏差——工具把「删掉一个旧的、加进一个新的」折成了「改名一个」,计数对不上,活却是对的。灯是红的,活是对的。
两件事放一起,读者要拿到的判断只有一句:灯是闸的输出,闸认的是什么,才是判据。 绿灯只说明「闸认的那几样没报警」,红灯只说明「闸认的那几样里有一样不符」。至于闸认的那几样是不是这件事真正取值的那个面,灯不会告诉你。所以读灯的头一个动作,不是看颜色,是问闸:你认的是什么?
上一页讲验是一整天的主动作。这一页讲的是那个动作的下一步:验出来的结果,不能直接当结论用。下面五个机件,就是把「闸认的是什么」这个问题拆开来问。
三、本地与远端互不代证
看到的是视图,判的必须是实况
第三个机件是第二个的镜像,专门堵一类缝:把「我这儿没看到」说成「那儿没有」,或者把「那儿有了」当成「我这儿也有了」。
一次开工播报里写了一句「成果件不在仓里」。后来发现,那份成果件早就在远端了——是播报这一侧的视图三天没更新。陈旧的本地视图只能证明「我这儿没看到」,证明不了「远端没有」。修法是改措辞:以后凡本地视图落后,「不在库」一律写成「本地视图未见、待实拉验证」,然后把验证动作交给有网络的那一侧去做。
反过来的那一次:远端上一份合并请求已经合了,本地的主干还停在旧点,两边差了八百多行。规矩里的切分支块带着一道前置自验,先拉、再算祖先关系、再切——自验没过,当场中止。要是没有那道自验,就会在一棵旧树上开工。「远端已合并」是远端的事实,本地不会因此前进一个字节。
两件事合起来是一条:本地和远端是两个面,互不代证。 看到的是视图,判的必须是实况;哪一侧有网络,验证动作就交给哪一侧——不是看谁方便,是看谁能碰到权威面。
四、期望值要含全部等价形态,常量要指得出权威面
工具会改写你的输入,判据要落在它存下来的那个形态上
第四个机件管两样东西:判据的期望值,和判据里的常量。
先说期望值。前面那次红灯——「删一个加一个」被工具记成「改名一个」——它是这张表的立表事由。不是因为这个错多严重,是因为它在册早有同形的判例,还是犯了。回头查,那条判例只活在一份收尾单的正文里,没进任何一张每轮必看的表。教训写下来了,写在一个没人回头看的地方,等于没写。所以表才立起来,住进每轮开工都要读的那份文件里。
这类缝的修法有两句。一句是把期望值写成并列形式:「删一个加一个」或者「改名一个」,两种写法都算过。另一句是在写判据之前先问工具一声:它会不会把我的期望改写成另一种形态? 会自动识别改名的、会自动换行的、会规范化路径的,都会。
同族的另一件事发生在网页的输入框里。往一个带勾选清单的正文框里贴了一段清单,编辑器的自动续行在每一行前面又插了一遍空的勾选框,几处标题被吞进了上一段。贴完就提交,存下来的和贴进去的不是一个东西。推广开来是一句:任何「我输入 A、系统存 B」的通道,判据都要落在 B 上。 这和上一个机件是同一句话的两个方向。
再说常量。有一次把一份转述件里的节名写进了停手判据——判据说「找不到这一节就停」。权威源里根本没有那个节名,是转述的人自己起的。拍板人当场抓住。规矩因此加了一条:判据里的定位串和受控值,只从权威源实读;转述件可以给结论,不可以给坐标;指不出权威面的常量,不许写进闸。
五、见红先查出处
红灯先问「谁报的、报的是不是我这批」,再问对错
第五个机件管红灯,也管界面上的报错。
一份合并请求页上挂着十个错误、一个警告。要是照灯读,这一批不能合。实读之后:那十个错误全部是历史存量,在册七十多条,出自一步「允许失败」的类型检查,本批零代码、一个字都没碰过那个作用域。红是真的,但不是这一批的红。
所以见红先查三样:
- 这道红是哪个步骤产出的;
- 那个步骤是不是「允许失败」的;
- 本批有没有碰到它的作用域。
三样查清,才判红绿。不是本批引入的红,不作红项。
界面上的报错另有一类脾气。点「删除分支」,页面报错说删不掉;刷新一下,已经删了。按钮点下去没反应,换一种点法再点,还是没反应——两种点法走的是同一条事件通道,被吞是一起被吞的;换成在输入框里按回车触发原生提交,一次成功。这两件事的修法是同一句:界面报错之后不重试同一个动作,先换机制、换通道,去读权威面确认真实状态。 结果判在权威查询面上,不判在按钮的反应上。
六、命令块本身要过判据
给别人跑的块,块自己就是一份判据
第六个机件管的是「给人跑的命令块」。块是拿来验别的东西的,但块自己也会错,而且错起来比被验的东西还隐蔽。表里关于块的教训有四条,各堵一种缝。
- 前提要实算。 一份收尾块默认「合并请求已经合了」,却没有验它;执行的人在合并之前跑了它,分支删在了合并之前。要害不在顺序错,在于那道删分支的闸认的是「远端跟踪引用里已含这个提交」,而不是「已经进了主干」——闸放行了,前提不成立。修法:凡以「上一步已完成」为前提的块,块首放一条实算前置闸,读权威面、命中才继续、否则打印停手。
- 重跑要无害。 同一天两次出现「整块粘贴后重跑」:一次是拉取挂起后重跑整块,一次是分支已存在后重跑。两次都靠工具自身的幂等性兜住了——兜住是运气,不是设计。 修法:凡「第二次跑会报错但无害」的命令,都显式吞掉错误、打印跳过原因;让重跑和首跑的输出可区分,但都不中断。
- 环境不写死。 一份单里写死了发单方自己电脑上远端的名字,执行方那台机上同一个名字指的是另一个仓,一跑就红,还被误读成「本地被人动过」。另一次,命令按另一套系统的写法写,跑在这一套上报「命令不存在」,被读成「链路不通」。修法:涉及远端名、克隆路径、目录布局的,先让对方自报再代入;块不依赖对方机器上未必有的工具;判据宁可红,不可挂在那里。
- 谁有网谁跑。 一条只读的拉取命令,也要出网;没有凭据的那一侧照样挂。决定一条命令走哪条通道的,是「要不要出网」,不是「改不改数据」。
四条合起来:给别人跑的块,块本身就是一份判据——前提要实算、重跑要无害、环境不写死、谁有网谁跑。 块过不了这四关,它验出来的灯,读者也不该信。
七、回执只贴当轮回显
回执是给核的人看的,不是给自己交差的
第七个机件管回执——执行完一份单,交回来的那份东西。
替补执行器合一份合并请求,照抄了上一步的模板,把没跑过的判据原样贴了上去;冲突还没解,就报了零。它自己发现、自报改正、重跑。这件事进了表,写法只有一句:不复用上一步或上一轮的输出与模板;未跑即无判据,写「未跑」。 「已确认」三个字不是输出,回显才是。
同族的另一条:一张受控表从一份文件搬到另一份,表里每个值是从哪个源来的那一栏标注,在搬运的时候被抹平了。内容会被判据检查到,标注不会——标注一丢,那张表就成了一份没有来处的数字。修法:搬表必搬「哪几个值来自哪个源」,判据加一条,专门核来源那一列。
回执这个机件和前面五个的关系是:前面五个都在管「判据本身对不对」,这一个管「判据的结果有没有被如实交回来」。判据写得再对,回执贴的是上一轮的,等于没验。
八、教训表怎么长,边界如实
表是施工史,不是格言集
六个机件都从一张表里来。表怎么长,本身也有规矩,写在表头。
头一条:每一条必须带「由来」,也就是在场证据——没有在场证据的条目不进表。 表是施工史,不是格言集。「判据要判在权威面上」这句话谁都会说,进表的不是这句话,是那次判据写在本地日志上、而合并请求页早就写着已合并的那件事。
第二条:全司一处。 各条线攒出来的判据教训都收进这一张表,条目保留各自的前缀,谁攒的看得出来;别的配置文件对这张表只放指针,不复述——复制即漂移。表原先只收一条线自己的教训,后来撞上了「别的线的教训要往哪放」,才改成一处。
第三条:表住在每轮必看的文件里。 立表事由说得很清楚:教训写在没人回头看的地方,等于没写。
一条教训从「留痕里的一句话」到「进表」,要过三关:有在场证据;判据化成一句可执行的写法;只住一处。三关过不了的,留在留痕里。
边界如实(以定稿当日那张表为准,数字为施工侧定稿日实算):
已实跑:十七条,各带在场证据;其中前置闸、可重入这几条已经升进了命令块的模板,成了每份块的固定写法。
已重犯:十七条里有两条记着「同一件事犯了第二回」。一条是立表事由,前面讲过;另一条是「远端已合并、本地没跟上」那类,第二回犯的时候修法升了一格——纪律只有长进模板,才算在用。
未验证:这张表还没有被第二家公司用过;也还没攒出一次「因为有表、所以没犯」的反向证据。表现在能证明的,只是「犯过的都记下来了」,证明不了「记下来的不会再犯」。
这十七条只在一家公司、几个大脑和两只手之间攒出来。它能不能迁到别的团队,我们没有另一次证据。