建個(gè)人技術(shù)資產(chǎn)管理系統(tǒng):基于零和哲學(xué)與Git、Docker的實(shí)踐指南)
最近在整理個(gè)人技術(shù)資產(chǎn)時(shí)我遇到了一個(gè)經(jīng)典難題如何高效、安全、可追溯地管理那些分散在本地、云端、甚至不同設(shè)備上的“數(shù)字資產(chǎn)”這里的資產(chǎn)不僅僅是代碼倉庫更包括項(xiàng)目文檔、配置模板、學(xué)習(xí)筆記、實(shí)驗(yàn)數(shù)據(jù)、甚至是臨時(shí)起意的腳本片段。傳統(tǒng)的文件夾分類、云盤同步或者簡單的Git倉庫在面對這種多源、異構(gòu)、且需要長期保存和快速檢索的“技術(shù)記憶”時(shí)往往力不從心。這讓我想起了十年前一個(gè)名為“星塵”的個(gè)人知識管理實(shí)驗(yàn)。它并非一個(gè)廣為人知的工具而更像是一種理念將零散的技術(shù)信息通過一套簡單的規(guī)則和工具鏈轉(zhuǎn)化為可連接、可執(zhí)行、可復(fù)現(xiàn)的“知識單元”。十年后的今天面對AI編程助手、低代碼平臺和愈發(fā)復(fù)雜的開發(fā)棧這種系統(tǒng)化“自存”的需求不是減弱了而是更強(qiáng)了。我們需要的不是一個(gè)更大的“垃圾抽屜”而是一個(gè)智能的“個(gè)人數(shù)字車間”。因此本文將以“星塵十周年《零和ZERO-SUM》自存”為引子探討如何為開發(fā)者構(gòu)建一個(gè)現(xiàn)代化、自動(dòng)化、版本化的個(gè)人技術(shù)資產(chǎn)管理系統(tǒng)。這不是對某個(gè)特定軟件的評測而是一套可落地的實(shí)踐方案。你將了解到如何利用現(xiàn)有開源工具如Git、Docker、Makefile、文本數(shù)據(jù)庫組合拳實(shí)現(xiàn)從信息收集、標(biāo)準(zhǔn)化處理、到檢索復(fù)用的完整閉環(huán)。更重要的是我會分享其中“零和”ZERO-SUM的設(shè)計(jì)哲學(xué)——如何通過減少系統(tǒng)熵增即混亂度來增加個(gè)人輸出的穩(wěn)定性和價(jià)值。如果你也受困于“上次那個(gè)腳本放哪兒了”、“這個(gè)環(huán)境當(dāng)初怎么配的”、“這個(gè)問題的解決方案好像在哪見過”這類問題那么這篇文章正是為你準(zhǔn)備的。我們將從理念到實(shí)踐一步步搭建屬于你自己的“技術(shù)記憶中樞”。1. 為什么你需要一個(gè)“技術(shù)資產(chǎn)管理系統(tǒng)”在深入方案之前我們必須先達(dá)成共識為什么簡單的筆記軟件或云盤不夠用開發(fā)者的“資產(chǎn)”有何特殊之處1.1 開發(fā)者資產(chǎn)的四大特性異構(gòu)性包含代碼多種語言、命令Shell, CMD、配置YAML, JSON, .env、文檔Markdown, PDF、數(shù)據(jù)CSV, 日志甚至整個(gè)容器鏡像。上下文依賴性一段代碼的有效性往往依賴于特定的運(yùn)行環(huán)境、依賴庫版本、配置文件甚至網(wǎng)絡(luò)狀態(tài)。缺少上下文資產(chǎn)就是“死”的。可執(zhí)行性許多資產(chǎn)如腳本、Dockerfile、Makefile的核心價(jià)值在于其可被重復(fù)執(zhí)行產(chǎn)生確定的結(jié)果??焖傺葑冃约夹g(shù)棧、最佳實(shí)踐、解決方案更新極快資產(chǎn)需要持續(xù)維護(hù)和版本化而非一次性存儲。1.2 傳統(tǒng)管理方式的痛點(diǎn)文件夾樹災(zāi)難項(xiàng)目一多文件夾嵌套深不見底命名隨意半年后自己都找不到。搜索失效全局文本搜索能搜到內(nèi)容但無法區(qū)分這是成功方案還是失敗嘗試也找不到運(yùn)行它的正確姿勢。環(huán)境失傳“這段代碼當(dāng)時(shí)在Python 3.7和TensorFlow 1.15下跑的”這種信息很少被記錄下來導(dǎo)致資產(chǎn)無法復(fù)現(xiàn)。碎片化存儲Gist存一段代碼筆記軟件存思路本地存數(shù)據(jù)云盤存文檔。關(guān)聯(lián)信息四分五裂。“星塵”理念的核心就是對抗這種無序化。它不追求一個(gè)全能工具而是定義一套最低限度的規(guī)范和一組能協(xié)同工作的工具讓資產(chǎn)自己“活”起來。2. 核心概念“零和”ZERO-SUM設(shè)計(jì)哲學(xué)“零和”在這里并非博弈論中的含義而是對系統(tǒng)狀態(tài)的一種追求。其核心是通過規(guī)范化的輸入和自動(dòng)化的處理使系統(tǒng)內(nèi)的混亂度熵維持在一個(gè)較低水平甚至趨向于零增長。這樣你投入的整理精力負(fù)熵與系統(tǒng)自然趨向的混亂正熵達(dá)成平衡甚至能產(chǎn)生凈收益。具體到我們的資產(chǎn)管理系統(tǒng)它體現(xiàn)為四個(gè)原則Z - Zero Context Loss (零上下文丟失)任何資產(chǎn)存入時(shí)必須捆綁其運(yùn)行所需的最小完備上下文。這包括環(huán)境說明、依賴列表、輸入輸出示例。E - Executable Verifiable (可執(zhí)行且可驗(yàn)證)資產(chǎn)應(yīng)盡可能封裝為可一鍵運(yùn)行或測試的單元如腳本、容器并能通過自動(dòng)化測試驗(yàn)證其功能。R - Retrievable Connected (可檢索且可連接)資產(chǎn)必須通過豐富的元數(shù)據(jù)標(biāo)簽、分類、關(guān)系進(jìn)行索引并支持資產(chǎn)間的關(guān)聯(lián)引用。O - Organized by Convention (約定優(yōu)于配置)使用固定的目錄結(jié)構(gòu)、命名模板和元數(shù)據(jù)格式減少決策成本提高自動(dòng)化處理的可能性。S - Single Source of Truth (單一事實(shí)來源)同一份知識或代碼只在一個(gè)核心位置維護(hù)其他地方通過引用或自動(dòng)化同步。U - Utility Over Perfection (效用優(yōu)于完美)不過度設(shè)計(jì)系統(tǒng)能解決80%的常見問題即可優(yōu)先保證可用性和持續(xù)運(yùn)行。M - Machine-Readable First (機(jī)器可讀優(yōu)先)所有元數(shù)據(jù)、配置均采用結(jié)構(gòu)化格式JSON, YAML便于工具鏈處理和批量操作。這套哲學(xué)是構(gòu)建后續(xù)所有技術(shù)方案的指導(dǎo)思想。3. 系統(tǒng)架構(gòu)與工具選型我們基于“零和”哲學(xué)設(shè)計(jì)一個(gè)輕量級、基于文本、版本可控的系統(tǒng)架構(gòu)。個(gè)人技術(shù)資產(chǎn)管理系統(tǒng)架構(gòu) ├── .archive/ # 核心資產(chǎn)庫 (Git倉庫) │ ├── snippets/ # 代碼片段 (按語言/功能分類) │ ├── scripts/ # 可執(zhí)行腳本 │ ├── configs/ # 配置模板 │ ├── docs/ # 技術(shù)筆記與解決方案 │ └── projects/ # 小型項(xiàng)目或?qū)嶒?yàn)原型 ├── manifest.yaml # 資產(chǎn)清單與元數(shù)據(jù)索引 ├── Makefile # 自動(dòng)化任務(wù)入口 ├── Dockerfile # 標(biāo)準(zhǔn)化運(yùn)行時(shí)環(huán)境 └── README.md # 系統(tǒng)使用說明工具選型說明版本控制Git。所有資產(chǎn)的核心庫是一個(gè)Git倉庫實(shí)現(xiàn)版本歷史、分支管理和多設(shè)備同步通過私有Git服務(wù)器或GitHub/Gitee私有庫。結(jié)構(gòu)化數(shù)據(jù)YAML。用于編寫manifest.yaml資產(chǎn)清單因?yàn)樗勺x性好且易于被腳本解析。自動(dòng)化引擎Makefile。作為統(tǒng)一的命令入口封裝復(fù)雜的查找、驗(yàn)證、打包等操作。環(huán)境標(biāo)準(zhǔn)化Docker/Docker Compose。為需要復(fù)雜環(huán)境的資產(chǎn)提供一次性、可復(fù)現(xiàn)的容器化運(yùn)行時(shí)。全文檢索ripgrep (rg)或fzf。在命令行中實(shí)現(xiàn)快速、強(qiáng)大的內(nèi)容搜索。元數(shù)據(jù)存儲SQLite??蛇x用于更復(fù)雜的查詢和關(guān)系管理。但對于起步Y(jié)AML清單足夠。4. 環(huán)境準(zhǔn)備與初始化你需要準(zhǔn)備一個(gè)Linux/macOS終端環(huán)境Windows可通過WSL2獲得最佳體驗(yàn)。4.1 基礎(chǔ)工具安裝確保你的系統(tǒng)已安裝以下工具# 檢查工具是否安裝 git --version make --version docker --version rg --version || echo ripgrep not installed, will use grep # 如果沒有使用包管理器安裝例如在Ubuntu上 # sudo apt update sudo apt install git make docker.io ripgrep fzf4.2 初始化資產(chǎn)庫# 1. 創(chuàng)建核心目錄 mkdir -p ~/tech-archive/.archive/{snippets,scripts,configs,docs,projects} cd ~/tech-archive # 2. 初始化Git倉庫 cd .archive git init git branch -M main # 3. 創(chuàng)建初始的manifest.yaml文件 cat manifest.yaml EOF # 個(gè)人技術(shù)資產(chǎn)清單 version: 1.0 maintainer: Your Name last_updated: 2023-10-27 assets: # 示例資產(chǎn)項(xiàng) - id: python-requests-example type: snippet title: Python Requests庫帶重試和超時(shí)的HTTP客戶端 description: 一個(gè)封裝了常用配置的requests.Session示例包含重試邏輯、超時(shí)設(shè)置和基礎(chǔ)認(rèn)證。 file_path: snippets/python/http_client_retry.py tags: [python, http, requests, retry, utility] dependencies: [requests2.25.1] context: 適用于需要穩(wěn)定HTTP請求的內(nèi)部API調(diào)用場景。 created: 2023-10-26 tested_on: [Python 3.8] EOF # 4. 創(chuàng)建Makefile入口 cat ../Makefile EOF .PHONY: help list search new-snippet run-snippet backup # 使用說明 help: echo 可用命令: echo make list - 列出所有資產(chǎn) echo make search KEYWORDxxx - 搜索資產(chǎn) echo make new-snippet TYPEpy - 創(chuàng)建新的代碼片段模板 echo make run-snippet IDxxx - 運(yùn)行指定的代碼片段如果可執(zhí)行 echo make backup - 備份資產(chǎn)庫到遠(yuǎn)程倉庫 # 解析YAML清單并列出資產(chǎn) (需要yq工具或使用python) list: echo 解析資產(chǎn)清單... (需要yq工具這里用偽代碼示意) echo 建議直接查看 manifest.yaml 或使用 grep 搜索 # 使用ripgrep進(jìn)行全文搜索 search: ifndef KEYWORD $(error 請使用 KEYWORDxxx 指定搜索關(guān)鍵詞) endif echo 正在全庫搜索 $(KEYWORD)... cd .archive rg -n --coloralways $(KEYWORD) || true # 創(chuàng)建新的代碼片段模板 new-snippet: ifndef TYPE $(error 請使用 TYPEpy|js|sh|sql 指定片段類型) endif mkdir -p .archive/snippets/$(TYPE) cat .archive/snippets/$(TYPE)/new_snippet_$$(date %Y%m%d_%H%M%S).$(TYPE) TEMPLATE #!/usr/bin/env $(shell echo $(TYPE) | sed s/py/python3/;s/sh/bash/) # Title: [請?zhí)顚憳?biāo)題] # Description: [請?zhí)顚懨枋鯹 # Tags: [tag1, tag2] # Dependencies: [] # Created: $$(date %Y-%m-%d) # Usage: [說明使用方法] # 代碼開始 TEMPLATE echo 新片段模板已創(chuàng)建在 .archive/snippets/$(TYPE)/ 目錄下。 # 備份到遠(yuǎn)程Git倉庫 backup: cd .archive \ git add . \ git commit -m Backup: $$(date %Y-%m-%d %H:%M:%S) \ git push origin main EOF # 5. 創(chuàng)建.gitignore文件 cat .archive/.gitignore EOF # 忽略臨時(shí)文件 *.tmp *.log *.swp # 忽略大型數(shù)據(jù)文件除非必要 *.data *.model *.zip *.tar.gz # 忽略環(huán)境相關(guān)文件通過Docker管理 .env venv/ __pycache__/ node_modules/ EOF echo 初始化完成你的個(gè)人技術(shù)資產(chǎn)庫位于: ~/tech-archive5. 核心工作流資產(chǎn)的“存、管、用”系統(tǒng)搭建好后關(guān)鍵在于日常使用的工作流。我們設(shè)計(jì)三個(gè)核心環(huán)節(jié)。5.1 “存”如何規(guī)范化地存入一個(gè)新資產(chǎn)假設(shè)你剛寫了一個(gè)有用的Python腳本用于清理日志文件。不要直接扔進(jìn)文件夾。步驟1創(chuàng)建標(biāo)準(zhǔn)化文件使用make new-snippet TYPEpy創(chuàng)建模板或手動(dòng)創(chuàng)建。cd ~/tech-archive/.archive/scripts cat cleanup_old_logs.py EOF #!/usr/bin/env python3 # Title: 自動(dòng)清理Nginx舊日志文件 # Description: 遞歸掃描目錄刪除超過30天的.log.gz壓縮日志文件。 # Tags: [python, devops, nginx, log-rotation, utility] # Dependencies: [] # Created: 2023-10-27 # Usage: python3 cleanup_old_logs.py /var/log/nginx # 代碼開始 import os import sys import time from pathlib import Path def cleanup_old_logs(directory, days30): now time.time() cutoff now - (days * 86400) dir_path Path(directory) for log_file in dir_path.rglob(*.log.gz): if log_file.stat().st_mtime cutoff: print(fDeleting: {log_file}) log_file.unlink() if __name__ __main__: if len(sys.argv) ! 2: print(Usage: python3 cleanup_old_logs.py directory) sys.exit(1) cleanup_old_logs(sys.argv[1]) print(Cleanup completed.) EOF步驟2更新資產(chǎn)清單manifest.yaml在manifest.yaml的assets:列表下新增一項(xiàng)- id: nginx-log-cleanup type: script title: 自動(dòng)清理Nginx舊日志文件 description: 遞歸掃描目錄刪除超過30天的.log.gz壓縮日志文件。 file_path: scripts/cleanup_old_logs.py tags: [python, devops, nginx, log-rotation, utility] dependencies: [] context: 適用于按日切割并壓縮的Nginx日志。直接運(yùn)行謹(jǐn)慎操作。 created: 2023-10-27 tested_on: [Python 3.8, Linux]步驟3提交版本cd ~/tech-archive/.archive git add scripts/cleanup_old_logs.py manifest.yaml git commit -m feat: add nginx log cleanup script5.2 “管”如何高效管理和檢索基于標(biāo)簽搜索由于所有資產(chǎn)都在manifest.yaml中索引你可以寫一個(gè)簡單的Python腳本或使用yq來查詢。# 文件~/.archive/tools/search_asset.py import yaml import sys with open(manifest.yaml, r) as f: data yaml.safe_load(f) keyword sys.argv[1].lower() if len(sys.argv) 1 else for asset in data.get(assets, []): if keyword in asset.get(title, ).lower() or \ keyword in .join(asset.get(tags, [])).lower() or \ keyword in asset.get(description, ).lower(): print(fID: {asset[id]}) print(fTitle: {asset[title]}) print(fFile: {asset[file_path]}) print(fTags: {, .join(asset.get(tags, []))}) print(- * 40)運(yùn)行python3 search_asset.py nginx命令行全文檢索使用make search KEYWORDlog或直接cd .archive rg -i cleanup。5.3 “用”如何復(fù)現(xiàn)和使用資產(chǎn)對于可執(zhí)行資產(chǎn)我們通過Makefile提供統(tǒng)一入口。# 在Makefile中新增目標(biāo) run-script: ifndef ID $(error 請使用 IDxxx 指定要運(yùn)行的腳本ID) endif echo 正在查找并運(yùn)行腳本: $(ID) python3 .archive/tools/find_and_run.py $(ID) # 工具腳本 find_and_run.py一個(gè)更簡單的辦法是直接根據(jù)ID找到文件路徑并執(zhí)行。關(guān)鍵是確保資產(chǎn)包含了足夠的上下文如依賴對于復(fù)雜環(huán)境下一步的Docker化是關(guān)鍵。6. 進(jìn)階使用Docker實(shí)現(xiàn)環(huán)境“零上下文丟失”這是實(shí)現(xiàn)“零和”哲學(xué)的關(guān)鍵一步。對于任何依賴特定環(huán)境的資產(chǎn)如需要特定Python包、數(shù)據(jù)庫客戶端等我們將其容器化。6.1 為資產(chǎn)創(chuàng)建Dockerfile假設(shè)我們有一個(gè)數(shù)據(jù)分析片段需要pandas和scikit-learn。# 文件.archive/snippets/data_analysis/Dockerfile FROM python:3.9-slim WORKDIR /workspace # 將資產(chǎn)代碼復(fù)制到容器內(nèi) COPY ./pandas_sklearn_demo.py ./demo.py # 復(fù)制依賴聲明文件如果有 COPY ./requirements.txt . # 安裝依賴 RUN pip install --no-cache-dir -r requirements.txt \ rm -rf /tmp/* /var/tmp/* # 設(shè)置默認(rèn)命令可以是運(yùn)行demo也可以是啟動(dòng)一個(gè)shell供交互 CMD [python, ./demo.py]對應(yīng)的requirements.txt:pandas1.5.3 scikit-learn1.2.06.2 在資產(chǎn)清單中記錄Docker信息- id: pandas-sklearn-demo type: snippet title: Pandas與Scikit-learn基礎(chǔ)數(shù)據(jù)分析流程 file_path: snippets/data_analysis/pandas_sklearn_demo.py tags: [python, data-science, pandas, scikit-learn] dependencies: [see Dockerfile] context: 此片段需要特定版本的pandas和sklearn已提供Dockerfile。 docker: build_context: snippets/data_analysis/ image_name: my-archive/pandas-demo:latest6.3 通過Makefile一鍵構(gòu)建和運(yùn)行# 在Makefile中新增 docker-run: ifndef ID $(error 請使用 IDxxx 指定資產(chǎn)ID) endif echo 構(gòu)建并運(yùn)行Docker化資產(chǎn): $(ID) # 這里需要先根據(jù)ID查找到docker配置然后執(zhí)行docker build和docker run # 為簡化假設(shè)資產(chǎn)ID與目錄名對應(yīng) cd .archive/snippets/data_analysis \ docker build -t pandas-demo . \ docker run --rm pandas-demo現(xiàn)在無論你換到哪臺有Docker的機(jī)器都可以通過make docker-run IDpandas-sklearn-demo完美復(fù)現(xiàn)該片段的運(yùn)行環(huán)境。7. 常見問題與排查思路問題現(xiàn)象可能原因排查方式解決方案make search無結(jié)果1.KEYWORD未傳入或?yàn)榭铡?.ripgrep未安裝。1. 檢查命令格式make search KEYWORDxxx。2. 運(yùn)行rg --version。1. 確保按格式輸入。2. 安裝ripgrep或修改Makefile使用grep -r。Git提交失敗提示大文件不小心將二進(jìn)制大文件如數(shù)據(jù)集、模型加入了版本庫。檢查git status和.gitignore文件。1. 使用git rm --cached file將其從暫存區(qū)移除。2. 將其路徑加入.gitignore。3. 對于必須版本化的數(shù)據(jù)考慮使用Git LFS。Docker構(gòu)建失敗1. Dockerfile語法錯(cuò)誤。2. 網(wǎng)絡(luò)問題導(dǎo)致依賴下載失敗。3. 構(gòu)建上下文路徑錯(cuò)誤。1. 查看Docker構(gòu)建錯(cuò)誤輸出。2. 檢查Dockerfile中RUN命令。3. 確認(rèn)docker build命令的路徑。1. 逐行檢查Dockerfile。2. 使用國內(nèi)鏡像源加速。3. 確保在Dockerfile所在目錄或正確指定上下文進(jìn)行構(gòu)建。無法根據(jù)ID找到資產(chǎn)1.manifest.yaml中ID填寫錯(cuò)誤或不存在。2. 搜索腳本邏輯有誤。1. 直接打開manifest.yaml文件查看。2. 運(yùn)行python3 search_asset.py 列出所有資產(chǎn)。1. 確保資產(chǎn)ID唯一且在清單中注冊。2. 調(diào)試或完善你的查找工具腳本。資產(chǎn)可執(zhí)行但運(yùn)行報(bào)錯(cuò)1. 本地環(huán)境與資產(chǎn)所需環(huán)境不符。2. 腳本有路徑依賴或權(quán)限問題。1. 檢查資產(chǎn)清單中的tested_on和dependencies。2. 在腳本中增加更詳細(xì)的錯(cuò)誤打印。1.優(yōu)先使用Docker封裝環(huán)境。2. 在腳本開頭檢查環(huán)境變量、路徑和權(quán)限。8. 最佳實(shí)踐與工程建議原子化存儲每個(gè)資產(chǎn)文件應(yīng)只解決一個(gè)明確的問題。避免創(chuàng)建“萬能工具”腳本而是拆分成可組合的小單元。元數(shù)據(jù)即文檔充分利用manifest.yaml中的description、context、tested_on字段。這些信息在未來檢索時(shí)比代碼本身更重要。定期回顧與清理每季度或每半年回顧一次資產(chǎn)庫。刪除過時(shí)的、被更好方案替代的資產(chǎn)。更新仍在使用的資產(chǎn)的元數(shù)據(jù)和依賴。自動(dòng)化備份將make backup命令加入你的crontab或CI/CD流水線確保資產(chǎn)庫的歷史版本安全??梢钥紤]推送到多個(gè)遠(yuǎn)程倉庫如GitHub私有庫Gitee私有庫。漸進(jìn)式復(fù)雜化不要一開始就追求完美的自動(dòng)化。先從手動(dòng)維護(hù)manifest.yaml和簡單的Makefile開始隨著資產(chǎn)增多再逐步編寫更智能的搜索、驗(yàn)證工具。安全第一資產(chǎn)庫中嚴(yán)禁存儲明文密碼、API密鑰、私鑰等敏感信息。使用環(huán)境變量或外部密碼管理工具。在.gitignore中嚴(yán)格排除敏感文件。與現(xiàn)有工具集成這個(gè)系統(tǒng)不是要取代你的IDE、筆記軟件或書簽管理器而是作為它們的“后端數(shù)據(jù)源”。你可以從筆記中鏈接到資產(chǎn)ID或在IDE中配置快捷命令來調(diào)用你的make search。9. 總結(jié)從信息囤積者到知識工程師“星塵十周年《零和ZERO-SUM》自存”這個(gè)主題其內(nèi)核并非懷舊而是指向一個(gè)更高效的開發(fā)者工作模式。我們通過構(gòu)建一個(gè)基于“零和”哲學(xué)的個(gè)人技術(shù)資產(chǎn)管理系統(tǒng)本質(zhì)上是在做以下幾件事將隱性知識顯性化把腦海中的“大概記得”變成可檢索、可執(zhí)行的確定資產(chǎn)。將臨時(shí)方案產(chǎn)品化把一次性的腳本和配置變成經(jīng)過封裝、測試、有文檔的“微產(chǎn)品”。降低未來決策成本當(dāng)類似問題再次出現(xiàn)你不再需要重新發(fā)明輪子或大海撈針而是能快速定位并復(fù)用歷史方案。這套方法的起點(diǎn)很低一個(gè)Git倉庫一個(gè)YAML文件但擴(kuò)展性極強(qiáng)。你可以根據(jù)需要引入更強(qiáng)大的檢索工具如Elasticsearch的本地實(shí)例、更復(fù)雜的編排如Kubernetes Job定義、或者與你的知識管理軟件如Obsidian、Logseq打通。真正的價(jià)值不在于工具本身而在于你開始以“工程師”的思維來管理自己的知識和產(chǎn)出。每一次有效的“自存”都是對個(gè)人技術(shù)能力的投資和復(fù)利。建議你從今天開始創(chuàng)建一個(gè)最簡單的manifest.yaml放入你最近解決的三個(gè)技術(shù)問題親身體驗(yàn)一下這種“有序”帶來的掌控感。