<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>模組結構 on Tarragon</title><link>https://tarrragon.github.io/blog/tags/%E6%A8%A1%E7%B5%84%E7%B5%90%E6%A7%8B/</link><description>Recent content in 模組結構 on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 31 Aug 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E6%A8%A1%E7%B5%84%E7%B5%90%E6%A7%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>#305 基本功能衍生的問題不比進階議題簡單，而進階議題要從它推導</title><link>https://tarrragon.github.io/blog/report/basics-anchor-the-advanced/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/report/basics-anchor-the-advanced/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>來自一個分類的十一篇實作（SQL 語言層教材）加使用者在過程中提出的判斷標準。&lt;strong>這是一次個案，機制的推導比量測強。&lt;/strong> 沒有對照組——手上沒有一批「從複雜需求出發」寫成的同題材內容可以並排比，所以下面關於推導起點那一半是設計論證，不是實驗結果。&lt;/p>
&lt;p>深度分配那一半有兩組資料：兩則陷阱的舉例，以及一次篇幅對照。樣本是一批十一篇，不足以推廣成比例。&lt;/p>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>熟悉度決定作者覺得一件事要不要解釋、要不要當成推導的起點。&lt;/strong> 這裡的熟悉度指的是作者對「這一段正在寫的那件事」有多自動，而不是他的整體資歷。 對基本功能，作者的熟悉度最高，所以它同時失去這兩個待遇——既沒有被展開，也沒有被當成起點。&lt;/p>
&lt;p>讀者的處境相反。基本處正是他手上既有結構最少的地方，能自行補完的最少；而越往進階走，他手上可用來掛新知識的東西越多。&lt;strong>兩邊的需求剛好反向，所以照自己的熟悉度分配，分出來的深度就與讀者的需求反向。&lt;/strong>&lt;/p>
&lt;h2 id="症狀一基本的被帶過而陷阱聚集在那裡">症狀一：基本的被帶過，而陷阱聚集在那裡&lt;/h2>
&lt;p>一批十一篇的教材裡，最基礎的那幾個題目量出了全批最危險的缺陷，而它們都不報錯。&lt;/p>
&lt;p>第一個是子句的分工。把描述單一列的條件放進篩選分組的子句，一個引擎拒絕、另一個接受並回出一份錯的清單——輸出每組一列、欄位齊全、編號都是實際存在的資料，沒有任何一處會讓人停下來檢查。&lt;/p>
&lt;p>第二個是識別字的大小寫。一個引擎把沒加引號的名字摺成小寫，另外兩個完全不區分大小寫——在後者上開發、名字大小寫混著寫，一路都正常，搬到前者之後凡是建表時加了引號而查詢時沒加的地方全部找不到表。錯誤出現的時機離寫下它的時機很遠。&lt;/p>
&lt;p>&lt;strong>陷阱聚集在基本處有結構上的原因&lt;/strong>，不是巧合。基本語法用得最頻繁，所以同一個誤解會在每一個查詢裡重複一次；而它們的失效形態多半是靜默的，因為引擎為了相容性接受寬鬆的寫法，而寬鬆的那一版通常還能算出某個看起來合理的值。&lt;/p>
&lt;p>進階功能在這一批裡的形態相反：用得少，所以同一個誤解不會重複那麼多次。&lt;strong>「難」與「危險」是兩個不同的軸，而教材的深度分配常常照前者配。&lt;/strong> 這個對比只在這一批成立——進階功能同樣有靜默失敗的形態（視窗函數的預設框架、時區的隱式轉換），本卡沒有量過它們，所以站得住的是頻率那一半，不是「進階比較嚴格」。&lt;/p>
&lt;p>深度那一側有一個現成可算的量，而它在改稿過程中會移動——這件事本身是證據的一部分。&lt;/p>
&lt;p>初次記錄時，那批十一篇裡最短的三篇分別是「表的一次出現」「連接的左運算元」與「宣告式與三種順序」，&lt;strong>而第三篇正是整個模組的推導源頭&lt;/strong>。最基本的那幾篇拿到最少的篇幅，本卡的判讀徵兆在它自己的來源上成立。&lt;/p>
&lt;p>審查之後那個排名變了。審查指出源頭那一篇的核心示範缺一個前提（少了它讀者會看到相反的結果），補完之後它離開了最短的那一群。&lt;strong>篇幅與基本度的對應會被審查修掉，而修掉它的前提是有人先量過。&lt;/strong>&lt;/p>
&lt;p>而最短的那幾篇至今仍然是最基本的那幾個——連接的左運算元、識別字、表的一次出現。徵兆在這個來源上只被修掉一處，其餘還在。這是一次個案的行數對照，不是比例關係的證據。&lt;/p>
&lt;h2 id="症狀二進階議題從複雜需求出發">症狀二：進階議題從複雜需求出發&lt;/h2>
&lt;p>第二種形態出現在模組的規劃階段。一個進階主題要開講的時候，最順手的起點是一個複雜的實際需求——因為那正是讓人想寫這個主題的原因。&lt;/p>
&lt;p>從複雜需求出發寫出來的是主題集合：每一篇解一個需求，判斷標準各自成立，而彼此折算不回去。讀者拿到的是一組互不通約的規則，換一個沒被寫過的情境就無從推導。&lt;/p>
&lt;p>從基本功能出發則得到推導體系。本次那個分類的源頭是一句關於語言性質的基本陳述——它是宣告式的，所以寫下的只是要什麼結果。&lt;/p>
&lt;p>&lt;strong>折算對回的是同一個性質，不是同一句斷言。&lt;/strong> 那個分類的十一篇分成兩支：一支問「結果集由什麼決定」（答案是一個與直覺不同的模型），另一支問「文字之外還有誰在決定」（答案是引擎的名字規則、寬鬆度、權限與最佳化器）。&lt;strong>兩支的答案方向相反，而它們問的是同一個性質的兩面。&lt;/strong> 初稿把兩支寫成同一句斷言的展開，審查指出那讓兩支互為否定——這是選對了源頭而描述錯了它的形狀。&lt;/p>
&lt;p>&lt;strong>判斷起點合不合格有一個機械的測試：這個起點能不能在不預設本模組任何內容的前提下用一句話說完。&lt;/strong> 複雜需求說不完，因為它自己就需要先鋪陳。&lt;/p>
&lt;h2 id="修法">修法&lt;/h2>
&lt;p>&lt;strong>深度的訊號換掉。&lt;/strong> 不用語法或主題的表面複雜度判斷該寫多詳細，改問「讀者讀到這裡手上有什麼」。基本章節要走一遍資料、把每一步的中間狀態逐項列出來，講完之後換一個角度重組一次——同一個判斷再給一句可以機械執行的問法。&lt;/p>
&lt;p>&lt;strong>進階議題往回找基本機制當起點。&lt;/strong> 想寫的那個複雜需求留著當案例，但推導從它底下的基本功能開始。順序是先寫清楚那個基本功能在做什麼，複雜需求成為它的一個推論。&lt;/p>
&lt;p>&lt;strong>模組的源頭用上面那個一句話測試驗收。&lt;/strong> 說不完就代表選到的是需求而不是機制。&lt;/p>
&lt;h2 id="這些判定的輸入">這些判定的輸入&lt;/h2>
&lt;p>上面每一條修法的最省力遵循方式都一樣：在腦中判一次，然後宣告通過。而&lt;strong>那個判定認真做過與完全沒做，產物完全相同&lt;/strong>——判定又由知道答案的作者執行，所以「我判過了」不構成證據。每一條判定要留下它的輸入：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>判定&lt;/th>
 &lt;th>要留下的輸入&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>「讀者讀到這裡手上有什麼」&lt;/td>
 &lt;td>列出來：這一段之前，讀者從哪幾篇拿到哪幾個概念。列不出來就是還沒判&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>源頭的一句話測試&lt;/td>
 &lt;td>那句話交給沒讀過本模組的探針，問它「這句話裡有哪些詞你不知道指什麼」。作者自己判不了，因為他知道答案&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「這一章是功能型所以維持原樣」&lt;/td>
 &lt;td>寫出這一章沒有並列兩種以上可替代的寫法。有並列就是選擇型，不論它同時是不是在解釋機制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「問題用讀者的語言寫」&lt;/td>
 &lt;td>問題句要有出處（實際的提問記錄），且句子裡不出現任何章節名裡的名詞。後者可以 grep&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「路由表已經補了」&lt;/td>
 &lt;td>每一章至少被一個問題指到。這一條可以數&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>篇幅與基本度的對照&lt;/td>
 &lt;td>排名回升時要說明補進去的是走過資料的段落，不是任何字數&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>判定本身不是產物，判定用的材料才是。&lt;/strong> 沒有這些輸入的時候，最省力的路徑會沿著零後續動作的那個結論走——判成不適用、判成不需要補、判成功能型——因為那個結論不產出任何東西可供檢查。&lt;/p>
&lt;h2 id="為什麼審查抓不到">為什麼審查抓不到&lt;/h2>
&lt;p>被帶過的那一段沒有錯，它只是短。審查問的是「這一段寫得對不對」，而一段正確而簡略的基本定義在每一個維度上都通過——字句合規、事實正確、結構完整。&lt;/p>
&lt;p>而同源的 reviewer 與作者共享同一份熟悉度：讀到那句簡略的定義時，兩邊腦中都自動補上了完整版，於是兩邊都覺得夠了。要偵測它得換一種讀者——手上沒有那份熟悉度、也不會自動補完的那種。&lt;/p>
&lt;h2 id="跟其他原則的關係">跟其他原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="../teaching-module-needs-derivation-anchor/">#219 教學模組要有推導源頭、不是主題集合&lt;/a>：那張卡要求模組要有一個源頭，本卡限定源頭的性質——它必須是基本機制，而不是任何一個複雜需求。兩張卡合起來才完整：有源頭而源頭選錯，模組仍然折算不起來。&lt;/li>
&lt;li>&lt;a href="../audience-is-professional-not-layperson/">#191 讀者是缺經驗的專業人士、不是外行人&lt;/a>：&lt;strong>這張卡最容易被誤讀成「所以基本的可以帶過」，而本卡明確擋掉這個推論。&lt;/strong> 那張卡管的是姿態（不要用科普語氣、不要故事線導入），不是份量。讀者缺的正是這個領域的基本結構，所以基本定義要寫足——用中性的敘述寫足，不是用科普的方式寫多。&lt;/li>
&lt;li>&lt;a href="../content-pressure-resolves-by-expansion-not-compression/">#262 內容超出容器時擴充結構、不壓縮內容&lt;/a>：同樣導向擴充而非壓縮，而觸發條件不同。那裡的壓力來自容器（判斷標準裝不進表格格），這裡的壓力來自熟悉度（作者覺得這太基本了不用寫）。前者作者看得見，後者看不見。&lt;/li>
&lt;li>&lt;a href="../cross-links-eat-the-article-they-live-in/">#303 串連佔掉的是本篇的篇幅&lt;/a>：那張卡的「承重術語在自己的主場最容易沒有定義」與本卡是同一個機制的兩個對象——那裡是一個詞，這裡是一整個主題。共同的成因都是越熟悉的東西陌生感消失得越早，所以停下來解釋它的那一刻從來不會到。&lt;/li>
&lt;li>&lt;a href="../feature-organized-teaching-has-no-address-for-tool-choice/">#306 按功能組織的教材裡「該用哪一個」沒有住址&lt;/a>：同一個成因的兩個缺席——本卡缺的是深度（基本的被帶過），那張卡缺的是入口（選擇沒有住址）。共同來源是作者手上有讀者沒有的東西：這裡是熟悉度，那裡是功能與問題的對照表。&lt;/li>
&lt;/ul>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;ul>
&lt;li>模組裡最短的那幾篇，主題剛好是最基本的那幾個。&lt;/li>
&lt;li>一個進階章節的開場是一段情境鋪陳，而那段鋪陳本身需要三四句才講得完。&lt;/li>
&lt;li>模組入口說不出一句「各篇的判斷標準都折算回這裡」的話，或者說得出而那句話裡包含只有本模組定義過的名詞。&lt;/li>
&lt;li>教材裡關於基本語法的段落全部是規則的陳述，沒有一段走過一次實際的資料。&lt;/li>
&lt;li>讀者的提問集中在基本處，而教材在那裡的篇幅最少。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>來自一個分類的十一篇實作（SQL 語言層教材）加使用者在過程中提出的判斷標準。<strong>這是一次個案，機制的推導比量測強。</strong> 沒有對照組——手上沒有一批「從複雜需求出發」寫成的同題材內容可以並排比，所以下面關於推導起點那一半是設計論證，不是實驗結果。</p>
<p>深度分配那一半有兩組資料：兩則陷阱的舉例，以及一次篇幅對照。樣本是一批十一篇，不足以推廣成比例。</p>
<h2 id="核心原則">核心原則</h2>
<p><strong>熟悉度決定作者覺得一件事要不要解釋、要不要當成推導的起點。</strong> 這裡的熟悉度指的是作者對「這一段正在寫的那件事」有多自動，而不是他的整體資歷。 對基本功能，作者的熟悉度最高，所以它同時失去這兩個待遇——既沒有被展開，也沒有被當成起點。</p>
<p>讀者的處境相反。基本處正是他手上既有結構最少的地方，能自行補完的最少；而越往進階走，他手上可用來掛新知識的東西越多。<strong>兩邊的需求剛好反向，所以照自己的熟悉度分配，分出來的深度就與讀者的需求反向。</strong></p>
<h2 id="症狀一基本的被帶過而陷阱聚集在那裡">症狀一：基本的被帶過，而陷阱聚集在那裡</h2>
<p>一批十一篇的教材裡，最基礎的那幾個題目量出了全批最危險的缺陷，而它們都不報錯。</p>
<p>第一個是子句的分工。把描述單一列的條件放進篩選分組的子句，一個引擎拒絕、另一個接受並回出一份錯的清單——輸出每組一列、欄位齊全、編號都是實際存在的資料，沒有任何一處會讓人停下來檢查。</p>
<p>第二個是識別字的大小寫。一個引擎把沒加引號的名字摺成小寫，另外兩個完全不區分大小寫——在後者上開發、名字大小寫混著寫，一路都正常，搬到前者之後凡是建表時加了引號而查詢時沒加的地方全部找不到表。錯誤出現的時機離寫下它的時機很遠。</p>
<p><strong>陷阱聚集在基本處有結構上的原因</strong>，不是巧合。基本語法用得最頻繁，所以同一個誤解會在每一個查詢裡重複一次；而它們的失效形態多半是靜默的，因為引擎為了相容性接受寬鬆的寫法，而寬鬆的那一版通常還能算出某個看起來合理的值。</p>
<p>進階功能在這一批裡的形態相反：用得少，所以同一個誤解不會重複那麼多次。<strong>「難」與「危險」是兩個不同的軸，而教材的深度分配常常照前者配。</strong> 這個對比只在這一批成立——進階功能同樣有靜默失敗的形態（視窗函數的預設框架、時區的隱式轉換），本卡沒有量過它們，所以站得住的是頻率那一半，不是「進階比較嚴格」。</p>
<p>深度那一側有一個現成可算的量，而它在改稿過程中會移動——這件事本身是證據的一部分。</p>
<p>初次記錄時，那批十一篇裡最短的三篇分別是「表的一次出現」「連接的左運算元」與「宣告式與三種順序」，<strong>而第三篇正是整個模組的推導源頭</strong>。最基本的那幾篇拿到最少的篇幅，本卡的判讀徵兆在它自己的來源上成立。</p>
<p>審查之後那個排名變了。審查指出源頭那一篇的核心示範缺一個前提（少了它讀者會看到相反的結果），補完之後它離開了最短的那一群。<strong>篇幅與基本度的對應會被審查修掉，而修掉它的前提是有人先量過。</strong></p>
<p>而最短的那幾篇至今仍然是最基本的那幾個——連接的左運算元、識別字、表的一次出現。徵兆在這個來源上只被修掉一處，其餘還在。這是一次個案的行數對照，不是比例關係的證據。</p>
<h2 id="症狀二進階議題從複雜需求出發">症狀二：進階議題從複雜需求出發</h2>
<p>第二種形態出現在模組的規劃階段。一個進階主題要開講的時候，最順手的起點是一個複雜的實際需求——因為那正是讓人想寫這個主題的原因。</p>
<p>從複雜需求出發寫出來的是主題集合：每一篇解一個需求，判斷標準各自成立，而彼此折算不回去。讀者拿到的是一組互不通約的規則，換一個沒被寫過的情境就無從推導。</p>
<p>從基本功能出發則得到推導體系。本次那個分類的源頭是一句關於語言性質的基本陳述——它是宣告式的，所以寫下的只是要什麼結果。</p>
<p><strong>折算對回的是同一個性質，不是同一句斷言。</strong> 那個分類的十一篇分成兩支：一支問「結果集由什麼決定」（答案是一個與直覺不同的模型），另一支問「文字之外還有誰在決定」（答案是引擎的名字規則、寬鬆度、權限與最佳化器）。<strong>兩支的答案方向相反，而它們問的是同一個性質的兩面。</strong> 初稿把兩支寫成同一句斷言的展開，審查指出那讓兩支互為否定——這是選對了源頭而描述錯了它的形狀。</p>
<p><strong>判斷起點合不合格有一個機械的測試：這個起點能不能在不預設本模組任何內容的前提下用一句話說完。</strong> 複雜需求說不完，因為它自己就需要先鋪陳。</p>
<h2 id="修法">修法</h2>
<p><strong>深度的訊號換掉。</strong> 不用語法或主題的表面複雜度判斷該寫多詳細，改問「讀者讀到這裡手上有什麼」。基本章節要走一遍資料、把每一步的中間狀態逐項列出來，講完之後換一個角度重組一次——同一個判斷再給一句可以機械執行的問法。</p>
<p><strong>進階議題往回找基本機制當起點。</strong> 想寫的那個複雜需求留著當案例，但推導從它底下的基本功能開始。順序是先寫清楚那個基本功能在做什麼，複雜需求成為它的一個推論。</p>
<p><strong>模組的源頭用上面那個一句話測試驗收。</strong> 說不完就代表選到的是需求而不是機制。</p>
<h2 id="這些判定的輸入">這些判定的輸入</h2>
<p>上面每一條修法的最省力遵循方式都一樣：在腦中判一次，然後宣告通過。而<strong>那個判定認真做過與完全沒做，產物完全相同</strong>——判定又由知道答案的作者執行，所以「我判過了」不構成證據。每一條判定要留下它的輸入：</p>
<table>
  <thead>
      <tr>
          <th>判定</th>
          <th>要留下的輸入</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「讀者讀到這裡手上有什麼」</td>
          <td>列出來：這一段之前，讀者從哪幾篇拿到哪幾個概念。列不出來就是還沒判</td>
      </tr>
      <tr>
          <td>源頭的一句話測試</td>
          <td>那句話交給沒讀過本模組的探針，問它「這句話裡有哪些詞你不知道指什麼」。作者自己判不了，因為他知道答案</td>
      </tr>
      <tr>
          <td>「這一章是功能型所以維持原樣」</td>
          <td>寫出這一章沒有並列兩種以上可替代的寫法。有並列就是選擇型，不論它同時是不是在解釋機制</td>
      </tr>
      <tr>
          <td>「問題用讀者的語言寫」</td>
          <td>問題句要有出處（實際的提問記錄），且句子裡不出現任何章節名裡的名詞。後者可以 grep</td>
      </tr>
      <tr>
          <td>「路由表已經補了」</td>
          <td>每一章至少被一個問題指到。這一條可以數</td>
      </tr>
      <tr>
          <td>篇幅與基本度的對照</td>
          <td>排名回升時要說明補進去的是走過資料的段落，不是任何字數</td>
      </tr>
  </tbody>
</table>
<p><strong>判定本身不是產物，判定用的材料才是。</strong> 沒有這些輸入的時候，最省力的路徑會沿著零後續動作的那個結論走——判成不適用、判成不需要補、判成功能型——因為那個結論不產出任何東西可供檢查。</p>
<h2 id="為什麼審查抓不到">為什麼審查抓不到</h2>
<p>被帶過的那一段沒有錯，它只是短。審查問的是「這一段寫得對不對」，而一段正確而簡略的基本定義在每一個維度上都通過——字句合規、事實正確、結構完整。</p>
<p>而同源的 reviewer 與作者共享同一份熟悉度：讀到那句簡略的定義時，兩邊腦中都自動補上了完整版，於是兩邊都覺得夠了。要偵測它得換一種讀者——手上沒有那份熟悉度、也不會自動補完的那種。</p>
<h2 id="跟其他原則的關係">跟其他原則的關係</h2>
<ul>
<li><a href="../teaching-module-needs-derivation-anchor/">#219 教學模組要有推導源頭、不是主題集合</a>：那張卡要求模組要有一個源頭，本卡限定源頭的性質——它必須是基本機制，而不是任何一個複雜需求。兩張卡合起來才完整：有源頭而源頭選錯，模組仍然折算不起來。</li>
<li><a href="../audience-is-professional-not-layperson/">#191 讀者是缺經驗的專業人士、不是外行人</a>：<strong>這張卡最容易被誤讀成「所以基本的可以帶過」，而本卡明確擋掉這個推論。</strong> 那張卡管的是姿態（不要用科普語氣、不要故事線導入），不是份量。讀者缺的正是這個領域的基本結構，所以基本定義要寫足——用中性的敘述寫足，不是用科普的方式寫多。</li>
<li><a href="../content-pressure-resolves-by-expansion-not-compression/">#262 內容超出容器時擴充結構、不壓縮內容</a>：同樣導向擴充而非壓縮，而觸發條件不同。那裡的壓力來自容器（判斷標準裝不進表格格），這裡的壓力來自熟悉度（作者覺得這太基本了不用寫）。前者作者看得見，後者看不見。</li>
<li><a href="../cross-links-eat-the-article-they-live-in/">#303 串連佔掉的是本篇的篇幅</a>：那張卡的「承重術語在自己的主場最容易沒有定義」與本卡是同一個機制的兩個對象——那裡是一個詞，這裡是一整個主題。共同的成因都是越熟悉的東西陌生感消失得越早，所以停下來解釋它的那一刻從來不會到。</li>
<li><a href="../feature-organized-teaching-has-no-address-for-tool-choice/">#306 按功能組織的教材裡「該用哪一個」沒有住址</a>：同一個成因的兩個缺席——本卡缺的是深度（基本的被帶過），那張卡缺的是入口（選擇沒有住址）。共同來源是作者手上有讀者沒有的東西：這裡是熟悉度，那裡是功能與問題的對照表。</li>
</ul>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>模組裡最短的那幾篇，主題剛好是最基本的那幾個。</li>
<li>一個進階章節的開場是一段情境鋪陳，而那段鋪陳本身需要三四句才講得完。</li>
<li>模組入口說不出一句「各篇的判斷標準都折算回這裡」的話，或者說得出而那句話裡包含只有本模組定義過的名詞。</li>
<li>教材裡關於基本語法的段落全部是規則的陳述，沒有一段走過一次實際的資料。</li>
<li>讀者的提問集中在基本處，而教材在那裡的篇幅最少。</li>
</ul>
]]></content:encoded></item><item><title>#306 按功能組織的教材裡，「該用哪一個」沒有住址</title><link>https://tarrragon.github.io/blog/report/feature-organized-teaching-has-no-address-for-tool-choice/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/report/feature-organized-teaching-has-no-address-for-tool-choice/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>來自一個語言層教材分類（十一篇）的實作與兩次實際的讀者提問。&lt;strong>個案一則，機制推導比量測強。&lt;/strong> 沒有對照組——手上沒有一批按問題組織的同題材內容可以並排比。&lt;/p>
&lt;p>可以查證的部分是結構事實：那個分類十一篇裡有八篇的篇名是語法或語法結構（子句、連接、別名、分組鍵、識別字），另外三篇的篇名是語言性質、權限與代價。讀者在兩次提問裡帶來的都是問題而不是語法。&lt;/p>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>教材按功能分章時，每個功能都有一節，而「我這個問題該用哪一個功能」沒有入口。&lt;/strong> 選擇本身有時是有的——一個模組裡常有一兩章專門講「這幾種寫法選哪一個」——缺的是從讀者的問題走到那一章的路：他要先知道自己的問題屬於哪一類功能，才找得到那一章，而那正是他來找的東西。 這個缺口是組織方式的直接結果而不是漏寫：章節照被解釋的對象切，而選擇發生在對象之間。&lt;/p>
&lt;p>讀者的處境與這個組織方式反向。他手上是一個問題——找出沒有對應資料的那些人、分組之後數字對不上——而不是一個語法。要從問題走到功能，他得先知道答案，而那正是他來找的東西。&lt;/p>
&lt;h2 id="症狀解釋得完整而選不出來">症狀：解釋得完整而選不出來&lt;/h2>
&lt;p>按功能組織的章節回答「這個東西做什麼」，回答得再完整也推不出「我不該用它」。&lt;/p>
&lt;p>一次實際的提問是這樣：讀者要找出從未下單的顧客，寫成外連接加分組再用計數等於零去篩。每一個零件的用法都對——外連接保留了配不到的列，計數某個欄位確實會跳過空值——而整條路是錯的。&lt;/p>
&lt;p>錯在哪裡要從業務事實才看得出來：&lt;strong>沒消費過的顧客在訂單表裡不會有任何一列。&lt;/strong> 由這一句直接推得「他的訂單數是零」這件事從訂單表本身問不出來，因為沒有一組可以代表他；那個零是外連接補了一列空值之後才出現的，是查詢自己製造再讀回去的產物。&lt;/p>
&lt;p>計數預設有東西可以數，而這一題的對象恰好是什麼都沒有的那些人。&lt;strong>這個結論不在任何一個語法功能的說明裡&lt;/strong>，因為它不是關於某一個功能，它是關於這些功能之間的選擇。&lt;/p>
&lt;h2 id="修法給選擇一個住址">修法：給選擇一個住址&lt;/h2>
&lt;p>&lt;strong>加一層問題到落點的路由。&lt;/strong> 章節照功能留著，另外給一張表把讀者實際會帶來的問題對到落點。這一層很便宜——不必重寫任何一章——而它補的正是組織方式製造的那個缺口。&lt;/p>
&lt;p>問題要用讀者的語言寫，不用功能的語言。「分組之後結果少了幾筆」是讀者說得出來的，「分組鍵的選擇」不是——後者已經預設他知道問題出在分組鍵上。&lt;/p>
&lt;p>&lt;strong>選擇型的章節要讓業務事實出現在語法比對之前。&lt;/strong> 一個章節如果承擔的是「這幾種寫法選哪一個」，那個讓選擇成立的業務事實要先講。實作中同一個章節的這一段先後寫過兩版：第一版從查詢的結果反推（「答案已經寫在每一列上了」），第二版從業務事實正推（「沒消費的人不會出現在訂單表」）。第二版不需要讀者先寫出一個查詢才看得到結論。&lt;/p>
&lt;p>&lt;strong>而那次實作只做到一半，值得記下來。&lt;/strong> 那一章的開場仍然是語法演練（分組鍵選錯會怎樣），業務事實出現在第四節。理由是該章同時承擔兩件事——鍵怎麼選，以及這題需不需要分組——而前者是機制、後者才是選擇。兩件事同章時，開場放哪一個沒有被解決，只是被排序繞過。&lt;/p>
&lt;p>&lt;strong>功能型的章節維持原樣。&lt;/strong> 這條修法只適用於承擔選擇的那些章節，把它套到「這個子句做什麼」那一類會製造沒有必要的鋪陳。&lt;/p>
&lt;h2 id="這些判定的輸入">這些判定的輸入&lt;/h2>
&lt;p>上面每一條修法的最省力遵循方式都一樣：在腦中判一次，然後宣告通過。而&lt;strong>那個判定認真做過與完全沒做，產物完全相同&lt;/strong>——判定又由知道答案的作者執行，所以「我判過了」不構成證據。每一條判定要留下它的輸入：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>判定&lt;/th>
 &lt;th>要留下的輸入&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>「讀者讀到這裡手上有什麼」&lt;/td>
 &lt;td>列出來：這一段之前，讀者從哪幾篇拿到哪幾個概念。列不出來就是還沒判&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>源頭的一句話測試&lt;/td>
 &lt;td>那句話交給沒讀過本模組的探針，問它「這句話裡有哪些詞你不知道指什麼」。作者自己判不了，因為他知道答案&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「這一章是功能型所以維持原樣」&lt;/td>
 &lt;td>寫出這一章沒有並列兩種以上可替代的寫法。有並列就是選擇型，不論它同時是不是在解釋機制&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「問題用讀者的語言寫」&lt;/td>
 &lt;td>問題句要有出處（實際的提問記錄），且句子裡不出現任何章節名裡的名詞。後者可以 grep&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>「路由表已經補了」&lt;/td>
 &lt;td>每一章至少被一個問題指到。這一條可以數&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>篇幅與基本度的對照&lt;/td>
 &lt;td>排名回升時要說明補進去的是走過資料的段落，不是任何字數&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>判定本身不是產物，判定用的材料才是。&lt;/strong> 沒有這些輸入的時候，最省力的路徑會沿著零後續動作的那個結論走——判成不適用、判成不需要補、判成功能型——因為那個結論不產出任何東西可供檢查。&lt;/p>
&lt;h2 id="為什麼審查抓不到">為什麼審查抓不到&lt;/h2>
&lt;p>缺口是一整節的缺席，而審查逐節檢查已經寫出來的東西。每一章都完整、正確、有判斷標準，合起來仍然缺一個入口——沒有任何一章可以被指出「這裡有問題」。&lt;/p>
&lt;p>作者也不容易看到，因為他知道每個功能各自解什麼問題，所以那張對照表在他腦中已經存在。它只是沒有被寫下來。&lt;/p>
&lt;h2 id="跟其他原則的關係">跟其他原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="../basics-anchor-the-advanced/">#305 基本功能衍生的問題不比進階議題簡單&lt;/a>：兩張卡都在講組織方式決定了什麼會缺席。那張卡的缺席是深度（基本的被帶過），本卡的缺席是入口（選擇沒有住址）。共同的成因是作者手上有讀者沒有的東西——那裡是熟悉度，這裡是功能與問題的對照表。&lt;/li>
&lt;li>&lt;a href="../teach-judgment-not-procedure/">#209 教鑑別能力、不教操作流程&lt;/a>：那張卡要求文章交付判斷力，本卡指出判斷力在按功能組織的教材裡沒有落腳的位置。單章寫成判斷力導向仍然不夠——選擇發生在章與章之間。&lt;/li>
&lt;li>&lt;a href="../teaching-module-needs-derivation-anchor/">#219 教學模組要有推導源頭、不是主題集合&lt;/a>：推導源頭讓各章折算得回同一個機制，而本卡管的是另一個方向——讀者從問題進來時走得到哪一章。源頭解決的是內容的一致性，路由解決的是入口。&lt;/li>
&lt;li>&lt;a href="../concept-used-but-never-named/">#321 從名字出發的術語檢查，抓不到被反覆使用而從未命名的概念&lt;/a>：同一個成因的第三個缺席——#305 缺深度、本卡缺入口、那張卡缺名字。三者共用「作者手上有讀者沒有的東西」，而那裡作者有的是用法、沒有的是名字。&lt;/li>
&lt;li>&lt;a href="../routing-destination-must-own-the-topic/">#240 路由目的地要承接該主題&lt;/a>：本卡新增的那一層路由同樣要過那張卡的驗收——問題對到的那一篇要真的承接它，而不只是主題相關。&lt;/li>
&lt;/ul>
&lt;h2 id="判讀徵兆">判讀徵兆&lt;/h2>
&lt;ul>
&lt;li>章節的名字全部是被解釋的對象（子句名、API 名、功能名），沒有一章的名字是一個問題。&lt;/li>
&lt;li>讀者的提問裡出現「我這樣寫犯了什麼錯」而不是「這個功能怎麼用」——他要的是選擇，而教材給的是說明。&lt;/li>
&lt;li>模組入口只有成員清單與推導源頭，沒有一張表把問題對到成員。&lt;/li>
&lt;li>某一章的開場是語法的比對，而那一章實際承擔的是「這幾種選哪一個」。&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<h2 id="論述基礎與限制">論述基礎與限制</h2>
<p>來自一個語言層教材分類（十一篇）的實作與兩次實際的讀者提問。<strong>個案一則，機制推導比量測強。</strong> 沒有對照組——手上沒有一批按問題組織的同題材內容可以並排比。</p>
<p>可以查證的部分是結構事實：那個分類十一篇裡有八篇的篇名是語法或語法結構（子句、連接、別名、分組鍵、識別字），另外三篇的篇名是語言性質、權限與代價。讀者在兩次提問裡帶來的都是問題而不是語法。</p>
<h2 id="核心原則">核心原則</h2>
<p><strong>教材按功能分章時，每個功能都有一節，而「我這個問題該用哪一個功能」沒有入口。</strong> 選擇本身有時是有的——一個模組裡常有一兩章專門講「這幾種寫法選哪一個」——缺的是從讀者的問題走到那一章的路：他要先知道自己的問題屬於哪一類功能，才找得到那一章，而那正是他來找的東西。 這個缺口是組織方式的直接結果而不是漏寫：章節照被解釋的對象切，而選擇發生在對象之間。</p>
<p>讀者的處境與這個組織方式反向。他手上是一個問題——找出沒有對應資料的那些人、分組之後數字對不上——而不是一個語法。要從問題走到功能，他得先知道答案，而那正是他來找的東西。</p>
<h2 id="症狀解釋得完整而選不出來">症狀：解釋得完整而選不出來</h2>
<p>按功能組織的章節回答「這個東西做什麼」，回答得再完整也推不出「我不該用它」。</p>
<p>一次實際的提問是這樣：讀者要找出從未下單的顧客，寫成外連接加分組再用計數等於零去篩。每一個零件的用法都對——外連接保留了配不到的列，計數某個欄位確實會跳過空值——而整條路是錯的。</p>
<p>錯在哪裡要從業務事實才看得出來：<strong>沒消費過的顧客在訂單表裡不會有任何一列。</strong> 由這一句直接推得「他的訂單數是零」這件事從訂單表本身問不出來，因為沒有一組可以代表他；那個零是外連接補了一列空值之後才出現的，是查詢自己製造再讀回去的產物。</p>
<p>計數預設有東西可以數，而這一題的對象恰好是什麼都沒有的那些人。<strong>這個結論不在任何一個語法功能的說明裡</strong>，因為它不是關於某一個功能，它是關於這些功能之間的選擇。</p>
<h2 id="修法給選擇一個住址">修法：給選擇一個住址</h2>
<p><strong>加一層問題到落點的路由。</strong> 章節照功能留著，另外給一張表把讀者實際會帶來的問題對到落點。這一層很便宜——不必重寫任何一章——而它補的正是組織方式製造的那個缺口。</p>
<p>問題要用讀者的語言寫，不用功能的語言。「分組之後結果少了幾筆」是讀者說得出來的，「分組鍵的選擇」不是——後者已經預設他知道問題出在分組鍵上。</p>
<p><strong>選擇型的章節要讓業務事實出現在語法比對之前。</strong> 一個章節如果承擔的是「這幾種寫法選哪一個」，那個讓選擇成立的業務事實要先講。實作中同一個章節的這一段先後寫過兩版：第一版從查詢的結果反推（「答案已經寫在每一列上了」），第二版從業務事實正推（「沒消費的人不會出現在訂單表」）。第二版不需要讀者先寫出一個查詢才看得到結論。</p>
<p><strong>而那次實作只做到一半，值得記下來。</strong> 那一章的開場仍然是語法演練（分組鍵選錯會怎樣），業務事實出現在第四節。理由是該章同時承擔兩件事——鍵怎麼選，以及這題需不需要分組——而前者是機制、後者才是選擇。兩件事同章時，開場放哪一個沒有被解決，只是被排序繞過。</p>
<p><strong>功能型的章節維持原樣。</strong> 這條修法只適用於承擔選擇的那些章節，把它套到「這個子句做什麼」那一類會製造沒有必要的鋪陳。</p>
<h2 id="這些判定的輸入">這些判定的輸入</h2>
<p>上面每一條修法的最省力遵循方式都一樣：在腦中判一次，然後宣告通過。而<strong>那個判定認真做過與完全沒做，產物完全相同</strong>——判定又由知道答案的作者執行，所以「我判過了」不構成證據。每一條判定要留下它的輸入：</p>
<table>
  <thead>
      <tr>
          <th>判定</th>
          <th>要留下的輸入</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>「讀者讀到這裡手上有什麼」</td>
          <td>列出來：這一段之前，讀者從哪幾篇拿到哪幾個概念。列不出來就是還沒判</td>
      </tr>
      <tr>
          <td>源頭的一句話測試</td>
          <td>那句話交給沒讀過本模組的探針，問它「這句話裡有哪些詞你不知道指什麼」。作者自己判不了，因為他知道答案</td>
      </tr>
      <tr>
          <td>「這一章是功能型所以維持原樣」</td>
          <td>寫出這一章沒有並列兩種以上可替代的寫法。有並列就是選擇型，不論它同時是不是在解釋機制</td>
      </tr>
      <tr>
          <td>「問題用讀者的語言寫」</td>
          <td>問題句要有出處（實際的提問記錄），且句子裡不出現任何章節名裡的名詞。後者可以 grep</td>
      </tr>
      <tr>
          <td>「路由表已經補了」</td>
          <td>每一章至少被一個問題指到。這一條可以數</td>
      </tr>
      <tr>
          <td>篇幅與基本度的對照</td>
          <td>排名回升時要說明補進去的是走過資料的段落，不是任何字數</td>
      </tr>
  </tbody>
</table>
<p><strong>判定本身不是產物，判定用的材料才是。</strong> 沒有這些輸入的時候，最省力的路徑會沿著零後續動作的那個結論走——判成不適用、判成不需要補、判成功能型——因為那個結論不產出任何東西可供檢查。</p>
<h2 id="為什麼審查抓不到">為什麼審查抓不到</h2>
<p>缺口是一整節的缺席，而審查逐節檢查已經寫出來的東西。每一章都完整、正確、有判斷標準，合起來仍然缺一個入口——沒有任何一章可以被指出「這裡有問題」。</p>
<p>作者也不容易看到，因為他知道每個功能各自解什麼問題，所以那張對照表在他腦中已經存在。它只是沒有被寫下來。</p>
<h2 id="跟其他原則的關係">跟其他原則的關係</h2>
<ul>
<li><a href="../basics-anchor-the-advanced/">#305 基本功能衍生的問題不比進階議題簡單</a>：兩張卡都在講組織方式決定了什麼會缺席。那張卡的缺席是深度（基本的被帶過），本卡的缺席是入口（選擇沒有住址）。共同的成因是作者手上有讀者沒有的東西——那裡是熟悉度，這裡是功能與問題的對照表。</li>
<li><a href="../teach-judgment-not-procedure/">#209 教鑑別能力、不教操作流程</a>：那張卡要求文章交付判斷力，本卡指出判斷力在按功能組織的教材裡沒有落腳的位置。單章寫成判斷力導向仍然不夠——選擇發生在章與章之間。</li>
<li><a href="../teaching-module-needs-derivation-anchor/">#219 教學模組要有推導源頭、不是主題集合</a>：推導源頭讓各章折算得回同一個機制，而本卡管的是另一個方向——讀者從問題進來時走得到哪一章。源頭解決的是內容的一致性，路由解決的是入口。</li>
<li><a href="../concept-used-but-never-named/">#321 從名字出發的術語檢查，抓不到被反覆使用而從未命名的概念</a>：同一個成因的第三個缺席——#305 缺深度、本卡缺入口、那張卡缺名字。三者共用「作者手上有讀者沒有的東西」，而那裡作者有的是用法、沒有的是名字。</li>
<li><a href="../routing-destination-must-own-the-topic/">#240 路由目的地要承接該主題</a>：本卡新增的那一層路由同樣要過那張卡的驗收——問題對到的那一篇要真的承接它，而不只是主題相關。</li>
</ul>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>章節的名字全部是被解釋的對象（子句名、API 名、功能名），沒有一章的名字是一個問題。</li>
<li>讀者的提問裡出現「我這樣寫犯了什麼錯」而不是「這個功能怎麼用」——他要的是選擇，而教材給的是說明。</li>
<li>模組入口只有成員清單與推導源頭，沒有一張表把問題對到成員。</li>
<li>某一章的開場是語法的比對，而那一章實際承擔的是「這幾種選哪一個」。</li>
</ul>
]]></content:encoded></item></channel></rss>