什麼是設計不足
(under-engineering)?
設計出來的系統復用性差,擴充套件性不強,不能靈活的應對變化,簡言之,設計沒到位。設計不足,多半是因為經驗有限,設計能力有限。
什麼是過度設計
(over-engineering)?
設 計出來的系統比恰到好處要複雜臃腫的多,過度的封裝、一堆繼承、介面和無用的方法,超複雜的
xml配置檔案,簡言之,客戶需求是要一把殺雞的刀,你給設計 了一把牛刀(殺雞用牛刀)。過度設計,多半是因為有設計的癖好,喜歡炫耀或玩弄無謂的技巧,或是喜歡把簡單的問題搞複雜化。
如此說來,沒有人能說自己的設計就是恰到好處的。適合的就是最好的,但什麼是適合的?這個度很難把握。
客戶只是告訴你他「需要一把殺雞的刀」,至於將來有沒有需求變化,有沒有可能要這把刀能殺牛,客戶也不知道。所以當然這個設計的度就很難把握了。
有人主張設計必須前瞻與使用者需求,不能以需求為導向。因為客戶從來不會告訴你他未來的需求,連他也不知道。例如,消費者從來不會告訴
rim公司,我需要一款能收企業郵件的 blackberry手機。
但也有人持相反觀點,認為設計必須以需求為導向,軟體以人為本,以用為本。
其實從一定意思上說,過度設計和設計不足都是「設計錯誤」的一種形式。
設計不足,則意味著系統復用性擴充套件性和靈活性差,系統僵化,不能應對將來的需求變化,或者將來修改和維護的代價和成本會很高,這當然是設計錯誤;
過度設計,則意味著為了實現這個設計要付出的額外代價,例如成本上公升,缺陷可能性加大,提公升維護成本,甚至降低系統效能。而可維護性和系統的高效能都是系統的隱性需求,這些需求沒實現好,當然也是設計錯誤。
從另外乙個角度看來,能夠進行過度設計的,多半設計能力高於設計不足的;過度的設計改回來的成本也比設計不足的改過去的成本低的多。
martin fowler說敏捷開發不 是輕視設計重實踐和重構,而是演進式的設計 (evolutionary design,區別與計畫性的設計 planned design)。每一次的重構和迭代都對映和更新到最新的設計中來,從而最大限度的滿足客戶的功能性需求和非功能性需求。從最初的 prototyping、初始需求分析與建模,然後進行演進式的架構設計和實踐,這也許是適合於大多數中小型專案的最佳實踐。
因為變化是無窮無盡的,需求是變幻莫測的,我們每天都跟在需求後面跑,跑的很累。而客戶還要求我們隨需應變,抱怨我們不夠敏捷,要求我們以歡喜的心態來擁抱變化,因為變化就是
it的機會嘛 ! 但我們能找到「銀彈」來封裝所有未知的需求變化嗎?我們能超前於客戶的需求,能變被動為主動嗎?我們能設計出乙個系統超前於未來客戶的需求嗎?
沒有乙個完美的能隨需應變的系統,所謂「設計之美」也是盛名之下其實難副。我們實際的目標只是最大限度的封裝變化,最大限度的**某些未來可能的變化,提供某些系統擴充套件和變化的可能性,從而減低未來變化的成本,為客戶創造價值。
也許,最簡單的才是最好的。大巧若拙,大道至簡, 有時候越簡單的反而越難實現,而且越接近真理。也許這個只能靠個人體會和悟性了,才能最終體會到簡單的精妙設計之美。熟背各種設計模式、學個一招半式的 人,就像乙個天天揹著一把劍的劍客一樣,唯恐旁人不知道其劍術高強;而真正的高手是手中無劍,卻照樣可以打贏別人,因為萬物都可被他用來施以劍法。這才是 真正的高境界。
我們缺乏的 是真正有創意的創造性的設計,比如我們為什麼沒有設計出中國人自己的
framework和 platform?因為我們經驗、技術和設計能力不足,大家都沉 迷於玩一些小技巧,戰術技巧,不是戰略技巧;玩到 30歲然後都去做 pm做培訓做銷售去了。而在那些需要簡約設計的地方,我們卻自詡為高手而加上很多華麗的 設計來維護虛幻的可擴充套件性和靈活性。
中國的架構師,缺乏的不僅僅是經驗、技術、創意、設計能力,也許最缺乏的是思想,是心境。
如何避免過度設計
設計的初衷是提高 質量。在做 設計的時候,一定要理清楚,為什麼要這樣設計,為什麼要應用這種設計模式,這樣做是否能真正地提高 質量,能提高 質量的哪些方面。如果自己很難講清楚,或者給出的理由都比較牽強,沒有壓倒性的優勢,那基本上就可以斷定這是一種過度設計,是為了設計而設計。設計的過程是先有問題後有方案...
「過度設計「說的根本不是設計問題
yf 2021 2 6 14 04 我們領導昨天教育我們說,不要過度設計,先做最重要的功能!最近學了潘老師的書,題也做了一些,感覺好像說的是功能不是設計,老師怎麼看?umlchina潘加宇 你的感覺很正確!很多人說 過度設計 overdesign 的時候,說的根本不是設計問題,而是 需求蔓延 req...
UI設計中的過度釋放
昨天在做相簿的時候遇到了乙個問題,系統沒有報錯,但在執行後總是crash,來回找錯好幾次也沒有發現錯誤,後來才發現是記憶體管理出了問題.在viewcontroller中,我宣告了乙個 uipagecontrol page 的屬性,但是在實現的時候,一時粗心大意我將 self page uipagec...