1. 程式人生 > >設計不足與過度設計

設計不足與過度設計

什麼是設計不足?設計出來的系統複用性差,擴充套件性不強,不能靈活的應對變化,簡言之,設計沒到位。設計不足,多半是因為經驗有限,設計能力有限。

什麼是過度設計?設計出來的系統比恰到好處要複雜臃腫的多,過度的封裝、一堆繼承、介面和無用的方法,超複雜的xml配置檔案,簡言之,客戶需求是要一把殺雞的刀,你給設計了一把牛刀(殺雞用牛刀)。過度設計,多半是因為有設計的癖好,喜歡炫耀或玩弄無謂的技巧,或是喜歡把簡單的問題搞複雜化。

如此說來,沒有人能說自己的設計就是恰到好處的。適合的就是最好的,但什麼是適合的?這個度很難把握。

客戶只是告訴你他“需要一把殺雞的刀”,至於將來有沒有需求變化,有沒有可能要這把刀能殺牛,客戶也不知道。所以當然這個設計的度就很難把握了。

有人主張設計必須前瞻與使用者需求,不能以需求為導向。因為客戶從來不會告訴你他未來的需求,連他也不知道。例如,消費者從來不會告訴RIM公司,我需要一款能收企業郵件的BlackBerry手機。

但也有人持相反觀點,認為設計必須以需求為導向,軟體以人為本,以用為本。

其實從一定意思上說,過度設計和設計不足都是“設計錯誤”的一種形式。

設計不足,則意味著系統複用性擴充套件性和靈活性差,系統僵化,不能應對將來的需求變化,或者將來修改和維護的代價和成本會很高,這當然是設計錯誤;

過度設計,則意味著為了實現這個設計要付出的額外代價,例如成本上升,缺陷可能性加大,提升維護成本,甚至降低系統性能。而可維護性和系統的高效能都是系統的隱性需求,這些需求沒實現好,當然也是設計錯誤。

從另外一個角度看來,能夠進行過度設計的,多半設計能力高於設計不足的;過度的設計改回來的成本也比設計不足的改過去的成本低的多。

Martin Fowler說敏捷開發不是輕視設計重實踐和重構,而是演進式的設計(Evolutionary Design,區別與計劃性的設計 Planned Design)。每一次的重構和迭代都對映和更新到最新的設計中來,從而最大限度的滿足客戶的功能性需求和非功能性需求。從最初的Prototyping、初始需求分析與建模,然後進行演進式的架構設計和實踐,這也許是適合於大多數中小型專案的最佳實踐。

因為變化是無窮無盡的,需求是變幻莫測的,我們每天都跟在需求後面跑,跑的很累。而客戶還要求我們隨需應變,抱怨我們不夠敏捷,要求我們以歡喜的心態來擁抱變化,因為變化就是IT的機會嘛! 但我們能找到“銀彈”來封裝所有未知的需求變化嗎?我們能超前於客戶的需求,能變被動為主動嗎?我們能設計出一個系統超前於未來客戶的需求嗎?

沒有一個完美的能隨需應變的系統,所謂“設計之美”也是盛名之下其實難副。我們實際的目標只是最大限度的封裝變化,最大限度的預測某些未來可能的變化,提供某些系統擴充套件和變化的可能性,從而減低未來變化的成本,為客戶創造價值。

也許,最簡單的才是最好的。大巧若拙,大道至簡,有時候越簡單的反而越難實現,而且越接近真理。也許這個只能靠個人體會和悟性了,才能最終體會到簡單的精妙設計之美。熟背各種設計模式、學個一招半式的人,就像一個天天揹著一把劍的劍客一樣,唯恐旁人不知道其劍術高強;而真正的高手是手中無劍,卻照樣可以打贏別人,因為萬物都可被他用來施以劍法。這才是真正的高境界。

我們缺乏的是真正有創意的創造性的設計,比如我們為什麼沒有設計出中國人自己的framework和platform?因為我們經驗、技術和設計能力不足,大家都沉迷於玩一些小技巧,戰術技巧,不是戰略技巧;玩到30歲然後都去做PM做培訓做銷售去了。而在那些需要簡約設計的地方,我們卻自詡為高手而加上很多華麗的設計來維護虛幻的可擴充套件性和靈活性。

中國的架構師,缺乏的不僅僅是經驗、技術、創意、設計能力,也許最缺乏的是思想,是心境。