上世紀60年代后望浩,由于“軟件危機”的推動,人們開始借助工程化的方式解決軟件開發(fā)中質(zhì)量透且、成本和工期不可控的問題捶码,形成了軟件工程學(xué)羽氮。
軟件工程學(xué)從其他人類工程學(xué)(如建筑學(xué)和硬件開發(fā))中吸收了許多成功的經(jīng)驗,明確提出了軟件生命周期模型惫恼,并發(fā)展出了各種在軟件開發(fā)與維護階段適用的技術(shù)方法與工程實踐档押,這些都在各種軟件項目中取得了一定的效果。記得當年大學(xué)計算機軟件工程課老師最喜歡用建筑學(xué)做類比祈纯,講到工程令宿、復(fù)用和模式之時必提及Christopher Alexander及其在建筑學(xué)上的相關(guān)著作。
遺憾的是腕窥,雖然軟件工程將科學(xué)的項目管理方式引入到軟件開發(fā)交付過程中粒没,但是并沒有很好解決軟件的一個核心問題,那就是 “變化” 的問題簇爆。軟件在其全生命流程中(無論交付后還是交付過程中)癞松,都會面臨由于需求變更或者技術(shù)演進帶來的相對更高頻的變化。
正因為軟件在開發(fā)和交付后一直充滿著變化入蛆,所以人們往往隱喻軟件是“具有生命”的响蓉。從這個角度來說,軟件開發(fā)有些像“養(yǎng)小孩”而非“做雕塑”安寺。單純用“硬件式”的工程方法被證明是難以做好復(fù)雜軟件的厕妖。
現(xiàn)代軟件工程開始強調(diào)“敏捷”和“演進式設(shè)計”的能力首尼,軟件公司也更愿意重視“人”和“文化”等因素挑庶,正是以動態(tài)生長體的方式來看待軟件言秸。
如果繼續(xù)對軟件領(lǐng)域進行細分的話,會發(fā)現(xiàn)不同領(lǐng)域的軟件變化頻率其實是不同的迎捺。
上圖展示了軟件的”門檻變化率“曲線:交付門檻越低的軟件举畸,變化頻率越高,而交付門檻越高的軟件凳枝,變化頻率越低抄沮。這也是軟件工程復(fù)雜的原因之一:很難有一條可以完全復(fù)制的成功經(jīng)驗。務(wù)實的做法是根據(jù)自己的定位岖瑰,探索適合自己的方式叛买。
對于變化頻率低的領(lǐng)域,“管控”蹋订、“規(guī)劃”和“度量”為主的工程和設(shè)計方法仍然是有效的率挣;而對于高頻變化的不確定性較強的領(lǐng)域,以“引導(dǎo)”露戒、“反饋”和“持續(xù)演進”為主的工程設(shè)計方法則往往會更加有效椒功。
但是無論如何,軟件要求能夠復(fù)用的特點決定了智什,軟件要能基于自身進行持續(xù)的生長动漾。變化頻率低只是生長速度慢,微小但是不斷累積的變化放到足夠長的時間里面看也是不容小覷的荠锭。
所以即使變化頻率低的領(lǐng)域旱眯,只要軟件生命周期足夠長,向下兼容的時間久节沦,就需要具備讓軟件持續(xù)響應(yīng)變化键思,長期保持健康生命力的能力。
這種能力被稱為 “演進式設(shè)計”甫贯。
關(guān)于演進式設(shè)計吼鳞,Martin Fowler在2004年寫過一篇文章《Is Design Dead?》,辯證的闡述了其與“規(guī)劃式設(shè)計”的關(guān)系叫搁。這篇文章是關(guān)于演進式設(shè)計不可多得的佳作赔桌,這里是其中文翻譯版。
演進式設(shè)計被認為主要由以下六部分組成:
其中渴逻,“完善測試”疾党、“及時重構(gòu)”和“持續(xù)反饋”,組成了演進式設(shè)計的工程能力部分惨奕。具體包括完善的測試體系雪位、重構(gòu)能力以及能夠快速反饋的持續(xù)集成和交付流水線。
上述能力也是現(xiàn)代軟件工程的基礎(chǔ)梨撞,有大量的著作對此做介紹雹洗,如《敏捷測試》香罐、《開發(fā)者測試》、《測試驅(qū)動開發(fā)》时肿、《重構(gòu)》庇茫、《持續(xù)集成》、《持續(xù)交付》螃成、《演進式架構(gòu)》等等旦签。如 Martin Fowler所說,這些工程實踐的目的是 “拉低軟件的變化成本曲線” 寸宏,保證設(shè)計的調(diào)整可以發(fā)生的足夠頻繁宁炫。
而“保持簡單”、“設(shè)計技能”和“延遲決策”則組成了演進式設(shè)計的設(shè)計能力部分氮凝×艿恚《敏捷軟件開發(fā)原則、模式與實踐》以及《浮現(xiàn)式設(shè)計:專業(yè)軟件開發(fā)的演進本質(zhì)》等著作有關(guān)于這方面的闡述覆醇。
不過演進式設(shè)計中關(guān)于設(shè)計方面的優(yōu)秀著作相比工程實踐方面的還是少很多朵纷。慶幸的是袁英杰寫過幾篇極佳的文章,非常適合用來闡述演進式設(shè)計所需要的設(shè)計能力永脓。
這篇文章《簡單設(shè)計》袍辞,通過講解“簡單設(shè)計原則”,很好闡述了什么是演進式設(shè)計中強調(diào)的“保持簡單”常摧。
這篇文章《變化驅(qū)動:正交設(shè)計》非常經(jīng)典的總結(jié)了演進式設(shè)計中需要的可以應(yīng)對變化的“設(shè)計技能”搅吁。
另外一篇《第一顆子彈》極佳的解釋了什么是正確的“延遲決策”。
最后我們總結(jié)一下演進式設(shè)計:
演進式設(shè)計強調(diào)讓設(shè)計盡量 “保持簡單” 落午,對不確定的變化需要 “延遲決策” 谎懦,直到被某個方向上的“第一顆子彈”擊中時,再通過應(yīng)對變化的 “設(shè)計能力” 進行設(shè)計調(diào)整溃斋,并同步將新的設(shè)計 “及時重構(gòu)”到代碼中界拦,讓代碼從此在對應(yīng)的方向上可以保持彈性。
演進式設(shè)計強調(diào)上述過程要能夠及時頻繁的發(fā)生梗劫,不要堆積享甸。這需要自動化的 “完善測試” 和 “持續(xù)反饋” 來持續(xù)保證設(shè)計和代碼變更盡量的低成本和安全有效。
總結(jié)完演進式設(shè)計后梳侨,下一篇中我們著重談?wù)勗谲浖幋a中如何解決具體代碼中存在的變化蛉威,作為對演進式設(shè)計中代碼實踐的補充。