程式碼整潔之道
簡介:
本書是程式設計大師“Bob 大叔”40餘年程式設計生涯的心得體會的總結,講解要成為真正專業的程式設計師需要具備什麼樣的態度,需要遵循什麼樣的原則,需要採取什麼樣的行動。作者以自己以及身邊的同事走過的彎路、犯過的錯誤為例,意在為後來者引路,助其職業生涯邁上更高臺階。
本書適合所有程式設計師閱讀,也可供所有想成為具備職業素養的職場人士參考。
第四章:編碼
要精熟掌握每項技藝,關鍵都是要具備“信心”和“出錯感知”能力。
4.1做好準備
編碼是一項頗具挑戰也十分累人的智力活動。相比較其他型別的活動,編碼要求更加聚精會神。
- 首先,程式碼必須能夠正常工作。
必須理解當前要解決的是什麼問題以及該如何解決。必須確保編寫的程式碼忠實遵循解決方案。必須管理 好解決方案的每一處細節,並且使語言、平臺、現有架構以及當前系統的所有問題和平共處。
-
程式碼必須能夠幫助你解決客戶提出的問題。
很多時候,客戶提出的需求其實並沒能真正解決他們自己的問題。這有賴於你去發現這些問題並與客戶交流,以確保程式碼能夠滿足客戶的真實需求。
-
程式碼必須要能和現有的系統結合的天衣無縫。
你的程式碼不能讓系統變得更僵硬、更脆弱、更晦澀,必須要妥善管理好各種依賴關係。簡而言之,編寫程式碼時必須遵循穩健的工程原則。
-
其他程式設計師必須能夠讀懂你的程式碼。
這不僅包括要寫好註釋這類事,還包括要精心錘鍊程式碼,使它能夠表達你的程式設計意圖。要做到這點很不容易。事實上,這可能是程式設計師最難精通的一件事
如果感到疲勞或者心煩意亂,千萬不要編碼。強而為之,最終只能再回頭返工。相反,要找到一種方法來消除干擾,讓心緒平靜下來。
4.2 流態區
這是程式設計師在編寫程式碼時會進入的一種意識高度專注但思維視野卻會收攏到狹窄的狀態。在這種狀態下,他們會感到效率極高;在這種狀態中,他們會感到“絕無錯誤”。
在流態區狀態下,你其實放棄了顧及全域性,因此,你很可能會做出一些後來不得不推倒重來的決策。在流態區寫程式碼可能會快些,但是後面你將不得不更多地回頭重新審視這些程式碼。
對作者而言,聽音樂有助於不進入“流態區”。(奇怪的要求)
結對是用以應對中斷的一種好方法。當你接答電話或回答其他同事的問題時,結對搭檔能夠維護住中斷處的上下文。等到你重新回去和結對搭檔一起工作時,他能夠很快地幫你恢復被打斷前的思維。
當然,中斷無法避免,總有干擾會打斷你、消耗你的時間。發生這種情況時要記住一點,也許下次也會輪到你去打斷別人請求幫助。因此,禮貌地表現出樂於助人的態度才是專業的態度。
4.3 阻塞
有的時候,死活就是寫不出程式碼來。我自己就曾經遇到過,也看到其他人身上發生過這種情況。乾坐在電腦前面,但什麼都寫不出來。
造成原因:對於我而言,另外一個主要因素便是睡眠。如果睡眠不足,我就什麼程式碼也寫不出來。其他因素還包括焦慮、恐懼和沮喪等。
解決方法:找一個搭檔結對程式設計。
創造性輸出”依賴於“創造性輸入”。
4.4 除錯
衡量你是否是一名專業人士的一個重要方面,便是看你是否能將除錯時間儘量降到最低。絕對的零除錯時間是一個理想化的目標,無法達到,但要將之作為努力方向。
4.5 保持節奏
軟體開發是一場馬拉松,而不是短跑衝刺。你無法全程一直以最快的速度衝刺來贏得比賽,只有透過儲存體力和維持穩定節奏來取勝。無論是賽前還是賽中,馬拉松選手都會仔細調整好自己的身體狀態。專業程式設計師也會同樣仔細地儲存好自己的精力和創造力。
-
知道何時應該離開一會兒
-
開車回家路上
-
洗澡
埋頭忙於解決問題時,有時候可能會由於和問題貼得太近,無法看清楚所有的可選項。由於大腦中富有創造性的部分被緊張的專注力所抑制,你會錯過很棒的解決方案。因此,有時候解決一個問題最好的辦法是回家,吃頓好的,然後上床睡覺,再在第二天清晨醒來洗個澡。
4.6進度延遲 :
管理延遲的訣竅,便是早期檢測和保持透明。要根據目標定期衡量進度,使用三個考慮到多種因素的期限, 樂觀預估、標稱預估、悲觀預估。儘量嚴守這三個時間點。不要把預估和期望混淆在一起!把全部這三個數字呈現給團隊和利益相關者,並每天修正這些數字。
交付失誤:
在程式設計師所能表現的各種不專業行為中,最糟糕的是明知道還沒有完成任務卻宣稱已經完成。有時候這只是一個撒過頭的謊言,這就已經很糟糕了。但是,如果試圖對“完成”做出一種新的合理化定義,潛在的危險性是最大的。
我們自欺欺人地認為任務已經完成得足夠好,然後轉入下一項任務。我們自己給自己找藉口說,其他還沒來得及完成的工作可以等有更充裕時間的時候再來處理。
解決:可以透過建立一個確切定義的“完成”標準來避免交付失誤。最好的方法是讓業務分析師和測試人員建立一個自動化的驗收測試[9],只有完全透過這些驗收測試,開發任務才能算已經完成。
4.7幫助
程式設計並非易事。越年輕的程式設計師對此可能越沒有什麼感覺。畢竟程式碼只不過是一堆if和while語句而已。但是隨著經驗漸長,你會開始意識到把這些if和while語句組裝在一起的方式十分重要。不能期望將它們簡單混在一起就能得到最好的程式碼。
相反,必須小心謹慎地將系統分解為易於理解的小單元,同時使這些單元之間的關係越少越好,這並非易事。程式設計很難,事實上,僅憑一己之力無法寫出優秀的程式碼。既使你的技能格外高超,也肯定能從另外一名程式設計師的思考與想法中獲益。
4.7.1 幫助他人
- 互相幫助是每個程式設計師的職責所在。將自己封閉在格子間或者辦公室裡與世隔絕,有悖於專業的職業精神。你的工作不可能重要到你不能花一丁點兒時間來幫助別人。事實上,作為專業人士,要以能夠隨時幫助別人為榮。
- 給他人提供幫助並非說明你比人家聰明很多,而是因為你帶來了一個新的視角,對於解決問題起到了顯著的催化作用。
4.7.2 接受他人的幫助
- 如果有人向你伸出援手,要誠摯接受,心懷感激地接受幫助並誠意合作。
- 要記住,如同要以樂於助人為榮一樣,也要以樂於接受別人的幫助為榮。
- 如果幫助唾手可得卻讓自己一個人堵在那兒,是很不專業的表現。
4.7.3 輔導
- 除了自身的內驅力和資深導師的有效輔導之外,沒有東西能將一名年輕的軟體開發人員更快地提升為敏捷高效的專業人士。
- 因此,再強調一次,花時間手把手地輔導年輕程式設計師是資深程式設計師的專業職責所在。同樣道理,向資深導師尋求輔導也是年輕程式設計師的專業職責。