程式碼整潔之道
簡介:
本書是程式設計大師“Bob 大叔”40餘年程式設計生涯的心得體會的總結,講解要成為真正專業的程式設計師需要具備什麼樣的態度,需要遵循什麼樣的原則,需要採取什麼樣的行動。作者以自己以及身邊的同事走過的彎路、犯過的錯誤為例,意在為後來者引路,助其職業生涯邁上更高臺階。
本書適合所有程式設計師閱讀,也可供所有想成為具備職業素養的職場人士參考。
第一章:專業主義
在開啟閱讀此書之前,不免先問一下自己一個問題,根據這個問題的回答來決定對此書閱讀的態度。
你想成為一名“專業人士”嗎?你確實是想成為專業的軟體工程師,對嗎?
如果堅定地回答道---“是-----!”,那麼調整好狀態聆聽Bob大叔對他40多年的程式設計經歷的娓娓道來吧~
1.1 清楚你要什麼
如果你想成為一名專業人士,必須要承擔責任。
“專業主義”不僅僅象徵著榮譽與驕傲,而且明確意味著責任與義務。
從你無法負責的事情上不可能獲得榮譽和驕傲。
1.2 承擔責任
沒有對例行程式進行測試就交付軟體是不負責任的。
Bob大叔擔任一款控制軟體的“負責工程師”,所負責的軟體控制一個測量電話線路質量的小型機系統和危機系統,程式是用匯編語言編寫的。該系統每天晚上都會執行“夜間例行程式”來對線路進行檢測,而bob為了使新功能如期釋出,未經測試直接將新系統程式交付給使用者,結果接連修復程式bug。給使用者和經理造成損失。
如何承擔責任?
1.3 首先,不行損害之事
1.3.1 不要破壞軟體功能
無法開發出完美的程式,那麼要對自己的不完美負責。
所謂專業人士,就是能對自己犯下的錯誤負責的人,哪怕那些錯誤實際上在所難免。
所以我們要練習的第一件事情就是“道歉”,儘管是必要的,但是僅僅如此還不夠。不能一而再,再而三地犯相同的錯誤。
職業經驗多了之後,你的失誤率應該快速減少,甚至漸近於零。失誤率永遠不可能等於零,但你有責任讓它無限接近零。
這裡給出具體的表現:
-
讓QA找不出任何問題
-
要確信程式碼正常執行
對所寫的程式碼內容要做到100%的測試,但是有些程式碼不是很難測試嗎?是的,但之所以很難測試,是因為設計時就沒考慮如何測試。唯一的解決辦法就是要設計易於測試的程式碼,最好是先寫測試,再寫要測的程式碼,這一方法叫做測試驅動開發(TDD)。
-
自動化QA
作為開發人員,你需要有個相對迅捷可靠的機制,以此判斷所寫的程式碼可否正常工作,並且不會干擾系統的其他部分。因此,你的自動化測試至少要能夠讓你知道,你的系統很有可能透過QA的測試。
1.3.2不要破壞結構
成熟的專業開發人員知道,聰明人不會為了釋出新功能而破壞結構。
結構良好的程式碼更靈活。以犧牲結構為代價,得不償失,將來必追悔莫及。
所有軟體專案的根本指導原則是,軟體要易於修改。如果違背這條原則搭建僵化的結構,就破壞了構築整個行業的經濟模型。
要想證明軟體易於修改,唯一辦法就是做些實際的修改。
該在什麼時候做這些簡單的小修改呢?隨時!關注哪個模組,就對它做點簡單的修改來改進結構。每次通讀程式碼的時候,也可以不時調整一下結構。
如果覺得修改之後重新測試很麻煩,那就體現掌握測試方法的重要性了。
1.4 職業道德
職業發展是你自己的事。僱主沒有義務確保你在職場能夠立於不敗之地,也沒義務培訓你,送你參加各種會議或給你買各種書籍充電。這些都是你自己的事。將自己的職業發展寄希望於僱主的軟體開發人員將會很慘。
你應該計劃每週工作60小時。前40小時是給僱主的,後20小時是給自己的。在這剩餘的20小時裡,你應該看書、練習、學習,或者做其他能提升職業能力的事情。
或許你不願那麼勤勉。沒問題。只是那樣的話你也不能自視為專業人士了,因為所謂“術業有專攻”那也是需要投入時間去追求的。
-
瞭解你的領域
總的來說,那些在過去50年中來之不易的理念,絕大部分在今天仍像過去一樣富有價值,甚至寶貴了。
下面列出了每個專業軟體開發人員必須精通的事項:
-
設計模式。必須能描述GOF書中的全部24種模式,同時還要有POSA書中的多數模式的實戰經驗。
-
設計原則。必須瞭解SOLID原則,而且要深刻理解元件設計原則。
-
方法。必須理解XP、Scrum、精益、看板、瀑布、結構化分析及結構化設計等。
-
實踐。必須掌握測試驅動開發、物件導向設計、結構化程式設計、持續整合和結對程式設計。
-
工件。必須瞭解如何使用UML圖、DFD圖、結構圖、Petri網路圖、狀態遷移圖表、流程圖和決策表。
-
堅持學習
讀書,看相關文章,關注部落格和微博,參加技術大會,訪問使用者群,多參與讀書與學習小組。不懂就學,不要畏難。如果你是.NET程式設計師,就去學學Java;如果你是Java程式設計師,就去學學Ruby;如果你是C語言程式設計師,就去學學Lisp;如果你真想練練腦子,就去學學Prolog和Forth吧!
-
練習
業精於勤。真正的專業人士往往勤學苦幹,以求得自身技能的純熟精煉。只完成日常工作是不足以稱為練習的,那隻能算是種執行性質的操作,而不是練習。練習,指的是在日常工作之餘專門練習技能,以期自我提升。
作者這裡指出“卡塔”型別練習,類似刷leetcode解決小的單元問題。
-
合作
專業軟體開發人員往往會更加努力地嘗試與他人一起程式設計、一起練習、一起設計、一起計劃,這樣他們可以從彼此身上學到很多東西,而且能在更短的時間內更高質量地完成更多工作。
-
輔導
想迅速牢固地掌握某些事實和觀念,最好的辦法就是與你負責指導的人交流這些內容。這樣,傳道授業的同時,導師也會從中受益。
-
瞭解業務領域
每位專業軟體開發人員都有義務瞭解自己開發的解決方案所對應的業務領域。如果編寫財務系統,你就應該對財務領域有所瞭解;如果編寫旅遊應用程式,那麼你需要去了解旅遊業。你未必需要成為該領域的專家,但你仍需要用功,付出相當的努力來認識業務領域。
-
與僱主/客戶保持一致
僱主的問題就是你的問題。你必須弄明白這些問題,並尋求最佳的解決方案。每次開發系統,都應該站在僱主的角度來思考,確保開發的功能真正能滿足僱主的需要。
-
謙遜
程式設計是一種創造性活動。寫程式碼是無中生有的創造過程,我們大膽地從混沌之中建立秩序。我們自信地釋出準確無誤的指令,稍有差錯,機器的錯誤行為就可能造成無法估量的損失。因此,程式設計也是極其自負的行為。
然而,專業人士也知道自己會摔跟頭,自己的風險評估也有出錯的時候,自己也有力不從心的時候。這時候,如果他們照照鏡子,會看到那個自負的傻瓜正對著自己笑。
因此,在發現自己成為笑柄時,專業人士會第一個發笑。他從不會嘲諷別人,自作自受時他會接受別人的嘲諷。反之,他則會一笑了之。他不會因別人犯錯就對之橫加貶損,因為他知道,自己有可能就是下一個犯錯的人。