<?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/%E7%89%88%E6%9C%AC%E4%BC%81%E5%8A%83/</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, 04 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/%E7%89%88%E6%9C%AC%E4%BC%81%E5%8A%83/index.xml" rel="self" type="application/rss+xml"/><item><title>工作日誌撰寫方法論 - 版本企劃與執行記錄的最佳實踐</title><link>https://tarrragon.github.io/blog/record/%E5%B7%A5%E4%BD%9C%E6%97%A5%E8%AA%8C%E6%92%B0%E5%AF%AB%E6%96%B9%E6%B3%95%E8%AB%96-%E7%89%88%E6%9C%AC%E4%BC%81%E5%8A%83%E8%88%87%E5%9F%B7%E8%A1%8C%E8%A8%98%E9%8C%84%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AF%A6%E8%B8%90/</link><pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/record/%E5%B7%A5%E4%BD%9C%E6%97%A5%E8%AA%8C%E6%92%B0%E5%AF%AB%E6%96%B9%E6%B3%95%E8%AB%96-%E7%89%88%E6%9C%AC%E4%BC%81%E5%8A%83%E8%88%87%E5%9F%B7%E8%A1%8C%E8%A8%98%E9%8C%84%E7%9A%84%E6%9C%80%E4%BD%B3%E5%AF%A6%E8%B8%90/</guid><description>&lt;p>某天深夜，CLI 工具在處理工作日誌時突然 panic：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">byte index 2 is not a char boundary; it is inside &amp;#39;⏳&amp;#39; (bytes 0..3) of `⏳ |`&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查了半小時才搞清楚：有人在 markdown 表格的狀態欄位貼了個沙漏 emoji，Rust 切字串時踩到多位元組字元邊界，直接 crash。&lt;/p>
&lt;p>這個意外讓我們重新想「工作日誌到底該長什麼樣」。&lt;/p></description><content:encoded><![CDATA[<p>某天深夜，CLI 工具在處理工作日誌時突然 panic：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="ln">1</span><span class="cl">byte index 2 is not a char boundary; it is inside &#39;⏳&#39; (bytes 0..3) of `⏳ |`</span></span></code></pre></div><p>查了半小時才搞清楚：有人在 markdown 表格的狀態欄位貼了個沙漏 emoji，Rust 切字串時踩到多位元組字元邊界，直接 crash。</p>
<p>這個意外讓我們重新想「工作日誌到底該長什麼樣」。</p>
<h2 id="工作日誌的本質">工作日誌的本質</h2>
<p>工作日誌不是私人筆記，也不是 log 檔。它是一份<strong>版本企劃書</strong>，給下一個接手的人看的。</p>
<p>那個人可能是三個月後的自己，可能是新人，也可能是凌晨三點被叫起來排查問題的 on-call。他們需要快速搞清楚：這個版本要做什麼、為什麼這樣設計、現在到哪了。</p>
<p>所以工作日誌最重要的特質是<strong>自給自足</strong>：拿起來讀，不需要問任何人，就能理解完整脈絡。</p>
<h2 id="三個核心原則">三個核心原則</h2>
<h3 id="原則一工具相容性優先">原則一：工具相容性優先</h3>
<p>從那個 panic 事故學到的：markdown 表格單元格裡，禁止放 emoji。<code>⏳</code>、<code>🔄</code>、<code>❌</code> 一律不行。工具鏈複雜，有些工具處理多位元組 Unicode 有 bug，而這種 bug 偏偏只在最不需要的時候出現。</p>
<p>表格外的段落、標題、列表可以自由用 emoji，限制只針對表格單元格。</p>
<p>錯誤的寫法：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="ln">1</span><span class="cl">| Ticket ID | 狀態 |
</span></span><span class="line"><span class="ln">2</span><span class="cl">|-----------|------|
</span></span><span class="line"><span class="ln">3</span><span class="cl">| W1-001    | ⏳   |
</span></span><span class="line"><span class="ln">4</span><span class="cl">| W1-002    | 🔄   |</span></span></code></pre></div><p>正確的寫法：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="ln">1</span><span class="cl">| Ticket ID | 狀態 |
</span></span><span class="line"><span class="ln">2</span><span class="cl">|-----------|------|
</span></span><span class="line"><span class="ln">3</span><span class="cl">| W1-001    | 待處理 |
</span></span><span class="line"><span class="ln">4</span><span class="cl">| W1-002    | 進行中 |</span></span></code></pre></div><p>一份無法被工具讀取的文件，等於沒有文件。</p>
<h3 id="原則二狀態符號標準化">原則二：狀態符號標準化</h3>
<p>表格只能用純文字，那就把詞彙統一：</p>
<ul>
<li>等待開始：<code>待處理</code></li>
<li>正在執行：<code>進行中</code></li>
<li>執行完畢：<code>已完成</code></li>
<li>主動取消：<code>取消</code></li>
<li>跳過不做：<code>跳過</code></li>
<li>被阻塞中：<code>阻塞</code></li>
<li>失敗或錯誤：<code>失敗</code></li>
</ul>
<p>詞彙固定，Hook 和解析工具才能依賴它計算——統計完成率、自動產生摘要、偵測卡住的任務。詞彙一飄移，自動化就跟著失效。</p>
<h3 id="原則三標準化結構">原則三：標準化結構</h3>
<p>結構固定，任何人拿到都知道去哪找什麼。標準模板的必要部分：</p>
<p><strong>版本基本資訊</strong>（最上方）：版本號、開始日期、當前狀態、Git 分支。五秒內確認自己看的是哪個版本。</p>
<p><strong>版本目標</strong>：幾句話說這個版本要做什麼。夠高層次讓非技術的人能讀懂，夠具體讓接手工程師能判斷方向對不對。</p>
<p><strong>執行階段與 Ticket 清單</strong>：每個階段一張表，欄位固定：Ticket ID、操作動詞（Analyze、Design、Fix、Implement）、目標、負責人、依賴、狀態。Ticket ID 格式是 <code>版本號-Wave-序號</code>，例如 <code>0.25.0-W1-001</code>，看到 ID 就知道它屬於哪個版本哪個批次。</p>
<p><strong>技術筆記</strong>：記錄開發過程中的發現和決策。沒有固定格式，但很重要——「為什麼這樣做」不寫下來，幾個月後就消失了。</p>
<h2 id="細節下沉原則">細節下沉原則</h2>
<p>工作日誌只寫大方向。分析過程、測試結果、錯誤訊息，放到 Ticket 文件裡。</p>
<p>工作日誌回答「要做什麼」和「為什麼」，Ticket 回答「怎麼做」和「結果如何」。違反這個原則的工作日誌會變成大雜燴：目標、程式碼片段、技術細節、執行記錄全部混在一起，要找什麼資訊得從頭讀到尾。</p>
<h2 id="讓格式守護自己">讓格式守護自己</h2>
<p>光靠自律維持格式效果有限。我們建了一個 Hook：<code>worklog-format-check</code>，在每次寫入或編輯工作日誌後自動觸發，掃描表格裡有沒有問題 emoji，有就輸出警告並指出位置。</p>
<p>它不阻擋操作，只提醒。強制阻擋讓人挫敗，沉默放行問題悄悄累積——警告是中間那個平衡點：提醒問題存在，但把修正的決定權留給人。</p>
<h2 id="格式是一種溝通">格式是一種溝通</h2>
<p>設計這些規則的時候，有時候會覺得這些細節是不是太瑣碎了。</p>
<p>但格式的背後是一種承諾：下一個接手的人不需要猜測，就能從文件裡找到答案；工具鏈穩定運作，不會在最需要的時候 crash；整個團隊說的是同一套語言。</p>
<p>格式是工具，工具設計得好，人才能把注意力放在真正重要的事上。</p>]]></content:encoded></item></channel></rss>