
系統分析與設計 — SA 的思維框架
SA 做的事,本質上是翻譯——把人話翻成系統能理解的結構。
SA 到底在做什麼
很多人以為 SA 就是「畫 UML 圖的人」或「寫規格文件的人」。這就像說廚師就是「切菜的人」。
SA 的核心工作是 在需求和實作之間建立橋樑:
使用者說的話 → [SA 的翻譯] → 開發者能實作的結構
「我要一個購物車」 → 資料模型、狀態流、API 介面、例外處理
翻譯之所以難,是因為:
- 使用者不知道自己要什麼(他們描述的是症狀,不是需求)
- 工程師會假設太多(他們直接跳到實作,跳過結構設計)
- 需求永遠在變(但結構不能每次都翻新)
SA 的五個思維層次
系統分析不是一個步驟,而是五個層次的思考,每一層回答不同的問題:
graph TD A[1. 問題域<br/>到底要解決什麼問題?] --> B[2. 需求域<br/>需要什麼能力來解決?] B --> C[3. 資料域<br/>需要管理哪些資料?關係是什麼?] C --> D[4. 行為域<br/>資料怎麼流動?狀態怎麼轉換?] D --> E[5. 介面域<br/>系統對外長什麼樣子?] style A fill:#E91E63,color:#fff style B fill:#9C27B0,color:#fff style C fill:#2196F3,color:#fff style D fill:#4CAF50,color:#fff style E fill:#FF9800,color:#fff
1. 問題域:到底要解決什麼問題?
最常見的錯誤是直接跳過這層。
使用者說「我需要一個報表系統」——你的第一反應不該是「用什麼報表框架」,而是:
- 他為什麼需要報表?想看什麼?做什麼決策?
- 現在沒有報表他怎麼做?痛點在哪?
- 真的需要「報表系統」嗎?還是一個 dashboard 就夠了?
核心技巧:5 Whys(五個為什麼)
不斷追問「為什麼」,直到碰到真正的問題根源。表面需求和真正需求往往差很遠。
2. 需求域:需要什麼能力?
確認問題後,把它拆成系統需要具備的「能力」:
| 需求類型 | 範例 | 容易被忽略嗎? |
|---|---|---|
| 功能性需求 | 使用者可以新增商品到購物車 | 不會,大家都會寫 |
| 非功能性需求 | 頁面載入時間 < 2 秒 | 經常被忽略 |
| 約束條件 | 必須在現有的 PostgreSQL 上運行 | 有時被忽略 |
| 商業規則 | 折扣不能疊加超過兩層 | 最容易被忽略 |
非功能性需求和商業規則才是真正的坑。 功能性需求大家都會列,但「同時 1000 人結帳不能掛」和「VIP 客戶的折扣規則」這種東西不問就不知道。
3. 資料域:需要管理什麼資料?
這是 SA 最具體的產出之一:Entity-Relationship 模型。
不需要畫完美的 ER Diagram,但你要能回答:
- 有哪些核心實體?(User、Product、Order、Cart…)
- 它們之間的關係是什麼?(一對多、多對多)
- 每個實體的生命週期是什麼?(建立 → 修改 → 刪除?還是建立 → 歸檔?)
- 哪些資料是衍生的?(訂單總金額 = Σ 商品金額 × 數量 - 折扣)
[User] 1──N [Order] N──N [Product]
│ │
└── 1──N [Cart] ──N ────┘
思維重點: 先想資料結構,再想功能。資料模型錯了,上面蓋的功能全部要重來。
4. 行為域:資料怎麼流動?
兩個核心工具:
資料流圖 (DFD) — 回答「資料從哪來、經過什麼處理、到哪去」
使用者 → [提交訂單] → 訂單系統 → [計算金額] → 支付閘道
↓
[更新庫存] → 庫存系統
狀態圖 — 回答「這個東西有哪些狀態、怎麼轉換」
[草稿] → 提交 → [待審核] → 核准 → [進行中] → 完成 → [已結案]
↓
退回 → [草稿]
為什麼這很重要: 大部分的 bug 不是「功能寫錯」,而是「狀態轉換沒處理好」。一個訂單從「待付款」可以變成「已取消」嗎?已出貨的訂單可以退款嗎?這些問題在這一層就要想清楚。
5. 介面域:對外長什麼樣?
最後一層才是大家最熟悉的:API 設計、UI wireframe、系統整合介面。
這一層的產出:
- API 端點清單(對應 API 設計)
- UI 的資訊架構(每個頁面顯示什麼資料、能做什麼操作)
- 外部系統整合介面(支付、物流、第三方 API)
重點: 如果前四層做得扎實,這一層幾乎是自然而然的。如果你發現 API 設計很糾結,通常是前面的資料模型或狀態流沒想清楚。
SA 產出物一覽
不是每個專案都需要全部的文件,但你應該知道有哪些工具可以用:
| 產出物 | 解決什麼問題 | 什麼時候必要 |
|---|---|---|
| 需求規格書 (SRS) | 記錄「系統要做什麼」的完整描述 | 外包、大型專案、合約型開發 |
| 資料字典 | 定義每個欄位的型別、範圍、來源 | 多人開發、資料密集型系統 |
| ER Diagram | 資料模型的視覺化 | 幾乎所有後端專案 |
| DFD 資料流圖 | 資料在系統中怎麼流動 | 複雜業務邏輯、多系統整合 |
| 狀態圖 | 核心物件的狀態轉換 | 有複雜生命週期的實體(訂單、工單、審批流) |
| Use Case 圖 | 誰可以對系統做什麼 | 權限設計、多角色系統 |
| 系統架構圖 | 模組之間的關係和部署結構 | 所有專案都值得畫 |
一個人做 SA 的現實
以前 SA 是一個專職角色,需要大量訪談和文件撰寫。現在如果你是自己做專案或小團隊,怎麼用最少的成本得到 SA 思維的好處?
最小可行的 SA 流程:
- 寫一頁 Problem Statement — 用三句話描述:什麼問題、誰遇到、現在怎麼處理
- 列出核心實體和關係 — 不需要畫圖,用文字列就好(User has many Orders, Order has many Items)
- 畫一張狀態圖 — 只畫最核心的那個實體(通常是 Order、Ticket、Request 之類的)
- 定義 API 的 happy path — 主要的 3-5 個 endpoint,只寫 request/response 的形狀
- 列出你「不確定」的地方 — 這些就是你需要去確認的風險點
AI 在這裡的角色: 你可以把模糊的需求丟給 AI,讓它幫你生成初版的 ER diagram、狀態圖、API 規格。但你要有能力判斷:它生成的東西哪裡不對、哪裡缺了。
反思問題
- 你上次開始寫 code 之前,有想過資料模型嗎? 還是邊寫邊加欄位?
- 你的系統裡,核心實體有幾種狀態?每種狀態的轉換條件你說得出來嗎?
- 如果明天來了一個新需求,你的資料模型撐得住嗎? 如果不確定,可能當初的 SA 沒做到位。
- 你能不能在 10 分鐘內,把一個新功能的資料流畫出來? 這是 SA 思維內化的指標。
延伸閱讀
- 系統規劃方法論 — 更偏重時程和資源面的規劃
- UML 統一塑模語言 — SA 產出物的標準化表達方式
- API 設計與認證機制 — 介面域的具體實踐
- IT 角色演進 — SA 角色在組織中的定位變化