優秀的程式反而是廉價
長久以來我一直主張:好程式碼是廉價的程式碼。
當我跟做開發的同事說出這話時,他們的第一反應是一種驚愕,然後是將近一個星期的嘲笑,把它當作一個笑話來講。當他們走近看我的表情、知道我是認真的時,才收斂一點。
當最初的驚愕消退後,他們會用一些這樣的話來反駁:“好程式碼不廉價,好程式碼是採用經過數十年電腦科學研究和積累得出的最佳實踐設計模式和方法論建立起來的精心製作的程式程式碼。
我只好繼續解釋為什麼他們給出的好程式碼的定義有問題的原因是(這是很多開發人員都忽視了的一個原因):知曉各種設計模式,框架,技術技巧只是事情的 一方面,而知道何時該、何時不該應用他們才是更重要的問題。在不知道一種技巧方式如何能對系統的開發有幫助的情況下,這種模式方法極有可能成為一種開發的 阻礙,而不是一種有益的幫助。
我還要解釋說,我所說的“廉價的程式碼”是指這些程式碼只需要很少的人/天數就能開發出來,並不是說是由沒有經驗的開發人員、在很少的工資報酬下、用6個月封閉式、只有烤白薯和豆腐湯可吃的環境中開發出來的東西。
但是 … 設計模式畢竟是個好東西 … 不是嗎?
當然,但它們好在哪裡?它們能提供什麼好處?
- 容易維護
- 產品更健壯
- 容易理解
- 易於日後的改進提高
- 更好的可跟蹤性
你會發現所有的這些最終都落到一點上:從長期的角度看,它們能讓你更快的做事情。這事情有可能是系統遷移,或是增加一個新功能,不論是什麼,通過運用這些方法模式,你會在時間效率上獲得實實在在的好處。
這麼說,我們觀點一致嗎?
怎麼說呢,讓我給你們說個例子,我們看看實現它的幾種方式。
系統
用PHP建立一個發郵件的表單,表單裡有幾個表單項,用郵件把這些資料傳送給某個人。除此之外,表單裡的內容還要存入MySQL資料庫裡。
現在,用什麼方式實現它們最好?按照傳統的說法,採用最好的實踐設計模式,你可能會想到這些:
- MVC
- N-層設計,包括資料庫抽象層
- 物件關係對映(ORM)
- 可能用到的框架
- XML配置和相關模型
- 等等.
我可以說,這簡直是瘋了,客戶的這些需求完全可以用10幾行程式碼、一個小時裡(包括測試時間)完成,而且所有的那些方法模式所希望達到的效果(諸如 可讀性,可移植性,穩定性)都有了。如果使用上面列出的那些,反而真正的會達不到這個目標,使程式碼複雜化,難於理解和維護修改。
那現在,假設客戶又來了,要求做一些改動,比如要增加一個管理員的介面。這樣的話,你就勝利了,你已經實現了很多很有用處的東西;然而這是因為你在 第一次開發這個系統時付出了很大的代價。我要向你宣告的是,即使我現在把這些簡單的程式碼進行重構,增加一些簡單的業務層,也仍然比按你要求的那種過度技術 化的初始實現方案要簡單的多。
再說了,如果客戶要求的只是在表單裡增加一個屬性,那你的N-層設計方案會讓你痛苦不堪,因為你需要改動各個層,包括那些CRUD程式碼。
SCRUM
我發現Scrum能吸引我的最大一個原因是它能迫使你敏捷開發;它能迫使你在每個Sprint結束的時候把東西都實現、釋出。它不會讓你做出目前用不到的多餘的東西;它不會允許你在實現東西上有任何所謂“正確方式”的奢侈行為。
相反,在你需要的時候你才去重構。當然,這會有一定的風險,因為在實現某些功能上你會花去比當初已經做了一些基礎工作的情況下要更長的時間。然而, 產品開發就像是一個沙漠中四處漂移的沙丘,你永遠不可能準確的知道一個產品在將來會做如何的改動。所有的你花在實現這些很有吸引力的各種模式上的時間很可 能會成為一種完全的浪費。
複用性
有些人會指出,我所說的方式產生的程式碼不具有太多的複用性,不能在新開發的一些其它系統中使用。我對這個問題的回覆就是,在根本不知道某些東西是否 /如何/在哪將會被複用的情況下去設計一個可複用的東西,這就跟去實現一些你根本用不到的功能或你的應用裡跟本用不到的功能一樣愚蠢而糟糕。如果你有一個 清楚的遠見,知道什麼地方會複用這些東西,這就不同了,因為你確實有一個內部的業務需求在指導你正確的開發方向。
我的最後的思考 …
- 瞭解你的設計模式,知道它們各自的好處(我一直認為,好的程式設計師和偉大的程式設計師之間的區別就在於偉大的程式設計師理解他們的模式);
-
讓你的程式碼廉價:
- 當模式能夠給你帶來好處,而且為你省時時才去使用它們;
- 如果不是這樣就不要使用它們(例如:想想你最近的一次為什麼要把系統遷移到一個不同的資料庫上?);
- 當框架能夠幫你提高開發速度時才使用它們;
- 在必要的時候重構,不要做一些超前性的開發;
我想,如果你能按照這些指導原則做事,你會發現開發週期變短、實現的程式碼更簡潔,易於除錯,易於維護修改。
相關文章
- 優秀程式設計師的優秀歷程程式設計師
- 廉價版iphone和iphone區別介紹 iPhone廉價版少了些什麼?iPhone
- 徵文是群眾智慧的廉價方法
- 廉價冗餘磁碟陣列陣列
- 優秀程式設計師因何而優秀?程式設計師
- 通過AT&T廉價GB寬頻看ISP的大資料優勢大資料
- 優秀程式設計的“藝術”程式設計
- IP-SAN:實現廉價安全的儲存
- 蘋果公司會生產廉價的iPhone嗎?蘋果iPhone
- 此程式碼募集最優秀的答案
- 對優秀程式設計師的思考程式設計師
- 優秀程式設計的18大原則程式設計
- 遊戲畫面如何去減少廉價感遊戲
- 優秀程式設計師不一定是優秀的軟體設計師程式設計師
- 優秀程式設計師眼中的整潔程式碼程式設計師
- 優秀程式碼的必知必會(一)?
- 更優秀的Java程式碼-技巧篇1Java
- 如何招聘到優秀的程式設計師?程式設計師
- 反覆修改才能創造出優秀的程式碼
- 10個最“優秀”的程式碼註釋
- 編寫優秀程式碼的10個技巧
- 你是優秀的程式設計師嗎?程式設計師
- 如何辨別優秀的程式設計師程式設計師
- 優秀程式設計的18個原則程式設計
- 優秀程式設計師的 18 大法則程式設計師
- 優秀PHP優秀框架Laravel和Yii的詳解PHP框架Laravel
- 使用Linux實現廉價的備份伺服器Linux伺服器
- iPhone X廉價版設計圖曝光 售價或4500元左右iPhone
- 日媒披露:為什麼廉價智慧手機如此高價效比?
- 程式設計師如何保持優秀程式設計師
- UNIX平臺廉價雙機容錯方案(轉)
- 怎麼成為一個優秀的程式設計師 而不是一個優秀的碼農?程式設計師
- 【優雅程式碼】07-spring下的優秀工具類Spring
- 優秀程式設計師寫可除錯的程式碼程式設計師除錯
- 優秀Java程式設計師的程式設計風格Java程式設計師
- 編寫優秀 CSS 程式碼的 8 個策略CSS
- 優秀的程式設計師就像藝術家?程式設計師
- 優秀的程式設計師都有哪些習慣?程式設計師