量測的前置步驟決定了分母,而所有檢查都落在分母之後
論述基礎與限制
本卡由一個併行專案的條文驗證工作抽出,同批的診斷另見 #347。該次工作用一組腳本盤點條文與題目之間的字面對應關係,而同一類問題在那批器材上出現三次,分別落在過濾條件、丟棄規則與抽取單位的定義上;順序那一項是第四個實例,出自另一具比對工具。
限制有兩項。四個實例來自同一批器材、同一個人設計,「這一類在別處同樣高頻」沒有量過,本卡成立的是機制與偵測方式。守恆式對帳的效力有一次驗證:導入之後找出被靜默丟棄的那一批,而它擋掉後續多少同類問題無從得知——沒有那個計數的存在方式。
核心原則
一具量測工具的前置步驟決定它的分母,而每一道檢查都作用在分母之後。 過濾條件決定什麼進得來、丟棄規則決定什麼被拿掉、抽取單位的定義決定一筆資料算幾筆、步驟順序決定哪些字串在中途被吸收掉——四者全部在「處理」發生之前就完成了,所以檢查處理結果的動作一律碰不到它們。
這一類的報告特徵是每個數字都正確。 工具照它收到的輸入算,算得對;驗算也對;抽樣比對也對。錯的是那組輸入從來沒有人看過,而報告上沒有任何欄位會顯示這件事。
這是 #337 在單一工具內部的形態。那張卡說工具整體落在審查對象之外,本卡說即使有人決定要審這具工具,審的也會是它的處理邏輯——因為那是它唯一看得見的部分。
三個前置步驟,各自漏掉不同的東西
過濾條件漏掉不合它預期寫法的資料。 那具工具以「餵入欄含某個字串」作為納入條件,而部分題目沿用上一題的寫法、欄位裡沒有那個字串,於是被靜默丟棄,分母跟著少。工具報出的每個比例都正確,只是都建立在一個沒人檢查過的子集上。
丟棄規則漏掉的東西有方向,而方向可能正好指向被測量。 同一批器材裡有一個污染判斷標準的候選訊號是「兩題的輸出分支是否相同」,它被明文否決,理由是以它作判斷標準會讓被測的失分形態每一輪都自動落入不可判讀——判斷標準吃掉被測量。這一種比單純漏資料嚴重一階:漏掉的正是最該被看到的那一批、而不是隨機的一批,且漏得越乾淨,讀數看起來越健康。
抽取單位的定義漏掉的是筆數本身。 同一段文字算一筆還是三筆由抽取範圍的定義決定,而那個定義寫在工具裡、不出現在輸出裡,於是任何對筆數的比較都建立在一個沒被宣告的切法上。
三者的共同點是它們全部在處理之前發生,因此不在任何檢查的射程內——要檢查它們,得先有人想到「這個數字的分母是怎麼來的」,而那個問題沒有觸發點。
順序也是前置步驟
同一組步驟換個順序會得到不同的結果,而工具在兩種順序下都沒有做錯。 那次比對要找出條文與題目之間共用的字串,先做極大化再取交集、與先取交集再做極大化,結果不同:先極大化會讓短字串被包含它的長字串吸收而消失,而讀者實際用來對應的正是那些短字串。兩個步驟對調之後,多找出三條廣度九以上的通路。
順序的可執行形式:從被審查的條文側起點,每個款次取出它的獨佔 n-gram,先與題幹取交集、交集之後才做極大化。這個順序不可對調——先極大化會讓短字串被包含它的長字串吸收而消失,而讀者實際用來對應的正是那些短字串。同一份比對兩個步驟對調,多找出三條廣度九以上的通路。
順序不寫進規格時,它由實作者當下覺得自然的那一種決定,而那個決定不會留下任何痕跡。這一項與前三項的差別在於它連「漏掉了什麼」都說不出來——被吸收掉的字串不會出現在任何一份輸出裡。
為什麼抽樣比對抓不到
被丟棄的東西不會出現在樣本裡。 抽樣比對的做法是從輸出裡挑幾筆回查原始資料,而這一類缺陷的表現是某些原始資料從未成為輸出,所以無論抽多少筆、查得多仔細,抽到的每一筆都會對。
要抓到它得換一種驗證形式:把全部原始單位分類到互斥的格子裡,加總必須等於總數。進了輸出的、被過濾掉的、被判不可判讀的、被合併的,逐格計數,總和對不上就代表有單位在中途消失了。這個守恆式與抽樣比對的差別在於它的對象是全集而不是輸出。
守恆式還要多一個條件才有約束力:分類函式的輸出必須就是比對函式的輸入。 兩者是不同的資料時,分類帳與掃描結果之間沒有因果關係,於是守恆式全綠而它什麼都沒有保證。一次實測的形態是三格分類回報全部通過,而實際去比對的那一步讀的是全文——兩邊各自自洽、加總也對,只是那個總數描述的不是被量的那一份。驗法是問一句:分類的時候數的那些單位,是不是逐一被送進了比對。
修法
對照輸入要分兩種,它們回答不同的問題。 一種驗管道通不通——拿一個已知會命中的字串餵進去,它不是零,其餘的零才算數;這一種擋的是工具沒跑、路徑沒展開、指令壞掉。另一種驗分母完不完整,而它的輸入必須落在現行過濾條件之外:逐則寫明它不滿足哪一項條件、預期由哪一個分支接住它。
第二種不可由第一種代替。已知會命中的字串自帶現行規則所需的全部特徵,所以它驗的是一則已知會過的輸入——對過濾條件的缺口零鑑別力。兩種都要跑,而報告要分開記,否則第一種的綠燈會被讀成第二種也綠。
被排除的每一筆都要寫進輸出,附上被排除的理由。 這是根治的那一項,因為它關掉的是「靜默」本身而不是某一條寫錯的過濾條件。過濾條件寫錯還會再發生,而只要每一次排除都留下一列,寫錯的那一次會自己現形。
前置步驟的定義寫進規格,包括順序。 納入條件、排除條件、抽取單位、步驟順序四項各寫一句,理由是它們全部在實作者手上有預設值,而預設值不會被記錄。
丟棄規則要與被測量正交。 訂一條排除規則的時候問一句:被測的對象失分的時候,會不會正好落進這條排除規則。會的話換一條,因為那條規則會在最需要讀數的那些輪次裡宣告無法測量。
收尾用守恆式對帳,不用抽樣比對。 抽樣驗的是處理邏輯,守恆式驗的是分母。兩者各自有效,而只有後者碰得到前置步驟。
判讀徵兆
- 一具工具報出的數字全部驗算正確,而據以得到的結論與手工查的結果不同
- 說得出工具算了什麼,說不出它的分母是哪些單位、有沒有東西沒進來
- 某一類資料的計數比預期少,而找不到任何一列說明它們去了哪裡
- 排除規則的條件與被測對象的失分形態有共同的成分
- 兩個步驟的先後由實作者決定,而規格裡沒有寫
- 驗證的方式是從輸出抽幾筆回查原始資料
跟其他抽象層原則的關係
- #337 審查的射程只涵蓋被審查的對象:本卡是它在單一工具內部的遞迴。那張卡的處置是起跑前列一份工具清單,而清單列得出「用了哪幾具工具、各是什麼版本」,列不出「每一具工具的分母是怎麼算的」——本卡補的是打開那具工具之後要問的第一個問題。
- #291 掃描指令壞掉時不會報錯,它報一個數字:那張卡的壞掉發生在執行層(管道展開、字串分詞),修法是放一個已知會命中的正對照。本卡的前置步驟沒有壞——它照設計運作,而設計本身縮小了分母,所以正對照會通過。分辨兩者的方式是問那個正對照有沒有經過同一條過濾:沒經過的話它證明的是工具會動,不是分母完整。
- #329 掃描的作用域會默默對齊「我這次動過什麼」:同一個機制在作用域這一軸的形態,且它是本卡四個前置步驟裡「納入條件」的一個高頻實例——以本次改動的新增字面作為差集基準時,來源從未改過的那些命中在差集下恆為零。兩張卡合起來的推論是變更掃描與全量掃描不可互相替代,前者隱含「存量沒問題」這個沒被宣告的假設。
- #347 審查的產出是判定還是歸因要先宣告:同一批器材的兩個診斷,而因果方向是那張卡在上游。歸因這個目標要求排除混淆因子,於是器材長出過濾條件、丟棄規則與不可判讀的定義——本卡這幾類前置步驟大半是為了讓歸因成立才存在的。放棄逐項歸因之後,需要被對帳的分母也跟著少。