<?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/%E9%87%8F%E6%B8%AC/</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>Wed, 02 Sep 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E9%87%8F%E6%B8%AC/index.xml" rel="self" type="application/rss+xml"/><item><title>#304 探針回報的信心與它的準確度是兩個量</title><link>https://tarrragon.github.io/blog/report/probe-confidence-is-not-accuracy/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/report/probe-confidence-is-not-accuracy/</guid><description>&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;/p>
&lt;h2 id="為什麼自評欄不承載準確度">為什麼自評欄不承載準確度&lt;/h2>
&lt;p>探針的自評答的是「這句話有沒有給我東西讓我寫得出預測」，不是「我寫的預測對不對」。後者它答不了——它看不到目的地，這正是這個量測的設計條件。所以自評欄測的是句子有沒有交出材料，而材料齊備跟材料指向正確是兩回事：一個句型完整、資訊看起來充分、但漏掉關鍵區辨項的句子，會讓每一個讀者都有把握地寫出各自不同的錯誤答案。&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;/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="../comprehension-sampled-not-judged/">#281 理解要取樣、不靠判斷&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="../term-probe-measures-register-not-invention/">#289 術語探針量的是語域不是自創&lt;/a>：同一種分欄紀律的另一個形態——術語探針的「收斂」與「答得對」也是兩個量，那張卡用控制詞承接這件事。&lt;/li>
&lt;li>&lt;a href="../keyword-list-needs-dominant-violating-sense/">#267 關鍵字清單需要違規義項佔多數&lt;/a>：兩張卡都在講一個便宜的訊號會蓋住它抓不到的那一類，差別在那張是 grep 的命中、這張是探針的自評。&lt;/li>
&lt;li>&lt;a href="../term-already-owned-inside-the-domain/">#307 收斂度分不出無主的詞與已經有主人的詞&lt;/a>：同族而錯的一方相反。本卡是探針有把握而答錯，比對外部答案才現形；那張卡是探針有把握而答對，錯的是作者，證據落在有把握那幾份寫的定義內容裡。兩張卡共用同一條紀律——自評欄與比對欄分開，而比對無法外包給探針自己。&lt;/li>
&lt;li>&lt;a href="../reviewer-measurement-needs-the-audited-scope/">#311 reviewer 給的數字要用被審對象宣告的口徑重跑一次&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;/ul></description><content:encoded><![CDATA[<p>低階模型探針的回報通常帶著一個自評欄位（有把握、看不出來、不確定），而那一欄與它答對沒答對是兩件獨立的事。只讀自評欄的批次會得到一個看起來很好的數字，同時放掉那一批唯一的缺陷。</p>
<h2 id="一次量測裡兩個數字的分岔">一次量測裡兩個數字的分岔</h2>
<p>二十六條路由句子交給三份獨立探針，指令逐字相同，每一份都被要求對每一條寫出「被指向的那一篇會交付什麼」，並自評有把握或看不出來。</p>
<p>三份的自評欄幾乎一致：各二十四條有把握、兩條看不出來，而那兩條落在同一處。摘要看起來是一個乾淨的通過。</p>
<p>逐條拿去目的地比對之後，數字換了一組。受測那十八條裡有一條三份探針全部答錯，其中兩份把方向答反了——那條路由承諾寫的是「這三種寫法為什麼全部落在同一側」，而句子從頭到尾沒說是哪一側。前一句剛好把兩側都列了出來，所以那是一個五五開的猜測，三份探針各自猜了，三份都在自評欄寫有把握。</p>
<p><strong>那一條的自評欄與其餘十七條長得一模一樣。</strong> 停在自評欄的話，這一批的結論會是二十四比二通過，而唯一該修的那一條在通過的那二十四條裡面。</p>
<h2 id="為什麼自評欄不承載準確度">為什麼自評欄不承載準確度</h2>
<p>探針的自評答的是「這句話有沒有給我東西讓我寫得出預測」，不是「我寫的預測對不對」。後者它答不了——它看不到目的地，這正是這個量測的設計條件。所以自評欄測的是句子有沒有交出材料，而材料齊備跟材料指向正確是兩回事：一個句型完整、資訊看起來充分、但漏掉關鍵區辨項的句子，會讓每一個讀者都有把握地寫出各自不同的錯誤答案。</p>
<p>這也解釋了為什麼「看不出來」那一欄仍然有用，只是用途比較窄：它抓的是完全沒給材料的句子。這次的兩條看不出來都落在對照組，而且都是裸的引用（「對應某某跟某某卡片」）。<strong>沒給材料是一種缺陷，給了錯的材料是另一種，前者自評欄抓得到，後者只有比對抓得到。</strong></p>
<h2 id="處置判定的單位是比對後的結果">處置：判定的單位是比對後的結果</h2>
<p>回報收進來之後，多一個步驟：<strong>每一條預測都要真的拿去目的地比對，比對的結果另立一欄，不與自評欄合併。</strong> 兩欄都保留，因為它們回答不同的問題——自評欄告訴你哪些句子沒給材料，比對欄告訴你哪些句子把讀者帶去錯的地方。</p>
<p>這一步無法外包給探針本身。讓探針讀了目的地再自評，它的預測會變成摘要而不是預測，設計條件當場失效。比對由派探針的那一側做，材料是探針的預測句與目的地的實際內容。</p>
<p>順序仍然是歸因先於處置。答錯的那一條先回原文查——句子是不是真的沒說是哪一側（是，所以修句子），還是句子說了而探針讀漏（那要另外歸因）。</p>
<h2 id="這一條的射程">這一條的射程</h2>
<p>適用於任何帶自評欄的探針批次，而不只是路由承諾這一種用途。理解取樣、重點涵蓋度、術語通用度都會產生自評，而它們共同的性質是：探針有能力判斷自己拿到多少材料，沒有能力判斷自己的結論對不對，因為判斷對不對需要的正是那份被刻意扣住的資料。</p>
<p>不適用於本來就沒有外部答案可比對的用途。閱讀負擔與語氣的取樣裡，探針的回報本身就是資料，沒有一個「正確答案」在別處等著比對。</p>
<h2 id="跟其他原則的關係">跟其他原則的關係</h2>
<ul>
<li><a href="../comprehension-sampled-not-judged/">#281 理解要取樣、不靠判斷</a>：那張卡建立了探針這個方法與它的五個設計條件，本卡限定其中一項的讀法——回報要分欄讀，不能只讀最省事的那一欄。</li>
<li><a href="../cross-links-eat-the-article-they-live-in/">#303 串連佔掉的是本篇的篇幅</a>：那張卡的內容測試明寫著「驗收就是真的拿去比對」，本卡是那一句為什麼不可省略的量測證據。省掉比對這一步，那個判斷標準會退化成只測句子有沒有交出材料。</li>
<li><a href="../term-probe-measures-register-not-invention/">#289 術語探針量的是語域不是自創</a>：同一種分欄紀律的另一個形態——術語探針的「收斂」與「答得對」也是兩個量，那張卡用控制詞承接這件事。</li>
<li><a href="../keyword-list-needs-dominant-violating-sense/">#267 關鍵字清單需要違規義項佔多數</a>：兩張卡都在講一個便宜的訊號會蓋住它抓不到的那一類，差別在那張是 grep 的命中、這張是探針的自評。</li>
<li><a href="../term-already-owned-inside-the-domain/">#307 收斂度分不出無主的詞與已經有主人的詞</a>：同族而錯的一方相反。本卡是探針有把握而答錯，比對外部答案才現形；那張卡是探針有把握而答對，錯的是作者，證據落在有把握那幾份寫的定義內容裡。兩張卡共用同一條紀律——自評欄與比對欄分開，而比對無法外包給探針自己。</li>
<li><a href="../reviewer-measurement-needs-the-audited-scope/">#311 reviewer 給的數字要用被審對象宣告的口徑重跑一次</a>：同一組分欄紀律換一個對象。本卡分開探針的自評與它的準確度，那張卡分開一份報告的說服力與它某一條量測的正確性——兩者都是讀的人手上只有前一個量。</li>
</ul>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>探針回報的摘要行寫著一個高通過率，而報告裡沒有任何一條記錄「我拿這條預測去比對過目的地」。</li>
<li>同一條的三份預測彼此矛盾，而三份的自評都是有把握——矛盾本身就是那一條材料不足的證據，自評欄看不到它。</li>
<li>承諾句裡出現「同一側」「其中之一」「那幾種」這類指向一個集合而不指名成員的說法，前文又剛好把整個集合列出來過。</li>
</ul>
]]></content:encoded></item><item><title>比對回報零差異時，那個零只證明這個粒度看不到差異</title><link>https://tarrragon.github.io/blog/report/null-difference-only-at-the-resolution-you-looked/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/report/null-difference-only-at-the-resolution-you-looked/</guid><description>&lt;h2 id="論述基礎與限制">論述基礎與限制&lt;/h2>
&lt;p>本卡由一次量測結案抽出。待驗項是「唯一索引會不會讓最佳化器改寫存在性子查詢的計畫」，量測在 SQLite 3.51.0 上比對同一段 &lt;code>EXISTS&lt;/code> 查詢在非唯一索引與唯一索引下的計畫。第一次比對用 &lt;code>EXPLAIN QUERY PLAN&lt;/code>，兩邊印出逐字相同的一行 &lt;code>SEARCH y USING INDEX ix (recordDate=?)&lt;/code>，據此在回覆裡宣告兩個計畫相同。改用 &lt;code>EXPLAIN&lt;/code> 看位元碼之後結論反轉：非唯一索引三十二行、內層 &lt;code>Next&lt;/code> 兩個，唯一索引三十一行、內層 &lt;code>Next&lt;/code> 一個——唯一時引擎知道那次查找至多回一列，整圈內層迴圈省掉了。&lt;/p>
&lt;p>&lt;strong>個案一則，無對照組。&lt;/strong> 量測由併行的另一個 session 完成並主動回報成方法層候選，本卡只做歸納。實例可複現：同一個引擎、同一組五千列資料、兩個檢視層各印一次。&lt;/p>
&lt;h2 id="核心原則">核心原則&lt;/h2>
&lt;p>&lt;strong>比對工具的輸出有它自己的粒度，「兩邊相同」的判定只在那個粒度上成立。&lt;/strong> 粗粒度的檢查回報零差異，與細粒度的檢查回報零差異，寫在報告上是同一句話——而前者只證明了那個粒度看不到差異，沒有證明差異不存在。&lt;/p>
&lt;p>這是&lt;a href="../lint-scope-must-be-explicit-fact/">檢查規則的作用域要顯式列舉&lt;/a>那個家族的第三個成員。偵測器編碼了幾個從不被審視的參數：&lt;strong>作用域&lt;/strong>（看哪些檔）、&lt;strong>視窗&lt;/strong>（往哪裡看）、&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;code>EXPLAIN QUERY PLAN&lt;/code> 是 SQLite 文件教人讀計畫的第一個指令，三個節點一眼看完；位元碼三十行、要對照 opcode 表。第一層省力且多數時候夠用，於是它同時也是最後一層。這與&lt;a href="../recorded-failures-recur-when-the-record-is-off-path/">已經記錄過的失效仍然重演&lt;/a>裡「第一次成功恰好繞過失效路徑」是同一種形態：粗層在別的比對上給過正確答案，正是這一次不設防的理由。&lt;/p>
&lt;p>&lt;strong>這條與逐格驗證放過導出句不同。&lt;/strong> &lt;a href="../per-cell-verification-misses-the-derived-claim/">#318&lt;/a> 的缺口是層級——每一格對了、格子之上的那句話沒人驗；本卡的缺口是解析度——同一層看了，看的工具把差異壓掉了。前者要往上多驗一層，後者要往下多看一層。&lt;/p>
&lt;h2 id="修法">修法&lt;/h2>
&lt;p>&lt;strong>零差異的回報要附它的粒度。&lt;/strong> 「計畫相同」改寫成「在 &lt;code>EXPLAIN QUERY PLAN&lt;/code> 這一層相同」，讀的人才知道這個結論的射程。附不出粒度的零差異不進結論。&lt;/p>
&lt;p>&lt;strong>手上有更細的一層就跑一次。&lt;/strong> 判斷標準是一句話：這個工具的輸出會不會把我要找的那種差異壓掉。答不出來就往下跑一層；兩層都零差異才算零差異。這一步的成本通常是一條指令——那次是把 &lt;code>EXPLAIN QUERY PLAN&lt;/code> 換成 &lt;code>EXPLAIN&lt;/code>。&lt;/p>
&lt;p>&lt;strong>正對照要放在細的那一層。&lt;/strong> 要證明「這個粒度看得到我要找的差異」，拿一個已知有差異的比對餵給同一個工具，看它印不印得出來。那次的正對照現成：位元碼層看得到內層迴圈少一圈，計畫層看不到，所以計畫層對這一類差異的正對照本身就失敗——它從一開始就不是能回答這個問題的工具。&lt;a href="../recorded-failures-recur-when-the-record-is-off-path/">#317&lt;/a> 把正對照放進掃描的輸出，本卡把它放進粒度的選擇。&lt;/p>
&lt;p>&lt;strong>時間量測不能代替結構量測。&lt;/strong> 那次同組資料七次計時取最小都是同一個值，計畫的差異在這個資料量下不出時間差。時間是更粗的一層：它把整條計畫壓成一個數字，看不到差異是預期中的。結構層有差異而時間層沒有，兩者都要記，結論寫成「計畫不同、這個規模量不出時間差」。&lt;/p>
&lt;h2 id="跟其他原則的關係">跟其他原則的關係&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="../lint-scope-must-be-explicit-fact/">#221 檢查規則的作用域要顯式列舉&lt;/a>：同一家族。那張卡的兩個參數是作用域與視窗，本卡補第三個——粒度。三者都是偵測器編碼的假設，寫下之後被當成定義。&lt;/li>
&lt;li>&lt;a href="../recorded-failures-recur-when-the-record-is-off-path/">#317 已經記錄過的失效仍然重演&lt;/a>：修法共用正對照這個裝置，位置不同——那裡放進掃描的輸出，這裡放進工具的選擇。第一次成功繞過失效路徑這個形態也共用。&lt;/li>
&lt;li>&lt;a href="../per-cell-verification-misses-the-derived-claim/">#318 每一格都驗過，不代表由格子導出的那句話驗過了&lt;/a>：兩張卡都是「驗了而沒驗到」，軸不同——那裡是層級（往上少一層），這裡是解析度（往下少一層）。&lt;/li>
&lt;li>&lt;a href="../broken-scan-reports-a-plausible-number/">#291 壞掉的掃描回報一個像樣的數字&lt;/a>：那張卡的機制表列的是掃描本身壞掉的成因，本卡的工具沒有壞，它只是解析度不夠。兩者在報告上長得一樣，處置不同——那裡修工具，這裡換工具。&lt;/li>
&lt;li>&lt;a href="../concept-used-but-never-named/">#321 從名字出發的術語檢查抓不到無名概念&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>本卡由一次量測結案抽出。待驗項是「唯一索引會不會讓最佳化器改寫存在性子查詢的計畫」，量測在 SQLite 3.51.0 上比對同一段 <code>EXISTS</code> 查詢在非唯一索引與唯一索引下的計畫。第一次比對用 <code>EXPLAIN QUERY PLAN</code>，兩邊印出逐字相同的一行 <code>SEARCH y USING INDEX ix (recordDate=?)</code>，據此在回覆裡宣告兩個計畫相同。改用 <code>EXPLAIN</code> 看位元碼之後結論反轉：非唯一索引三十二行、內層 <code>Next</code> 兩個，唯一索引三十一行、內層 <code>Next</code> 一個——唯一時引擎知道那次查找至多回一列，整圈內層迴圈省掉了。</p>
<p><strong>個案一則，無對照組。</strong> 量測由併行的另一個 session 完成並主動回報成方法層候選，本卡只做歸納。實例可複現：同一個引擎、同一組五千列資料、兩個檢視層各印一次。</p>
<h2 id="核心原則">核心原則</h2>
<p><strong>比對工具的輸出有它自己的粒度，「兩邊相同」的判定只在那個粒度上成立。</strong> 粗粒度的檢查回報零差異，與細粒度的檢查回報零差異，寫在報告上是同一句話——而前者只證明了那個粒度看不到差異，沒有證明差異不存在。</p>
<p>這是<a href="../lint-scope-must-be-explicit-fact/">檢查規則的作用域要顯式列舉</a>那個家族的第三個成員。偵測器編碼了幾個從不被審視的參數：<strong>作用域</strong>（看哪些檔）、<strong>視窗</strong>（往哪裡看）、<strong>粒度</strong>（看到多細）。那張卡處理前兩個，本卡處理第三個。三者的共同點是參數寫下的當時是個假設、寫下之後被當成定義；差別在失效方向——作用域缺漏與粒度不足都給假陰性，視窗錯誤給假陽性。</p>
<h2 id="為什麼零差異特別會被當成結論">為什麼零差異特別會被當成結論</h2>
<p><strong>「相同」是一個不產出任何後續動作的結論。</strong> 差異被找到時會引出下一步——解釋它、量它、寫進哪一篇；零差異的下一步是結案。所以粒度的問題只在零差異這一側會被放過：有差異時人會去看那個差異長什麼樣，順帶就用了更細的工具；沒差異時沒有東西可看，第一層的輸出就是最後一層。</p>
<p><strong>粗粒度工具通常是預設入口。</strong> <code>EXPLAIN QUERY PLAN</code> 是 SQLite 文件教人讀計畫的第一個指令，三個節點一眼看完；位元碼三十行、要對照 opcode 表。第一層省力且多數時候夠用，於是它同時也是最後一層。這與<a href="../recorded-failures-recur-when-the-record-is-off-path/">已經記錄過的失效仍然重演</a>裡「第一次成功恰好繞過失效路徑」是同一種形態：粗層在別的比對上給過正確答案，正是這一次不設防的理由。</p>
<p><strong>這條與逐格驗證放過導出句不同。</strong> <a href="../per-cell-verification-misses-the-derived-claim/">#318</a> 的缺口是層級——每一格對了、格子之上的那句話沒人驗；本卡的缺口是解析度——同一層看了，看的工具把差異壓掉了。前者要往上多驗一層，後者要往下多看一層。</p>
<h2 id="修法">修法</h2>
<p><strong>零差異的回報要附它的粒度。</strong> 「計畫相同」改寫成「在 <code>EXPLAIN QUERY PLAN</code> 這一層相同」，讀的人才知道這個結論的射程。附不出粒度的零差異不進結論。</p>
<p><strong>手上有更細的一層就跑一次。</strong> 判斷標準是一句話：這個工具的輸出會不會把我要找的那種差異壓掉。答不出來就往下跑一層；兩層都零差異才算零差異。這一步的成本通常是一條指令——那次是把 <code>EXPLAIN QUERY PLAN</code> 換成 <code>EXPLAIN</code>。</p>
<p><strong>正對照要放在細的那一層。</strong> 要證明「這個粒度看得到我要找的差異」，拿一個已知有差異的比對餵給同一個工具，看它印不印得出來。那次的正對照現成：位元碼層看得到內層迴圈少一圈，計畫層看不到，所以計畫層對這一類差異的正對照本身就失敗——它從一開始就不是能回答這個問題的工具。<a href="../recorded-failures-recur-when-the-record-is-off-path/">#317</a> 把正對照放進掃描的輸出，本卡把它放進粒度的選擇。</p>
<p><strong>時間量測不能代替結構量測。</strong> 那次同組資料七次計時取最小都是同一個值，計畫的差異在這個資料量下不出時間差。時間是更粗的一層：它把整條計畫壓成一個數字，看不到差異是預期中的。結構層有差異而時間層沒有，兩者都要記，結論寫成「計畫不同、這個規模量不出時間差」。</p>
<h2 id="跟其他原則的關係">跟其他原則的關係</h2>
<ul>
<li><a href="../lint-scope-must-be-explicit-fact/">#221 檢查規則的作用域要顯式列舉</a>：同一家族。那張卡的兩個參數是作用域與視窗，本卡補第三個——粒度。三者都是偵測器編碼的假設，寫下之後被當成定義。</li>
<li><a href="../recorded-failures-recur-when-the-record-is-off-path/">#317 已經記錄過的失效仍然重演</a>：修法共用正對照這個裝置，位置不同——那裡放進掃描的輸出，這裡放進工具的選擇。第一次成功繞過失效路徑這個形態也共用。</li>
<li><a href="../per-cell-verification-misses-the-derived-claim/">#318 每一格都驗過，不代表由格子導出的那句話驗過了</a>：兩張卡都是「驗了而沒驗到」，軸不同——那裡是層級（往上少一層），這裡是解析度（往下少一層）。</li>
<li><a href="../broken-scan-reports-a-plausible-number/">#291 壞掉的掃描回報一個像樣的數字</a>：那張卡的機制表列的是掃描本身壞掉的成因，本卡的工具沒有壞，它只是解析度不夠。兩者在報告上長得一樣，處置不同——那裡修工具，這裡換工具。</li>
<li><a href="../concept-used-but-never-named/">#321 從名字出發的術語檢查抓不到無名概念</a>：同一批工作抽出的姊妹卡，軸不同——那裡是檢查走不到對象，這裡是檢查走到了但看不清。</li>
</ul>
<h2 id="判讀徵兆">判讀徵兆</h2>
<ul>
<li>比對回報「相同」，而回報裡沒寫是用哪個工具、在哪一層比的。</li>
<li>用來比對的是該系統文件教的第一個檢視指令，而它底下還有一層。</li>
<li>同一個工具在別的比對上給過正確的差異，於是這一次沒被質疑。</li>
<li>時間量測回報無差異，而結構層的比對沒跑。</li>
<li>零差異的結論直接推進到結案，沒有引出任何下一步。</li>
</ul>
]]></content:encoded></item></channel></rss>