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