SDLC 軟體開發生命週期總覽
是什麼?
SDLC(Software Development Life Cycle,軟體開發生命週期)是一套描述「軟體從構想到下線」全過程的結構化框架。它把混沌的開發工作切成可管理、可交接、可量測的階段,讓團隊對「現在在哪、產出什麼、誰負責」有共同語言。
身為資深 C# 開發者,你可能已經在 Visual Studio 裡按過無數次 F5,但 SDLC 關注的不是某一行程式碼,而是「整個交付流程」。它的價值在於:
- 降低風險:在早期用便宜的文件與討論發現問題,而不是上線後用真金白銀補救。
- 可預測性:管理層能估時程、估成本、估資源。
- 可追溯性:每個功能都能往回追到當初的需求,往下對應到測試案例。
ℹ️SDLC 不等於某個方法論
SDLC 是「階段的抽象骨架」;Waterfall、Agile、Scrum 是「跑這套骨架的不同節奏與順序」。同一組階段,瀑布是一次走完,敏捷是每個衝刺都迷你地走一輪。別把 SDLC 跟某個特定流程畫上等號。
六大階段詳解
每個階段都有明確的「輸入 → 活動 → 產出 → 負責角色」。理解這四個面向,才能在任何專案中辨認自己身處哪一階段。
| 階段 | 輸入 | 主要活動 | 產出物 | 主要負責角色 |
|---|---|---|---|---|
| 1. 需求 Requirement | 商業目標、客戶痛點、市場調查 | 訪談、釐清、優先排序、可行性評估 | 需求規格(SRS)、User Story、驗收條件 | BA/PO、需求分析師 |
| 2. 設計 Design | 已確認的需求 | 架構決策、資料模型、API 合約、UI 線框 | 架構設計文件、ERD、介面規格、ADR | 架構師、技術主管、UX |
| 3. 開發 Implementation | 設計文件、技術規格 | 寫程式、Code Review、版本控制、單元測試 | 原始碼、可建置的成品、單元測試 | 開發工程師 |
| 4. 測試 Testing | 可測試的成品、測試計畫 | 整合測試、系統測試、UAT、回歸測試 | 測試報告、缺陷清單、通過的測試套件 | QA/測試工程師 |
| 5. 部署 Deployment | 通過測試的版本、發佈計畫 | 環境佈署、CI/CD、設定管理、灰度發佈 | 上線的系統、發佈說明、回滾方案 | DevOps、SRE |
| 6. 維運 Maintenance | 線上系統、使用者回饋、監控告警 | 修 Bug、效能調校、安全修補、小幅增強 | 修正版本、監控儀表板、新需求 | 維運團隊、開發、SRE |
各階段的實務重點
- 需求:這是整條生命週期中錯誤成本最低、修正最便宜的時刻。一句話沒問清楚,可能讓後面五個階段全部走偏。
- 設計:把「要做什麼」翻譯成「怎麼做」。對 C# 專案而言,這裡會決定分層架構、是否導入 CQRS、ORM 選型、邊界上下文(Bounded Context)切分。
- 開發:實際產出程式碼。好的團隊在此階段就把單元測試、靜態分析(如 Roslyn Analyzer)、Code Review 內建進流程。
- 測試:不只是「找 Bug」,更是「驗證系統符合需求」。注意測試左移(Shift-Left),愈早測愈省。
- 部署:現代實務以 CI/CD 自動化為主,搭配藍綠部署或金絲雀發佈降低上線風險。
- 維運:軟體生命週期中最長的階段,往往佔總成本 60% 以上,而且會持續餵出新需求。
需求階段:四個活動怎麼做
- 訪談:對利害關係人做半結構式訪談。先開放式問題(「你現在怎麼處理請假?」)再收斂,用 5 Whys 挖真實痛點;問「現況與困擾」而非「你想要什麼功能」(使用者常直接丟解法)。
- 釐清:把模糊處轉成明確陳述,維護「假設清單(Assumptions)」與「待澄清問題(Open Questions)」,逐一找對的人確認。
- 優先排序:常用 MoSCoW、價值/成本矩陣、RICE、Kano 模型。
- 可行性評估:技術、經濟(ROI)、時程、營運四個面向逐一評估。
產出物(SRS、User Story、驗收條件)的完整內容與寫法,詳見本主題第 2 課《需求工程與 User Story》。
設計階段:四種產出物的內容與產出方式
| 產出物 | 內容是什麼 | 怎麼產出 |
|---|---|---|
| 架構設計文件 | 元件、分層、部署拓樸、技術選型、跨切面策略 | 常用 C4 模型(Context → Container → Component → Code 四層由粗到細) |
| ERD(實體關係圖) | 資料表、欄位、主鍵外鍵、表間關係 | 從領域名詞抽實體 → 定關係 → 正規化(通常到 3NF) |
| 介面規格 | API 端點、HTTP 動詞、請求/回應 schema、錯誤碼、認證 | 用 OpenAPI/Swagger 寫成合約,前後端依此並行開發 |
| ADR(架構決策紀錄) | 記錄「為什麼這樣決定」的一頁文件 | 固定格式,存進 repo 的 docs/adr/ |
ADR 範本(每個重大決策一個檔案):
# ADR-007: 訂單查詢採用 Dapper 而非 EF Core
## Status
Accepted(2026-06)
## Context
訂單報表有大量複雜 SQL,EF Core 產生的查詢效能不佳且難調校。
## Decision
查詢路徑改用 Dapper 手寫 SQL;寫入路徑仍用 EF Core。
## Consequences
+ 報表查詢效能大幅提升、SQL 完全可控
- 團隊需同時維護兩套資料存取方式ADR 是最被低估的工具:半年後有人問「為什麼這樣設計?」,ADR 就是答案,避免決策被反覆推翻。
設計階段常聽到的技術名詞
- CQRS(命令查詢職責分離):把「寫入(改狀態)」與「讀取(查資料)」拆成兩條模型/路徑,讀寫各自最佳化,代價是複雜度上升。詳見 DDD 主題的 CQRS 一課。
- ORM 選型:ORM 把 C# 物件與資料表自動對映。.NET 兩大選擇是 EF Core(功能全、開發快、LINQ、自動 migration)與 Dapper(極輕、貼近 SQL、效能好但要自己寫 SQL)。選型即在「開發速度」與「效能/掌控度」間取捨。
- Bounded Context(限界上下文):DDD 概念,把大系統依業務語意邊界切成數個獨立模型,每個邊界內名詞有一致意義。詳見 DDD 主題與本主題《系統切分》一課。
- 靜態分析(如 Roslyn Analyzer):不執行程式、直接分析原始碼,用來抓 bug 風險、強制風格一致、揪安全漏洞,在編譯期/CI 就擋下低級錯誤,常搭
.editorconfig、SonarQube。
// 一段程式碼如何貫穿各階段的「可追溯性」示意
// 需求: US-142「使用者下單後應收到 Email 通知」
// 設計: 採用事件驅動,OrderPlaced 事件觸發通知服務
public sealed class OrderPlacedHandler : INotificationHandler<OrderPlaced>
{
private readonly IEmailSender _email; // 設計階段定義的介面合約
public OrderPlacedHandler(IEmailSender email) => _email = email;
// 開發階段實作;測試階段對應 TC-142 驗收條件
public async Task Handle(OrderPlaced e, CancellationToken ct)
{
await _email.SendAsync(e.CustomerEmail, "您的訂單已成立", ct);
}
}常見誤區
⚠️把 SDLC 當成只能線性走一次
最常見的誤解是「需求一旦定稿就不能改」。現實是需求會演化、市場會變、使用者用了才知道自己要什麼。把 SDLC 想成單行道,會讓團隊抗拒變更、累積技術債,最後做出沒人要的產品。
⚠️跳過或壓縮需求與設計階段
「先寫了再說」在 Demo 階段很爽,但需求模糊導致的返工,成本會在後期指數級放大。研究普遍指出:需求階段發現的缺陷修復成本約為 1 倍,設計階段約 5 倍,開發階段 10 倍,測試階段 15 倍以上,而上線後(維運階段)可高達 30 至 100 倍。愈晚發現,愈貴。
⚠️把測試當成開發完才開始的獨立關卡
測試若集中在尾端,會變成時程被擠壓時第一個被犧牲的環節。正確做法是「測試左移」:需求階段就寫驗收條件,開發階段就寫單元測試,讓品質內建而非事後檢查。
流程/步驟
下圖以循序方式呈現六大階段。請記得:在敏捷實務中,這六步是「每個衝刺迷你跑一輪」,而非整個專案只跑一次。
需求 Requirement
釐清商業目標與使用者需求,產出需求規格與驗收條件
設計 Design
做架構與資料模型決策,產出設計文件與介面合約
開發 Implementation
撰寫程式碼、Code Review、單元測試,產出可建置成品
測試 Testing
整合、系統、UAT、回歸測試,產出測試報告與缺陷清單
部署 Deployment
透過 CI/CD 佈署到正式環境,準備回滾方案
維運 Maintenance
監控、修補、調校,並蒐集回饋形成新需求
SDLC 模型比較
同一組階段,可以用不同節奏來跑。下表是四種經典模型的一句話精華:
| 模型 | 一句話特性 | 適用情境 | 主要風險 |
|---|---|---|---|
| Waterfall(瀑布) | 階段一次走完、嚴格前後相依,文件驅動 | 需求極穩定、合規嚴格(如政府、醫療) | 後期才發現問題,返工昂貴 |
| Iterative/Incremental(迭代漸進) | 分多輪交付,每輪都做完整六階段的一小塊 | 需求大致清楚但可分批 | 需要良好的版本與整合管理 |
| Spiral(螺旋) | 每一圈都先做風險分析再開發,重風險控管 | 大型、高風險、高成本專案 | 流程重、成本高,小專案過度 |
| Agile(敏捷) | 短週期迭代交付,擁抱變更,主流選擇 | 需求多變、需快速回饋的產品開發 | 缺紀律時易失控、文件不足 |
ℹ️如何選模型
判斷關鍵是「需求的穩定度」與「變更的成本」。需求愈穩定、變更愈昂貴(如嵌入式、合約制),愈偏向瀑布;需求愈多變、愈需要市場回饋,愈偏向敏捷。多數現代網路與企業應用團隊選擇敏捷(Scrum/Kanban),這也是面試最常被問到的方向。
架構圖/概念圖
下圖呈現 SDLC 的迭代循環本質:維運階段蒐集到的回饋與新需求,會重新流回需求階段,啟動下一輪循環。這正是「它不是一次走完的瀑布」的核心。
注意從「維運」回到「需求」那條邊:它把整個流程閉合成一個循環。每一次循環,產品都應該比上一輪更貼近使用者真正需要的東西。
實戰補充(Q&A)
Q:身為資深 C# 開發者,我每天都在寫程式(開發階段),為什麼還要懂整條 SDLC? A:因為你寫的程式碼會被前後階段牽動。需求沒講清楚,你寫得再漂亮也是白工;設計階段的架構決策,決定你之後是輕鬆擴充還是天天救火;不懂部署與維運,你會寫出在本機跑得很好、上線就爆炸的程式。理解全局,你才能在 Code Review 與設計討論中提出真正有價值的意見,也才是 Senior 跟 Junior 的差別。
Q:敏捷團隊還需要設計階段嗎?看起來大家都直接開衝刺? A:需要,但形式不同。敏捷不是「不設計」,而是「即時且足夠(Just Enough, Just In Time)的設計」。重大架構決策仍會用 ADR(Architecture Decision Record)記錄,只是不再寫幾百頁的前期設計文件,而是隨衝刺漸進演化。
Q:維運階段為什麼會「產出新需求」?感覺很反直覺。 A:因為使用者只有真正用了系統,才知道哪裡不順、還缺什麼。監控數據會揭露效能瓶頸,客服工單會揭露痛點,這些都會被整理成新的 User Story,重新進入需求階段。這就是 SDLC 是循環而非直線的最佳證明。
Q:DevOps、CI/CD 是不是取代了 SDLC? A:不是取代,是「加速並自動化」其中的部署與部分測試階段。SDLC 描述「做什麼階段」,DevOps 描述「如何讓這些階段流動得更快更可靠」。兩者是不同層次,互補而非互斥。
理解測驗
🤔 在 SDLC 中,缺陷在哪一個階段被發現時,修復成本通常最低?
🤔 關於 SDLC 的迭代本質,下列何者最正確?
🤔 某團隊開發一套需求極度穩定、且受嚴格法規約束的醫療設備韌體,變更成本非常高。最適合的 SDLC 模型最可能是?
重點整理
💡一句話記住
SDLC 是「需求→設計→開發→測試→部署→維運」六階段的循環骨架——愈早把事情想清楚愈便宜,而維運的回饋會餵出新需求,讓整個流程不斷迭代轉動,而不是一條走完就結束的直線。
| 重點 | 一句話總結 |
|---|---|
| 六大階段 | 需求 → 設計 → 開發 → 測試 → 部署 → 維運 |
| 核心心法 | 它是循環,不是一次性瀑布 |
| 成本鐵律 | 缺陷愈晚發現,修復成本愈貴(最高可達數十至上百倍) |
| 模型選擇 | 需求穩定選瀑布、需求多變選敏捷 |
| 維運真相 | 最長、成本最高,且會源源不絕產出新需求 |
| 對開發者的意義 | 懂全局,才能在設計與評審中提出有價值的判斷 |