B01 · 跨語言共通概念 詳細 ROADMAP
計畫文件,不會被 Quartz 渲染。
回主 roadmap → backend/ROADMAP.md
章節目標
這章刻意不綁語言。講後端工程師換語言時不會變的概念——變數 / 錯誤處理 / 並行模型 / 記憶體管理 / 型別系統 / IO 模型。本章建立「跨語言心智模型」,讓讀者切換 Go / Python / JS / Java 時知道不同語法背後解的是同一類問題。
🌱 基本介紹
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 01 | 後端跨語言共通概念是什麼 | 01-what-is-language-common-concept | 🌱 | 為什麼後端要有「跨語言」視角;同一個問題在不同語言的形狀 |
❓ 為什麼需要
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 02 | 為什麼後端一定要懂多種語言 | 02-why-multi-language | 🌱 | 單一語言舒適圈的風險、招募現實、跨語言讓你更看清抽象、debug OSS 要能讀多語言 source |
| 03 | 為什麼跨語言概念比語法重要 | 03-why-concepts-over-syntax | 🌱 | 語法是皮毛、變化快;並行 / IO / 錯誤 / 記憶體 幾十年沒變;學概念比背語法 ROI 高 |
| 04 | 為什麼要分「共通概念」跟「語言特定」 | 04-why-separate-concept-from-language | 🌱 | 本章(B01)vs backend/language/{name}/ 的分工邏輯:共通講模型,語言講實作 |
🕰️ 演進
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 05 | 後端語言演進史 | 05-backend-language-evolution | 🌱 | CGI + Perl → PHP/Java 時代 → Ruby on Rails / Python Django → Node.js → Go(2009)→ Rust(2010+)→ 多 runtime(Bun / Deno) |
| 06 | 並行模型演進 | 06-concurrency-model-evolution | 🌱 | fork/exec → Thread → Thread Pool → Event Loop → async/await → Coroutine / Goroutine → Actor(Erlang/Akka) |
| 07 | 型別系統演進 | 07-type-system-evolution | 🌱 | 動態 vs 靜態、duck typing 興起、TypeScript / Python typing / Flow 潮回頭、Rust 型別革命 |
🧠 知識型
F01-A 變數與記憶體
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 08 | 變數 / Scope / Closure(跨語言比較) | 08-variable-scope-closure | 🌱 | var / let / const(JS)vs Python nonlocal vs Go := vs Rust let mut;closure 在各語言的形狀 |
| 09 | 記憶體管理模型 | 09-memory-management | 🌱 | GC(Java / Python / Go / JS)vs 手動(C)vs Ownership(Rust);各自的權衡與成本 |
| 10 | Heap vs Stack 跨語言 | 10-heap-vs-stack | 🌱 | 各語言怎麼決定東西放 heap 還 stack;escape analysis(Go / Java) |
F01-B 並行與 IO
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 11 | Thread / Coroutine / async/await / Actor | 11-concurrency-primitives | 🌱 | 四大並行 primitive 比較:OS thread(Java)vs goroutine(Go)vs async(JS/Python/Rust)vs actor(Erlang / Akka) |
| 12 | IO 模型:Blocking / Non-blocking / Async / Event-driven | 12-io-models | 🌱 | select / poll / epoll / kqueue / io_uring 演進;Node.js 怎麼用、Python asyncio 怎麼用、Go runtime scheduler 怎麼包 |
| 13 | 為什麼有 GIL、為什麼沒 GIL | 13-gil-or-no-gil | 🌱 | Python GIL、Ruby GVL、JavaScript 單執行緒、Node.js worker_threads、Go / Java 真 parallel |
| 13-2 | 並行資料衝突與合併策略 | 13-2-concurrent-conflict-resolution | 🌱 | 多執行緒 / 多程序 / 多服務同時處理同一筆資料造成不一致:Last-write-wins、Version vector、CRDT、Application-level merge、DB 層鎖(跟 B03 #22 連動);為什麼「最後誰 commit 誰贏」常常不夠 |
F01-C 錯誤處理
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 14 | 錯誤處理模式比較 | 14-error-handling-patterns | 🌱 | Exception(Java / Python / JS)vs Result / Option(Rust)vs Error value(Go if err != nil);各自優缺 |
| 15 | 錯誤包裝(wrapping) | 15-error-wrapping | 🌱 | Go errors.Wrap / %w / errors.Is / errors.As、Rust thiserror、Python chained exception、JS cause |
| 16 | Panic / Crash / Recover | 16-panic-crash-recover | 🌱 | 什麼時候該讓程式直接死(fail-fast)vs 優雅降級;Go recover、Rust panic vs Result、Java Error vs Exception |
F01-D 型別系統
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 17 | 靜態 vs 動態型別 | 17-static-vs-dynamic | 🌱 | 各自的權衡;Python + type hints / TypeScript 作為中間方案 |
| 18 | Structural vs Nominal typing | 18-structural-vs-nominal | 🌱 | TypeScript structural(duck typing)vs Java/C# nominal;Go interface(structural)vs Rust trait(nominal + structural 混合) |
| 19 | Generics 跨語言 | 19-generics-cross-language | 🌱 | Java generics(erasure)vs C# generics(reification)vs Go generics(2022+)vs Rust generics(monomorphization) |
🔧 小實作注意事項
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 20 | 用 3 語言實作同一個 Debounce | 20-debounce-3-languages | 🌱 | JS / Python / Go 實作 debounce,對比並行原語的差異 |
| 21 | 用 3 語言實作 Worker Pool | 21-worker-pool-3-languages | 🌱 | Python ThreadPoolExecutor / Go goroutine+channel / Node.js worker_threads 對比 |
💣 Anti-pattern
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 22 | 跨語言 Anti-patterns | 22-cross-language-antipatterns | 🌱 | 用一種語言的腦寫別的語言(Python 寫 Java 味、JS 寫 Go 味)、追新潮語言學皮毛沒學模型、GIL 無視做多執行緒、Go 濫用 goroutine 沒想 context 取消 |
🧰 對應檢查工具
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 23 | 跨語言相關工具 | 23-cross-language-tooling | 🌱 | LSP(Language Server Protocol)、tree-sitter(跨語言語法樹)、Protobuf / gRPC 作為跨語言契約、OpenAPI codegen 跨 7 語言 |
📎 補充
| # | 主題 | Slug | Stage | 大綱 |
|---|
| S01 | 為什麼 Erlang / Elixir 並行模型特別 | s01-erlang-actor | 🌱 | BEAM VM、Let it crash 哲學、Phoenix LiveView;為什麼 WhatsApp 單機百萬連線 |
| S02 | 為什麼 Rust 的 borrow checker 對後端重要 | s02-rust-borrow-checker | 🌱 | data race 編譯期禁止、Send / Sync trait、無 GC 達到 Java 等級生產力 |
章節進度統計
- 知識主題:23 + 2 補充 = 25 項
- 🌿 growing:0
- 🌱 seed:25
跨系列連結
- →
backend/language/{name}/ — 每個概念落到具體語言怎麼寫
- →
backend/network/ B02 — 網路 IO 跟並行模型連動
- →
backend/os/ B04 — OS 提供並行 / IO 原語
- →
system-design/ — 系統設計面試常考這些基礎模型