如何成為優秀的程序員

今天關注了一個很有意思的問題“中國目前最優秀的程序員有哪些?

”。和小時候有人問“你的理想是什麼?”,你說想當科學家一樣,作為程序員的理想就是成為最優秀的程序員。當然這個問題更加寬泛,生活中有很多事情不是自己想做就能夠做到的。你不再是一個單獨個體,往小裡說,需要養家餬口,往大里說,每個人都生活在時代的洪流中。

有時候回顧過去,我往往會產生一些不切實際的想法。可能會覺得沒有生活在馬拉多納的時代,一睹球王的風采;還有可能覺得沒生活在冷戰時期,人類登月成功;也沒有看到第一臺電腦問世。但仔細想想,有的時候反而慶幸,我們生活的時代,沒有戰亂,也沒有饑荒,這已經非常幸運了。人類茹毛飲血,之前幾千年的物質十分匱乏,每隔一段時間就會為了生存而發動戰爭。目前已經很少有人因為飢餓而身亡,也很少有人因為戰爭而送命了。細細數來也見證了不少歷史,沒有馬拉多納,但是梅西已經拿了6個金球獎了;沒有見證登月,但是有幸看到spacex火箭回收;沒有見過第一臺電腦問世,但是經歷了第一臺智能機問世。如果我從未來回憶過去,可能也會羨慕過去能夠見證如此多的東西。


如何成為優秀的程序員

再回到之前的問題,如何在有限的範圍內朝著優秀的程序員這個方向努力呢?

我們可以大致將這些頂尖的程序員分為3類:

第一類ACM類。這類程序員最重要的就是基礎好,算法等基礎知識比較紮實,這是很多程序員欠缺的,並且需要一定的刻意練習。為什麼這麼說呢?由於程序員大部分時候使用的都是庫函數,不用自己造輪子,所以大部分人對算法的實現瞭解的沒那麼清楚。再加上python的流行,對c++瞭解的程序員也越來越稀少,也就是說理解計算機底層的程序員越來越少了。在基礎不紮實的情況下,遇到簡單的問題可以解決,遇到稍微複雜一點的問題就會花費很長的時間,並且效率低下。這方面我很欠缺,雖然學的多,但是理解的少,並且不成系統,都是零敲碎打的學一下,基本功不是很紮實。有ACM經驗的程序員,一是邏輯思維比較強,二是實現代碼的基礎比較好。

第二類開源社區類。這類程序員一般都是各大公司的核心開發成員,也酷愛寫代碼,真正做到了興趣和工作相結合。作為開源社區的維護者和貢獻者,這類程序員都比較專注,也樂於實現自己的想法,並且一直在某一領域深耕細作,長期堅持輸出。開源精神代表了興趣,貢獻和專注。

第三類博客類。這類程序員是真正的駭客,從來都是空杯心態,能夠長期堅持學習,並且有自己的思考、理解和感悟。輸出的想法和知識都比較接地氣,是書本中學不來的。這類程序員真正的影響了一大批程序員,因為目前的工作中的很多問題都是google搜索來解決的。喬布斯說求知若渴,對知識和思想的渴望可以超越一切,言傳身教也不過如此了。

根據上述的總結,那麼我們應該如何提高呢?

1. 持續的練習。基礎的提升是最難的,俗話說臺上一分鐘,臺下十年功,基礎的提高是需要日積月累的。有的時候為了應付考試和麵試,突擊式的學習算法和數據結構,結果很容易忘記。有的時候往往覺得自己理解了對應的算法,結果過一段時間又忘記了。針對這種情況我也沒太多好方法,也是突擊學一陣,然後就聚焦於工作中具體的問題和業務了,很少能夠沉下心來持續的學習算法、數據結構和設計模式等。再加上這部分知識的作用很難有立竿見影的效果,往往花費大量的時間和精力,有的時候還用不上,短期內很難收到回報,所以經常會有挫敗感。

但學習基礎知識的好處是能夠鍛鍊人的思維,因為很多方法都是相通的,解決的問題多了,思維能力也上來了。無論是看開源代碼,還是看專業書籍,都可以歸結為提高基礎的能力,這一部分需要持續的練習,才能收穫,可以類比為練內功。

2. 足夠的專注。對所做的事情充滿熱愛,能夠找到自己的方向,並且能夠一直堅持在某一個方向持續的努力,這其實需要自己考慮清楚自己要什麼,並且願意長期堅持,這個領域可能是比較熱門的,也有可能也沒那麼熱門,就比如計算器一類的項目,或者一些基礎的庫函數,哪怕只有少量的人關注,也可以把它實現的很優美。

3. 求知若渴。能夠堅持持之以恆的學習,學習能力包括2方面,一方面是學習知識,另一方面是提煉並且輸出知識,這2方面都做好了才叫學習。有的時候聽課,發現有些人理解的很好,公式證明過程也回答的很好,但是真正做題的時候卻不是很好。也就是說理解之後,還需要對知識分類形成知識體系,思考並且輸出知識,這樣才叫學習能力。這也是非常推薦的“費曼學習法”。

4. 善於思考。我們遇到問題,往往就是直接去解決,而有些人會對問題做分類,把問題歸為哪一類,然後針對這一類問題去找對應的方法解決。遇到問題能把問題抽象,類比到相同領域的問題,針對這類問題,業界可能有很經典的解法了,只要按照對應的方法就可以解決問題。思考還包括提問題,通過提問題來理解,為什麼要這麼設計,以及這麼設計的原因,從而從根本上理解原理。

5. 樂於分享。自己學習很簡單,能夠長期的輸出知識卻很難,看一本英文書很簡單,但是翻譯它卻很難,能夠把自己的想法知識貢獻出來,讓更多的人學習和討論,分享知識的同時,自己也收穫得很多知識。

如果能夠長期堅持以上一點或者幾點,我相信你一定會成為一名優秀的程序員,至少比以前優秀。


分享到:


相關文章: