前言 / Introduction

工作上經常會寫一些自動化小工具,去解決日常的問題,開發過程不免俗與其他同事的專案有重疊的功能,因此會互相 Code Review,但此時常會覺得羞於見人,既沒有 Diagram 描述架構,文件描述又異常地空乏,總覺得少了點甚麼。

一開始我會覺得:「反正只是個小工具嘛」,但當聽到大神們聊起「模組設計 OOP」、「可維護性」、「容錯設計」等架構問題時,才意識到,我寫的不是工具,是妥協出來的程式碼。

初期的盲點:解決問題 ≠ 解決得好

對我來說,小工具只要「能跑」、「能交差」,就算完成。但這樣的 mindset 讓我忽略了幾件事:

  • 沒人看得懂的 code,會變成團隊的負債
  • 架構思慮不周,容易留下技術債
  • 擴充性很低,重構等於打掉重練
  • 沒有良好的錯誤處理、資源釋放、IO timeout

大神們思考的是「系統的運作」,而不是「功能的存在」

有一次 Code Review,學長只用兩句話,就打醒我:

  • Function 過度耦合,缺乏可維護性和可擴展性
  • 架設方式過於複雜,沒考慮使用者的背景

這時我才發現,System Design 不是只有在面試時才會遇到的 buzzword,它是真正在工作中,讓專案變得可靠、可維護的核心能力。

我為什麼決定開始學習 System Design

  • 技術長大了,但腦袋沒長大:寫得出複雜的程式碼,但無法抽象出整體結構
  • 專案開始有接觸多人合作:你不能只靠自己看懂,還要讓別人接得下去
  • 我想寫出讓人放心的程式,而不是「現在能跑,之後爆炸的程式」

學習路線

我規劃一個 System Design Study Plan,希望能夠利用空閒的時間去補齊這些知識。

週次主題核心關鍵詞重點問題
Week 1Scalability & Load BalancerVertical / Horizontal Scaling, Auto Scaling, Round Robin, IP Hash如何應對高併發?如何分散負載?
Week 2Cache 設計與策略Read-Through, Write-Through, TTL, LRU, Redis如何用 Cache 提高效能又保持一致性?
Week 3Database 選型與 ShardingSQL vs NoSQL, Sharding, Replication, CAP什麼情況選 MySQL?什麼情況拆 DB?
Week 4Data Consistency & Message QueueEventual Consistency, Kafka, RabbitMQ, Idempotency Key系統怎麼確保資料一致?怎麼防重複?
Week 5Rate Limiting & Circuit BreakerToken Bucket, Leaky Bucket, Retry, Backoff, Hystrix如何保護系統不被濫用或雪崩?
Week 6CDN & Global System DesignCloudflare, Geo DNS, Edge Cache如何設計給全球用戶?如何用 CDN 加速?
Week 7Monitoring & ReliabilitySLA, SLO, SLI, Prometheus, Grafana, Healthcheck如何設計一個穩定且可觀察的系統?
Week 8Design Real Systems & Interview CaseDesign YouTube, Messenger, TinyURL, LLM Infra如何答出一個完整的系統設計題?

結語

System Design 不只是為了寫出能跑的系統,而是為了寫出能活得久的系統。

每一個亂七八糟的 script 都可能是未來災難的起點;每一次設計上的思考,都是朝「大神」跨進的一步。