2K字帶你讀完《程式設計師修煉之道》精華

心源意碼發表於2020-04-06

注重實效的哲學

我的原始碼讓貓給吃了

在所有的弱點中,最大的弱點就是害怕暴露弱點。

對於缺點、無知、錯誤,必須誠實。

負責

承諾的事情正確完成,無法完成,超出控制的事情不去承諾。

為結果負責,出現問題時應提供其他解決方案,不是尋找藉口。

軟體的熵

低劣設計,糟糕程式碼需要發現一個就修一個,否則會加速任何一個整潔,良好系統的腐爛。

破窗理論:一輛轎車放一星期無人理睬,一旦有一扇窗戶被打破,數小時之內車上裝置就會被搶奪一空

石頭湯煮青蛙

當大家都不願意做一件事時,自己先做,讓其餘人看見未來,就能聚集在自己周圍。

足夠好的軟體

欲求更好,常把好事更糟糕。-The King Lear

系統的功能和質量可以讓使用者參與權衡,不一定要十全十美才進行交付。使用者儘早使用而給出的反饋,能讓系統引向更好的最終解決方案。

你的知識資產

知識會過期,價值會降低,自身價值也在降低

經營你的資產

  • 定期投資:定期學習新知識,即使學的不多,因為習慣本身和知識總量同樣重要
  • 多元化:掌握的技術越多,就能更好的進行調整,擁抱變化
  • 管理風險:技術也存在高風險高回報,低風險低迴報的情況,不要把技術雞蛋放一個籃子裡(個人理解:風險:學習需要花費的時間,回報:學習後產生的收益。高風險高回報的例如:作業系統,演算法之類的計算機基礎。而低風險低迴報的例如某個框架的使用,API的使用等)
  • 低買高賣:在新技術流行之前學習它,但是這和找到被低估的股票一樣困難
  • 重新評估與平衡:上個月的熱門技術可能下個月就非常冷門,要時常關注業內的新動向。

學習的機會

當發現自己不會的問題不要擱置,應該上網搜尋,去圖書館,去找出能找到答案的人。尋找答案的過程不僅可以建立人際網路,也可以找到其他不相關問題的解決方案,都是很大的收穫。

批判的思考

對於學習到的知識要加上自己的思考,不一定每一個熱門技術都適合自己的專案,每個技術不一定都像宣傳那麼好。

交流

知道你想要說什麼

寫下想表達內容的大綱,並反覆問自己,這些是否講清了我要說的所有內容?並反覆修改

瞭解你的聽眾

  • 你想讓他們學到什麼
  • 他們對你講的什麼內容感興趣
  • 他們有多少經驗
  • 他們想要多少細節
  • 你想讓誰知道這些資訊
  • 你如何讓他們聽你說話

注重實效的路徑

重複的危害

如果你改變其中一處,你必須記得改變其他各處。這不是你是否能記住的問題,而是你何時忘記的問題。

正交性

不相依賴以及解耦,良好的系統中,改變資料庫不會影響介面,改變介面不會影響資料庫。

通過消除無關事務之間的影響來做到正交,可以帶來兩個好處提高生產率與降低風險

提高生產率

  • 改動得以區域性化,增加新程式碼不用改變已有程式碼
  • 更好的複用
  • 對正交的元件進行組合,生產率會微妙的提高。A元件能做M件事,B元件能做N件事,AB組合在一起就能做M*N件事。(這裡有一點中臺的感覺)

降低風險

  • 隔離:某個模組出現問題不會擴散到其餘模組,修復也更容易
  • 更健壯:對某個模組進行改動,出現的問題只會出現在該模組
  • 可替換性:不會和特定產品、平臺繫結在一起,第三方元件都被隔離在各自模組

設計

如果顯著改變某個功能的需求,有多少模組會受影響?正交系統中的答案是:一個。

編碼

每次編寫程式碼都有破壞正交性的風險,需要時刻監視自己做的事。

  • 程式碼保持解耦
  • 避免使用全域性資料
  • 避免編寫相似的函式

測試

每個模組都應擁有自己的單元測試

可撤銷性

不存在最終決策,要把決策視為寫在沙灘上而不是刻在石頭上,大浪隨時可能把它抹去。

注重實效的偏執

計算機簡短歷史中,沒人曾寫出一個完美的軟體,你也不大可能成為第一個

接受,擁抱並慶祝它

要崩潰,不要破壞

當錯誤發生時,應該儘快丟擲異常終止程式,而不是把錯誤資料寫進資料庫裡。

斷言式程式設計

如果一個情況不可能發生,就用斷言確保它不會發生

彎曲,或折斷

解耦與德墨忒爾法則

好籬笆促成好鄰居

間諜常會組成一個小組,小組內互相認識,但不認識小組外的人,如果某個小組被發現了,再多的審問也無法使其他小組的人暴露。

德墨忒爾法則

函式的德墨忒爾法則規定,任何方法呼叫都應該只呼叫屬於以下情形的方法

public class Demeter {
    private void func(){}
    private Object selfObj;
    public void example(Object paramObj){
        Object methodObj = new Object();
        func();               //1.類自身的方法
        paramObj.toString();          //2.傳入該方法的任何引數
        selfObj = new Object();
        selfObj.toString();     //3.該方法建立的任何物件
        methodObj.toString();    //4.任何直接持有元件的物件
    }
}
複製程式碼

當你編碼時

靠巧合程式設計

避免靠巧合程式設計,而要深思熟慮地程式設計。

怎樣深思熟慮地程式設計

  • 總是意識自己在做什麼
  • 不要盲目程式設計:不要構建不完全理解的系統,使用不熟悉的技術
  • 按照計劃行事
  • 依靠可靠事務:如果有無法特定的情形,就假定是最壞的情況
  • 需要其他人知道的內容最好文件化
  • 為工作劃分優先順序
  • 不做歷史的奴隸:不讓已有程式碼支配未來程式碼,不適用的程式碼都可被替換,是否重構取決於重構的影響小於不重構的影響

重構

何時重構

  • 出現重複性程式碼
  • 非正交設計
  • 過時的知識
  • 效能不好

重構就像外科手術取腫瘤,越早重構越安全

早重構,常重構

怎樣重構

  • 不要在重構的同時增加功能
  • 開始重試之前,確保擁有良好的測試

結論

  1. 首先承認自己永遠寫不出完美的軟體,也沒人能寫出
  2. 對於接手整潔的系統,要小心翼翼地維護,防止破窗效應
  3. 接手糟糕的系統,需要新增單測用例,然後排期逐漸重構
  4. 系統的設計與編碼實踐中,要注意正交性設計,盡最大可能地解耦
  5. 注意培養定期學習的習慣,哪怕學習的內容不多,習慣本身更加重要

相關文章