電腦科學發展到現在其實還不到一百年,卻已經從打孔卡一路走到了 AI,中間換過好幾次玩法。以前想寫程式、做系統開發,你得對電路怎麼接、硬體怎麼跑很有概念;現在有了 AI,幾乎任何人都能用日常講話的方式跟它一起把應用做出來。這篇想把這條路從頭到尾聊一遍,也順便把一個現代開發者該有的知識地圖補齊。
程式與系統開發方式的演變概覽
第一階段:1940年代(機器語言 Machine Language)
- 時代背景:二戰前後,最早的電腦(例如 ENIAC)誕生。ENIAC(Electronic Numerical Integrator and Computer,電子數值積分計算機)是世界上第一台可程式化的通用電子數位計算機,於 1943–1945 年間由 John Mauchly 與 J. Presper Eckert 在賓州大學打造,最初用於計算美軍的彈道射擊表。它有大約 1.8 萬顆真空管、重達 30 噸,算起來比人手快上千倍。不過那時候還沒有程式語言,所謂的寫程式,其實是靠實體插線和撥動開關來完成的。
- 溝通媒介:二進位代碼(
0與1)、打孔卡片、實體線路插拔。 - 開發者的狀態:那時候的工程師,與其說在寫程式,不如說是在做物理操作,直接在硬體上撥開關,把電訊號送進真空管裡。
- 技術限制:換一台不同型號的電腦,同一套運算邏輯就必須重新打孔、重新接線。
Betty Snyder 與 Glen Beck 於 1945 年在彈道研究實驗室,靠插線和撥開關為 ENIAC 編程,這大概是機器語言時代最有代表性的一張照片了。src: Wikipedia, ENIAC
第二階段:1940年代末期~1950年代初期(組合語言 Assembly Language)
- 時代背景:第一代馮·紐曼架構(Von Neumann architecture)的電腦開始運作,科學家受夠了無窮無盡的
0和1。 - 溝通媒介:英文縮寫與助記符(如
MOV,ADD,JMP)。 - 發展出了組譯器(Assembler),開發者終於可以用人類看得懂的短單字來代表二進位指令。
- 技術限制:雖然不用寫
0和1,但依然被死死綁在硬體架構上。開發者還是得親自管理 CPU 暫存器與記憶體位址,且不同硬體廠商的組合語言完全不互通。
1949 年劍橋大學的 EDSAC 電腦是最早的儲存程式電腦之一,象徵組合語言時代的開端。src: Wikipedia
J. Robert Oppenheimer(左)與 John von Neumann(右)於 1952 年 10 月 IAS 電腦落成典禮合影,象徵組合語言時代電腦設計的理論基礎。src: Encyclopaedia Britannica
第三階段:1950年代中期~2022年(高階程式語言 High-level Languages)
這是軟體工程史上最漫長、分支最龐大的一個時代。人類在這個階段停留了將近 70 年,並在內部經歷了多次微小的典範轉移:
- 1950年代中期(科學與商業運算):FORTRAN(1957)和 COBOL(1959)誕生,人類第一次能用類似數學公式與基礎英文句型的語法來寫程式。
- 1970年代(系統級抽象):C 語言(1972)出現,成為現代軟體工業的基石,幾乎所有後來的作業系統都基於此。
- 1990年代(物件與網際網路):Java(1995)、Python、C++ 普及,大家開始用物件導向的方式,把真實世界的東西模擬進程式裡。
- 溝通媒介:極度嚴謹的英文語法、迴圈(
for,while)、條件判斷(if/else)。 - 編譯器(Compiler)和直譯器(Interpreter)也是在這時候出現的,程式碼終於跟硬體脫鉤,工程師不用再管底層 CPU 長什麼樣子。
- 技術限制:語法幾乎沒有容錯空間,少一個分號、縮排錯一格,程式就直接掛給你看。
Ken Thompson(左)與 Dennis Ritchie(右)於 1973 年攝於貝爾實驗室。Ritchie 開發的 C 語言讓 Unix 得以用高階語言重寫核心,實現了跨硬體平台移植,奠定現代軟體工業的基石。src: History of Information
第四階段:2022年底~至今(自然語言 Natural Language)
- 時代背景:以 ChatGPT(2022年底發布)為標誌性起點,大語言模型(LLM)突破了理解人類語境的門檻。
- 溝通媒介:人類的日常自然語言(甚至包含錯字與語病)+ 提示詞(Prompt)。
- 這時候輪到 AI 大型語言模型上場。開發者的角色從寫執行步驟的人(How to do)變成講清楚自己要什麼的人(What I want)。你下個指令,AI 就能把自然語言轉成 Python 或 C,再丟給傳統編譯器變成機器碼。
- 技術特徵:寫程式的門檻被壓得很低。真正吃重的能力,也從背得出語法,變成能不能想清楚整個系統、能不能把需求講明白(也就是所謂的 Prompt Engineering)。
ChatGPT 使用者介面截圖。2022 年底發布的 ChatGPT 標誌著自然語言時代的起點,開發者只需用日常語言下達指令,AI 便能理解意圖並轉譯為程式碼。src: Wikimedia Commons(CC BY 3.0)
現代開發技術棧
開發應用與系統的流程,已經從一個人埋頭寫程式,變成跟 AI 一起寫程式。動手之前,先花點時間把整張技術地圖攤開來看會比較有方向。
所謂的技術棧(Tech Stack),其實就是你拿來蓋一個網站或應用的一整套工具組合。講白一點,大致可以分成四塊:
-
前端(Frontend):使用者看得到、摸得到的那一層。
- React / Next.js:負責畫介面的函式庫,加上一套全端框架。
- TypeScript:補上型別檢查,讓你少踩很多低級錯誤。
- Tailwind CSS:實用工具優先的樣式框架,排版排得又快又順手。
- 後端(Backend):藏在畫面背後、真正在幹活的那一層。
-
資料庫(Database):東西總得存下來。
- PostgreSQL:功能很全能的關聯式資料庫。
- MongoDB:走彈性 schema 路線的 NoSQL 文件型資料庫。
- Redis:常拿來當高速快取或訊息佇列。
-
部署與維運(Deployment / DevOps):怎麼把東西穩穩地送上線。
- Docker:把環境包成一致的容器,到哪跑都一樣。
- Vercel / Cloudflare:現代前端與無伺服器(Serverless)託管平台,部署很省事。
- Kubernetes:規模一大、要管一堆微服務時,靠它做容器自動化部署。
補充:這些技術的權威資源,通常就是它們的官方網站與官方文件,上面連的都是各自的官網。原始碼可到對應的 GitHub 專案查看,例如 facebook/react、vercel/next.js、microsoft/TypeScript、kubernetes/kubernetes 等。
下面就一塊一塊往下拆,聊聊各自現在比較主流的選擇。
前端
現在新專案大部分都會從 Meta framework 開始,比較少人會想自己從零組合造輪子。
- Meta framework 是常見起點:Next.js 和 Nuxt 內建路由、資料取得、快取、渲染策略,省下不少重造輪子的時間。
- React Server Components + SSR:讓 server-first 變成預設做法,只把真正需要互動的部分送到瀏覽器。
- TypeScript:2025 年已超越 Python 和 JavaScript,成為 GitHub 上貢獻者最多的語言。2026 年還在正式專案寫純 JavaScript 多少會被當成有點過時。
後端
後端並不像前端那樣擁有如此明顯的典範轉移,則比較像是看團隊需求選擇,但雲端原生已經算是預設的選擇:
- Node.js/TypeScript、Python(Django/FastAPI)、Go、Rust 都還很活躍,選擇通常取決於團隊背景與需求。
- 如果產品會應用到 AI/ML,Python 的 FastAPI 是比較常見的選擇,畢竟 AI 生態系是 Python 優先的,LangChain、LlamaIndex、DSPy、CrewAI 全部都是 Python 原生。
- 架構上 serverless 和 microservices 依然是主流,雲端原生(AWS/GCP/Azure)搭配容器編排也是常使用的方式。
AI 應用開發
這塊是目前變動最快的,也最難整理出一套穩定技術棧:
- LangChain + FastAPI + Next.js:這套組合被不少人稱為 2026 年比較受矚目的技術棧,滿適合需要整合 LLM、做 AI 副駕駛的產品。
- 常見的切分方式是:Next.js 處理前端與使用者體驗,FastAPI 專門處理 AI 推論與 pipeline,兩邊用型別化的 API 合約溝通。
- 建議先把架構骨架定下來就好,工具鏈細節(agent framework 用哪個、RAG pipeline 接哪個向量資料庫)留到動手做的時候再查。
跨平台 App
- React Native + Expo:如果本來就熟悉 React、TypeScript,這條路走起來比較順,網頁端的元件邏輯可以直接共用,Expo 現在是官方推薦的預設起點。
- Flutter:如果產品比較動畫密集、視覺一致性是核心賣點(例如要求中階 Android 也保證 60/120fps),或團隊本身沒有 React 背景,Flutter 自己畫像素,跨裝置的視覺一致性目前 React Native 還做不太到。
開發部署
部署沒有標準答案,取決於專案類型與預算:
- Next.js 專案優先考慮 Vercel + Supabase(原廠平台,零配置,但 Hobby 方案不能商用)。
- 預算有限、流量會快速成長選 Cloudflare Pages(幾乎無限免費頻寬,但 Workers 不是完整 Node.js 環境)。
- 後端有 AI 推論需求可搭配 Railway、Fly.io 或 Modal(容器/長連線模型,不受 serverless 執行時間限制)。
- 需要精細控制基礎設施,或已有既有雲端資源則考慮 AWS/GCP/Azure 或自管 Docker + VPS,學習曲線最陡但彈性最大。
技術棧參考資源:
Python
- 為你自己讀 CPython 原始碼:理解直譯器運作,對 AI 效能工程蠻有幫助的
- Fluent Python(第二版):想寫出道地又有效率的 Python,這本大概是公認的標竿。它會帶你深入資料模型、裝飾器、上下文管理器這些語言內部機制,重點不在語法,而在告訴你 Python 為什麼要這樣設計
- Real Python 進階教學專區:涵蓋並行處理(concurrency)、元編程(metaprogramming)、效能優化、CPython 內部運作、C 擴充套件,內容扎實、免費,是 Real Python 官方整理的進階學習路徑
- Raymond Hettinger 的 PyCon 演講:他是 Python 核心開發者之一,也是社群裡公認最會講技術的人。像 Transforming Code into Beautiful, Idiomatic Python 這場,YouTube 上都找得到完整版,看完你對什麼叫 Pythonic 會有完全不一樣的體會
- Python 官方文件的 What's New:每個新版本發布時官方寫的完整說明,養成習慣讀這個,會發現很多你天天用卻不知道存在的新特性,也是了解語言演進方向最直接的管道
- Real Python:Async IO 完整教學:Python 的非同步程式設計是最容易學了語法但用不好的一塊,這篇把
asyncio的概念和實務講得很完整,對接 FastAPI 這類非同步框架會有幫助
TypeScript
- 深入理解 TypeScript(中文):進階向,值得讀
- Total TypeScript Essentials:Matt Pocock 整理的精華
- Bun Runtime:現代 TypeScript 執行環境,2025 年 12 月被 Anthropic 收購,現在是 Claude Code 底層基礎設施之一,維持開源、MIT 授權
React 生態 / Next.js
- React 官方文件 Quick Start:React 19 的起點
- Next.js 官方 Learn 課程:免費互動課程,帶你從零建一個財務儀表板,涵蓋路由、資料抓取、串流、身份驗證,官方團隊寫的,算是最權威的起點
- Next.js App Router 官方文件:查細節功能會用到,2026 年 Pages Router 已進入維護模式,直接學 App Router 就好
- Electron:跨平台桌面應用(工具類產品常用)
- Capacitor by Ionic:Web 打包成原生 App,通常會比從零學 Flutter/Dart 快一些上線(這點是合理推論,沒查到 2026 年的具體數據佐證)
後端 / AI 應用開發
- FastAPI 官方 Learn 文件:官方形容這是一本書、一門課,也是官方推薦的學習路徑,從基礎到進階都涵蓋,品質公認很高
- LangChain 官方 Learn 文件:官方教學、概念說明與 RAG/agent 範例,是目前最新版本(LangChain v1.x)的權威參考,這塊工具鏈變動快,建議直接看官方文件而非教學文章,比較不會學到過時寫法
跨平台 App
- React Native + Expo:Expo 官方文件,2026 年官方推薦的 React Native 起手式
- Flutter:Flutter 官方文件
系統與資料基礎
開發應用與系統的工作流程,除了知道怎麼跟 AI 協作、怎麼用好工具之外,還有一塊很容易被忽略、但決定系統扛不扛得住的基礎知識。
資料結構與演算法基礎
它決定的是你寫出來的程式碼會不會在資料量變大時垮掉。
- 常見資料結構:陣列、雜湊表(hash table)、鏈結串列、樹(尤其是二元搜尋樹)、圖(graph)。你不用背到能手刻紅黑樹,但要知道每種結構查找、插入、刪除大概要花多少時間,以及什麼情境該用哪一種。
- 時間複雜度(Big O):能看懂 O(1)、O(log n)、O(n)、O(n log n)、O(n²) 的差異,並在寫程式時大致判斷自己寫的迴圈屬於哪一種,是資深與初階工程師最明顯的分水嶺之一。
- 排序與搜尋演算法:不用手刻,但要理解為什麼資料庫索引用 B-tree、為什麼二分搜尋比線性搜尋快這麼多。
- 實務上的用法:多數時候你不是在發明演算法,而是在判斷這裡用 Set 還是 Array 比較快、這個 N+1 query 該怎麼用雜湊表解掉。真正的價值,是把這些知識用在效能除錯和程式碼審查上。
進一步閱讀:NeetCode、Big O Cheat Sheet
安全基礎
安全這件事,不是丟給資安團隊就沒你的事,而是每個開發者在寫程式的當下就該放在心上的預設意識。
- OWASP Top 10:目前業界公認最該優先了解的清單,涵蓋 SQL Injection、XSS、CSRF、權限控管失效等常見漏洞類型。
- 認證與授權(Authentication vs Authorization):先分清楚你是誰、跟你能做什麼,這是兩回事;OAuth 2.0、JWT 的基本運作原理要熟。
- 密鑰與敏感資訊管理:API key、資料庫密碼絕對不能寫死進程式碼或進 Git 歷史,環境變數、密鑰管理服務是基本配備。
- 輸入驗證:任何使用者輸入都要假設是惡意的,先驗證再處理。
- HTTPS/TLS:所有正式環境都該強制 HTTPS,知道憑證是怎麼運作的。
進一步閱讀:OWASP Top 10、OWASP Cheat Sheet Series
資料庫與 API 設計
- SQL 基礎:就算專案用了 ORM,你還是得看得懂、也寫得出基本的 SQL,像 SELECT、JOIN、GROUP BY、子查詢這些,都是除錯效能問題時繞不開的東西。
- 資料庫設計:正規化的基本概念、什麼時候該反正規化換效能、索引怎麼加才有效。
- 關聯式 vs 非關聯式資料庫:PostgreSQL/MySQL 適合結構化、需要交易一致性的資料;MongoDB、Redis 這類適合彈性 schema 或高速快取的場景。
- API 設計原則:REST 目前仍是約 85% 組織採用的主流,理解 HTTP 方法語意(GET/POST/PUT/DELETE)、狀態碼該怎麼用、版本控制怎麼做;GraphQL 則適合前端需要彈性查詢欄位的場景。
- API 文件化:OpenAPI/Swagger 讓 API 契約可以被前後端、甚至 AI agent 讀懂,是團隊協作的基本配備。
系統設計與可擴展性
- 快取策略:知道什麼資料適合快取(讀多寫少)、快取失效策略怎麼設計,Redis 是目前最常見的實作工具。
- 水平擴展 vs 垂直擴展:垂直擴展是加大單台機器規格,水平擴展是加更多台機器分攤流量。
- 負載平衡:多台伺服器之間怎麼分流量,基本概念要懂。
- 可觀測性(Observability):日誌(logging)、指標(metrics)、追蹤(tracing)三支柱,系統出問題時能不能快速定位到根因,取決於這塊有沒有做好。
- CAP 定理與取捨思維:一致性、可用性、分區容錯性這三者沒辦法同時做到完美,這個取捨的概念放在心裡,選資料庫、選架構時會有幫助。
進一步閱讀:Use The Index, Luke、REST API Tutorial、System Design Primer
被忽略的開發基本功
透過這門 MIT 的課程 The Missing Semester of Your CS Education,補齊一些容易被忽略卻很關鍵的技術能力。這門課由 MIT 校友 Anish Athalye、Jon Gjengset 與 Jose Javier Gonzalez Ortiz 共同開設,屬於 MIT 獨立活動期(IAP)的非學分課程,從 2019 年開課至今,持續在全球開發者社群間廣受轉發。
1. Shell 入門
sh shell
Windows PowerShell - 也是一種 shell
- 終端與 Shell:終端(terminal)是視覺介面,而 Shell 是實際解讀指令的程式。bash 是 Linux/macOS 最常見的 Shell,zsh/fish 提供更好的易用性。
- 基本導航:
cd、pwd;絕對路徑 vs 相對路徑;.(當前目錄)與..(父目錄)。 $PATH與程式查找:Shell 透過$PATH環境變數尋找可執行檔;which可查詢指令實際路徑。- 常見命令:
cat、sort、uniq、head/tail、grep、sed、find、awk。 - 推薦替代工具:
eza(取代ls)、bat(取代cat)、ripgrep(取代grep)、fd(取代find)。 - 管道與組合:
|串接多個程式的輸出入,可組合出複雜的一行指令。 - 腳本撰寫慣例:shebang(
#!/bin/bash)決定用哪個直譯器執行;set -euo pipefail讓腳本在出錯時提早退出;建議搭配shellcheck檢查腳本。 - AI 輔助:可用 LLM 解釋命令用途、協助撰寫與除錯 Shell 腳本,或將過長的 bash 腳本(100+ 行)轉譯成 Python。
2. 命令列環境(Command-line Environment)
- CLI 慣例五要素:參數(arguments)、串流(streams)、環境變數(environment variables)、返回碼(return codes)、信號(signals)。
- 參數與旗標:
$1~$9存取個別參數;$@存取全部參數;旗標慣例為-x單字母或--xxx長名稱,可合併寫(如ls -la)。 - Globbing 通配符:
*(任意字元)、?(單一字元)、{}(多重展開);zsh 支援**遞迴匹配。 - 串流機制:每個程式都有
stdin/stdout/stderr三條標準流;管道裡串起來的多個程式,其實是同時啟動、一起跑的。 - 環境變數:賦值語法
foo=bar(等號兩側不可有空格);用export讓變數傳遞給子行程。 - 返回碼:程式結束時回傳 0(成功)或非 0(失敗);
&&(前者成功才執行)、||(前者失敗才執行)。 - 信號(Signals):
Ctrl-C實際上是 Shell 送出SIGINT訊號中斷正在執行的行程。
3. 開發環境與工具(Development Environment and Tools)
- IDE vs 終端工作流:IDE(如 VS Code)易上手、AI 整合較完整;終端工作流(tmux + Vim + zsh)輕量、在無 GUI 環境也能用。建議兩者都熟悉,至少精通一種。
-
Vim 的哲學:Vim 的操作介面本身就像一套小型語言,每個按鍵都是可以組合的命令,目標是讓你想到什麼、手就能同步做到。
- 模態編輯(Modal Editing):Normal、Insert、Replace、Visual、Command-line 五種模式;
<ESC>隨時回到 Normal 模式。 - 動詞加名詞的語法:移動指令(
w下一個字、0/$行首行尾)可與編輯指令(d刪除、c修改、y複製)組合,並可加上數量與修飾詞(如ci(修改括號內文字)。 - Vim 無所不在:VS Code(VSCodeVim 外掛)、Zsh、甚至 Claude Code 都內建 Vim 模式支援。
- 模態編輯(Modal Editing):Normal、Insert、Replace、Visual、Command-line 五種模式;
- Language Server:透過 LSP(Language Server Protocol)提供自動完成、內嵌文件顯示、跳轉定義查找所有引用、匯入管理等功能。
- AI 輔助開發的三種形態:自動補齊(autocomplete)、行內聊天(inline chat)、編程代理(coding agents)。
4. 調試與效能分析(Debugging and Profiling)
- Print Debugging 與 Logging:加入輸出定位問題是最基本的手段;更進階是用日誌框架(INFO/DEBUG/WARN/ERROR 等嚴重級別、支援結構化資料)。
- 除錯器(Debuggers):適合那種你不確定要印什麼、或問題很難重現的情境。泛用型有
gdb、lldb,語言專用型像 Python 的pdb。 - Record-Replay 除錯:
rr能把一次執行完整錄下來,再一模一樣地重播,甚至可以用reverse-continue、reverse-step往回倒著除錯。 - 系統呼叫追蹤:
strace(Linux)/dtruss(macOS)可觀察程式發出的每個系統呼叫;bpftrace(基於 eBPF)可在核心層做低開銷的追蹤。 - 網路除錯:
tcpdump/Wireshark 抓封包分析;HTTPS 加密流量可用mitmproxy或瀏覽器開發者工具的 Network 分頁。 - 效能量測:
time指令拆解出 Real(壁鐘時間)、User(使用者程式碼 CPU 時間)、Sys(核心程式碼 CPU 時間)三種時間,可判斷程式是卡在運算還是卡在等待。 - 資源監控:
htop/btop、iotop、free、lsof、ss。 - CPU 效能分析器:Linux 標準工具
perf;perf stat看整體概覽,perf record/perf report搭配火焰圖(Flame Graph)視覺化熱點。各語言專屬:Python 的cProfile/py-spy、Go 的go tool pprof。 - 效能基準測試:
hyperfine用來比較不同實作或工具的效能,自動跑多次取平均與標準差。
5. 版本控制與 Git(Version Control and Git)
- 單人開發也有用:能隨時回顧舊版本、留下修改原因的紀錄。
- 多人協作不可或缺:能快速看出是誰在何時改了什麼、快速找出是哪次修改導致某個測試壞掉。
資料模型
Git 跟其他版本控制系統(像 SVN)最大的差別,在於它把檔案和目錄的變化歷史,看成一連串的快照(Snapshot):每一個快照,就是某個時間點整棵頂層目錄樹的完整狀態。
// 1. 檔案 (blob):就是一堆單純的位元組 (byte),本身不記錄檔名,只有內容
type blob = array<byte>
// 2. 目錄 (tree):把檔名/目錄名對應到特定的 blob 或其他 tree (支援子目錄)
type tree = map<string, tree | blob>
// 3. 快照 (commit):記錄父節點、作者、訊息,以及指向該次快照頂層 tree 的指標
type commit = struct {
parents: array<commit>
author: string
message: string
snapshot: tree
}
// 4. 物件儲存庫 (objects):Git 的核心是一個大 Map,所有物件以 SHA-1 雜湊值定址
objects = map<string, blob | tree | commit>
// 5. 參照 (references):將人類可讀的名稱 (如 main, HEAD) 對應到特定的 SHA-1 雜湊值
references = map<string, string>
三個核心概念:blob、tree、commit
blob(檔案):就是一堆位元組(byte),本身不記錄檔名,單純是內容。src: xosh.org
tree(目錄):把名稱對應到 blob 或其他 tree,所以目錄底下可以再放子目錄。src: xosh.org
commit(快照):記錄父 commit、作者、訊息,以及指向這次快照對應的頂層 tree;commit 本身不可變,所謂改歷史,其實是在建立新的 commit。src: xosh.org
所有物件以 SHA-1 雜湊內容定址(content-addressed),彼此靠雜湊值互相參照。src: xosh.org
歷史是 DAG(有向無環圖)
Git 的提交歷史不是單純的線性列表,而是有向無環圖(Directed Acyclic Graph)。因為一個 commit 可以有多個父提交,例如將兩條平行開發的分支合併(Merge)時,產生的合併提交就會指向兩個父節點。
src: xosh.org
References 與 HEAD
src: xosh.org
- References(參照):人類記不住 SHA-1 雜湊值,所以 Git 用 References 來指向特定的 commit。最常見的 Reference 就是分支(例如
main)。分支指標是可變的,當你在該分支新增 commit 時,指標會自動往前推移。 - HEAD:代表你目前所在的位置(通常指向某個分支,如
HEAD -> main)。 - Detached HEAD(分離的 HEAD 狀態):如果你直接
checkout到某個特定的 commit 雜湊值,HEAD就會脫離分支,直接指向該 commit。在這種狀態下做的任何新提交,如果沒有建立新分支把它接住,切換回其他分支後,這些新提交就變成沒人指向的孤兒,最後會被 Git 回收掉。
src: xosh.org
儲存庫三個區域
- 工作目錄(Working Directory):你目前真正在編輯的實體檔案。
- 暫存區(Staging Area / Index):讓你自己挑這次到底要提交哪些修改,可以把手上的變動拆成好幾個乾淨、獨立的 commit。
- 儲存庫歷史(Repository / History):已經被 commit 記錄下來的不可變快照。
src: xosh.org
常用指令速查
- 基礎:
git init、git status、git add、git commit、git log --all --graph --decorate、git diff - 分支與合併:
git branch、git switch、git checkout -b <name>、git merge、git rebase - 遠端操作:
git remote、git push、git fetch、git pull、git clone - 進階:
git add -p(互動式部分暫存)、git rebase -i(互動式重寫歷史)、git blame、git stash、git bisect(二分搜尋找出引入 Bug 的 commit)、git worktree(同時檢出多個分支到不同目錄,多 AI 代理並行修改時常用)
進一步閱讀:Oh Shit, Git!?!、Git 官方書籍
6. 程式碼打包與發布(Packaging and Shipping Code)
程式碼寫完只是第一步。怎麼讓別人的電腦、或是伺服器也能順順利利跑起來你的程式,才是打包與發布真正要解決的問題。
-
依賴與環境:當你執行像是
pip install requests這樣的指令時,套件管理員在背後幫你做了四件重要的事情:- 搜尋套件庫(如 Python 的 PyPI、Node.js 的 npm)
- 尋找對應版本(根據 OS、硬體架構與語言版本)
- 解析遞移依賴(Transitive Dependencies)
- 下載與安裝到正確的系統目錄
1.0 版,而專案 B 需要套件 X 的 2.0 版,如果把它們都安裝在全域環境,就會發生版本衝突。
- 虛擬環境:在 Python 中,我們會用
venv來為每一個專案建立獨立的資料夾環境,將各專案的依賴完全隔離。現代更推薦使用由 Rust 開發的uv,安裝速度極快(快上數十倍),還能同時管理多個 Python 版本並存的問題。 - 專案規格檔:
pyproject.toml(基於 PEP 517 與 PEP 621)現在所有的專案設定都應該收斂到這個單一檔案中。 - 製品與打包(Artifact):在 Python 生態系中,最常見的製品格式是 Wheel (.whl),透過
uv build可以將原始碼同時打包成預先編譯好的 Wheel 以及原始碼分發包。 -
版本發布與 SemVer:語意化版本(SemVer),格式為
MAJOR.MINOR.PATCH:- PATCH(修訂號):單純修復 Bug,完全向下相容。如
1.0.0→1.0.1 - MINOR(次版號):新增了新功能,向下相容。如
1.0.1→1.1.0 - MAJOR(主版號):引入了破壞性變更(Breaking Changes)。如
1.1.0→2.0.0
- PATCH(修訂號):單純修復 Bug,完全向下相容。如
- 其他主題:可重現性(Reproducibility)、虛擬機與容器(Docker)、配置管理、服務與編排(Kubernetes)、CI/CD。
7. 代理式編程(Agentic Coding)
編程代理是一個被賦予了工具存取權的對話式 AI。它通常存在於你的 IDE 內(如 Cursor、Windsurf),或是獨立的終端機工具中(如 Claude Code)。它不僅能跟你對話,還能自主執行以下操作:
- 讀取與寫入本地檔案
- 進行網路搜尋(查閱最新 API 文件)
- 在終端機執行 Shell 指令(如跑測試、編譯、建置)
運作原理
不要把 Agent 當成魔法,底層邏輯其實非常清晰:
- LLM 的本質:說到底,大語言模型做的還是同一件事:給它一段輸入字串,它去預測接下來該輸出什麼,靠的是機率分佈取樣。
- Harness:Agent 的核心,其實是一個夾在你和 LLM 中間的控制程式(Harness)。
-
回饋迴圈(Feedback Loop):
- Harness 會把你的提示詞、對話歷史、以及目前工作區的狀態組合成一大包字串送給 LLM。
- LLM 回傳的字串裡,可能夾帶著呼叫某個工具的指令(例如:讀取檔案 A、或執行指令 B)。
- Harness 攔截到這個指令後,真正在你的電腦上執行它,並把執行結果當作新的輸入再次送給 LLM。
- 每次工具呼叫,都會重新觸發一次 LLM 的推理,直到任務完成。
典型用例
- 實現新功能:直接用自然語言描述需求。若搭配測試驅動開發(TDD),Agent 可以自己寫代碼、自己跑測試,直到測試通過為止。
- 修復 Bug:給 Agent 一個報錯訊息,讓它自行在專案中搜尋問題、修改程式碼,並重新執行失敗的檢查來驗證是否修復。
- 重構程式碼(Refactoring):指令 Agent 整理架構或抽離共用邏輯。
- 程式碼審查(Code Review):搭配 GitHub CLI,讓 Agent 直接幫你看 Pull Request。
- 程式碼理解:對著一個完全陌生的龐大專案問問題,極度有助於新人上手。
- Vibe Coding:完全不親手寫任何一行程式碼,純粹靠自然語言與 Agent 互動來完成整個軟體專案。
進階用法
- 可重用的 Prompt / 模板:把複雜、常用的提示詞(如你個人的 Code Style 規範)存成模板重複使用。
- 並行多代理(Parallel Agents)與
git worktree:當任務龐大時,可同時開啟多個 Agent 處理不同任務;搭配 Git 的worktree功能,讓不同的 Agent 在獨立的目錄下操作同一個儲存庫的不同分支,互不干擾。 - MCP(Model Context Protocol):一套開放協議,把 AI 模型要怎麼接上外部工具和資料源這件事標準化了。舉個例子,你裝一個 Notion 的 MCP 伺服器,IDE 裡的 Agent 就能直接讀寫你的 Notion 筆記。
- 上下文管理(Context Management):LLM 的上下文窗口(Context Window)是有上限的,塞太多沒用的東西反而會讓它開始亂編。幾個實用做法:該清空上下文時就清、善用回滾對話、需要的話做上下文壓縮。
進一步閱讀:200 行程式碼理解 Agent 核心概念
8. 程式碼品質(Code Quality)
寫出能跑的程式碼只是第一步,如何確保程式碼在多人協作、長期維護下依然保持一致性與穩定性?
-
格式化(Formatting):處理表面語法的一致性(單引號還是雙引號、大括號要不要換行、import 的順序等)。
- 高度可配置:如前端常用的
Prettier,允許你微調各種排版細節。 - 獨裁且不可配置:像 Python 的
Black或 Go 的gofmt,故意不給你什麼選項調,就是要省掉大家為了排版細節吵不完的單車棚效應(Bikeshedding)。
.editorconfig。 - 高度可配置:如前端常用的
-
靜態檢查(Linting):比格式化更深入,負責分析程式碼並找出反模式、潛在 Bug 或未使用的變數。進階工具
semgrep是基於抽象語法樹(AST)的搜尋工具,讓你即使跨越不同的程式語言,也能自訂檢查規則。 -
測試(Testing):依照粒度分為三層:
- 單元測試(Unit Test):測試單一函數或類別,速度最快。
- 整合測試(Integration Test):測試多個模組之間的互動是否正常。
- 端到端測試(E2E / Functional Test):模擬真實使用者操作整個系統,速度最慢但最接近真實。
- TDD(測試驅動開發):先寫好測試(此時測試會失敗),再寫實作程式碼讓測試通過。
- 回歸測試:當你修好一個 Bug 後,一定要寫一個對應的測試,確保未來這個 Bug 永遠不會再出現。
- 屬性測試(Property-based Testing):定義屬性,由工具(如 Python 的
Hypothesis)自動生成大量隨機且極端的輸入來轟炸你的程式,找出你想都沒想過的邊界情況。 - 測試覆蓋率:它頂多是個輔助指標,別盲目追求 100%。因為這行程式有被執行到,不代表它的邏輯真的被驗證過。
- Pre-commit Hooks:每次你
git commit時自動幫你跑格式化、Linting,甚至跑一部分測試,讓那些髒亂、不符規範的程式碼,連進 Git 儲存庫的資格都沒有。 - 持續集成(CI):利用如 GitHub Actions 等工具,在每次
push、發起Pull Request或定期排程時,在雲端伺服器自動執行格式化檢查、Linting、測試與型別檢查。CD(持續部署)進一步延伸 CI,當測試全數通過並合併到主分支後,自動建置並部署到正式環境。 - 命令運行器(Command Runner):現代專案的指令常常又臭又長。我們可以使用像
just(現代版的make)這樣的工具,把複雜的指令包裝成簡短好記的別名(如just lint或just test)。 - 正則表達式(Regular Expressions):一種專門用來比對字串樣式的語言,在程式碼品質控管裡到處都用得到。
9. 程式碼之外(Beyond the Code)
軟體開發本質上是一場跨越時間與空間的溝通。你寫下的程式碼、註解、README 與 Commit Message,都是在與其他人(未來的同事、接手的維護者、半年後的自己)進行單向溝通。
單向溝通的核心原則:永遠把重點放在為什麼(Why),而不是做了什麼(What)。做了什麼,看程式碼本身就知道了,不用你多說。
值得寫的注釋類型:
- 具體可執行的 TODO:要註明為何延後、何時需要處理。
- 外部參考連結:演算法的出處、依循的商業規格或 RFC 網址;務必盡量使用永久連結(Permalink)。
- 正確性論證:當一段程式碼的邏輯不是一眼就看得懂時,說明它為什麼是對的。
- 踩坑記錄(Gotchas):如果你花了超過 30 分鐘除錯,才找出一個不太直覺的解法,一定要記下來,救救未來的讀者(很可能就是你自己)。
- 魔法數字 / 常數的理由:為什麼這裡要乘以
1.05?為什麼重試次數是3? - 為什麼不這樣做的說明:把你試過但走不通的死路記下來,免得哪天有人一片好心,又把你現在的正確做法改回錯的版本。
README 撰寫原則(漏斗式結構):
- 這是做什麼的?(一句話摘要)
- 為什麼我該在意?(痛點與價值展示)
- 怎麼用?(先給一段最基礎的 Demo 或程式碼範例)
- 怎麼安裝?(最後才講繁瑣的環境建置與安裝步驟)
Commit Message 的藝術:
- 複雜變更的結構:建議照著問題、解決方案、影響與取捨這個順序來寫。
- 導入規範:強烈建議採用 Conventional Commits(如
feat:,fix:,docs:等前綴),讓機器與人類都能一眼看懂改動性質。 - 與 LLM 協作的技巧:如果要請 LLM 幫你寫 Commit Message,千萬別只把 diff 丟過去,那你只會拿到像是新增了三行程式碼這種等於沒說的廢話。最好在剛剛陪你一起開發這個功能的同一個對話裡請它寫,並且明講:重點放在 Why。
貢獻與開源協作:
- 完美的 Bug Report:發 Issue 前先搜尋是否已有重複。報告必須包含:環境資訊、預期結果 vs 實際結果、明確的重現步驟。
- MRE(最小可重現範例):提供一個不含任何無關業務邏輯的 Minimal Reproducible Example,這是對維護者最大的尊重。
- 清晰的 PR:一個 PR 只能專注於單一改動,並清楚說明動機。
- AI 程式碼的責任歸屬:即使程式碼是 AI 寫的,你依然是這段程式碼的主人。必須徹底理解並把關後才能提交。
Code Review 文化:
- 對事不對人:說這段函式的邏輯不太清楚,而不是說你寫得很亂。
- 提問大於命令:與其直接說把這裡改成 Map,不如問一句:這裡是不是可以考慮用 Map?一句提問就能把對方的防備心降下來。
- 區分層級:清楚標出哪些是一定要改的 Blocker,哪些只是你個人偏好的 Nits(吹毛求疵)。
- 不要吝嗇讚美:看到寫得漂亮的程式碼,明確地給予肯定。
參考來源
- ENIAC 與 Betty Snyder / Glen Beck 照片
- J. Robert Oppenheimer 與 John von Neumann 合照
- Ken Thompson 與 Dennis Ritchie 合照
- ChatGPT 使用者介面截圖
- The Missing Semester of Your CS Education
- Explain Git in Simple Words
- The Data Structures Behind Git
- Oh Shit, Git!?!
- Pro Git(Git 官方書籍)
- 200 行程式碼理解 Agent 核心概念
- Conventional Commits 規範
- OWASP Top 10
- System Design Primer