戰(zhàn):從 SKILL.md 設(shè)計(jì)到 GKE 部署與 npx 排錯(cuò))
1. 從“skills”這個(gè)標(biāo)題說(shuō)起它到底指什么第一次看到“skills”這個(gè)標(biāo)題很多人會(huì)以為是某個(gè)泛泛的能力清單或者一份簡(jiǎn)歷上的技能羅列。但結(jié)合熱搜詞里反復(fù)出現(xiàn)的 Google Cloud、Agent Skills、npx、GKE、claude agent skills、codex skills 這些詞基本可以判斷這里說(shuō)的 skills 不是人類的能力項(xiàng)而是給 AI Agent 掛載的“技能包”——一套可安裝、可調(diào)用、可組合的能力模塊。打個(gè)比方一個(gè)剛出廠的大模型就像一個(gè)聰明但沒(méi)上過(guò)崗的實(shí)習(xí)生腦子好使可你讓它去查數(shù)據(jù)庫(kù)、跑測(cè)試、發(fā)部署、生成分鏡腳本它一樣都干不了。skills 就是給這個(gè)實(shí)習(xí)生配的一整套“工具腰帶”每掛一個(gè) skill它就多會(huì)一件事。Agent Skills 這個(gè)概念最近在開(kāi)發(fā)者圈子里火起來(lái)核心原因就是它把“讓 AI 干活”這件事從“寫一大段提示詞”變成了“裝一個(gè)標(biāo)準(zhǔn)化的技能包”。這套東西能解決什么問(wèn)題最直接的就是復(fù)用和標(biāo)準(zhǔn)化。以前你調(diào)教好一個(gè)能自動(dòng)寫周報(bào)、自動(dòng)跑單測(cè)、自動(dòng)做代碼審查的提示詞只能自己用換個(gè)人、換個(gè)項(xiàng)目就得重來(lái)。skills 把這些能力封裝成目錄結(jié)構(gòu)里面有說(shuō)明文件、有腳本、有依賴聲明誰(shuí)都能裝誰(shuí)都能改。它適合誰(shuí)來(lái)參考三類人一是天天跟 AI 編程工具打交道的開(kāi)發(fā)者二是想把 AI 接進(jìn)自己工作流的產(chǎn)品和運(yùn)營(yíng)三是想搞清楚 Agent 底層怎么跑起來(lái)的技術(shù)愛(ài)好者。我下面會(huì)從設(shè)計(jì)思路、目錄結(jié)構(gòu)、安裝實(shí)操、常見(jiàn)坑幾個(gè)角度把 skills 這套東西拆開(kāi)講清楚。內(nèi)容會(huì)涉及 Google Cloud、GKE、npx 這些具體工具但重點(diǎn)不是背命令而是理解為什么這么設(shè)計(jì)、什么時(shí)候該用哪個(gè)。2. Agent Skills 的整體設(shè)計(jì)與思路拆解2.1 為什么是“技能包”而不是“大提示詞”早期大家用 AI 干活基本靠一段超長(zhǎng)提示詞把角色、任務(wù)、輸出格式全塞進(jìn)去。問(wèn)題是這段提示詞越寫越長(zhǎng)維護(hù)成本直線上升改一個(gè)標(biāo)點(diǎn)可能就影響整體表現(xiàn)。更麻煩的是提示詞里沒(méi)法真正執(zhí)行代碼、沒(méi)法讀文件、沒(méi)法調(diào)外部服務(wù)模型只能“說(shuō)”不能“做”。Agent Skills 的思路是把能力拆成獨(dú)立單元。每個(gè) skill 是一個(gè)文件夾里面至少有一個(gè)描述文件告訴 Agent“我是誰(shuí)、我能干什么、什么時(shí)候該調(diào)用我”。需要執(zhí)行具體動(dòng)作時(shí)skill 里可以帶腳本Agent 通過(guò)工具調(diào)用去跑這些腳本。這樣一來(lái)能力是可插拔的今天需要代碼審查就裝審查 skill明天需要生成分鏡就裝分鏡 skill互不干擾。這個(gè)設(shè)計(jì)背后有個(gè)很實(shí)際的考量上下文窗口是稀缺資源。如果把所有能力都寫進(jìn)系統(tǒng)提示詞光描述就占掉幾千 token真正干活的空間被壓縮。skills 采用“按需加載”的方式Agent 先看到一份技能清單只有判斷需要某個(gè)技能時(shí)才去讀它的詳細(xì)說(shuō)明。這跟人查手冊(cè)一個(gè)道理你不會(huì)把整本字典背下來(lái)而是需要時(shí)翻到那一頁(yè)。2.2 目錄結(jié)構(gòu)里藏著的設(shè)計(jì)哲學(xué)一個(gè)標(biāo)準(zhǔn)的 skill 目錄通常長(zhǎng)這樣my-skill/ ├── SKILL.md # 核心說(shuō)明文件必須有 ├── scripts/ # 可執(zhí)行腳本 │ └── run.py ├── references/ # 參考資料、模板 │ └── template.md └── assets/ # 靜態(tài)資源 └── logo.pngSKILL.md是整個(gè)技能的靈魂。它一般包含三塊內(nèi)容元信息名稱、版本、適用場(chǎng)景、能力描述這個(gè)技能能做什么、輸入輸出是什么、調(diào)用示例給 Agent 看的用法示范。元信息里的“適用場(chǎng)景”特別關(guān)鍵它決定了 Agent 在什么情況下會(huì)想起這個(gè)技能。寫得太窄該用的時(shí)候用不上寫得太寬不該用的時(shí)候亂調(diào)用。scripts/目錄放的是真正干活的代碼。這里有個(gè)經(jīng)驗(yàn)?zāi)_本要盡量無(wú)狀態(tài)、可獨(dú)立運(yùn)行。因?yàn)?Agent 調(diào)用腳本時(shí)環(huán)境可能跟你的開(kāi)發(fā)機(jī)不一樣依賴沒(méi)裝、路徑不對(duì)都是常事。我見(jiàn)過(guò)太多 skill 在本地跑得好好的一換環(huán)境就報(bào)錯(cuò)根子就在腳本假設(shè)了太多外部條件。references/和assets/是可選的但用好了能大幅提升技能質(zhì)量。比如一個(gè)“寫論文”的 skill可以在 references 里放幾篇范文的結(jié)構(gòu)模板Agent 調(diào)用時(shí)直接參考輸出質(zhì)量比空口讓它寫要高一大截。2.3 和 MCP、npx 的關(guān)系怎么理熱搜詞里 claude mcpservers npx 出現(xiàn)頻率很高這里得把幾個(gè)概念理清楚不然容易混。MCP是模型上下文協(xié)議解決的是“Agent 怎么跟外部服務(wù)通信”的問(wèn)題。它定義了一套標(biāo)準(zhǔn)接口讓 Agent 能統(tǒng)一地調(diào)用數(shù)據(jù)庫(kù)、文件系統(tǒng)、API。skills更偏向“能力封裝”它可能內(nèi)部用 MCP 去連服務(wù)也可能就是幾個(gè)本地腳本。兩者不是替代關(guān)系而是不同層次MCP 管通信skills 管能力組織。npx是 Node 生態(tài)里的包執(zhí)行工具npx playwright install這種命令就是用它跑起來(lái)的。很多 skill 的安裝和初始化依賴 npx因?yàn)樗苤苯永〔?zhí)行包不用先全局安裝。但 npx 在國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境下經(jīng)??ㄗ∵@也是后面要重點(diǎn)講的坑。GKE和Google Cloud出現(xiàn)在熱詞里說(shuō)明不少 skill 是面向云環(huán)境的比如自動(dòng)部署、自動(dòng)擴(kuò)縮容、日志分析。這類 skill 通常需要配置云憑證安裝前得先把權(quán)限理清楚不然腳本跑到一半報(bào)權(quán)限錯(cuò)誤排查起來(lái)很費(fèi)勁。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 SKILL.md 怎么寫才讓 Agent 愿意用SKILL.md的寫法直接決定技能好不好用。我總結(jié)了一個(gè)三段式結(jié)構(gòu)實(shí)測(cè)下來(lái) Agent 的調(diào)用準(zhǔn)確率明顯更高。第一段是觸發(fā)條件用自然語(yǔ)言描述“什么時(shí)候該用我”。比如## 何時(shí)使用 當(dāng)用戶要求生成短視頻分鏡腳本且需要包含鏡頭編號(hào)、畫面描述、時(shí)長(zhǎng)時(shí)使用本技能。注意這里要寫具體的、可判斷的條件不要寫“當(dāng)用戶需要幫助時(shí)”這種廢話。Agent 判斷是否調(diào)用靠的就是這段描述跟當(dāng)前任務(wù)的匹配度。第二段是輸入輸出規(guī)范明確告訴 Agent 需要提供什么、會(huì)得到什么## 輸入 - 主題字符串視頻核心內(nèi)容 - 時(shí)長(zhǎng)數(shù)字單位秒默認(rèn) 60 ## 輸出 - 分鏡表格包含鏡號(hào)、畫面、臺(tái)詞、時(shí)長(zhǎng)四列第三段是調(diào)用示例給一兩個(gè)完整例子。示例比描述管用Agent 會(huì)模仿示例的格式和粒度。我一般會(huì)放一個(gè)簡(jiǎn)單案例和一個(gè)復(fù)雜案例覆蓋不同場(chǎng)景。注意SKILL.md不要寫太長(zhǎng)控制在 500 行以內(nèi)。太長(zhǎng)的說(shuō)明文件會(huì)擠占上下文而且 Agent 讀到后面容易忘前面。詳細(xì)資料放references/需要時(shí)再讀。3.2 腳本編寫的三個(gè)硬性要求腳本是 skill 的執(zhí)行層寫得好不好直接決定技能能不能落地。有三條要求我踩過(guò)坑之后一直嚴(yán)格遵守。第一入口要單一。一個(gè) skill 最好只有一個(gè)主入口腳本比如scripts/main.py其他都是它調(diào)用的模塊。這樣 Agent 調(diào)用時(shí)不用糾結(jié)該跑哪個(gè)文件減少出錯(cuò)概率。我見(jiàn)過(guò)一個(gè) skill 放了五個(gè)腳本結(jié)果 Agent 每次都要猜該用哪個(gè)十次有三次猜錯(cuò)。第二參數(shù)要顯式。所有輸入通過(guò)命令行參數(shù)或環(huán)境變量傳入不要依賴腳本內(nèi)部的硬編碼路徑。比如import argparse parser argparse.ArgumentParser() parser.add_argument(--topic, requiredTrue) parser.add_argument(--duration, typeint, default60) args parser.parse_args()這樣 Agent 能清楚地知道要傳什么也方便調(diào)試。第三錯(cuò)誤要可讀。腳本報(bào)錯(cuò)時(shí)輸出信息要讓人和 Agent 都能看懂。不要拋一堆堆棧就完事最好捕獲異常后輸出“缺少 XX 參數(shù)”或“XX 服務(wù)連接失敗請(qǐng)檢查憑證”。Agent 看到可讀的錯(cuò)誤有時(shí)能自己糾正重試。3.3 依賴管理別讓環(huán)境問(wèn)題毀掉技能依賴是 skill 最容易出問(wèn)題的地方。我的做法是在 skill 目錄里放一個(gè)requirements.txt或package.json把依賴寫清楚并在SKILL.md里說(shuō)明安裝命令。對(duì)于 Python 技能推薦用虛擬環(huán)境隔離python -m venv .venv source .venv/bin/activate pip install -r requirements.txt對(duì)于 Node 技能npx雖然方便但國(guó)內(nèi)網(wǎng)絡(luò)下經(jīng)常超時(shí)。一個(gè)穩(wěn)妥的辦法是提前把依賴裝到本地或者配置鏡像源。npx playwright install失敗是高頻問(wèn)題后面會(huì)專門講排查方法。提示如果 skill 依賴瀏覽器自動(dòng)化比如 Playwright安裝體積會(huì)很大建議在SKILL.md里注明“首次使用需下載瀏覽器內(nèi)核約 300MB”讓使用者有心理預(yù)期。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 從零安裝一個(gè) skill 的完整流程假設(shè)我們要裝一個(gè)“自動(dòng)生成周報(bào)”的 skill完整流程如下。第一步確認(rèn)運(yùn)行環(huán)境。先看本機(jī)有沒(méi)有 Node 和 Pythonnode -v python --version如果 Node 版本低于 18建議升級(jí)因?yàn)楹芏嘈?skill 用了較新的語(yǔ)法特性。第二步獲取 skill 包。常見(jiàn)方式有兩種從代碼托管平臺(tái)克隆或者從技能市場(chǎng)下載壓縮包??寺〉脑抔it clone skill-repo-url my-weekly-report cd my-weekly-report第三步安裝依賴??茨夸浝镉袥](méi)有requirements.txt或package.json# Python 技能 pip install -r requirements.txt # Node 技能 npm install第四步配置憑證。如果 skill 需要訪問(wèn)外部服務(wù)通常會(huì)在SKILL.md里說(shuō)明要配哪些環(huán)境變量。比如export REPORT_API_KEYyour-key-here建議把這些寫進(jìn).env文件不要直接提交到代碼倉(cāng)庫(kù)。第五步本地測(cè)試。先手動(dòng)跑一次主腳本確認(rèn)能正常輸出python scripts/main.py --week 2024-W20第六步注冊(cè)到 Agent。把 skill 目錄放到 Agent 約定的技能目錄下或者在配置文件里添加路徑。不同工具的注冊(cè)方式不一樣Claude 系的一般是放到指定文件夾Codex 系的可能需要在配置里聲明。4.2 參數(shù)選擇與計(jì)算過(guò)程實(shí)錄拿“分鏡生成”這個(gè) skill 舉例講一下參數(shù)怎么定。假設(shè)要生成一個(gè) 60 秒短視頻的分鏡核心參數(shù)是鏡頭數(shù)量和單鏡時(shí)長(zhǎng)。我的經(jīng)驗(yàn)公式是鏡頭數(shù) 總時(shí)長(zhǎng) / 平均單鏡時(shí)長(zhǎng)短視頻平均單鏡時(shí)長(zhǎng)一般在 3 到 5 秒取 4 秒的話60 / 4 15 個(gè)鏡頭但這只是起點(diǎn)。實(shí)際還要考慮內(nèi)容節(jié)奏開(kāi)頭 3 秒要抓人可能需要 2 到 3 個(gè)快切中間敘事部分可以放慢到 5 到 6 秒結(jié)尾留 3 秒做收束。所以最終可能是段落鏡頭數(shù)單鏡時(shí)長(zhǎng)小計(jì)開(kāi)頭31.5s4.5s主體85s40s高潮33s9s結(jié)尾23s6s合計(jì)16-59.5s這個(gè)計(jì)算過(guò)程我會(huì)寫進(jìn) skill 的說(shuō)明里讓 Agent 知道參數(shù)不是隨便填的而是有依據(jù)的。實(shí)測(cè)下來(lái)帶計(jì)算邏輯的 skill 輸出質(zhì)量比不帶的高出一截因?yàn)?Agent 有了“為什么這么定”的上下文。4.3 在 GKE 上跑 skill 的注意事項(xiàng)有些 skill 是面向云環(huán)境的比如自動(dòng)部署、日志分析。在 GKE 上跑這類 skill有幾個(gè)點(diǎn)要特別注意。權(quán)限最小化。給 skill 用的服務(wù)賬號(hào)只授予它真正需要的權(quán)限。比如一個(gè)只讀日志的 skill就別給它集群管理員權(quán)限。我見(jiàn)過(guò)有人圖省事直接給 Owner結(jié)果 skill 腳本有 bug誤刪了生產(chǎn)環(huán)境的配置。網(wǎng)絡(luò)出口要通。GKE 集群默認(rèn)可能沒(méi)有外網(wǎng)訪問(wèn)skill 如果需要拉取依賴或調(diào)用外部 API得配置 NAT 網(wǎng)關(guān)或者用私有連接。這個(gè)在本地測(cè)試時(shí)發(fā)現(xiàn)不了一上云就報(bào)超時(shí)。資源限制要設(shè)。skill 跑在 Pod 里的話記得設(shè)resources.requests和limits。不設(shè)的話一個(gè)死循環(huán)的 skill 可能把節(jié)點(diǎn)資源吃光影響同節(jié)點(diǎn)其他服務(wù)。resources: requests: memory: 256Mi cpu: 250m limits: memory: 512Mi cpu: 500m注意云上跑 skill日志一定要打到標(biāo)準(zhǔn)輸出方便用云原生日志工具收集。寫到本地文件的話Pod 一重啟就沒(méi)了。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 npx playwright install 失敗怎么破這是被問(wèn)得最多的問(wèn)題沒(méi)有之一。npx playwright install失敗通常有三個(gè)原因。原因一網(wǎng)絡(luò)超時(shí)。Playwright 要下載瀏覽器內(nèi)核文件幾百 MB國(guó)內(nèi)直連經(jīng)常斷。解決辦法是配置鏡像源export PLAYWRIGHT_DOWNLOAD_HOSThttps://npmmirror.com/mirrors/playwright npx playwright install原因二磁盤空間不足。瀏覽器內(nèi)核解壓后占空間不小先檢查df -h原因三權(quán)限問(wèn)題。在 Linux 上如果之前用 root 裝過(guò)普通用戶再裝可能報(bào)權(quán)限錯(cuò)誤。清理緩存重來(lái)rm -rf ~/.cache/ms-playwright npx playwright install5.2 skill 裝了但 Agent 不調(diào)用這個(gè)問(wèn)題的排查思路是從觸發(fā)條件倒推。先看SKILL.md里的“何時(shí)使用”寫得夠不夠具體。如果寫的是“當(dāng)用戶需要寫作時(shí)”那 Agent 基本不會(huì)主動(dòng)調(diào)用因?yàn)樘珜挿毫恕8某伞爱?dāng)用戶要求生成包含鏡號(hào)、畫面、臺(tái)詞、時(shí)長(zhǎng)的分鏡表格時(shí)”命中率立刻上來(lái)。再檢查技能清單有沒(méi)有被正確加載。有些工具需要重啟才能識(shí)別新 skill有些需要手動(dòng)刷新索引??梢栽?Agent 的調(diào)試模式里看它當(dāng)前加載了哪些技能。還有一種情況是技能之間沖突。兩個(gè) skill 的觸發(fā)條件重疊Agent 不知道該用哪個(gè)干脆都不用。這時(shí)候要調(diào)整描述讓各自的適用場(chǎng)景區(qū)分開(kāi)。5.3 常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查方法解決方式腳本報(bào)“命令未找到”依賴未安裝檢查requirements.txt重裝依賴Agent 不調(diào)用 skill觸發(fā)條件太寬泛查看 SKILL.md 描述改具體云上跑報(bào)權(quán)限錯(cuò)誤服務(wù)賬號(hào)權(quán)限不足查看云審計(jì)日志補(bǔ)權(quán)限輸出格式不對(duì)示例不夠清晰檢查調(diào)用示例補(bǔ)完整示例首次運(yùn)行特別慢下載瀏覽器內(nèi)核看網(wǎng)絡(luò)流量配鏡像源技能之間互相干擾觸發(fā)條件重疊列出所有技能描述調(diào)整區(qū)分度5.4 幾個(gè)我踩過(guò)的坑坑一把密鑰寫進(jìn)腳本。早期圖省事直接把 API Key 硬編碼在腳本里結(jié)果 skill 分享出去密鑰就泄露了?,F(xiàn)在一律用環(huán)境變量并且在SKILL.md里明確寫“需要配置 XX 環(huán)境變量”??佣雎钥缙脚_(tái)差異。在 Mac 上寫好的腳本到了 Linux 上路徑分隔符、換行符都可能出問(wèn)題?,F(xiàn)在我會(huì)在腳本里用pathlib處理路徑用\n顯式控制換行??尤f(shuō)明文件寫太細(xì)。一開(kāi)始恨不得把每個(gè)參數(shù)都解釋一遍結(jié)果SKILL.md寫了上千行Agent 讀到后面注意力就散了?,F(xiàn)在控制在 300 行以內(nèi)詳細(xì)內(nèi)容挪到references/??铀牟蛔霭姹竟芾?。skill 更新后舊版本的行為可能變了但使用者不知道?,F(xiàn)在我會(huì)在SKILL.md頂部寫版本號(hào)和更新日志重大變更單獨(dú)標(biāo)注。6. 技能組合與進(jìn)階玩法6.1 多個(gè) skill 怎么串起來(lái)用單個(gè) skill 能力有限真正有意思的是組合。比如做一條短視頻可以串三個(gè) skill選題 skill負(fù)責(zé)根據(jù)熱點(diǎn)生成選題分鏡 skill負(fù)責(zé)把選題拆成鏡頭文案 skill負(fù)責(zé)給每個(gè)鏡頭配臺(tái)詞。三個(gè) skill 各司其職Agent 按順序調(diào)用。串接的關(guān)鍵是接口對(duì)齊。選題 skill 的輸出格式要能被分鏡 skill 直接當(dāng)輸入用。我一般會(huì)在設(shè)計(jì)時(shí)就約定好中間格式比如統(tǒng)一用 JSON{ topic: 夏季防曬誤區(qū), angle: 常見(jiàn)錯(cuò)誤認(rèn)知, target_audience: 20-35歲女性 }這樣分鏡 skill 拿到這個(gè) JSON就知道該往哪個(gè)方向拆。如果格式對(duì)不上中間就得加一個(gè)轉(zhuǎn)換步驟多一道手續(xù)就多一個(gè)出錯(cuò)點(diǎn)。6.2 怎么判斷一個(gè) skill 值不值得裝技能市場(chǎng)里 skill 很多但質(zhì)量參差不齊。我的判斷標(biāo)準(zhǔn)有三條。一看說(shuō)明文件是否完整。連SKILL.md都寫得含糊的腳本質(zhì)量大概率也不行。二看有沒(méi)有測(cè)試用例。好的 skill 會(huì)帶一個(gè)examples/目錄里面有輸入輸出樣例。沒(méi)有的話你得自己摸索怎么用時(shí)間成本高。三看依賴是否干凈。如果一個(gè) skill 依賴十幾個(gè)包其中還有幾個(gè)是冷門庫(kù)那維護(hù)成本會(huì)很高。優(yōu)先選依賴少、用主流庫(kù)的。6.3 自己寫 skill 的切入點(diǎn)如果你想自己寫 skill建議從自己每天重復(fù)做的事入手。比如每天要整理會(huì)議紀(jì)要、每天要跑一遍測(cè)試、每天要生成數(shù)據(jù)報(bào)表。把這些流程固化下來(lái)就是一個(gè) skill。寫的時(shí)候記住一個(gè)原則先能跑再優(yōu)化。不要一上來(lái)就追求完美架構(gòu)先寫一個(gè)能用的版本跑通了再考慮抽象、復(fù)用、錯(cuò)誤處理。我第一個(gè) skill 就是幾十行 Python丑是丑但確實(shí)省了我每天半小時(shí)。提示寫完 skill 后找個(gè)人幫你測(cè)一遍。你自己知道怎么用不代表別人知道。別人踩的坑往往就是你說(shuō)明文件沒(méi)寫清楚的地方。7. 關(guān)于 skills 生態(tài)的一些個(gè)人觀察skills 這套東西現(xiàn)在還在快速演化不同平臺(tái)的做法不太一樣。Claude 系偏向用文件夾加說(shuō)明文件的方式Codex 系更強(qiáng)調(diào)命令行集成Google Cloud 那邊則把 skill 和云服務(wù)綁定得更緊。這種碎片化短期內(nèi)不會(huì)消失但核心思路是一致的把能力封裝成可復(fù)用的單元讓 Agent 按需調(diào)用。我在實(shí)際使用中最大的體會(huì)是skills 的價(jià)值不在于單個(gè)技能多強(qiáng)大而在于組合起來(lái)的靈活性。一個(gè)只會(huì)寫周報(bào)的 skill 沒(méi)什么了不起但周報(bào) skill 加上數(shù)據(jù)分析 skill 加上圖表生成 skill就能自動(dòng)產(chǎn)出一份帶圖表的完整報(bào)告。這種組合能力才是 Agent 真正區(qū)別于普通腳本的地方。另外一點(diǎn)skills 的維護(hù)成本不能忽視。裝十個(gè) skill可能有三四個(gè)因?yàn)橐蕾嚫?、接口變化而失效。所以我現(xiàn)在會(huì)定期清理只留真正高頻使用的。技能不在多在精在穩(wěn)定。最后分享一個(gè)小技巧給每個(gè) skill 寫一個(gè)CHANGELOG.md記錄每次改了什么、為什么改。過(guò)幾個(gè)月回頭看能省下大量回憶的時(shí)間。這個(gè)習(xí)慣看起來(lái)麻煩但長(zhǎng)期看絕對(duì)值。