適用情形:適用于任何項(xiàng)目,所有大型的或復(fù)雜的系統(tǒng)和項(xiàng)目都應(yīng)該采用該原則。
應(yīng)用方式:讓同同行來檢查解決方案是否好理解,抵制過度設(shè)計(jì)的強(qiáng)烈欲望。
應(yīng)用理由:復(fù)雜的解決方案實(shí)施成本高,而且會(huì)產(chǎn)生大量長期成本。要點(diǎn):過度復(fù)雜的系統(tǒng)會(huì)限制擴(kuò)展能力。簡單的系統(tǒng)更容易維護(hù)和擴(kuò)展,且成本更低。
維基百科解釋說,過度設(shè)計(jì)分為兩大類。一類是指設(shè)計(jì)與實(shí)現(xiàn)超出了有用需求的產(chǎn)品。出于完整性的考慮,我們只簡單地討論一下這個(gè)問題。相對(duì)于第二類問題來說,這類問題對(duì)可擴(kuò)展性的影響較小。過度設(shè)計(jì)的另一類問題指過于復(fù)雜的產(chǎn)品。如前所述,我們最關(guān)心的是第二類問題對(duì)可擴(kuò)展性的影響。不過,還是先來了解一下第一個(gè)問題吧。
要解釋過度設(shè)計(jì)的第一類問題,即超出產(chǎn)品有用需求的問題,就要先搞清楚楚“有用的”這個(gè)術(shù)語的含義,這個(gè)術(shù)語在這里表示的只是“能夠伸用”。例如。為家庭住房設(shè)計(jì)一種空調(diào),能夠在室外溫度為0開時(shí)把整個(gè)房子的溫度加熱到300華氏度,這毫無意義,純屬浪費(fèi),我們只需要一個(gè)能夠在室外溫度為-20華氏度時(shí)把房子加熱到舒適溫度的產(chǎn)品。這種過度設(shè)計(jì)會(huì)產(chǎn)生過度的成本,其中開發(fā)的成本會(huì)更高,實(shí)施該方案的硬件和軟件成本也會(huì)更高。如果研發(fā)這種過度設(shè)計(jì)系統(tǒng)的時(shí)間比研發(fā)有用系統(tǒng)的時(shí)間更長,還可能拖延產(chǎn)品的發(fā)布,對(duì)公司造成進(jìn)一步的影響。成本高,利潤就低。研發(fā)時(shí)間長,收入或收益就會(huì)被延遲,所有這些成本都會(huì)影響到利益相關(guān)者。范圍蔓延,或者最初的產(chǎn)品定義和最初的產(chǎn)品發(fā)布之間的范圍差異,是過度設(shè)計(jì)的一種表現(xiàn)。
說個(gè)更接近我們工作的例子,是開發(fā)一個(gè)員工打卡系統(tǒng),這個(gè)系統(tǒng)能夠處理的員工數(shù)量是整個(gè)地球上人數(shù)的100倍。在這個(gè)軟件的使用期限內(nèi),地球上的人口升至100倍的可能性是微乎其微的,而所有人都為一家公司工作的可能性則更小。我們當(dāng)然想讓構(gòu)建的系統(tǒng)滿足客戶需求但也不想浪費(fèi)時(shí)間來實(shí)現(xiàn)和部署遠(yuǎn)遠(yuǎn)超出需求的系統(tǒng)。
過度設(shè)計(jì)的第二類表現(xiàn)是使系統(tǒng)過度復(fù)雜,或者用復(fù)雜的方式來實(shí)現(xiàn)它。簡而言之,就是要花費(fèi)過大的力氣去完成一項(xiàng)工作,或者是讓用戶花費(fèi)過大的力氣去完成一項(xiàng)任務(wù),或者是讓程序員花費(fèi)過大的力氣去理解一個(gè)功能。讓我們來逐一分析過度復(fù)雜的系統(tǒng)的這三種情況。
什么是花費(fèi)過大的力氣去完成一項(xiàng)工作呢?現(xiàn)實(shí)世界有最簡單的例子。假設(shè)你讓某人去雜貨店買東西,你告訴他,店里面的所有商品都拿一個(gè),排隊(duì)結(jié)賬時(shí)給你打電話。等他打電話給你時(shí),你再告訴他到底想要哪幾個(gè),讓他從所拿的無數(shù)籃商品中選出來,然后把其他商品都倒在地上。你一定會(huì)說:“別開玩笑了。”可是,你在自己的代碼中用過select(大)schema_nane.tab1e_name這樣的SQL語句,只是為了從返回的集合中找出自己想要的結(jié)果嗎?我們這個(gè)雜貨店的例子,和上述的se1ect(*)正是異曲同工。在你的代碼中,有幾個(gè)條件語句是處理個(gè)別情況的,它們是按照什么順序執(zhí)行的?是不是最可能發(fā)生的情況最先執(zhí)行?你是不是經(jīng)常剛查詢完一個(gè)結(jié)果,又重復(fù)查詢一次?是不是經(jīng)常剛顯示了HML面,這種情況隨處可見,卻又經(jīng)常被忽視。
什么是讓一位用戶花費(fèi)過大的力氣去完成一項(xiàng)任務(wù)呢?答案非常簡單。在許多情況下,少就是多。為追求系統(tǒng)的靈活性,我們總是想給它硬加上盡可能多的奇怪功能。但生活的情趣并不總在于多種多樣。許多時(shí)候,用戶只是想無干擾地盡可能快地從A到達(dá)B。如果你的市場中有99%的用戶不需要把日志文件存成pdf文件,那么就不要構(gòu)建一個(gè)提示框詢問他們是否想把日志文件保存成pdf文件。如果你的用戶想把.wav文件轉(zhuǎn)換成MP3文件,那么他們已經(jīng)不在乎損失精度了,所以不必再提示他們轉(zhuǎn)換成無損壓縮的FLAC文件,那樣只會(huì)干擾他們。
最后一種情況,就是軟件復(fù)雜得讓其他程序員難以理解。創(chuàng)建復(fù)雜的代碼讓他人難以理解曾經(jīng)非常流行(還有過比賽)。有時(shí),代碼寫得復(fù)雜,是為了讓它比一般程序員所開發(fā)的代碼運(yùn)行更快。而更多的情況是代碼的復(fù)雜度(就其理解的難度而言)成了程序員才華的象征,或者說是功夫高低的象征。那些開發(fā)的代碼能讓做代碼檢查的高級(jí)開發(fā)人員欲苦無淚的人反而頗受推崇。復(fù)雜度成了智慧的牢籠,編程極客們會(huì)在公司內(nèi)部爭強(qiáng)好勝。對(duì)于樂此不疲的人來說,這是很好的比賽,但對(duì)于公司和股東來說,則要為一場無人關(guān)心的牢籠大賽買單。對(duì)于那些仍然沉浸于這場極客盛宴的人,如果不想損害利益相關(guān)者的利益,又想真刀真槍地拼一場,那建議你參加國際混淆C代碼競賽。
我們都應(yīng)該努力去寫讓每個(gè)人都能理解的代碼。衡量一個(gè)偉大程序員的真正標(biāo)準(zhǔn),是他能夠多快把一個(gè)復(fù)雜的問題簡化,多快能開發(fā)出一個(gè)既容易理解,又容易維護(hù)的解決方案。容易執(zhí)行的解決方案意味著一般程序員就可以快速地掌握系統(tǒng),為它提供支持。容易理解的解決方案則意味著在查找問題時(shí)能夠甲
方式把系統(tǒng)恢復(fù)到正常工作狀態(tài)。容易執(zhí)行的解決方案可以提高公司和解決方案的可擴(kuò)展性。
要測試系統(tǒng)是否太復(fù)雜,一個(gè)很好的方法是讓負(fù)責(zé)解決復(fù)雜問題的程序員把他的解決方案陳述給公司內(nèi)的一組程序員。這組程序員應(yīng)該代表公司內(nèi)不同的編碼水平,不同的工作年限(加入這一條,是因?yàn)榭赡苡行┯薪?jīng)驗(yàn)的程序員在公司的工作經(jīng)驗(yàn)不多)。要通過這一測試,需要這組程序員中的每一位都能夠輕松理解該解決方案,能夠在無幫助的情況下向他人描述它,而不只是知道它。如果這組程序員中的任何一位不能理解該解決方案,那么就要小組討論該系統(tǒng)是不是過度復(fù)雜了。
過度的網(wǎng)站設(shè)計(jì)是可擴(kuò)展性的一個(gè)敵人。開發(fā)一個(gè)超出有用需求的解決方案,既浪費(fèi)金錢又浪費(fèi)時(shí)間。此外,還可能進(jìn)一步步浪費(fèi)處理資源,增加擴(kuò)展成本,限制系統(tǒng)的整體擴(kuò)展能力(即系統(tǒng)能被擴(kuò)展到什么程度)。構(gòu)建過度復(fù)雜的解決方案會(huì)造成類似的后果。運(yùn)行吃力的系統(tǒng)會(huì)增加成本,限制最終發(fā)展規(guī)模。讓用戶用起來吃力的系統(tǒng),會(huì)放慢吸引客戶的速度,從而限制業(yè)務(wù)增長的速度。太復(fù)雜以至于難以理解的系統(tǒng),則會(huì)扼制司的生產(chǎn)力,讓你無從增加程序員,或者難以給系統(tǒng)增加功能。
本文地址:http://m.cdrpkj.cn//article/3442.html