Web Day 45 系列總結與延伸路線
執行需求:CPU 可跑。今天是「Web 系統實戰:用 FastAPI 打造能上線的後端」45 篇系列的最後一篇。我們從 Day 1 的 FastAPI hello world 起步,用七個主題區塊(導論、基礎、安全、品質、前端整合、上線、貫穿專案)走到 Day 44 的 runbook 與交接文件,最後用 Day 45 這篇把整個路徑索引起來,並列出三條值得繼續深入的延伸學習方向:分散式系統、可觀察性棧、與團隊工程化。整個系列用「預約管理系統」做貫穿專案,把資料模型、衝突檢查、HTMX 後台、Docker Compose 部署、Prometheus 監控、locust 壓測、runbook 交接都走過一輪。所有資料都是虛構示範,目的是讓你在沒有真實客戶資料的情況下也能練完整個流程。本文是系列的收束、不是結束,後續建議的延伸內容才是真正的下一段路。
引言
回顧整個 45 天的學習地圖,我們從 Day 1 的「為什麼需要從腳本走到系統」開始,一路建到 Day 35–44 的「預約管理系統 end-to-end 可上線」。這不是一條單一路徑,而是七個主題區塊互相交織的學習旅程:基礎(Day 3–10)讓你會寫 HTTP API;安全(Day 11–15)讓你會保護使用者資料;品質(Day 16–22)讓你會寫測試、跑背景任務、寫日誌;前端整合(Day 23–28)讓你會把 API 接到介面上;上線(Day 29–34)讓你會用 Docker 部署、寫 CI、設監控;貫穿專案(Day 35–44)則把這些全部串起來,每天解決一個現實問題。
這個系列刻意只用 2025 年 7 月之前已存在且具知名度的工具:Python 3.13、FastAPI 0.116、SQLModel 0.0.24、PostgreSQL 17、Redis 8、HTMX 2.0、Next.js 15、Streamlit 1.46、Docker Compose v2、locust 2.3。我們不教你追逐新框架,而是教你把這些穩定的主流工具用到能撐 production。這也是讀者從「會寫腳本」走到「能獨立上線後端」需要的最短路徑。
今天的內容分四段:第一段把 45 天的學習地圖索引起來;第二段列出三條延伸學習方向;第三段用一支 Python 腳本把「如何查閱這個系列」做成可重現工具;第四段回顧整個系列的核心精神。讀完這篇你會了解:這個系列給了你什麼能力、哪些方向可以繼續深入、怎麼把這套能力實際應用到自己的工作上。
寫在最後:完成 45 天並不代表你會了所有後端議題,但代表你已經有辦法獨立讀懂官方文件、寫出一個能跑能測試的服務、並把部署與監控的整套節奏跑起來。下一次你碰到沒學過的主題時,這套「從零到 production」的學習方法比任何單一框架更值得帶走;它會讓你在新的工具、新的需求、新的團隊裡都能站穩腳步。
原理解念:45 天的學習地圖
整個系列分成七個主題區塊、共 45 篇。我們把它當成一座七層樓梯,每一層都站在前一層的肩膀上,每一層都會用到前一層的能力:學了基礎才能談安全、學會寫測試才能談品質、學會整合前端才方便上線、貫穿專案把前面六層都用上一輪。這種層疊式的設計避免了「先學離散知識再整合」的茫然,讓學習者每天都有明確目標、每天都有可跑的成果。
# 對應的學習地圖(純文字示範)
LEARNING_MAP = """
第一層 導論(Day 1–2)
└─ 系列地圖、環境、工具鏈、專案結構
第二層 基礎(Day 3–10)
└─ HTTP、FastAPI、SQLModel、CRUD、關聯、Alembic、錯誤處理
第三層 安全(Day 11–15)
└─ 密碼雜湊、JWT、OAuth2、檔案上傳、輸入防護
第四層 品質(Day 16–22)
└─ pytest、非同步、背景任務、快取、排程、日誌
第五層 前端整合(Day 23–28)
└─ HTMX、Next.js 串接、前端認證、WebSocket
第六層 上線(Day 29–34)
└─ 環境變數、Docker、PostgreSQL、CI/CD、反向代理、監控
第七層 貫穿專案(Day 35–45)
└─ 預約管理系統的端到端實作
"""
print(LEARNING_MAP.strip())
這七層的設計精神是「先穩後大」。前 34 天的知識點多是各自獨立的(學完一個就會用一個),第 35 天開始的貫穿專案則把所有點串起來變成「一個真實會跑的服務」。這樣的順序對學習者特別友善:前 34 天你可以「每天學一個新東西」,第 35 天開始才進到「把所有東西整合」。沒有這個順序,初學者常會在 Day 35 就被整合複雜度擊倒。
從能力矩陣看,45 天結束時你應該會的:
CAPABILITIES = """
- 寫一個乾淨的 FastAPI 0.116 服務(含依賴注入、Pydantic v2 驗證、JWT 認證)
- 用 SQLModel 0.0.24 設計資料模型、跑 Alembic 1.16 migration
- 寫 pytest 8.4 + httpx 0.28 的單元、整合、端對端測試
- 把背景任務與排程工作整合進 lifespan
- 用 HTMX 2.0 寫伺服器端渲染的後台介面
- 用 Docker Compose v2 部署整套 stack(API + PostgreSQL 17 + Caddy 2.8)
- 用 prometheus_client 暴露 metrics、用 JSON log 收集 events
- 用 locust 2.3 與純 Python 壓測找出容量邊界
- 用 pg_dump 與還原演練確保資料可救
- 用 runbook 與 README 把專案變成可被接手
"""
print(CAPABILITIES.strip())
這十項能力是「後端工程師可以獨立交付一個 production 服務」的最小集合。我們的系列不是教你某一項做到 90 分,而是教每項都做到 60–80 分、能組合起來成可上線系統。真正的高手都是在每個層面都熟悉、並能評估什麼情境要用什麼工具。十項之中,後端工程師最常忽略的是第三、四、八項(測試、整合、團隊文件),這三項看似沒有顯著的技術含量,卻是讓專案從「個人作品」升級為「團隊資產」的關鍵。
延伸學習:三條值得繼續的路
45 天結束是另一條路的起點。我們列出三條「值得繼續走」的方向,每一條都有對應的延伸資源:
ROUTES = """
(一)分散式系統與服務拆分
情境:單一 FastAPI 服務到天花板了,該拆成多個 microservice
學習路徑:
- Day 43 學的 locust 不夠用 → 改用 k6 或 Gatling 模擬分散式流量
- Day 42 學的 metrics 不夠細 → 改用 OpenTelemetry + Jaeger 做分散式追蹤
- Day 41 學的 docker compose 不夠彈性 → 改用 Kubernetes(Helm / Kustomize)
- Day 28 學的 WebSocket 在多節點時要 sticky session → 改用 Redis Pub/Sub
投入時間:3-6 個月
(二)可觀察性棧(observability stack)
情境:metrics + log 夠用,trace 還沒串起來
學習路徑:
- 在 Day 42 的 metrics 模組加 OpenTelemetry SDK
- 從每個 request 帶 trace_id 開始,逐步把 metrics / log / trace 串成一條鏈
- 用 Grafana Tempo 或 Jaeger 把 trace 視覺化
- 把今天的 loki / Prometheus / Tempo 三件套用 docker compose 串起來
投入時間:1-3 個月
(三)團隊工程化
情境:一個人寫的專案變成 3-5 個人共同維護
學習路徑:
- Day 40 學的 pytest 不夠 → 加上 mutation testing(mutmut)、contract testing(schemathesis)
- Day 32 學的 GitHub Actions 不夠 → 加上 dependency review、code scanning、gitleaks
- Day 44 學的 README / runbook 不夠 → 加上 ADR(Architecture Decision Record)
- 用 trunk-based development、feature flag 提升協作效率
投入時間:6-12 個月(持續)
"""
print(ROUTES.strip())
這三條不是互斥的——很多專案會同時往兩三條走。例如把 stack 升級到 k8s 的同時順手引入 OpenTelemetry,或者在團隊壯大時同時發展 AD 與 CI 政策。我們的 Day 45 結束並不代表「你都會了」,而是「你可以開始選下一條路」。
每條路的投入時間與該系列預期收益都在上面 ROUTES 段落裡。讀者可以依照自己工作上的痛點來選:覺得部署卡住就走 k8s、覺得查問題很慢就走 observability、覺得團隊協作出問題就走工程化。三條路都與本系列高度接續,但深度有限,深入要各自再花幾個月。Day 45 結束並非「你會了所有」,而是「你具備挑戰下一階段的基礎」,這個觀點比「全都學完」更健康。
完整實作:學習地圖索引器
底下是一支小型 Python 腳本,把整個系列的主題、版本、文件位置索引成可重現的 Markdown:
# scripts/series_index.py
# 把整個 45 天系列的索引輸出成 Markdown,方便讀者複習
from datetime import datetime, timezone
from pathlib import Path
import textwrap
SERIES = [
("導論", "Web Day 1–2", "從腳本到系統的學習地圖、環境與工具鏈"),
("基礎", "Web Day 3–10", "HTTP、FastAPI、SQLModel、CRUD、關聯、Alembic、錯誤處理"),
("安全", "Web Day 11–15", "密碼雜湊、JWT、OAuth2、檔案上傳、輸入防護"),
("品質", "Web Day 16–22", "pytest、httpx、非同步、BackgroundTasks、快取、排程、日誌"),
("前端整合", "Web Day 23–28", "HTMX、Next.js 串接、前端認證、WebSocket"),
("上線", "Web Day 29–34", "環境變數、Docker、PostgreSQL、CI/CD、Caddy、健康檢查"),
("貫穿專案", "Web Day 35–45", "預約管理系統資料模型、認證、預約流程、通知、後台 HTMX、測試、Docker Compose、監控、壓測、文件"),
]
def render_markdown() -> str:
today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
lines = [
"# Web 系統實戰系列 — 索引(自動生成)",
"",
f"生成日期:{today}",
f"總篇數:45 篇(導論 2 + 基礎 8 + 安全 5 + 品質 7 + 前端整合 6 + 上線 6 + 貫穿專案 11)",
"",
"## 七個主題區塊",
"",
]
for stage, days, desc in SERIES:
lines.append(f"### {stage}({days})")
lines.append(desc)
lines.append("")
lines.append("## 版本基準(2025 年 7 月)")
lines.append("")
lines.append("- Python 3.13、FastAPI 0.116、SQLModel 0.0.24、SQLAlchemy 2.0.41")
lines.append("- Pydantic 2.11、Alembic 1.16、pytest 8.4、httpx 0.28、uv 0.7")
lines.append("- HTMX 2.0、Next.js 15、Streamlit 1.46、PostgreSQL 17、Redis 8")
lines.append("- Docker Compose v2、Caddy 2.8、Prometheus client 0.21、locust 2.3")
lines.append("")
return "\n".join(lines) + "\n"
if __name__ == "__main__":
out = Path("docs/series-index.md")
out.write_text(render_markdown(), encoding="utf-8")
print(f"索引寫到 {out}({len(SERIES)} 個主題)")
這支腳本可以做兩件事:第一,把整個系列的結構索引成 Markdown,當成「系列封面頁」放在 README 開頭;第二,未來新增章節時只要更新 SERIES 常數就會自動同步。我們刻意把它寫在 scripts/ 下,與 Day 44 的 build_docs.py 並排,下次 deploy 就會自動生成最新索引。
另外一支小工具是把這個系列的「常見問題」做成索引卡,方便讀者複習:
# scripts/cheatsheet.py
# 把 45 天的關鍵指令 / 程式片段濃縮成一張 cheatsheet
CHEATSHEET = {
"環境": [
"uv python install 3.13",
"uv init --package",
"uv add fastapi==0.116 uvicorn[standard]==0.35",
"uv sync",
],
"FastAPI": [
"uvicorn booking_system.main:app --reload",
"curl http://localhost:8000/openapi.json",
"@app.get('/health')",
"Depends(get_session)",
],
"資料庫": [
"alembic revision --autogenerate -m 'add field'",
"alembic upgrade head",
"pg_dump --no-owner --no-privileges",
"psql -d booking -c 'SELECT * FROM bookings LIMIT 5;'",
],
"測試": [
"uv run pytest -v",
"uv run pytest -m slow",
"locust -f tests/load/locustfile.py --headless",
],
"部署": [
"docker compose up -d",
"docker compose logs api",
"docker compose exec api alembic upgrade head",
],
"監控": [
"curl http://localhost/metrics",
"docker compose logs api | jq .",
"python scripts/backup_postgres.py",
],
}
for category, items in CHEATSHEET.items():
print(f"## {category}")
for it in items:
print(f"- `{it}`")
print()
這張 cheatsheet 可以輸出成 Markdown 放在 docs/cheatsheet.md,讓讀者「30 秒找到指令」。
常見錯誤與踩雷
第一個常見錯誤是「讀完 45 天就覺得自己會了」。讀完跟會做是兩回事:讀完只能保證你「知道有這些東西」,實際寫程式時還是會卡在套件衝突、SQL 索引、套件版本。這也是我們在前 34 天都堅持「完整可跑的範例」的原因:每篇都附帶一段程式碼與執行指令,照著做就能看到結果,比純讀文字有效得多。如果你想真正內化,就挑幾天的主題親手做一遍(從 Day 35 的預約資料模型開始重做是個不錯的起點)。
第二個常見踩雷是「Day 41 沒裝 Docker 直接跳過」。Docker 是 production 部署的標準工具,跳過這個議題會在 production 第一天就被擊倒。我們在 Day 41 提供了「沒 Docker 的替代方案」(uvicorn + 本機 PostgreSQL),那是過渡方案,不是終點。真的想 production-deploy,建議花一個週末把 Docker 從零學起。
第三個是「只想學沒人教的部分」。Day 11–15 的安全、Day 16–17 的測試、Day 34 的監控,這幾塊是「單獨看起來不重要、整合起來救你一命」的部分。如果只挑喜歡的章節讀,最後會留下難以整合的盲點。建議至少把每一主題區塊的第一篇(10、15、22、28、34、45)都讀過,把握每塊的核心觀念。
第四個是「把這個系列當聖經」。這個系列教的是「2025 年 7 月主流工具的標準做法」,不是「唯一正確的做法」。套件會升級、API 會改、觀念會演進。我們的內容會在某個時間點變得過時,但那時你已經會讀官方文件、跑壓測評估容量、寫 runbook 處置事件,這些能力不會過時。工具會變、學習方法不會。
效能與實務提醒
45 天只是學習曲線的起點,不是終點。後端工程這條路很長,我們能做到的是「給你起點與方向」。從 Day 1 到 Day 45 的累積:知道 HTTP 是什麼、會寫 FastAPI 服務、會設計資料模型、會寫測試、會做整合、會部署、會監控、會交接。這些能力組合起來,已經足以勝任大多數中小型後端職缺。
下一段路怎麼走完全看你:想往架構走就去看 microservice、k8s;想往資料走就補 Data Engineering;想往 ML 走就把 Day 26 的 NLP/LLM 經驗拿來做 LLM 應用的 backend;想往管理走就學習技術領導與團隊工程化。三條都通,但深度有限;選一條深入,是更有效的策略。
實務上,學習最快的路徑是「做中學」。找一個工作中的小型專案(內部工具、side project、公司 demo),把這 45 天的能力實際應用上去:寫 FastAPI、做 Docker Compose、加 Prometheus 監控。碰到卡住時回來查對應的篇章,會比純讀有效得多。
最後,學習不是線性累積。每天花一小時複習、一週寫一篇心得、一個月做一個 side project——這些都比「計畫一次讀完 45 篇」更有效。我們這個系列的設計是「每天一篇、每篇 30 分鐘內可讀完」,這也是鼓勵你能持續 45 天。讀完後把這個習慣帶到下一條路上,就會持續進步。
# scripts/series_index.py — 把整個 45 天的關鍵指標索引成清單
# 這支腳本可以單獨跑,也可以併入 Day 44 的 build_docs.py
SUMMARY = {
"總篇數": 45,
"主題區塊": 7,
"程式碼範例": "每篇 6-10 個,可單獨跑",
"測試覆蓋率": "8 支核心 E2E + 1 支效能 smoke + 1 支 migration",
"可選 extension": ["microservice", "observability", "team engineering"],
"下次閱讀建議": "Day 35–44 整個貫穿專案重做一次",
}
def print_summary(summary: dict) -> None:
for key, value in summary.items():
if isinstance(value, list):
print(f"- {key}:")
for v in value:
print(f" - {v}")
else:
print(f"- {key}:{value}")
print_summary(SUMMARY)
把這個系列的事實摘要寫成可重現的腳本,可以放在 docs/series-summary.md、可以在演講中引用、可以併入開源專案的 README。下次有人問「你這個系列到底涵蓋什麼?」,把這張表印出來即可。
小結
今天是「Web 系統實戰:用 FastAPI 打造能上線的後端」45 篇系列的最後一篇。我們回顧了七個主題區塊、列出三條延伸學習方向、用兩支 Python 腳本把學習地圖與 cheatsheet 自動化。整個系列結束,但你剛走完的是「後端工程師上手指南」這條路,後面還有 microservice、分散式追蹤、k8s、團隊工程化等更深的議題。我們希望你帶走的不只是工具箱,還有「從零到 production」的學習方法:把大問題拆成每天一篇的小問題、每篇都附可執行的範例、寫 runbook 把經驗固化下來、讓團隊與自己都能從頭複習。
結語
這 45 天學到的核心精神:把「在原作者電腦裡跑得通」變成「可以被接手、能上線、能量化」。這個精神跨越了具體的工具:明天也許 FastAPI 被其他框架取代、SQLModel 改寫、HTMX 不流行,但「寫可被測試、可被監控、可被維運的程式」這件事永遠不會過時。祝福你在後端這條路上走得順,遇到每個新框架都能靠這套方法快速上手;如果我們這個系列幫助到你,就達到目的了。感謝你陪這個系列走完 45 天。
延伸資源
- Web Day 45 系列完賽紀錄:本系列已全部上線,可以從 manifest-web.json 查到所有 URL;對應的章節與日期見 SPEC-web-series.md。
- 延伸方向 1:Kubernetes 官方文件(2025):
https://kubernetes.io/docs/home/,Day 41 之後的下一步:把 Docker Compose 升級為 Helm chart。 - 延伸方向 2:OpenTelemetry Python SDK(2025):
https://opentelemetry.io/docs/languages/python/,從 Day 42 的 metrics / log 走到分散式追蹤的標準介面。 - 延伸方向 3:martinfowler.com — Architecture 專欄(跨年代經典):
https://martinfowler.com/architecture/,決策記錄(ADR)、microservice、團隊工程化的最佳讀物。 - 延伸方向 4:Google SRE Book(2017,跨年代經典):
https://sre.google/sre-book/,production monitoring、incident response、toil reduction 的官方聖經。 - 延伸方向 5:Four Tet 拉的 Postgres 索引研究(2024):
https://pgexercises.com/,實際練習 PostgreSQL 索引與 query plan。
留言
張貼留言