從手寫程式碼到自動化代理:走進 AI 輔助開發的未來

從機器語言到自然語言,補齊一個現代開發者的完整知識圖

By XD3an

電腦科學發展到現在其實還不到一百年,卻已經從打孔卡一路走到了 AI,中間換過好幾次玩法。以前想寫程式、做系統開發,你得對電路怎麼接、硬體怎麼跑很有概念;現在有了 AI,幾乎任何人都能用日常講話的方式跟它一起把應用做出來。這篇想把這條路從頭到尾聊一遍,也順便把一個現代開發者該有的知識地圖補齊。

程式與系統開發方式的演變概覽


程式語言發展演變概覽

第一階段:1940年代(機器語言 Machine Language)

  • 時代背景:二戰前後,最早的電腦(例如 ENIAC)誕生。ENIAC(Electronic Numerical Integrator and Computer,電子數值積分計算機)是世界上第一台可程式化的通用電子數位計算機,於 1943–1945 年間由 John Mauchly 與 J. Presper Eckert 在賓州大學打造,最初用於計算美軍的彈道射擊表。它有大約 1.8 萬顆真空管、重達 30 噸,算起來比人手快上千倍。不過那時候還沒有程式語言,所謂的寫程式,其實是靠實體插線和撥動開關來完成的。
  • 溝通媒介:二進位代碼(01)、打孔卡片、實體線路插拔。
  • 開發者的狀態:那時候的工程師,與其說在寫程式,不如說是在做物理操作,直接在硬體上撥開關,把電訊號送進真空管裡。
  • 技術限制:換一台不同型號的電腦,同一套運算邏輯就必須重新打孔、重新接線。
Betty Snyder 與 Glen Beck 於 1945 年在彈道研究實驗室透過插線與撥動開關為 ENIAC 編程 Betty Snyder 與 Glen Beck 於 1945 年在彈道研究實驗室,靠插線和撥開關為 ENIAC 編程,這大概是機器語言時代最有代表性的一張照片了。src: Wikipedia, ENIAC

第二階段:1940年代末期~1950年代初期(組合語言 Assembly Language)

  • 時代背景:第一代馮·紐曼架構(Von Neumann architecture)的電腦開始運作,科學家受夠了無窮無盡的 01
  • 溝通媒介:英文縮寫與助記符(如 MOV, ADD, JMP)。
  • 發展出了組譯器(Assembler),開發者終於可以用人類看得懂的短單字來代表二進位指令。
  • 技術限制:雖然不用寫 01,但依然被死死綁在硬體架構上。開發者還是得親自管理 CPU 暫存器與記憶體位址,且不同硬體廠商的組合語言完全不互通。
1949 年劍橋大學的 EDSAC 電腦 1949 年劍橋大學的 EDSAC 電腦是最早的儲存程式電腦之一,象徵組合語言時代的開端。src: Wikipedia
J. Robert Oppenheimer 與 John von Neumann 於 1952 年合影 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 年攝於貝爾實驗室 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 使用者介面截圖 ChatGPT 使用者介面截圖。2022 年底發布的 ChatGPT 標誌著自然語言時代的起點,開發者只需用日常語言下達指令,AI 便能理解意圖並轉譯為程式碼。src: Wikimedia Commons(CC BY 3.0)

現代開發技術棧


開發應用與系統的流程,已經從一個人埋頭寫程式,變成跟 AI 一起寫程式。動手之前,先花點時間把整張技術地圖攤開來看會比較有方向。

所謂的技術棧(Tech Stack),其實就是你拿來蓋一個網站或應用的一整套工具組合。講白一點,大致可以分成四塊:

  • 前端(Frontend):使用者看得到、摸得到的那一層。
    • React / Next.js:負責畫介面的函式庫,加上一套全端框架。
    • TypeScript:補上型別檢查,讓你少踩很多低級錯誤。
    • Tailwind CSS:實用工具優先的樣式框架,排版排得又快又順手。
  • 後端(Backend):藏在畫面背後、真正在幹活的那一層。
    • Node.js / Express:最順手的 JavaScript 執行環境與伺服器框架。
    • Python / FastAPI:高效能的 API 框架,很適合要接 AI 的場景。
    • Go:勝在高併發,執行速度也快。
  • 資料庫(Database):東西總得存下來。
    • PostgreSQL:功能很全能的關聯式資料庫。
    • MongoDB:走彈性 schema 路線的 NoSQL 文件型資料庫。
    • Redis:常拿來當高速快取或訊息佇列。
  • 部署與維運(Deployment / DevOps):怎麼把東西穩穩地送上線。
    • Docker:把環境包成一致的容器,到哪跑都一樣。
    • Vercel / Cloudflare:現代前端與無伺服器(Serverless)託管平台,部署很省事。
    • Kubernetes:規模一大、要管一堆微服務時,靠它做容器自動化部署。

    補充:這些技術的權威資源,通常就是它們的官方網站與官方文件,上面連的都是各自的官網。原始碼可到對應的 GitHub 專案查看,例如 facebook/reactvercel/next.jsmicrosoft/TypeScriptkubernetes/kubernetes 等。

下面就一塊一塊往下拆,聊聊各自現在比較主流的選擇。

前端

現在新專案大部分都會從 Meta framework 開始,比較少人會想自己從零組合造輪子。

Meta framework(元框架)是什麼:React、Vue 這類框架本身只負責畫畫面、管理元件狀態,並不管路由怎麼設計、資料怎麼抓、要不要做伺服器端渲染、怎麼打包。Meta framework 就是建立在這些基礎框架之上,把路由、資料抓取、渲染策略、打包工程全部包好的框架。例如 Next.js 是建立在 React 之上的 meta framework,Nuxt 是建立在 Vue 之上的。
  • 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

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

系統與資料基礎


開發應用與系統的工作流程,除了知道怎麼跟 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 該怎麼用雜湊表解掉。真正的價值,是把這些知識用在效能除錯和程式碼審查上。

進一步閱讀:NeetCodeBig 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 10OWASP 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, LukeREST API TutorialSystem 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 sh shell
Windows PowerShell - 也是一種 shell Windows PowerShell - 也是一種 shell
  • 終端與 Shell:終端(terminal)是視覺介面,而 Shell 是實際解讀指令的程式。bash 是 Linux/macOS 最常見的 Shell,zsh/fish 提供更好的易用性。
  • 基本導航cdpwd;絕對路徑 vs 相對路徑;.(當前目錄)與 ..(父目錄)。
  • $PATH 與程式查找:Shell 透過 $PATH 環境變數尋找可執行檔;which 可查詢指令實際路徑。
  • 常見命令catsortuniqhead/tailgrepsedfindawk
  • 推薦替代工具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 模式支援。
  • Language Server:透過 LSP(Language Server Protocol)提供自動完成、內嵌文件顯示、跳轉定義查找所有引用、匯入管理等功能。
  • AI 輔助開發的三種形態:自動補齊(autocomplete)、行內聊天(inline chat)、編程代理(coding agents)。

4. 調試與效能分析(Debugging and Profiling)

  • Print Debugging 與 Logging:加入輸出定位問題是最基本的手段;更進階是用日誌框架(INFO/DEBUG/WARN/ERROR 等嚴重級別、支援結構化資料)。
  • 除錯器(Debuggers):適合那種你不確定要印什麼、或問題很難重現的情境。泛用型有 gdblldb,語言專用型像 Python 的 pdb
  • Record-Replay 除錯rr 能把一次執行完整錄下來,再一模一樣地重播,甚至可以用 reverse-continuereverse-step 往回倒著除錯。
  • 系統呼叫追蹤strace(Linux)/dtruss(macOS)可觀察程式發出的每個系統呼叫;bpftrace(基於 eBPF)可在核心層做低開銷的追蹤。
  • 網路除錯tcpdump/Wireshark 抓封包分析;HTTPS 加密流量可用 mitmproxy 或瀏覽器開發者工具的 Network 分頁。
  • 效能量測time 指令拆解出 Real(壁鐘時間)、User(使用者程式碼 CPU 時間)、Sys(核心程式碼 CPU 時間)三種時間,可判斷程式是卡在運算還是卡在等待。
  • 資源監控htop/btopiotopfreelsofss
  • CPU 效能分析器:Linux 標準工具 perfperf stat 看整體概覽,perf record/perf report 搭配火焰圖(Flame Graph)視覺化熱點。各語言專屬:Python 的 cProfile/py-spy、Go 的 go tool pprof
  • 效能基準測試hyperfine 用來比較不同實作或工具的效能,自動跑多次取平均與標準差。

5. 版本控制與 Git(Version Control and Git)

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>
Git 資料模型示意圖 src: The Data Structures Behind Git
Git 資料庫流程圖 src: The Data Structures Behind Git

三個核心概念:blob、tree、commit

Git blob blob(檔案):就是一堆位元組(byte),本身不記錄檔名,單純是內容。src: xosh.org
Git tree tree(目錄):把名稱對應到 blob 或其他 tree,所以目錄底下可以再放子目錄。src: xosh.org
Git commit commit(快照):記錄父 commit、作者、訊息,以及指向這次快照對應的頂層 tree;commit 本身不可變,所謂改歷史,其實是在建立新的 commit。src: xosh.org
Git hash / SHA-1 所有物件以 SHA-1 雜湊內容定址(content-addressed),彼此靠雜湊值互相參照。src: xosh.org

歷史是 DAG(有向無環圖)

Git 的提交歷史不是單純的線性列表,而是有向無環圖(Directed Acyclic Graph)。因為一個 commit 可以有多個父提交,例如將兩條平行開發的分支合併(Merge)時,產生的合併提交就會指向兩個父節點。

Git DAG commit history src: xosh.org

References 與 HEAD

Git branch references src: xosh.org
  • References(參照):人類記不住 SHA-1 雜湊值,所以 Git 用 References 來指向特定的 commit。最常見的 Reference 就是分支(例如 main)。分支指標是可變的,當你在該分支新增 commit 時,指標會自動往前推移。
  • HEAD:代表你目前所在的位置(通常指向某個分支,如 HEAD -> main)。
  • Detached HEAD(分離的 HEAD 狀態):如果你直接 checkout 到某個特定的 commit 雜湊值,HEAD 就會脫離分支,直接指向該 commit。在這種狀態下做的任何新提交,如果沒有建立新分支把它接住,切換回其他分支後,這些新提交就變成沒人指向的孤兒,最後會被 Git 回收掉。
Git HEAD branch2 src: xosh.org

儲存庫三個區域

  1. 工作目錄(Working Directory):你目前真正在編輯的實體檔案。
  2. 暫存區(Staging Area / Index):讓你自己挑這次到底要提交哪些修改,可以把手上的變動拆成好幾個乾淨、獨立的 commit。
  3. 儲存庫歷史(Repository / History):已經被 commit 記錄下來的不可變快照。
Git working directory staging history src: xosh.org

常用指令速查

  • 基礎git initgit statusgit addgit commitgit log --all --graph --decorategit diff
  • 分支與合併git branchgit switchgit checkout -b <name>git mergegit rebase
  • 遠端操作git remotegit pushgit fetchgit pullgit clone
  • 進階git add -p(互動式部分暫存)、git rebase -i(互動式重寫歷史)、git blamegit stashgit bisect(二分搜尋找出引入 Bug 的 commit)、git worktree(同時檢出多個分支到不同目錄,多 AI 代理並行修改時常用)

進一步閱讀:Oh Shit, Git!?!Git 官方書籍

6. 程式碼打包與發布(Packaging and Shipping Code)

程式碼寫完只是第一步。怎麼讓別人的電腦、或是伺服器也能順順利利跑起來你的程式,才是打包與發布真正要解決的問題。

  • 依賴與環境:當你執行像是 pip install requests 這樣的指令時,套件管理員在背後幫你做了四件重要的事情:
    1. 搜尋套件庫(如 Python 的 PyPI、Node.js 的 npm)
    2. 尋找對應版本(根據 OS、硬體架構與語言版本)
    3. 解析遞移依賴(Transitive Dependencies)
    4. 下載與安裝到正確的系統目錄
⚠️ 依賴地獄(Dependency Hell):當專案 A 需要套件 X 的 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.01.0.1
    • MINOR(次版號):新增了新功能,向下相容。如 1.0.11.1.0
    • MAJOR(主版號):引入了破壞性變更(Breaking Changes)。如 1.1.02.0.0
  • 其他主題:可重現性(Reproducibility)、虛擬機與容器(Docker)、配置管理、服務與編排(Kubernetes)、CI/CD。

7. 代理式編程(Agentic Coding)

編程代理是一個被賦予了工具存取權的對話式 AI。它通常存在於你的 IDE 內(如 Cursor、Windsurf),或是獨立的終端機工具中(如 Claude Code)。它不僅能跟你對話,還能自主執行以下操作:

  • 讀取與寫入本地檔案
  • 進行網路搜尋(查閱最新 API 文件)
  • 在終端機執行 Shell 指令(如跑測試、編譯、建置)

運作原理

不要把 Agent 當成魔法,底層邏輯其實非常清晰:

  1. LLM 的本質:說到底,大語言模型做的還是同一件事:給它一段輸入字串,它去預測接下來該輸出什麼,靠的是機率分佈取樣。
  2. Harness:Agent 的核心,其實是一個夾在你和 LLM 中間的控制程式(Harness)。
  3. 回饋迴圈(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)。
    實務上最省事的做法:把編輯器設成存檔時自動格式化(Format on save),再在專案根目錄放一個 .editorconfig
  • 靜態檢查(Linting):比格式化更深入,負責分析程式碼並找出反模式、潛在 Bug 或未使用的變數。進階工具 semgrep 是基於抽象語法樹(AST)的搜尋工具,讓你即使跨越不同的程式語言,也能自訂檢查規則。
  • 測試(Testing):依照粒度分為三層:
    1. 單元測試(Unit Test):測試單一函數或類別,速度最快。
    2. 整合測試(Integration Test):測試多個模組之間的互動是否正常。
    3. 端到端測試(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 lintjust test)。
  • 正則表達式(Regular Expressions):一種專門用來比對字串樣式的語言,在程式碼品質控管裡到處都用得到。

9. 程式碼之外(Beyond the Code)

軟體開發本質上是一場跨越時間與空間的溝通。你寫下的程式碼、註解、README 與 Commit Message,都是在與其他人(未來的同事、接手的維護者、半年後的自己)進行單向溝通。

單向溝通的核心原則:永遠把重點放在為什麼(Why),而不是做了什麼(What)。做了什麼,看程式碼本身就知道了,不用你多說。

值得寫的注釋類型:

  • 具體可執行的 TODO:要註明為何延後、何時需要處理。
  • 外部參考連結:演算法的出處、依循的商業規格或 RFC 網址;務必盡量使用永久連結(Permalink)。
  • 正確性論證:當一段程式碼的邏輯不是一眼就看得懂時,說明它為什麼是對的。
  • 踩坑記錄(Gotchas):如果你花了超過 30 分鐘除錯,才找出一個不太直覺的解法,一定要記下來,救救未來的讀者(很可能就是你自己)。
  • 魔法數字 / 常數的理由:為什麼這裡要乘以 1.05?為什麼重試次數是 3
  • 為什麼不這樣做的說明:把你試過但走不通的死路記下來,免得哪天有人一片好心,又把你現在的正確做法改回錯的版本。

README 撰寫原則(漏斗式結構):

  1. 這是做什麼的?(一句話摘要)
  2. 為什麼我該在意?(痛點與價值展示)
  3. 怎麼用?(先給一段最基礎的 Demo 或程式碼範例)
  4. 怎麼安裝?(最後才講繁瑣的環境建置與安裝步驟)

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(吹毛求疵)。
  • 不要吝嗇讚美:看到寫得漂亮的程式碼,明確地給予肯定。

參考來源


  1. ENIAC 與 Betty Snyder / Glen Beck 照片
    Wikipedia, ENIAC·Available ↗
  2. J. Robert Oppenheimer 與 John von Neumann 合照
    Encyclopaedia Britannica·Available ↗
  3. Ken Thompson 與 Dennis Ritchie 合照
    History of Information·Available ↗
  4. ChatGPT 使用者介面截圖
    Wikimedia Commons(CC BY 3.0)·Available ↗
  5. The Missing Semester of Your CS Education
    MIT,版權為 CC BY-NC-SA·Available ↗
  6. Explain Git in Simple Words
    xosh.org·Available ↗
  7. The Data Structures Behind Git
    Blog by Juliano Lima·Available ↗
  8. Oh Shit, Git!?!
    ohshitgit.com·Available ↗
  9. Pro Git(Git 官方書籍)
    git-scm.com·Available ↗
  10. 200 行程式碼理解 Agent 核心概念
    mihaileric.com·Available ↗
  11. Conventional Commits 規範
    conventionalcommits.org·Available ↗
  12. OWASP Top 10
    owasp.org·Available ↗
  13. System Design Primer
    GitHub / donnemartin·Available ↗
×