太長不看版
C 語言,結(jié)構(gòu)化編程,系統(tǒng)編程
Java 語言,面向?qū)ο缶幊蹋浖O(shè)計,Java 社區(qū)以及工程配套
Python 語言,動態(tài)語言,輕量級開發(fā),人工智能
Lisp 語言,函數(shù)式編程,構(gòu)建模型
Rust 語言,安全編程,工程實踐的集大成者
詳細版
為什么要學(xué)習(xí)多門程序設(shè)計語言呢?如果只是為了工作本身,會一兩門能夠養(yǎng)家糊口的程序設(shè)計語言足矣。要學(xué)習(xí)多門程序設(shè)計語言必然是為了在某一方面拓展自己,但究竟要拓展的是什么呢?
我在極客時間專欄《軟件設(shè)計之美》中專門講到了這個話題。簡言之,我們學(xué)習(xí)程序設(shè)計語言主要是為了學(xué)習(xí)不同程序設(shè)計語言提供的編程模型,比如:不同的程序組織方式,不同的控制結(jié)構(gòu)等等。因為不同的編程模型會帶給我們不同的思考方式。
所以,如果是站在這樣一個角度來看程序設(shè)計語言的學(xué)習(xí),答案就是顯而易見的,就是從擁有不同模型的程序設(shè)計語言中,挑選出最經(jīng)典的一個來學(xué)習(xí)就好了。那具體有哪些語言要學(xué)習(xí)呢?
C 語言

首先是C 語言。
一方面,從編程范式上來說,C 語言是一種經(jīng)典的結(jié)構(gòu)化編程語言,學(xué)會 C 語言也就掌握了結(jié)構(gòu)化編程的基本思路。C 語言不僅僅是提供編程思想,其基礎(chǔ)的控制結(jié)構(gòu)(比如 for、while)也是成了很多程序設(shè)計語言的根基,比如:C++或 Java。掌握了 C 的語法,對于未來學(xué)習(xí)更多的程序設(shè)計語言是有幫助的。
另一方面,C 語言目前依然是系統(tǒng)編程領(lǐng)域的霸主。在一些需要充分發(fā)揮計算機能力的領(lǐng)域,比如,操作系統(tǒng)、圖形圖像處理,C 語言依然是首選。
所以,學(xué)習(xí) C 語言,語法是基礎(chǔ),還要學(xué)會如何充分榨取計算機性能。
Java 語言

其次是Java 語言。
在編程范式上,Java 是學(xué)習(xí)面向?qū)ο蠛芎玫囊粋€范例,市面上討論面向?qū)ο蟪绦蛟O(shè)計的很多書是用 Java 寫的。相比于 C++,學(xué)習(xí) Java 可以忽略掉很多與軟件設(shè)計無關(guān)的細節(jié),比如,內(nèi)存管理,把更多的注意力放在軟件設(shè)計本身上。學(xué)習(xí) Java,不學(xué)軟件設(shè)計,無異于過寶山而不入。
學(xué)習(xí) Java,不僅是 Java 語言本身,Java 的社區(qū)也是一個很有料的地方。Java 社區(qū)的興起幾乎與開源社區(qū)的發(fā)展是同步的。像 Spring 這樣的開源項目,甚至讓整個 Java 社區(qū)發(fā)生了范式轉(zhuǎn)移,開發(fā)方式發(fā)生了天翻地覆的變化。
學(xué)習(xí) Java 還有一點是非常重要的,就是在工程的配套上。Java 社區(qū)的興起之時,也是敏捷軟件開發(fā)理念同步發(fā)展的階段。所以,Java 也成了各種理念的試驗田:自動化測試、重構(gòu)、持續(xù)集成、持續(xù)交付等等,所以,Java 社區(qū)有各種工具值得學(xué)習(xí)。
Python 語言

再有是Python 語言。
C 語言和 Java 語言都是靜態(tài)語言,無論做起什么項目,都要拉開架勢。很多時候,我們只要做一些簡單的項目,不想把架勢拉這么滿,所以,我們掌握一門輕巧的語言,這就是動態(tài)語言的價值所在。
為了讓代碼寫起來更輕巧,動態(tài)語言有很多簡化代碼編寫的語法,比如,各種數(shù)據(jù)結(jié)構(gòu)的字面量表達、類型推演、解構(gòu)等等,像 ?Java 這樣的語言已經(jīng)開始把這些東西學(xué)了過去,不斷在簡化代碼的編寫。
原本在動態(tài)語言這條賽道上有很多競爭對手,Python 之外,還有 Perl、Ruby 等等。Perl 的優(yōu)勢在于先發(fā),Ruby 曾經(jīng)依賴于 Ruby On Rails 贏得了許多關(guān)注,Python 一直不疾不徐地跑著。終于在人工智能的浪潮中,Python 一下子沖了出來,將其它對手完全甩在了身后。
Lisp 方言

接下來應(yīng)該學(xué)習(xí)的是一門 Lisp 的方言,無論是 Clojure、Scheme 或 Common Lisp,都可以。
學(xué)習(xí)這門語言的目的是了解函數(shù)式編程,函數(shù)式編程是一種重要的編程范式,而且,正在變得越來越重要。函數(shù)式編程的不變性、組合式編程影響著各種新程序設(shè)計語言的語法和 API 的設(shè)計。
Lisp 是最古老的函數(shù)式程序設(shè)計語言,其核心模型極其簡單,然后在基礎(chǔ)的模型上逐層疊加,構(gòu)建起更復(fù)雜的模型。學(xué)習(xí)函數(shù)式編程,其核心就是學(xué)習(xí)這種構(gòu)建模型的能力?!队嬎銠C程序的構(gòu)造和解釋》是行業(yè)內(nèi)的經(jīng)典之作,其核心就是在構(gòu)造各種模型:從基礎(chǔ)的數(shù)據(jù)模型,到程序設(shè)計語言,再到一臺有計算能力的機器。這本書中使用的程序設(shè)計語言是 Scheme,一種 Lisp 方言。
正是因為有這種強大的構(gòu)造模型的能力,Lisp 社區(qū)針對各種問題會產(chǎn)生很多有趣的解決方案,比如,應(yīng)對并發(fā)的軟件事務(wù)性內(nèi)存。所有這一切,都是建立在函數(shù)式編程的基礎(chǔ)之上。
Rust 語言

有了前面這幾門語言,基本上最核心編程范式和主流的編程模型就覆蓋到了,如果你還學(xué)有余力,想了解一下行業(yè)內(nèi)程序設(shè)計語言的最新發(fā)展,那我推薦學(xué)習(xí)Rust 語言。
行業(yè)中大多數(shù)人對 Rust 的關(guān)注應(yīng)該是始于一些大公司對 Rust 的態(tài)度,無論是亞馬遜、微軟,還是谷歌,這些大公司都面臨著很多的“安全”的問題。Rust 的設(shè)計特性剛好可以有效地解決這些問題。
如果你是經(jīng)驗不多的新手,直接上手 Rust,會有一種強烈的挫敗感。這并不奇怪,為了“安全”,Rust 的語言設(shè)計強加了許多限制,這讓習(xí)慣于放飛自我的程序員非常不習(xí)慣。但你應(yīng)該知道的一點是,Rust 語言是工程實踐的集大成者。只要你擁有了一些良好工程實踐的基礎(chǔ),你就會理解 Rust 語言設(shè)計的價值所在。比如:
Rust 缺省的是值,而不是變量,因為不變性會減少出錯的幾率
Rust 沒有構(gòu)造函數(shù),因為有名字的工廠方法是一個比構(gòu)造函數(shù)更恰當(dāng)?shù)淖龇?/p>
Rust 沒有空指針,取而代之的是 Option,讓你無論如何不會處理為空的情況
……
Rust 是一門讓程序員“痛并快樂著”的程序設(shè)計語言,寫程序的痛苦和運行時的快樂并存。但我們應(yīng)該認識到,程序員有時確實不那么靠譜,而且大多數(shù)程序員都有不靠譜的時候,所以,有一門程序設(shè)計語言限制一下程序員,其實也是一件好事。