Categories
程式開發

20年老程序員告訴你的20條編碼原則


我從 1999 年就開始了編程生涯,到今年已經有 20 多年了。我先是從 Basic 開始,很快轉到了 Pascal 和 C 語言,然後又學習了面向對象編程語言 Delphi 和 C++。 2006 年,我開始使用 Java,2011 年開始使用 JavaScript。我參與過各個行業的軟件開發,從機器人、金融科技、醫療到媒體和通信。我還擔任過研究員、CTO、TPM(技術產品經理)、老師、系統架構師和技術負責人,但不管怎樣,我一直都在編程。

在我參與過的項目當中,有些為數百萬人提供服務,有些在發布之前就宣告失敗。我做過諮詢顧問,還創辦過自己的公司。我在開源項目、閉源項目和內部開源項目上花了很多時間,從微控制器到移動應用、桌面應用,再到雲服務和無服務器架構。

我把過去 20 年積累的一些最為重要的編程原則總結如下。

  1. 不要糾結於開發工具——不管是庫、編程語言還是平台。盡可能使用原生的構件。不要歪曲技術,也不要歪曲了問題本身。為要解決的問題選擇合適的工具,否則你要為你所選擇的工具重新安排你的工作。

  2. 你寫的代碼不是給機器看的,而是給你的同事和未來的你看的(除非你寫的是一次性代碼或彙編代碼)。寫代碼的時候要考慮一下初級開發者,他們會把你的代碼作為參考。

  3. 優秀的軟件是協作開發的結果。高效溝通,進行開放式的協作。信任他人,並讓他人也信任你。尊重他人勝過尊重代碼。以身作則,把你的追隨者變成領導者。

  4. 分而治之。為分離的關注點開發單獨的低耦合模塊。進行單獨的模塊測試和集成測試。盡可能按照實際情況測試,同時也要測試到各種邊界情況。

  5. 不要把自己與代碼捆綁在一起,要想辦法讓其他人也能修改你的代碼或者添加新的功能,這樣你才能更容易脫身去參與其他項目,或者去其他公司。不要捆綁自己,否則你很難成長。

  6. 安全性是分層的,每一層需要進行單獨的評估,同時又與整體相關。風險是一個業務決策,與脆弱性和概率有直接的關係。每一個產品或組織都有不同的風險偏好(為了獲得更大的收益,他們願意承擔風險)。通常這三個關注點之間存在相互衝突:用戶體驗、安全性和性能。

  7. 要意識到每一行代碼都有其生命週期,它們最終都會死掉。有時候,一些代碼會在發布之前就死掉,所以要學會放手。代碼可以分為三種:一種是核心代碼,就像汽車的引擎,沒有了它,產品就毫無意義;一種是必要的代碼,就像是汽車的備胎,平時用得少,但一旦需要,它決定了系統的成敗;一種是增值的代碼,就像汽車的杯托,如果有那是再好不過,但如果沒有也不會影響產品。

  8. 不要把你的個人標識融入到代碼裡,人和代碼應該是分離的。不要把其他人對代碼的評價與你自身聯繫到一起,在評價他人的代碼時也要十分謹慎。

  9. 技術債務就像快餐一樣,偶爾欠下一點技術債務是可接受的,但如果你習慣了這樣,它會毀掉你的產品(而且是以讓你措手不及的方式)。

  10. 在尋找解決方案時,請按照這樣的優先級進行決策:安全性>可用性(可訪問性和用戶體驗)>可維護性>簡單性(開發者體驗)>簡潔性(代碼量)>性能。但不能盲目照搬,而是要根據產品的特點進行取捨。你積累的經驗越多,就越是能夠在這些因素之間做出權衡。例如,在設計遊戲引擎時,性能享有最高的優先級,但在開發銀行應用程序時,安全性則最為重要。

  11. 拷貝粘貼是滋生 bug 的溫床。對你所拷貝或導入的東西加以審查,bug 一般會藏身在復雜性中。依賴項複雜沒有關係,但不能讓它存在於代碼中。

  12. 不要只顧著寫正常的代碼,處理異常的代碼也要好好寫。讓人們明白為什麼會發生異常、如何檢測到的以及怎樣解決。對所有的系統輸入(包括用戶輸入)進行驗證:儘早失敗,並儘可能從錯誤中恢復。我們要假設用戶手裡握著一把槍:你努力讓用戶輸入一些其他的東西,而不是讓他們的子彈射在你的腦門上。

  13. 不要使用依賴項,除非使用它們的成本比你自己寫代碼的成本低很多。因為使用依賴項要導入、維護、處理 bug,在必要的時候還要進行重構,這些都是成本。

  14. 遠離“炒作驅動開發”,但你要去了解它們,做一些嘗試。

  15. 走出舒適區,每天都要學習。把學到的東西分享出來。如果你以大師自居,就不是在學習。接觸更多的編程語言、技術、文化,保持一顆好奇心。

  16. 好代碼不需要註釋,而優秀的代碼提供了良好的註釋,可以讓任何一個原先沒有參與代碼演進、試錯和需求過程的人更容易閱讀、修改它。

  17. 盡量避免使用重載、繼承和隱式的智能特性。使用純函數,它們更容易測試和診斷,否則的話就使用類。實現不同功能的函數要使用不同的名字。

  18. 在徹底了解問題之前不要急著寫代碼。花在傾聽和了解問題上的時間通常比花在寫代碼上的時間要多。在寫代碼之前要先了解問題域。問題就像迷宮一樣,你要循序漸進,反復進行“編碼 – 測試 – 改進”,直到把問題解決為止。

  19. 不要嘗試去解決不存在的問題。不要進行投機性編程。只有在確定代碼確實需要具備擴展性之後才讓代碼具備可擴展性。通常情況下,當代碼被擴展之後,你會發現問題會變得與原先認為的不一樣了。

  20. 大家一起開發軟件會更加有趣。建立可持續發展的社區。傾聽,激發靈感,學習,分享。

我並不是軟件開發方面的權威,但這些都是我一路走來總結出來的原則。我相信,20 年後,這些原則會發生變化,會變得更加成熟。

英文原文

My guiding principles after 20 years of programming