論述基礎與限制

主要實例由併行 session 的一次四輪、二十餘個 reviewer 的審查提供(自陳),另一個形態是本庫先前記下的共用產物。兩個實例落在同一個結構上;三類的窮盡性是推導,未量測。

核心原則

每一個 frame 都是對著審查對象設計的,所以任何不在審查對象裡的項目,沒有任何一個 frame 會碰到它。 規劃 frame 的人問的是「這份內容還有什麼沒被檢查」,那個問句的值域就是內容本身,工具與流程從一開始就在值域外面。多加幾個 frame 補不上,因為每一個新 frame 也要先有一個審查對象。

三類項目結構上落在外面:

  • 被每一輪修改而不屬於任何一輪的共用產物:入口頁、待辦清單、索引。
  • 審查所用的工具:方法論、規範檔、腳本,以及它們的版本。
  • 審查自己的產物:finding 清單、覆蓋盤點表、停止判定。
  • 正在被寫出來的那條規則:規範是用來檢查產物的工具,本身不是被檢查的產物,所以撰寫規範這個場景結構上落在自己的射程外。它與前一類的差別在時序——前一類是審查跑完之後留下的產物,這一類在規則生效之前就已經在射程外了。

實例:方法論落後十一個 minor 版,而四輪審查沒有一步會發現

一次審查在開跑前把方法論拉到本地,跑完四輪、做完停止判讀之後才發現發佈端已經前進了十一個 minor 版。那些版本差裡有一版把某條停止訊號降級為「不作必要條件」,並把 quorum 的分母縮到前三條——而該次的停止判定正好建立在那一條上。用新版複核,停止判定不成立。

四輪、二十餘個 reviewer,沒有任何一步會查這件事。每一個 frame 都指著稿件。

第四類的傳播係數最高,而兩者同向

前三類漏掉的後果止於這一輪:入口頁沒更新、方法論落後、盤點表沒對帳。第四類漏掉的斷言會複製給每一個載入規範的人,而且它到達的形態是「已查證的事實」而不是「一種判斷」。 規則檔是被讀進 context 的素材,所以一句未經查證的斷言寫進去之後,懷疑它需要先懷疑規範。

規則不觸發的那個場景,恰好是後果最大的場景,兩者同向而不互相抵銷。 兩個實例的形狀相同而來源不同:一個是作者自己判斷錯了再寫進規範(錯的是判斷);另一個是作者把同儕的回報以「已查證」的形態寫進規則的實證欄,而他有一條專門管這件事的規則、當天在別的場合用過至少四次,唯獨寫規範那一刻沒套(錯的是流程,而事後查證結果相符——相符來自運氣,不構成查核)。第二種更難發現,因為它通過了任何以「這個事實對不對」為輸入的檢查。

這一類的處置與前三類相同:靠清單、不靠加 frame。收尾時列一次「本輪寫進規範層的斷言」,逐條標出它的來源與查核方式;來源是他人回報的,補上自己那一次跑的輸出。

為什麼補一個 frame 不管用

要讓工具進入審查範圍,得先有人把它放進對象清單,而放進清單這個動作沒有觸發點:它不是任何一輪的產物,也不會出現在任何一份 finding 裡。這一類的缺口靠清單補,不靠 frame 補——清單可以在起跑前寫一次,而 frame 要有對象才存在。

修法

起跑前列出這次要用的工具,逐個寫下版本與取得時間。 成本是一行。方法論、規範檔、檢查腳本各算一項;有發佈端的,順手比一次。

收尾前列出這次被改過而不屬於任何一輪的產物。 入口頁、待辦清單、索引三項是固定成員,逐項重讀:入口頁看那幾條路線現在還通嗎,待辦清單看那幾列真的都還沒做嗎、做完的真的都刪了嗎。

停止判定與盤點表自己也要有一次複核。 它們是這一輪的產物,而產物照定義不在這一輪的射程裡。上面那個實例的複核就發生在這一格——換了版本的方法論重讀自己的停止判定。

跟其他原則的關係

判讀徵兆

  • 一輪審查跑完,說得出審查對象是什麼,說不出用了哪幾樣工具、各是什麼版本。
  • 某份共用產物(入口頁、索引、待辦清單)每一輪都被改,而它不在任何一輪的審查範圍裡。
  • 停止判定所依據的規則,來自一份沒有查過發佈端的本地副本。
  • 覆蓋盤點表本身沒有進過任何一輪的複核。