#306 按功能組織的教材裡,「該用哪一個」沒有住址
論述基礎與限制
來自一個語言層教材分類(十一篇)的實作與兩次實際的讀者提問。個案一則,機制推導比量測強。 沒有對照組——手上沒有一批按問題組織的同題材內容可以並排比。
可以查證的部分是結構事實:那個分類十一篇裡有八篇的篇名是語法或語法結構(子句、連接、別名、分組鍵、識別字),另外三篇的篇名是語言性質、權限與代價。讀者在兩次提問裡帶來的都是問題而不是語法。
核心原則
教材按功能分章時,每個功能都有一節,而「我這個問題該用哪一個功能」沒有入口。 選擇本身有時是有的——一個模組裡常有一兩章專門講「這幾種寫法選哪一個」——缺的是從讀者的問題走到那一章的路:他要先知道自己的問題屬於哪一類功能,才找得到那一章,而那正是他來找的東西。 這個缺口是組織方式的直接結果而不是漏寫:章節照被解釋的對象切,而選擇發生在對象之間。
讀者的處境與這個組織方式反向。他手上是一個問題——找出沒有對應資料的那些人、分組之後數字對不上——而不是一個語法。要從問題走到功能,他得先知道答案,而那正是他來找的東西。
症狀:解釋得完整而選不出來
按功能組織的章節回答「這個東西做什麼」,回答得再完整也推不出「我不該用它」。
一次實際的提問是這樣:讀者要找出從未下單的顧客,寫成外連接加分組再用計數等於零去篩。每一個零件的用法都對——外連接保留了配不到的列,計數某個欄位確實會跳過空值——而整條路是錯的。
錯在哪裡要從業務事實才看得出來:沒消費過的顧客在訂單表裡不會有任何一列。 由這一句直接推得「他的訂單數是零」這件事從訂單表本身問不出來,因為沒有一組可以代表他;那個零是外連接補了一列空值之後才出現的,是查詢自己製造再讀回去的產物。
計數預設有東西可以數,而這一題的對象恰好是什麼都沒有的那些人。這個結論不在任何一個語法功能的說明裡,因為它不是關於某一個功能,它是關於這些功能之間的選擇。
修法:給選擇一個住址
加一層問題到落點的路由。 章節照功能留著,另外給一張表把讀者實際會帶來的問題對到落點。這一層很便宜——不必重寫任何一章——而它補的正是組織方式製造的那個缺口。
問題要用讀者的語言寫,不用功能的語言。「分組之後結果少了幾筆」是讀者說得出來的,「分組鍵的選擇」不是——後者已經預設他知道問題出在分組鍵上。
選擇型的章節要讓業務事實出現在語法比對之前。 一個章節如果承擔的是「這幾種寫法選哪一個」,那個讓選擇成立的業務事實要先講。實作中同一個章節的這一段先後寫過兩版:第一版從查詢的結果反推(「答案已經寫在每一列上了」),第二版從業務事實正推(「沒消費的人不會出現在訂單表」)。第二版不需要讀者先寫出一個查詢才看得到結論。
而那次實作只做到一半,值得記下來。 那一章的開場仍然是語法演練(分組鍵選錯會怎樣),業務事實出現在第四節。理由是該章同時承擔兩件事——鍵怎麼選,以及這題需不需要分組——而前者是機制、後者才是選擇。兩件事同章時,開場放哪一個沒有被解決,只是被排序繞過。
功能型的章節維持原樣。 這條修法只適用於承擔選擇的那些章節,把它套到「這個子句做什麼」那一類會製造沒有必要的鋪陳。
這些判定的輸入
上面每一條修法的最省力遵循方式都一樣:在腦中判一次,然後宣告通過。而那個判定認真做過與完全沒做,產物完全相同——判定又由知道答案的作者執行,所以「我判過了」不構成證據。每一條判定要留下它的輸入:
| 判定 | 要留下的輸入 |
|---|---|
| 「讀者讀到這裡手上有什麼」 | 列出來:這一段之前,讀者從哪幾篇拿到哪幾個概念。列不出來就是還沒判 |
| 源頭的一句話測試 | 那句話交給沒讀過本模組的探針,問它「這句話裡有哪些詞你不知道指什麼」。作者自己判不了,因為他知道答案 |
| 「這一章是功能型所以維持原樣」 | 寫出這一章沒有並列兩種以上可替代的寫法。有並列就是選擇型,不論它同時是不是在解釋機制 |
| 「問題用讀者的語言寫」 | 問題句要有出處(實際的提問記錄),且句子裡不出現任何章節名裡的名詞。後者可以 grep |
| 「路由表已經補了」 | 每一章至少被一個問題指到。這一條可以數 |
| 篇幅與基本度的對照 | 排名回升時要說明補進去的是走過資料的段落,不是任何字數 |
判定本身不是產物,判定用的材料才是。 沒有這些輸入的時候,最省力的路徑會沿著零後續動作的那個結論走——判成不適用、判成不需要補、判成功能型——因為那個結論不產出任何東西可供檢查。
為什麼審查抓不到
缺口是一整節的缺席,而審查逐節檢查已經寫出來的東西。每一章都完整、正確、有判斷標準,合起來仍然缺一個入口——沒有任何一章可以被指出「這裡有問題」。
作者也不容易看到,因為他知道每個功能各自解什麼問題,所以那張對照表在他腦中已經存在。它只是沒有被寫下來。
跟其他原則的關係
- #305 基本功能衍生的問題不比進階議題簡單:兩張卡都在講組織方式決定了什麼會缺席。那張卡的缺席是深度(基本的被帶過),本卡的缺席是入口(選擇沒有住址)。共同的成因是作者手上有讀者沒有的東西——那裡是熟悉度,這裡是功能與問題的對照表。
- #209 教鑑別能力、不教操作流程:那張卡要求文章交付判斷力,本卡指出判斷力在按功能組織的教材裡沒有落腳的位置。單章寫成判斷力導向仍然不夠——選擇發生在章與章之間。
- #219 教學模組要有推導源頭、不是主題集合:推導源頭讓各章折算得回同一個機制,而本卡管的是另一個方向——讀者從問題進來時走得到哪一章。源頭解決的是內容的一致性,路由解決的是入口。
- #321 從名字出發的術語檢查,抓不到被反覆使用而從未命名的概念:同一個成因的第三個缺席——#305 缺深度、本卡缺入口、那張卡缺名字。三者共用「作者手上有讀者沒有的東西」,而那裡作者有的是用法、沒有的是名字。
- #240 路由目的地要承接該主題:本卡新增的那一層路由同樣要過那張卡的驗收——問題對到的那一篇要真的承接它,而不只是主題相關。
判讀徵兆
- 章節的名字全部是被解釋的對象(子句名、API 名、功能名),沒有一章的名字是一個問題。
- 讀者的提問裡出現「我這樣寫犯了什麼錯」而不是「這個功能怎麼用」——他要的是選擇,而教材給的是說明。
- 模組入口只有成員清單與推導源頭,沒有一張表把問題對到成員。
- 某一章的開場是語法的比對,而那一章實際承擔的是「這幾種選哪一個」。