Linux中國

是什麼造就了一個優秀的程序員?

1. 分解問題

編程是為了解決問題,但在你開始寫代碼前,需要明白如何解決問題。優秀程序員的一項技能是把大的問題逐層分解成一個個更小的部分,直到每一部分都可以很容易解決。但找到解決問題的方式往往並沒有那麼簡單。優秀程序員能找到方法去建立問題模型,這種方法使得輸出結果的程序容易解釋、實現和測試。

我寫過的某些最複雜的程序在局部上都是難懂的,因為代碼實現並不能很好地匹配這個問題,也就導致了編寫的代碼難以理解。當問題很好地建模的時候,我贊同伯尼·科賽爾所說的話(取自著名的程序員在工作中的訪談記錄):

「……很少有本質上很難的程序。如果你盯著某一塊代碼,它看起來確實很難;如果你無法理解這段代碼應該產生什麼結果,這基本上就是暗示它很難被理解了。在這個時候,你不應該捲起袖子,嘗試修復代碼;你需要只是往回一步,再仔細考慮清楚。當你已經深思熟慮後,你會發現問題變得很簡單」。

2. 場景分析

優秀開發者能考慮到如何使程序適合多種不同的場景。這項能力既適用於處理程序本身的邏輯,又適用於處理可能會發生的外部和內部事件。為了考慮邏輯上的不同思路,他們問自己這樣的問題:如果這個參數為空會發生什麼?如果所有條件都為假呢?這個方法在線程上是安全的嗎?為了發現軟體需要處理的各種類型的事件,他們問自己這樣的問題:如果隊列佔滿了會怎樣?如果請求收不到響應會怎樣?如果在這台伺服器重啟的同時另外一台伺服器也重啟了會怎樣?

優秀程序員問他們自己:如何發現程序的缺陷?換句話說,他們有能力像測試人員一樣思考。相反,缺少經驗的程序員通常只考慮正確的路徑——在一切都按照預期進行時正常的控制流(當然這也是程序在大部分時候的情況)。當然,異常不可避免要發生,所以需要程序能處理這些情況。

3. 命名

編程由大量的命名對象組成:類、方法和變數。當編碼完成得很好時,程序也具備了自我描述的能力,也就是說通過閱讀源代碼可以清楚地明白程序中函數的含義。自描述代碼的一個好處就是很自然地產生許多更短的命名方法,而不是少數更長的方法,因為你有更多空間去放置有意義的名字(還有其它原因解釋為什麼短小方法更好)。

想出好的名字比它聽起來更困難一些。我喜歡這段引用(來自菲爾·卡爾頓):「在計算機科學領域只有兩件困難的事情:緩存失效和命名對象。」命名在一定程度上很困難是因為你需要清楚地明白每一個名字究竟要代表什麼。有時候命名不是一下子就清晰明了,只有隨著軟體開發進展才會慢慢顯現。因此,重命名和命名一樣重要。

命名對象也包含提出要用的概念和這些概念該如何稱呼。通過深思熟慮,清楚命名所使用的慣用概念(在程序中和與程序員、非程序員討論時使用),這使得編寫程序變得更加容易。

4. 一致性

也許編程中最大的挑戰是管理複雜性。保持一致性是處理複雜性的一種方法。它通過允許我們看到對象命名、使用和處理所採用的模式和推理來降低了某些複雜性。有了一致性,我們就無需用腦去記住異常和隨機變數。取而代之,我們可以更關注程序本身的複雜性,而不是偶然產生的複雜性

保持一致性從整體看來是很重要的。它應用在變數名字和分組、方法命名、模塊劃分、目錄結構、GUI、錯誤處理、日誌輸出和文檔等很多方面。比如,如果某些變數是的相關,並一起出現(在聲明、方法調用或資料庫中的列),而且總是以相同的順序使用它們。那麼當其中一個消失或者整體被打亂時,你就會很容易發現。對於一個操作,如果在一個地方叫delete,就不要在另一個地方叫remove:務必使用相同的名字。史蒂夫·麥克奈爾在代碼大全中對於使用相反命名有相同的建議。比如,begin和end是相反的,就如同start和stop一樣。當使用相反對時不要混用不同對的名字(比如使用begin和stop)。

當修改一段程序時可能會引入非一致性。粗心大意的程序員不會注意到他們添加的代碼是否和已有的代碼保持一致。優秀程序員會嚴苛地確保在這些看似很小的細節上都要做到精益求精。他們知道保持一致性對於在軟體開發的整個過程中處理複雜性是多麼的重要。

5. 學習能力

作為一名軟體開發者,你需要持續學習。在為軟體添加一項新功能前,你必須明白為什麼要這麼做。在給一個已有程序添加代碼前,你通常必須知道已有代碼在做什麼,以便合適地嵌入新功能。你還需要學習相關係統,以便正確地與它們交互。因此,快速學習的能力使你成為一名更加高效的開發者。

而且,因為軟體工程領域的開發速度是如此的快速,所以新的編程語言、工具、技術和框架需要學習層出不窮。這是好還是壞,就看你怎麼看。佛瑞德·布魯克斯把學習能力列為技能的快樂之一,對此我深表贊同。學習新事物本身就是令人心滿意足的,它也意味著開發者的生活從不無聊。

總結

上面所有的技能都是通用的——它們中沒有一項是針對某種語言、某個框架或某種技術。如果你擁有它們,你就能快速學習一門新的語言或工具,在新的環境下寫出優秀的軟體。而且,因為它們在本質上是通用的,所以不會在若干年以後過時。

是什麼造就了一個優秀的程序員?以上便是我的觀點。你認為造就一個優秀程序員的因素有哪些?在評論里告訴我吧。

via: http://henrikwarne.com/2014/06/30/what-makes-a-good-programmer/

作者:Henrik Warne 譯者:KayGuoWhu 校對:Caroline

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國