Skip to content

Commit 5c20465

Browse files
committed
Refactor code structure for improved readability and maintainability
1 parent 3b93605 commit 5c20465

File tree

2 files changed

+195
-0
lines changed

2 files changed

+195
-0
lines changed
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
---
2+
title: "[SDD 與 Spec Kit]傳統瀑布式開發(1975-2000)"
3+
date: 2025/10/30 16:36:06
4+
tags:
5+
- 學習筆記
6+
---
7+
8+
TL;DR
9+
10+
## 當軟體開發還是一門工程學
11+
12+
1970 年代,當軟體開發還是一門新興學科時,人們自然地從傳統工程領域借鑒經驗。
13+
14+
蓋房子需要藍圖、造橋需要設計圖,那麼開發軟體當然也需要完整的規格文件——這個看似合理的類比,開啟了長達數十年的瀑布式開發時代。
15+
16+
有趣的是,[瀑布式開發 - Waterfall](/assets/royce1970.pdf) 這個名詞首次出現在1970年 Winston Royce 的論文中
17+
18+
但 Royce 其實只是點名在當時的主流方法,並且給這種方法一些批評與建議。
19+
20+
只是產業界選擇性地抓住了 Buzz Word ”Waterfall” 並將其奉為圭臬,而忽略了他的警告。
21+
22+
當然這也不是第一次業界扭曲軟體工程理論的原意。
23+
24+
## 瀑布模式的黃金年代
25+
26+
流程的確立
27+
28+
瀑布式建立起一套看似完美的流程:
29+
30+
### 需求分析 → 系統設計 → 實作 → 測試 → 部署 → 維護
31+
32+
就像接力賽跑,一棒接一棒,每個階段都有明確的交付物和把關者。
33+
34+
需求分析階段產出厚達數百頁的需求規格書(SRS, Software Requirements Specification),
35+
36+
系統設計階段則有高階設計(HLD, High-Level Design)和低階設計(LLD, Low-Level Design)文件。
37+
38+
這些文件不只是參考,而是具有合約效力的承諾。
39+
40+
當時的人相信,只要文件夠詳細,開發就是照著做而已。
41+
42+
甚至 UML 也在那個時代應運而生。
43+
44+
### 角色分工的確立
45+
46+
這個時期也確立了軟體開發的專業分工:
47+
48+
- PM(專案經理)負責管理時程與資源,通常不懂技術
49+
- SA(系統分析師)負責理解業務需求,把業務語言翻譯成技術語言
50+
- SD(系統設計師)負責技術架構,畫一堆UML圖
51+
- PG(程式設計師)負責編碼實作,被視為「碼農」
52+
- QA(品質保證工程師)負責測試驗證,專門找碴
53+
54+
這種分工暗示著「思考」和「執行」是可以分離的。
55+
56+
會思考的人負責設計,會打字的人負責coding。
57+
58+
這種階級觀念到今天都還沒完全消失。
59+
60+
## 為什麼瀑布式曾經如此成功?
61+
62+
### 無法失敗的時代背景
63+
64+
在1980年代,一套企業系統可能要價數百萬美元,開發週期動輒2-3年。
65+
66+
IBM的System/360開發耗資50億美元(相當於今天的400億),這種規模的投資容不得失敗。
67+
68+
瀑布式提供了管理層最需要的東西:控制力(或許只是幻覺)。
69+
70+
每個階段都有文件、有簽核、有人負責。出事了可以調出文件來看是誰的錯。
71+
72+
這種「可究責性」讓高層睡得安心。
73+
74+
### 適合當時的技術限制
75+
76+
當時的開發環境是什麼樣子?
77+
78+
- 沒有 Git,版本控制用 CVS/RCS 等集中式系統,或原始的複製資料夾
79+
- 早期沒有 IDE,主要用 vi 或 Emacs,90年代才有原始的 IDE
80+
- 編譯大型專案可能要等數小時
81+
- 測試主要靠人工,自動化測試工具原始且昂貴
82+
- 部署要半夜停機,通過實體媒介發布
83+
84+
在這種環境下,改一行code的成本可能是現在的100倍。
85+
86+
「想清楚再動手」不只是最佳實踐,而是唯一選擇。
87+
88+
[個人經驗補充區]
89+
90+
## 瀑布式的內在矛盾
91+
92+
### 文件與現實的落差
93+
94+
最大的問題在於:軟體是看不見、摸不著的。
95+
96+
建築師可以做模型,讓客戶看到未來的大樓長什麼樣子。
97+
98+
但軟體呢?畫了100張UML圖,客戶還是不知道系統用起來是什麼感覺。
99+
100+
更慘的是,需求文件寫著「系統應支援多使用者同時操作」,但什麼叫「多」?
101+
102+
10個?1000個?每個人心中都有不同的數字,直到系統上線當機才發現認知落差。
103+
104+
### 溝通的斷層
105+
106+
瀑布式假設資訊可以無損地傳遞,但現實是每一次傳遞都會失真,每一層次轉換都是風險:
107+
108+
> 客戶說:「我要一個簡單的購物網站」
109+
>
110+
> PM聽成:「要有會員系統、商品管理、訂單處理、金流串接...」
111+
>
112+
> SA寫成:「系統應提供使用者友善的介面以利商品選購」
113+
>
114+
> SD設計成:「採用三層式架構搭配MVC模式」
115+
>
116+
> PG實作成:「if-else地獄加上全域變數」
117+
118+
最後客戶看到成品:「這不是我要的!」
119+
120+
### 變更的成本
121+
122+
瀑布式最致命的假設是:**需求是可以預先確定且不會改變的。**
123+
124+
但現實是,**客戶看到系統之前,根本不知道自己要什麼。**
125+
126+
就像買衣服,不試穿怎麼知道合不合身?
127+
128+
但在瀑布式的世界裡,改需求要走變更流程、要重新評估、要加錢加時間。
129+
130+
結果就是:不是系統符合需求,而是需求被迫符合系統。
131+
132+
Y2K:瀑布式的最後輝煌與警鐘
133+
1990年代末的千禧蟲(Y2K)危機,是瀑布式的最後一場大戲。
134+
面對明確、不可變更的需求(修正日期欄位從2位數改成4位數),瀑布式展現了它的優勢:
135+
136+
需求明確:2000年1月1日是死線
137+
範圍固定:所有日期欄位都要改
138+
風險可控:測試案例可以預先定義
139+
140+
全球企業投入6000億美元,有條不紊地完成了系統修正。2000年1月1日,世界沒有崩潰,瀑布式似乎贏了。
141+
但等等,為什麼當初設計時沒想到?為了省兩個byte的空間,結果花了6000億來補救?這暴露了瀑布式的致命傷:它假設人類可以預見未來。
142+
143+
[個人經驗補充區]
144+
網路時代的衝擊
145+
1995年,Netscape上市,網路泡沫開始膨脹。突然間,遊戲規則全變了:
146+
147+
產品生命週期從年變成月
148+
競爭對手不是隔壁公司,而是地球另一端的車庫創業
149+
使用者期待每週都有新功能
150+
「永遠Beta」成為新常態
151+
152+
Amazon的Jeff Bezos提出「兩個披薩團隊」理論:團隊要小到兩個披薩就能餵飽。這完全違反了瀑布式的大兵團作戰思維。
153+
Google更狂,直接在logo上掛著Beta標籤好幾年。Gmail從2004年Beta到2009年,期間不斷推出新功能。如果用瀑布式,大概還在寫規格書的第五版。
154+
當你的競爭對手每週更新,而你還在等三個月後的UAT(使用者驗收測試),市場早就不見了。
155+
瀑布式的遺產
156+
仍然適用的領域
157+
諷刺的是,即使在2024年,某些領域仍然需要瀑布式:
158+
159+
醫療設備軟體:FDA要求完整的文件追蹤,一個bug可能害死人
160+
航太系統:NASA的軟體開發依然遵循嚴格的階段審查
161+
金融核心系統:當你處理的是別人的錢,「快速失敗」不是選項
162+
163+
這些領域的共同點是:錯誤的成本遠大於延遲的成本。
164+
文化的延續
165+
更深層的影響是,瀑布式留下的不只是流程,更是一種思維模式。
166+
即使號稱敏捷的團隊,骨子裡可能還是瀑布式思維:
167+
168+
Sprint計畫會議開4小時,像極了需求分析會議
169+
Story Point估算變成了工時評估2.0
170+
Scrum Master變成了改名的PM
171+
Retrospective淪為抱怨大會,因為「流程是總部規定的」
172+
173+
最諷刺的是什麼?很多公司的「敏捷轉型」本身就是用瀑布式規劃的:先導入Scrum、再導入CI/CD、最後導入DevOps。每個階段都有明確的里程碑和KPI。
174+
結語:理解過去,才能創造未來
175+
瀑布式開發不是錯誤,而是特定時代的最佳解答。
176+
它教會了產業很多重要的事:
177+
178+
文件化的價值(雖然常常過頭)
179+
流程管理的重要(雖然常常僵化)
180+
品質控制的必要(雖然常常太晚)
181+
182+
但當世界改變,堅持不變就是最大的風險。瀑布式的問題不在於它本身,而在於它假設世界是靜態的、可預測的、可控制的。
183+
可惜,軟體開發更像衝浪而不是蓋房子。你必須隨時調整平衡,回應每一個浪頭。
184+
下一篇,我們將探討敏捷如何試圖解決這些問題,以及為什麼「敏捷」最後也變成了另一種「瀑布」。畢竟,人類就是這麼喜歡把動詞變成名詞,把精神變成教條。
185+
186+
註:本文部分數據來源於IEEE Software History、Computer History Museum資料庫。Y2K投入成本數據來自Gartner 2000年報告。
187+
[待補充個人經驗區塊]RetryClaude can make mistakes. Please double-check responses. Opus 4.1
188+
189+
## 參考
190+
191+
- [以前的程序员,除了敲代码,还得会画画【让编程再次伟大#42](https://www.youtube.com/watch?v=RyGA6zBHcJg)
192+
- [RUP 統一軟體開發過程](https://zh.wikipedia.org/zh-tw/%E7%BB%9F%E4%B8%80%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E8%BF%87%E7%A8%8B)
193+
- [序列圖,UML 給軟體開發帶來的唯一好處](https://docs.mermaidchart.com/blog/posts/sequence-diagrams-the-good-thing-uml-brought-to-software-development)
194+
195+
(fin)
429 KB
Binary file not shown.

0 commit comments

Comments
 (0)