拆分產生的缺陷落在檔與檔的交界,每一份單獨讀都是對的
論述基礎與限制
本卡由一次單檔拆成八檔(入口檔加七份 reference、依角色切)之後的三輪理解探針量測抽出。量測由併行專案執行,本站取用它的機制與判斷標準、不取它的專案識別符。該份文件在量測之前已經通過三輪高階 reviewer 的九個 frame,而三輪共二十八份低階模型報告產出的七項判決,沒有一項被那九個 frame 攔下。
限制有三項。單一拆分事件:一份文件、一種切法,其他切法的發生率未量測。「拆分造成」這個歸屬由結構推出、未做對照——七項裡判為拆分造成的那五項,理由是同樣的內容在單檔形態下不存在那個缺口,而沒有拿單檔版本重跑一批探針驗這件事。外移之後的擺盪那一節是兩次改寫的觀察,每次三份,份數小到只夠說明機制存在。
核心原則
拆分會造出一個原本不存在的位置:檔與檔之間的交界。 連續閱讀時讀者一路往下走,拆開之後他要在某處離開一份檔案、進入另一份,或者根本不知道還有另一份可以進。缺陷落在這些位置上。
而每一份檔案單獨讀都是對的,所以逐檔審查對這一類恆真。 這不是審查跑得不夠仔細——九個 frame 逐檔問「這一份有沒有違規」,七項判決一項都沒報出來,因為每一份確實都沒有違規。同樣的道理延伸到探針:只餵一份檔案的探針量得到那一份讀不讀得懂,量不到讀者知不知道還有別份。受測單位要跟缺陷的所在對齊,而拆分之後那個單位是整組檔案。
拆分自己造出來的那幾類
下表逐列查詢用,每一列是一個獨立的檢查:
| 形態 | 讀者那一側的症狀 | 檢查 |
|---|---|---|
| 互指矩陣有破口 | 不知道某條路徑存在,且能說出一個錯的總數 | 逐檔取檔頭的同目錄引用做成矩陣、看有沒有缺格 |
| 層級混疊 | 走完最後一步以為結束了,實際上還有下一層 | 把子檔裡的步驟編號與全程步驟編號並排、看有沒有指同一件事 |
| 定義與使用分屬兩檔 | 把一個受管的詞讀成它的字面義 | 對每個受管詞查它的定義在哪一檔、使用在哪幾檔 |
| 指路寫在檔頭 | 回報「文件沒說這個詞去哪查」,而檔頭寫了 | 查那個詞首次在正文用到的位置有沒有帶指路 |
| 內嵌於散文的計數 | 依那個數字去數,數出來的成員與文件不符 | 見 #325 |
| 入口檔沒有起手動作 | 讀完入口檔說不出第一個可以打開的東西 | 只餵入口檔跑一批探針、問第一個具體動作是什麼 |
前四列與最後一列是拆分新造出來的,第五列在單檔時就存在而拆分讓它復發,成因與修法在 #325,這裡不重複。其餘五列裡有兩列的成因不直觀,值得就地展開。
層級混疊:同一件事在兩個層級各編一次號
依角色切的結構會讓每一份子檔都從自己的第一步開始編號,而子檔裡的後段步驟經常就是全程的中段步驟——填完契約、做完整性檢查、回填建票,在子檔裡是「步驟六、七、八」,在全程裡是「步驟三、四、五」。兩套編號同時存在而沒有任何一處說明它們的關係。
讀者那一側的後果是走完「步驟八」以為結束,而他實際上跨了三個層級、還有下一層等著。量測裡三份全體一致回報「文件沒說走完之後要做什麼」。
這一項只有重排才會發現,逐檔讀看不到它:兩套編號各自在自己的檔案裡連續、合理、沒有跳號。改成依步驟切之後,三條路徑各自收斂為五步以內,交棒點自然浮現,同一題隨即轉為三份都答得出來。所以層級混疊同時是一個切法訊號——依角色切會製造它,依步驟切不會。
指路的位置:讀者在正文遇到那個詞時不會回頭查檔頭
八份檔案的檔頭都寫了同一句總括式指路(本檔出現的方法論、範本、工具與規格檔,地址一律查某一份地址檔)。第二輪量測裡三份仍然把其中兩個詞列為「沒說去哪查」。
第三輪做了單變項對照:只把其中一個詞從對照組移到實驗組,改成首次用到的那一點就地具名並帶指路,其餘七份與其餘的詞一律不動。
| 輪次 | 那個詞的處理 | 判為「沒說去哪查」 |
|---|---|---|
| 第二輪 | 僅檔頭一句總括 | 三份全數 |
| 第三輪 | 首次用點就地帶指路 | 零份 |
同一個詞、同一批問法、只改指路的位置。結論是讀者在正文遇到那個詞時不會回頭查檔頭,所以受管詞的指路要放在首次用到的那一點。
第二輪只下得了「檔頭總括式無效」這半個結論:當時的實驗組同時改了兩件事(行內定義加上就地展開判斷標準),翻轉歸不了因。把手段拆成單變項是拿得到因果的那一步,這一點對任何複驗都成立,不限於指路。
偵測:受測單位是檔案集合
拆分之後多派一批探針,問法與既有的理解探針不同——既有那幾種問「這一份說了什麼」,這一批問「這一份在整體裡的位置」。三道題各自對應上表的一組形態:
- 位置感:這份文件是某個整體的一部分嗎、那個整體有哪些部分、各在哪裡。它抓互指矩陣的破口,而且會順帶抓到填平行為——量測裡有一份給出了確切但錯誤的總數。
- 交棒:做到最後一步之後接下來要做什麼、文件有沒有說。它是層級混疊的偵測器。
- 缺料自覺:有哪些東西是這份文件自己沒有定義、要去別處查的,逐個寫出那個詞、文件有沒有說去哪查、說得清不清楚。它量指路的落點,並會把完全沒有指路的詞一起挖出來。
入口檔另外跑一批、只餵入口檔。 入口檔缺起手動作這一項只在讀者拿不到其餘檔案時現形——量測裡四份有三份回報「找不到任何可以打開的東西」,第四份給出完全不同的一組動作,而同一批探針拿到全部檔案時各欄全對。
派發設計沿用既有探針的條件(同一個低階模型、指令逐字相同、不給審查框架、明令標記不確定),另加兩條:對照組要留(不要把全部檔案一次改完,否則翻轉歸不了因),一次只改一個手段。
外移一段之後,留在原處的殘餘要自足
拆分的操作面有一個固有的擺盪,它不是失手。把一段下沉到後面的子檔之後,原處會被讀成掏空——量測裡三份分別寫「被掏空」「摸不著頭腦」「本節內容不夠自足」。補回內容之後掏空感消失,而閱讀負擔的回報立刻移到補回的那幾句上。
兩次改寫之間的差別是份量:補回三項後果會被讀成堆砌,補回一個具體實例就夠。所以判斷標準是留在原處的殘餘要能自足回答「為什麼這一步值得慢慢做」,而自足的成本是一個具體實例、不是一串後果。
沒這樣做的麻煩
逐檔審查會回報全部通過,而讀者持續回報跳躍與割裂,兩邊的訊號互相矛盾且都是真的。這種矛盾沒有自然的收斂方式:審查那一側每一條規則都遵守了,於是下一輪只會加更多逐檔的 frame,而缺陷所在的那個單位從頭到尾沒有被檢查過。
指路那一類另有一層代價:檔頭的總括句讀起來已經盡到責任,所以「這個詞有沒有交代去哪查」這個問題不會被重新問一次。量測顯示它對讀者的效果是零,而它在產物上看起來是有寫的。
判讀徵兆
- 一份文件拆成三份以上,而拆分的依據是角色、章節或主題這類靜態分類
- 讀者回報「不知道還有這一份」,或說得出一個確切而錯誤的檔案總數
- 子檔裡的步驟編號與入口檔的步驟編號都存在,而沒有一處寫出兩者的對應
- 檔頭有一句總括式的指路,涵蓋多個受管詞
- 某個詞的定義只出現一次,而使用它的檔案有兩份以上
- 逐檔審查連續多輪零 finding,而使用者那一側的回報沒有變化
跟其他抽象層原則的關係
- #284 文章的連貫靠鞏固形狀、不靠讀者的記憶:那張卡管篇內的割裂,修法是關係鏈與錨點路由;本卡是同一件事的跨檔形態,而缺陷的載體從段落之間換成檔案之間,偵測單位因此要跟著換。#284 自陳限制是「單一文章案例、尚無探針量測樣本」,本卡的二十八份報告補的正是那個位置。
- #325 散文裡指向一組成員的數字,在結構改動之後不會跟著動:同一個拆分事件的另一半。那裡管數字這一類、給的是判別問句(這個數字由什麼決定),本卡把它列為六種形態之一而不重述修法;兩張卡的關係是它管一類、本卡管這一類所在的那個位置。
- #321 從名字出發的術語檢查,抓不到被反覆使用而從未命名的概念:那張卡已經記下「檔頭的同目錄索引與正文的跨檔指涉是兩套不同的指標系統」,本卡給那兩套各自一個可執行的檢查(互指矩陣看缺格、首次用點看指路),並把「方向數不等於入口數」推進一步——入口數也不等於落點數,同一條指路寫在檔頭與寫在首次用點的效果相差三份對零份。
- #303 串連佔掉的是本篇的篇幅,順序要先自足再往外開門:那裡問連結交付什麼(遮住目的地能不能預測那一篇會給什麼),本卡問連結放在哪裡。兩個檢查互不替代——一條寫在檔頭的指路可以把目的地交代得很完整而讀者仍然拿不到它。
- #281 理解檢查用低階 model 取樣讀者的實際理解:本卡的偵測工具,五個設計條件全部沿用;本卡對它的增補是受測單位多一種(檔案集合)與派發多一條(對照組一次只改一個手段)。
- #204 路由條目要自包含:跳轉單位不依賴鄰條上下文:那裡管單一條目的自包含,本卡管條目的集合有沒有缺格;一組每條都自包含的路由仍然可能漏掉一個目的地。
- #377 文件的職責數從修改紀錄讀出:本卡的檢查對象是新檔彼此之間的交界;那一張補上新檔以外的兩件事——其他文件、腳本與 agent 指令裡指向原檔路徑與原段標錨點的引用,以及原檔要保留成路由表而不是刪除。