程序員升級指南之編程語言

為了進入專業的編程領域,我們需要認真學習以下三方面的知識。

編程語言。你需要學習 C、C++ 和 Java 這三個工業級的編程語言。為什麼說它們是工業級的呢?主要是,C 和 C++ 語言規範都由 ISO 標準化過,而且都有工業界廠商組成的標準化委員會來制定工業標準。次要原因是,它們已經在業界應用於許多重要的生產環境中。

  • C 語言不用多說,現今這個世界上幾乎所有重要的軟件都跟 C 有直接和間接的關係,操作系統、網絡、硬件驅動等等。說得霸氣一點兒,這個世界就是在 C 語言之上運行的。
  • 而對於 C++ 來說,現在主流的瀏覽器、數據庫、Microsoft Office、主流的圖形界面、著名的遊戲引擎等都是用 C++ 編寫的。而且,很多公司都用 C++ 開發核心架構,如 Google、騰訊、百度、阿里雲等。
  • 而金融電商公司則廣泛地使用 Java 語言,因為 Java 的好處太多了,代碼穩定性超過 C 和 C++,生產力遠超 C 和 C++。有 JVM 在,可以輕鬆地跨平臺,做代碼優化,做 AOP 和 IoC 這樣的高級技術。以 Spring 為首的由龐大的社區開發的高質量的各種輪子讓你只需關注業務,是能夠快速搭建企業級應用的不二之選。

此外,我推薦學習 Go 語言。一方面,Go 語言現在很受關注,它是取代 C 和 C++ 的另一門有潛力的語言。C 語言太原始了,C++ 太複雜了,Java 太高級了,所以 Go 語言就在這個夾縫中出現了。這門語言已經 10 多年了,其已成為雲計算領域事實上的標準語言,尤其是在 Docker/Kubernetes 等項目中。Go 語言社區正在不斷地從 Java 社區移植各種 Java 的輪子過來,Go 社區現在也很不錯。

如果你要寫一些 PaaS 層的應用,Go 語言會比 C 和 C++ 更好,目前和 Java 有一拼。而且,Go 語言在國內外一些知名公司中有了一定的應用和實踐,所以,是可以學習的(參看:《Go 語言、Docker 和新技術》一文)。此外,Go 語言語法特別簡單,你有了 C 和 C++ 的基礎,學習 Go 的學習成本基本為零。

理論學科。你需要學習像算法、數據結構、網絡模型、計算機原理等計算機科學專業需要學習的知識。為什麼要學好這些理論上的知識呢?

  • 其一,這些理論知識可以說是計算機科學這門學科最精華的知識了。說得大一點,這些是人類智慧的精華。你只要想成為高手,這些東西是你必需要掌握和學習的。
  • 其二,當你在解決一些很複雜或是很難的問題時,這些基礎理論知識可以幫到你很多。我過去這 20 年從這些基礎理論知識中受益匪淺。
  • 其三,這些理論知識的思維方式可以讓你有觸類旁通,一通百通的感覺。雖然知識比較難啃,但啃過以後,你將獲益終生。

另外,你千萬不要覺得在你的日常工作或是生活當中根本用不上,學了也白學,這樣的思維方式千萬不要有,因為這是平庸的思維方式。如果你想等我用到了再學也不晚,那麼你有必要看一下這篇文章《程序員的荒謬之言還是至理名言?》。

系統知識。系統知識是理論知識的工程實踐,這裡面有很多很多的細節。比如像 Unix/Linux、TCP/IP、C10K 挑戰等這樣專業的系統知識。這些知識是你能不能把理論應用到實際項目當中,能不能搞定實際問題的重要知識。

當你在編程的時候,如何和系統進行交互或是獲取操作系統的資源,如何進行通訊,當系統出了性能問題,當系統出了故障等,你有大量需要落地的事需要處理和解決。這個時候,這些系統知識就會變得尤為關鍵和重要了。

這些東西,你可以認為是計算機世界的物理世界,上層無論怎麼玩,無論是 Java NIO,還是 Nginx,還是 Node.js,它們都逃脫不掉最下層的限制。所以,你要好好學習這方面的知識。

編程語言

Java 語言

學習 Java 語言有以下入門級的書(注意:下面一些書在入門篇中有所提及,但為了完整性,還是要在這裡提一下,因為可能有朋友是跳著看的)。

  • 《Java 核心技術:卷 1 基礎知識》,這本書本來是 Sun 公司的官方用書,是一本 Java 的入門參考書。對於 Java 初學者來說,是一本非常不錯的值得時常翻閱的技術手冊。書中有較多地方進行 Java 與 C++ 的比較,因為當時 Java 面世的時候,又被叫作 "C++ Killer"。而我在看這本書的時候,發現書中有很多 C++ 的東西,於是又去學習了 C++。學習 C++ 的時候,發現有很多 C 的東西不懂,又順著去學習了 C。然後,C -> C++ -> Java 整條線融匯貫通,這對我未來的技術成長有非常大的幫助。
  • 有了上述的入門後,Java 的 Spring 框架是你玩 Java 所無法迴避的東西,所以接下來是兩本 Spring 相關的書,《Spring 實戰》和《Spring Boot 實戰》。前者是傳統的 Spring,後者是新式的微服務的 Spring。如果你只想看一本的話,那麼就看後者吧。

認真學習前面的書可以讓你成功入門 Java,但想要進一步成長,就要看下面我推薦的幾本提升級的書。

  • 接下來,你需要了解了一下如何編寫高效的代碼,於是必需看一下《Effective Java》(注意,這裡我給的引用是第三版的,也是 2017 年末出版的書),這本書是模仿 Scott Meyers 的經典圖書《Effective C++》的。Effective 這種書基本上都是各種經驗之談,所以,這是一本非常不錯的書,你一定要讀。
  • 《Java 併發編程實戰》,是一本完美的 Java 併發參考手冊。書中從併發性和線程安全性的基本概念出發,介紹瞭如何使用類庫提供的基本併發構建塊,用於避免併發危險、構造線程安全的類及驗證線程安全的規則,如何將小的線程安全類組合成更大的線程安全類,如何利用線程來提高併發應用程序的吞吐量,如何識別可並行執行的任務,如何提高單線程子系統的響應性,如何確保併發程序執行預期任務,如何提高併發代碼的性能和可伸縮性等內容。最後介紹了一些高級主題,如顯式鎖、原子變量、非阻塞算法以及如何開發自定義的同步工具類。
  • 瞭解如何編寫出併發的程序,你還需要了解一下如何優化 Java 的性能。我推薦《Java 性能權威指南》。通過學習這本書,你可以比較大程度地提升性能測試的效果。其中包括:使用 JDK 中自帶的工具收集 Java 應用的性能數據,理解 JIT 編譯器的優缺點,調優 JVM 垃圾收集器以減少對程序的影響,學習管理堆內存和 JVM 原生內存的方法,瞭解如何最大程度地優化 Java 線程及同步的性能,等等。看完這本書後,如果你還有餘力,想了解更多的底層細節,那麼,你有必要去讀一下《深入理解 Java 虛擬機》。
  • 《Java 編程思想》,真是一本透著編程思想的書。上面的書讓你從微觀角度瞭解 Java,而這本書則可以讓你從一個宏觀角度瞭解 Java。這本書和 Java 核心技術的厚度差不多,但這本書的信息密度比較大。所以,讀起來是非常耗大腦的,因為它會讓你不斷地思考。對於想學好 Java 的程序員來說,這是一本必讀的書。
  • 《精通 Spring 4.x》,也是一本很不錯的書,就是有點厚,一共有 800 多頁,都是乾貨。我認為其中最不錯的是在分析原理,尤其是針對前面提到的 Spring 技術,應用與原理都講得很透徹,IOC 和 AOP 也分析得很棒,娓娓道來。其對任何一個技術都分析得很細緻和全面,不足之處就是內容太多了,所以導致很厚,但這並不影響它是一本不錯的工具書。

當然,學 Java 你一定要學面向對象的設計模式,這裡就只有一本經典的書《設計模式》。如果你覺得有點兒難度了,那麼可以看一下《Head First 設計模式》。學習面向對象的設計模式時,你不要迷失在那 23 個設計模式中,你一定要明白這兩個原則:

  • Program to an 'interface', not an 'implementation'
  • 使用者不需要知道數據類型、結構、算法的細節。
  • 使用者不需要知道實現細節,只需要知道提供的接口。
  • 利於抽象、封裝,動態綁定,多態。符合面向對象的特質和理念。
  • Favor 'object composition' over 'class inheritance'
  • 繼承需要給子類暴露一些父類的設計和實現細節。
  • 父類實現的改變會造成子類也需要改變。
  • 我們以為繼承主要是為了代碼重用,但實際上在子類中需要重新實現很多父類的方法。
  • 繼承更多的應該是為了多態。

至此,如果你把上面的這些知識都融匯貫通的話,那麼,你已是一個高級的 Java 程序員了,我保證你已經超過了絕大多數程序員了。基本上來說,你在技術方面是可以進入到一線公司的,而且還不是一般的崗位,至少是高級程序員或是初級架構師的級別了。

C/C++ 語言

不像我出道那個時候,幾乎所有的軟件都要用 C 語言來寫。現在,可能不會有多少人學習 C 語言了,因為一方面有 Java、Python 這樣的高級語言為你屏蔽了很多的底層細節,另一方面也有像 Go 語言這樣的新興語言可以讓你更容易地寫出來也是高性能的軟件。但是,我還是想說,C 語言是你必須學習的語言,因為這個世界上絕大多數編程語言都是 C-like 的語言,也是在不同的方面來解決 C 語言的各種問題。這裡,我想放個比較武斷話——如果你不學 C 語言,你根本沒有資格說你是一個合格的程序員!

  • 這裡尤其推薦,已故的 C 語言之父 Dennis M. Ritchie 和著名科學家 Brian W. Kernighan 合作的聖經級的教科書《C 程序設計語言》。注意,這本書是 C 語言原作者寫的,其 C 語言的標準不是我們平時常說的 ANSI 標準,而是原作者的標準,又被叫作 K&R C。但是這本書很輕薄,也簡潔,不枯燥,是一本你可以拿著躺在床上看還不會看著看著睡著的書。
  • 然後,還有一本非常經典的 C 語言的書《C 語言程序設計現代方法》。有人說,這本書配合之前的 The C Programming Language 那本書簡真是無敵。我想說,這本書更實用,也夠厚,完整覆蓋了 C99 標準,習題的質量和水準也比較高。更好的是,探討了現代編譯器的實現,以及和 C++ 的兼容,還揭穿了各種古老的 C 語言的神話和信條……是相當相當乾的一本學習 C 語言的書。

對了,千萬不要看譚浩強的 C 語言的書。各種誤導,我大學時就是用這本書學的 C,後來工作時被坑得不行。

在學習 C 語言的過程中,你一定會感到,C 語言這麼底層,而且代碼經常性地崩潰,經過一段時間的掙扎,你才開始覺得你從這個爛泥坑裡快要爬出來了。但你還需要看看《C 陷阱與缺陷》這本書,你會發現,這裡面的坑不是一般大。

此時,如果你看過我的《編程範式遊記》那個系列文章,你可能會發現 C 語言在泛型編程上的各種問題,這個時候我推薦你學習一下 C++ 語言。可能會有很多人覺得我說的 C++ 是個大坑。是的,這是世界目前來說最複雜也是最難的編程語言了。但是,C++ 是目前世界上範式最多的語言了,其做得最好的範式就是 " 泛型編程 ",這在靜態語言中,是絕對地劃時代的一個事。

所以,你有必要學習一下 C++,看看 C++ 是如何解決 C 語言中的各種問題的。你可以先看看我的這篇文章 "C++ 的坑真的多嗎?" ,有個基本認識。下面推薦幾本 C++ 的書。

  • 《C++ Primer 中文版》,這本書是久負盛名的 C++ 經典教程。書是有點厚,前面 1/3 講 C 語言,後面講 C++。C++ 的知識點實在是太多了,而且又有點晦澀。但是你主要就看幾個點,一個是面向對象的多態,一個是模板和重載操作符,以及一些 STL 的東西。看看 C++ 是怎麼玩泛型和函數式編程的。
  • 如果你想繼續研究,你需要看另外兩本更為經典的書《Effective C++》和《More Effective C++》。 這兩本書不厚,但是我讀了 10 多年,每過一段時間再讀一下,就會發現有更多的收穫。這兩本書的內容會隨著你經歷的豐富而變得豐富,這也是對我影響最大的兩本書,其中影響最大的不是書中的那些 C++ 的東西,而是作者的思維方式和不斷求真的精神,這真是太讚了。
  • 學習 C/C++ 都是需要好好了解一下編譯器到底幹了什麼事的。就像 Java 需要了解 JVM 一樣,所以,這裡還有一本非常非常難啃的書你可以挑戰一下《深度探索 C++ 對象模型 》。這本書是非常之經典的,看完後,C++ 對你來說就再也沒有什麼秘密可言。我以前寫過的《C++ 虛函數表解析》,還有《C++ 對象內存佈局》屬於這個範疇。
  • 還有 C++ 的作者 Bjarne Stroustrup 寫的 C++ FAQ (中文版),也是非常值得一讀的。

學習 Go 語言

C 語言太原始了,C++ 太複雜了,Go 語言是不二之選。有了 C/C++ 的功底,學習 Go 語言非常簡單。

首推 Go by Example 作為你的入門教程。然後,Go 101 也是一個很不錯的在線電子書。如果你想看紙書的話,The Go Programming Language 一書在豆瓣上有 9.2 分,但是國內沒有賣的。(當然,我以前也寫過兩篇入門的供你參考 "GO 語言簡介(上)- 語法" 和 "GO 語言簡介(下)- 特性")。

另外,Go 語言官方的 Effective Go 是必讀的,這篇文章告訴你如何更好地使用 Go 語言,以及 Go 語言中的一些原理。

Go 語言最突出之處是併發編程,Unix 老牌黑客羅勃·派克(Rob Pike)在 Google I/O 上的兩個分享,可以讓你學習到一些併發編程的模式。

  • Go Concurrency Patterns( 幻燈片和演講視頻)。
  • Advanced Go Concurrency Patterns(幻燈片、演講視頻)。

然後,Go 在 GitHub 的 wiki 上有好多不錯的學習資源,你可以從中學習到多。比如:

  • Go 精華文章列表。
  • Go 相關博客列表。
  • [Go Talks])(https://github.com/golang/go/wiki/GoTalks)。

此外,還有個內容豐富的 Go 資源列表 Awesome Go,推薦看看。

小結

好了,最後我們來總結一些今天分享的內容。在編程語言方面,我推薦學習 C、C++、Java 和 Go 四門語言,並分別闡釋了推薦的原因。

  • 我認為,C 語言是必須學習的語言,因為這個世界上絕大多數編程語言都是 C-like 的語言,也是在不同的方面來解決 C 語言的各種問題。
  • 而 C++ 雖然複雜難學,但它幾乎是目前世界上範式最多的語言了,其做得最好的範式就是 " 泛型編程 ",這在靜態語言中,是絕對地劃時代的一個事。尤其要看看 C++ 是如何解決 C 語言中的各種問題的。
  • Java 是我認為綜合能力最強的語言。其實我是先學了 Java,然後又去學了 C++,之後去學了 C 語言的。C -> C++ -> Java 整條線融匯貫通,這對我未來的技術成長有非常大的幫助。
  • 在文章最末,我推薦了 Go 語言,並給出了相關的學習資料。

我認為,一個合格的程序員應該掌握幾門語言。一方面,這會讓你對不同的語言進行比較,讓你有更多的思考。另一方面,這也是一種學習能力的培養,會讓你對於未來的新技術學習得更快。

  • 開篇詞
  • 入門篇

零基礎啟蒙

正式入門

  • 修養篇

程序員修養

  • 專業基礎篇

編程語言

理論學科

系統知識

  • 軟件設計篇
  • 高手成長篇

完整內容可以關注我後,看動態的。


分享到:


相關文章: