判斷標準少一條獨立的軸時,它不會停下來,它會篤定地指向錯的答案
論述基礎與限制
本卡從一次多輪審查的個案實跑抽出。那一批稿件裡有一條選型判斷標準只掛在一條軸上(「這一列離開它的父列之後還有沒有意義」),四個個案裡三個走出正確答案,第四個——受金融稽核、資料有法規保留義務的那一個——走得完、答案明確、而那個答案會刪掉整條稽核軌跡。三輪審查的其餘每一個 frame 都放行了它。
限制:單一個案,而且缺席的那條軸(法規保留義務)本身就是一條容易想到的軸,所以「為什麼沒想到」這一半沒有被解釋。推翻方式:找一條缺軸的判斷標準,它在缺軸的個案上表現為停頓而非錯答,本卡對那一例就不成立。
核心原則
輸入端少一條軸有兩種表現,而它們的可見度差一個量級。 少掉的軸是「產生表徵的那個條件」時,讀者帶著個案走到某一步會停下來——判斷標準問了一個他答不出來的問題,或給了一個對不上他處境的處置。停頓看得見,也留得下痕跡。
少掉的軸是一條在部分個案上才存在的獨立條件時,剩下的那條軸照樣走得完。判斷標準不知道自己少了什麼,於是它用僅有的那條軸做出一個語氣完全正常的判定。讀者沒有任何理由停下來,因為從他看得到的那一部分來看,這條判斷標準運作良好。
危險與那條軸的品質成正比。 「離開父列之後還有沒有意義」這條軸本身是對的,套在交易紀錄上也答得對——一筆交易離開它的帳戶之後確實說不出在記什麼。正因為第一條軸在這個個案上答得漂亮,第二條軸的缺席才完全不現形。 一條半吊子的軸反而會讓人起疑。
分支數少於正文自己列出的種類數,是最便宜的偵測
這一次的缺口有一個機械的先兆:那一段給了三個分支,而它處理的對象在規格上有五種。兩個沒有分支的種類,正好是保留場景的答案(一個是不准刪父列,一個是讓子列改指一個哨兵值)。
這個指標在同一批稿件的另一處也成立:一段講「規則該寫在哪裡」的判斷標準給了兩個住址,而同一篇的第一段自己寫著那條規則可以掛在三個層級上,加上條件層是四個。少的兩層正好是來歷不明的舊系統最可能的落點。
所以派人走個案之前先數一個數:判斷標準的分支數,與正文自己列舉出來的種類數。分支數比較少的時候,落在所有分支之外的那些種類就是候選缺口,而個案要刻意挑落在那裡的。這一步不需要領域知識,只需要把兩個數列出來。
反模式
用「這條判斷標準走得完嗎」當驗收。 走得完是缺軸的症狀而不是它的反證。要問的是「它在什麼樣的個案上會走出危險的答案」,而那要拿極端個案去撞,不是讀判斷標準本身。
個案都挑典型的。 典型個案由設計判斷標準時腦中的那個系統形狀決定,而缺席的軸的定義就是它不在那個形狀裡。個案要挑在規模、約束型態、與外部義務上的極端——受稽核的、有合約約束的、資料不能刪的、沒有寫入路徑的。
在判斷標準旁邊補一句提醒。 「注意有些系統有保留義務」是一句話,而它不改變判斷標準的結構:讀者照樣走那一條軸,走到答案之後不會回頭看那句提醒。缺的是一個在前面攔住他的問句,不是一個在旁邊的注意事項。
兩個問句寫成並列。 順序要緊:保留義務成立的時候第一條軸不作數,所以它得先問。寫成並列的時候讀者會照閱讀順序走第一條,而第一條答得漂亮。
修法
把第二條軸寫成一個獨立的問句,並明寫順序不能顛倒。 這一次的形態是:第一個問句問語意(子列離開父列之後還有沒有意義),第二個問句問義務(這一列有沒有自己的保留義務),而第二個成立時第一個不作數。順序寫進正文,不寫進註腳。
把缺席的分支補回來,並說明它們各自對應哪一種條件。 三個分支補成五個之後,兩個新分支各自是第二條軸的出口——沒有那條軸就沒有理由選它們,所以它們不是備選項。
用個案驗收而不是用閱讀驗收。 挑三到四個在約束型態上互相極端的個案,每個走一遍,逐問記錄答案。判斷標準型的內容用讀的驗不到它實際的行為。
判讀徵兆
| 徵兆 | 為什麼是訊號 | 下一個動作 |
|---|---|---|
| 判斷標準的分支數少於正文自己列出的種類數 | 落在所有分支之外的種類沒有出口 | 列出差集,個案挑落在那裡的 |
| 一條軸在每個試過的個案上都答得漂亮 | 品質好的單軸最能遮住第二條軸的缺席 | 換一個約束型態極端的個案再走一次 |
| 判斷標準的軸全部是對象自身的性質 | 外部強加的義務(法規、合約、稽核)不是對象的性質,天然落在這類軸之外 | 問有沒有一種個案上有外部義務 |
| 缺口的處置寫成「注意某些情況」 | 提醒不改變走的路徑 | 換成前置的問句 |
| 兩個問句並列而沒有寫順序 | 讀者照閱讀順序走,而漂亮的那一條通常寫在前面 | 明寫哪一個先問、以及它成立時另一個是否失效 |
這條原則什麼時候不成立
判斷標準的對象沒有外部義務的時候不成立。 純技術取捨(兩種寫法哪個快、兩個資料結構選哪個)上,所有的軸都是對象自身的性質,第二條軸多半與第一條同源,缺了會表現成停頓而不是錯答。
錯答的代價可回復的時候不成立。 這一條的危險來自代價不可回復(刪掉的稽核軌跡拿不回來)。錯了重來一次就好的判斷標準,缺一條軸的成本落在效率上而不是安全上。
判斷標準只有一條軸而那條軸就是全部的時候不成立。 單軸不等於缺軸——要有證據說明第二條軸存在,而證據的形式是一個走出危險答案的具體個案。
跟其他抽象層原則的關係
#297 判斷標準只收表徵,把產生表徵的那個條件從輸入端折疊掉 是最近的姊妹卡,兩者共用「輸入集合不完整」這個機制而症狀相反:那裡缺的軸與剩下的軸有因果關係(它產生了表徵),所以拿掉之後判斷標準得不出判定,讀者停在那裡;這裡缺的軸與剩下的軸互相獨立,所以拿掉之後判斷標準照樣走完。停頓會現形,篤定不會——那張卡的驗收(拿個案走一遍看走不走得完)在本卡的形態上會回報通過。
#312 判斷標準指對了路,而它給的理由在這個個案上不成立 是同一個軸的另一端:那裡路由對而理由錯,代價延後到讀者把那句因果帶去下一個個案;這裡理由對而路由錯,代價落在這個個案上。兩者的共同前提是判斷標準的正確性有兩個獨立的部分,而個案實跑一次只驗得到其中一個——那裡要追問理由,這裡要追問還有沒有別的軸。
判斷標準要寫到條件層 管的是成熟度:維度清單不夠,要寫到各條件的後果與理由。本卡處理的是條件層齊全之後的下一層——條件層的完整性與輸入的完整性是兩個獨立的檢查,一段判斷標準可以替每個條件都寫出明確的後果,而輸入端就是少一個維度。
#302 定位決定體例,它先於任何一條規則生效 講規則的觸發條件先於它自己的判斷標準生效。本卡是它在判斷標準內部的形態:第一條軸的觸發條件涵蓋了第二條軸該管的個案,於是第二條軸永遠不會被叫起來。兩者的處置也同形——在規則之前加一道問句,而不是在規則裡加一個例外。
#361 比較的軸要落在讀者接下來要交出的那份產出上補上第三種軸失效:本卡的先兆(分支數少於種類數)對它沉默,因為軸的數量完全對得上,錯的是整組軸選在另一個平面上。分辨順序是先數分支與種類,對得上再查平面。