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

談談"設計不足"與"過度設計"

昨天看到一老兄的文章,深有感觸,所以轉載來給大家分享一下

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相關推薦

談談"設計不足""過度設計"

昨天看到一老兄的文章,深有感觸,所以轉載來給大家分享一下 什麼是設計不足(under-engineering)?設計出來的系統複用性差,擴充套件性不強,不能靈活的應對變化,簡言之,設計沒到位。設計不足,多半是因為經驗有限,設計能力有限。 什麼是過度設計(over-eng

"設計不足""過度設計"

什麼是設計不足 (under-engineering)? 設計出來的系統複用性差,擴充套件性不強,不能靈活的應對變化,簡言之,設計沒到位。設計不足,多半是因為經驗有限,設計能力有限。 什麼是過度設計 (over-engineering)? 設 計出來的系統比恰到好處要複

設計不足過度設計

什麼是設計不足?設計出來的系統複用性差,擴充套件性不強,不能靈活的應對變化,簡言之,設計沒到位。設計不足,多半是因為經驗有限,設計能力有限。 什麼是過度設計?設計出來的系統比恰到好處要複雜臃腫的多,過度的封裝、一堆繼承、介面和無用的方法,超複雜的xml配置檔案,簡言之

敏捷核心思想、設計模式過度設計

這兒只談敏捷開發的核心思想,而不談其他表現形式比如結對程式設計,測試驅動等。本文不是談設計模式,而是談何時該用設計模式。 敏捷開發的核心思想是:只對當前已經發生過>=2次的同類需求變更,去應用抽象,封裝,或設計模式來調整當前架構,以使之能夠靈活適應下次同類需求變更(

大道至簡過度設計

前段時間,由於系統需要擴充套件一下發送事件通知,一個服務可以傳送多個通知,而且通知裡需要有一些邏輯判斷。冥思苦想後,在抽象模板方法中增加了一個擴充套件點,又通過interceptor攔截服務的方法名,當時還在為自己高深的設計竊喜。 1. 找了一位同事幫我review下程式碼。

《A_Pancers》團隊作業6—團隊項目系統設計改進詳細設計

內部 自動完成 表現 語言 img 類的屬性 開發環境 最終 細節 一.團隊項目系統設計改進: 1.分析項目系統設計說明書初稿的不足,特別是軟件系統結構模型建模不完善內容: 在上一次的項目系統設計說明書中沒有很好的完成軟件系統結構模型的建模設計,只做了基本的系統項目原

PCB資料:平衡PCB層疊設計方法避免設計中串擾

平衡PCB層疊設計方法 平衡結構避免彎曲 不用奇數層設計PCB的最好的理由是:奇數層電路板容易彎曲。當PCB在多層電路粘合工藝後冷卻時,核結構和敷箔結構冷卻時不同的層壓張力會引起PCB彎曲。隨著電路板厚度的增加,具有兩個不同結構的複合PCB彎曲的風險就越大。消除電路板彎曲

談談智慧路燈設計思想原則

並且 打開 運營 ima 智慧城市 電氣 通過 bubuko 推廣 談談智慧路燈設計思想與原則智慧路燈光源采用LED照明,夜間照射出來的是柔和的暖白光,並且可以根據車流量和天氣狀況自動調光,做到按需照明,比常規路燈節能60%以上。而對於路燈運維檢修人員來說,這些路燈每個單體

java軟件設計模式——單例設計模式中的【餓漢式】 【懶漢式】示例

nal pre turn new對象 構造方法 sta 餓漢式 () urn 以下為單例設計模式中的兩種經典模式的代碼示意: 1 單例設計模式(spring框架IOC,默認創建的對象都是單例的): 2 餓漢式: 3 public class Sing

Java中的24種設計模式7大原則

工廠模式 職責 需要 占位符 ati gre template 層次 cto 一、創建型模式 1、抽象工廠模式(Abstract factory pattern): 提供一個接口, 用於創建相關或依賴對象的家族, 而不需要指定具體類.2、生成器模式(Builder pat

概要設計具體設計

技術分享 term lang align top 之間 應該 post 問題 概要設計與具體設計 在寫概要設計與具體設計的時候,對於內容以及他們之間的界限非常easy模糊.今天寫點自己的想法.有問題請大家不吝賜教:[email protected]/*

Javascript設計模式開發實踐詳解(二:策略模式) http://www.jianshu.com/p/ef53781f6ef2

的人 思想 ram gis pan pro msg have 改變 上一章我們介紹了單例模式及JavaScript惰性單例模式應用這一次我主要介紹策略模式策略模式是定義一系列的算法,把它們一個個封裝起來,並且讓他們可以互相替換。比方說在現實中很多時候也有很多途徑到達同一個

設計思想模式之四靜態代理模式

test 創建 靜態代理 pan 代理 對象的訪問 override todo 父類 一 概述 1.什麽是代理模式? 為了隱藏與保護目標對象,為其他對象提供一個代理以控制對該目標對象的訪問。 2.什麽是靜態代理模式? 代理模式有兩種: 靜態代理:代理對象固定。 動態代理:

設計思想模式之五觀察者模式

per -- 什麽 over out junit 測試類 rem second 一 概述 1.什麽是觀察者模式? 將一個對象視作被觀察者,當它發出某種行為或者發生某種變化時,通知所有依賴它的對象(觀察者),這種設計模式叫做觀察者設計模式。 2.觀察者設

架構的坑系列:重構過程中的過度設計

一件事 都是 。。 上層 實現 軟件 太行 事件 -m 架構的坑系列:重構過程中的過度設計 軟件架構 2016-06-03 08:47:02 發布 您的評價: 5.0 收藏 2收藏 這個系列是 坑 系列,

程序設計基石實踐系列之按值傳遞還是按引用

有趣 name align pos str 堆棧 技術分享 easy pan 從簡單的樣例開始.如果我們要交換兩個整形變量的值,在C/C++中怎麽做呢?我們來看多種方式,哪種能夠做到.void call_by_ref(int &p,int &q) { //

Spark設計理念基本架構

http textfile hdf www 接受 ng- exe tag 高可用 《深入理解Spark:核心思想與源代碼分析》一書前言的內容請看鏈接《深入理解SPARK:核心思想與源代碼分析》一書正式出版上市 《深入理解Spark:核心思想與源代碼分析》一書第一章的內容

移動端網頁設計經驗心得

分段 下一條 操作 適應 med 常用 格式 手機版 大於 智能手機發展確實很迅速,像今年,我的大部分工作就都在移動端網頁上。 再往前些年,看到的手機版/移動版網頁,限制於瀏覽器與手機性能,2g網絡速度等 網頁設計無非是藍、黑、白,界面單調,並且要盡可能的設計簡單。

老男孩教育每日一題-第96天-網站並發知識點:pv-並發架構設計基礎知識

每日一題 並發 pv 你想建設一個能承受500萬PV/每天的網站嗎? 500萬PV是什麽概念?服務器每秒要處理多少個請求才能應對?如何計算呢?答案參考:PV是什麽:PV是page view的簡寫。PV是指頁面的訪問次數,每打開或刷新一次頁面,就算做一個pv。計算模型:每臺服務器每秒處理請求的數量=

設計模式哲學

word tar .com 進行 引用 方式 tor http itl http://www.cnblogs.com/feng9exe/p/6782945.html 首先要提到的是,不論是過程論還是對象論,都承認一點,那就是程序世界本質上只有兩種東西——數據和邏輯。數據天性