最近,有人在推特上討論編程語言如何才能取得成功。有人提到了社區(qū)、營銷、低成本的開發(fā)人員等等。
然而,我認為這些因素與編程語言的成功并沒有太大關聯(lián)。20 多年來,我使用過很多編程語言,也反思過它們的優(yōu)缺點。在本文中,我想總結一些常見的模式,說明為什么有些語言取得了成功,而有些語言則失敗了。
如果編程語言沒有解決任何實際的開發(fā)人員問題,那么也走不長遠。成功的語言都會解決困擾開發(fā)人員的問題。在早期,性能是一個主要問題,因為那時的計算機真的很慢。C 編程語言之所以流行起來,很大程度上是因為人們可以利用 C 編寫速度非??斓拇a。相比之下,LISP 和 Smalltalk 由于性能低下,其發(fā)展就非常有限。
C++ 流行是因為它解決了很多 C 代碼中的問題,而 Java 是因為它解決了許多 C++ 的問題。就像 Swift 解決了許多 Objective-C 的問題一樣。Perl(雖然現(xiàn)在不怎么流行了)變得非常流行,是因為它極大地簡化了 shell 編程。
從很多方面來說,Python 之所以流行,是因為它針對 Perl 帶來的混亂提供了一種解決方案。而Ruby 也因同樣的原因廣受歡迎。從某種程度上說,它們通過不同的方式解決了 Perl 的痛點,同時又沒有放棄許多 Perl 的優(yōu)點。說到這里,我們不得不提兼容性和熟悉度。
許多語言都利用 C 來解決問題。最有名的例子就是 C++。它使用的語法與 C 非常相似,甚至可以與 C 的代碼兼容,因此你可以將已有的 C 代碼與新的 C++ 代碼混合起來使用。這樣采用 C++ 的門檻就會降低。
Java雖然沒有提供源代碼兼容性,但它提供了熟悉度。它大量借用了許多人熟悉的 C/C++ 語法,同時簡化了許多概念。Java 誕生之時,面向對象非常流行,它借助了面向對象的熱潮,并宣稱Java 甚至不允許編寫自由函數(shù)。一切都必須是方法;這是面向對象的Java!雖然這是個有點愚蠢的噱頭,但從營銷的角度來看,效果非常好。這種說法很容易被人們接受,即便邏輯有問題。
JavaScript的創(chuàng)建者注意到了 Java 的廣泛流行,并采納了 Java 風格的語法。因此,JavaScript 通過熟悉的語法推動了采用。即便語義上完全不同也不重要。人們是膚淺的,如果語法看起來很熟悉,人們就會覺得這門語言很容易學習。
而Perl、Ruby 和 Python 像是存在于平行宇宙中。Unix 不僅帶來了 C 編程,還帶來了shell 腳本。對于簡單的任務和自動化,shell 腳本明顯比 C 程序更有優(yōu)勢。人們紛紛開始編寫大型 shell 腳本,然而 shell 語法不太適合大型腳本。于是,救星 Perl 出現(xiàn)了。它是一種更合適的語言,而且對于熟悉shell 腳本的人來說,Perl 的語法非常熟悉。因此,任何習慣使用 Bash shell 的人都可以輕松掌握 Perl。
于是,Perl 成為了文本處理界的“瑞士軍刀”。它有正則表達式,你可以與之交互。它與C、C++ 和 Java 有著不同的市場。
Python和Ruby 的成功也借鑒了這類經(jīng)驗。它們也是可以在 Unix shell 中輕松運行的 shell 語言。雖然二者在 Bash 之外也有很多用途,但它們的語法讓 Perl 程序員倍感親切。它們吸引了熟悉非腳本語言(比如 Java)的程序員,同時對 shell 也很友好。
因此,它們也建立在熟悉的基礎之上,盡管源代碼不兼容。
令人驚訝的是,通過壟斷的方式將某種語言推向頂峰的做法也很常見。例如,作為 Web 語言,JavaScript 設計得相當隨便。但由于它成為了網(wǎng)頁的標準,因此壟斷了客戶端 Web 開發(fā)。隨著 Web 越來越流行,JavaScript 的普及度也水漲船高。
Objective-C和Swift 的情況也完全相同。在 iPhone 大受歡迎、人們愛上智能手機應用之前,Objective-C 是一種相對難懂的語言,幾乎只有蘋果生態(tài)系統(tǒng)使用。我是早期的粉絲之一。事實上,在 Objective-C 被納入蘋果之前,我就是它的粉絲,該語言來自 NeXT 公司,是喬布斯在 80 年代被踢出蘋果公司后創(chuàng)辦的。
對于我來說,Objective-C 的吸引力在于它結合了 C 的性能與 Smalltalk 優(yōu)雅的對象模型。當然,這種只有技術宅男才會關注的點并沒有對大眾帶來太多吸引力。真正讓 Objective-C 得到發(fā)展的是iPhone。Mac OS X 基于 NeXTSTEP,而 iPhone OS 基于 Mac OS X。在 NeXT 和 OS X 的世界中,Objective-C的地位如同 Unix 系統(tǒng)中的 C 一樣,完全主宰一切。
事實上,我們可以說 C 流行起來的原因也大抵相同。就像 iPhone 的流行成全了 Objective-C 一樣,Unix 的流行也將 C 推向了巔峰。Unix 中所有重要的功能都是用 C 編寫的,因此如果你想攻克 Unix,首先必須學習 C。這就是 70 年代人們紛紛開始C 的原因。
Swift的發(fā)展思路也大致相同。蘋果宣布 Swift 是未來,它將取代 Objective-C。這就等于保證了該語言的巨大市場份額。
雖然上述因素可以讓編程語言達到一定的流行度,但可能還不足以解釋為什么這些語言會如此流行。通常,這些語言中的某些功能可以構建某款殺手級的應用。
例如,Ruby 具有強大的元編程功能。因此,有人構建了 Ruby on Rails,而這反過來又推動了 Ruby 的發(fā)展。
對于Objective-C 和 Swift,我猜你會說殺手級應用是iPhone 應用。
對于JavaScript,我們很難得出相同的結論,因為其在 Web 的壟斷始終可以確保主導地位。然而我認為,可以說 Node.js 的開發(fā)鞏固了 JavaScript 的地位。
雖然長期以來 Python 一直很受歡迎,但真正讓它走紅的是數(shù)據(jù)科學與機器學習的興起。這些領域需要交互式解決方案。編譯語言不太適合。Python 擁有 NumPy 以及其他解決方案,并且沒有面臨太多競爭。JavaScript 被鎖到了 Web 上。Perl 是一種非常難讀懂的語言。Matlab 走的是商業(yè)路線,而且年頭太久遠。并且二者都沒有提供面向對象編程或函數(shù)式編程,只是簡單的過程式編程。Lua 主要適用于嵌入,沒有豐富的庫生態(tài)系統(tǒng)。R 有古怪的語法和混亂的生態(tài)系統(tǒng),對程序員沒有吸引力。
然而, R 相對發(fā)展得還不錯,部分原因是數(shù)據(jù)分析的興起,以及軟件行業(yè)對大數(shù)據(jù)的癡迷。
一門編程語言可以解決很多痛點,并提供很大的優(yōu)勢,但如果不易于使用和學習,也走不長遠。請注意,易學和易用并不一定是一回事。舉個例子,C++ 是一種極其復雜的語言,而且使用也很不方便。那么,它是如何變得如此受歡迎的呢?
因為它借助了 C 的成功。對于有 C 經(jīng)驗的人來說,學習 C++ 不會特別難。而且當初 C++ 流行起來的時候,它遠比如今簡單得多。此處,我們還要提一下臨界質量和社區(qū)的概念。一個成功會推動另一個成功。某種語言一旦擁有龐大的社區(qū)、教程、大量用它編寫的軟件、愿意招聘的公司,那么無論該語言存在何種缺陷,都會得到發(fā)展。但是也不能將 C++ 的成功完全歸功于社區(qū),因為這并不能解釋最初它是如何俘獲社區(qū)的。
還有一點也很重要,易用性往往是表面上的。例如,Objective-C 是一種比 C++ 簡單得多的語言。然而人們通常會認為 C++ 更容易學習,因為它的語法看起來更熟悉。熟悉感是強大的驅動力。
如今的 Java 可能并不是一種簡單的語言,但在它剛出現(xiàn)時,很多改進都超過了 C++。開發(fā)人員不必了解引用、指針、指向指針的指針、地址運算符以及各種導致 C++ 開發(fā)復雜化的底層概念。
在這方面,90 年代的 Go 編程語言也有類似的感覺。它是一種非常簡單的小型語言,但是沒有像 Java 那樣受到面向對象 炒作的影響。相反,它努力遵循 C 的理念。我記得當初 Go 剛問世不久我就嘗試了一下。當時我是一名 C++ 開發(fā)人員,但我用 Python 編寫了一些小型命令行工具,來簡化我的工作流程。
我記得,我只用了短短幾天就學會了 Go。我很驚訝它的速度竟然如此之快。對于接觸過 C 和 Python 編程的人來說,Go 的庫和語法似乎都很熟悉。幾乎有點像使用腳本語言。我記得,很快 Go 就取代 Python,成為我編寫小工具的首選語言。靜態(tài)類型檢查有助于發(fā)現(xiàn) bug,而不會像 C++ 那樣扼殺生產(chǎn)力。當時在我看來,Go 必然會成功。它不僅易學、熟悉、而且性能良好,并解決了真正的痛點,比如并發(fā)等。
那時,我實際上并不關心并發(fā)。我只是在比較 Julia、C#、Java、Erlang 和 Swift 的并發(fā)系統(tǒng)時嘗試了 Go 并發(fā)。那時我才意識到 Go 的提升有多明顯。
然而,我認為 Python、Ruby 和JavaScript 的興起,很大程度上也要歸功于學習這些語言的簡單性。
說起未能成功的語言,我不禁會想起 Haskell、Standard ML、OCaml、F#、LISP、Scheme、D 和 Smalltalk。這些語言都很棒,可以解決實際問題。然而,盡管經(jīng)過了多年的努力,它們始終未能取得任何進展。為什么呢?
Haskell是一種面向各種編程極客的語言。從很多方面來看,我都像是會寫大量夸贊 Haskell 有多么了不起的文章,并再三預言 Haskell 革命即將來臨。然而,我?guī)缀鯊奈磳戇^關于 Haskell 的文章。為什么?
也許是因為我也是 UX 的忠實粉絲,有時會寫一些有關易用性和用戶界面設計的文章。從某種數(shù)學和技術的角度來看,Haskell 看起來像是天才的杰作。然而,從易用性的角度來看,我覺得它不及格。
沒錯,它具有數(shù)學優(yōu)雅和簡單性,完全不同于 C++ 的混亂。然而,高級抽象數(shù)學,無論多么優(yōu)雅,都不是普通人可以輕松掌握的。相反,盡管英語十分混亂,人們還是可以學習英語。很多英語的拼寫毫無邏輯,缺乏一致性。然而,人們可以容忍這些問題。盡管微積分在概念上更簡單,但普通人卻完全掌握不了。
這就是這些語言失敗的地方。通常,它們都具有數(shù)學之美,但它們的構建方式并不適合我們愚鈍的大腦。這些語言的知音人可能會覺得意難平。看似極樂世界盡在掌握,只可惜有些人就是不開竅。有時,可能只是你太聰明了,無法理解普通人的難處。
我個人認為 LISP、Scheme 和 Smalltalk 曾有過機會。對于這些語言,我認為問題不在學習有困難,而是缺乏熟悉度。與編程世界已經(jīng)習慣的語法相比,它們都包含一些奇怪的語法。另一個原因是生不逢時。它們根本無法達到當時所需的性能。這些都是開源項目和互聯(lián)網(wǎng)出現(xiàn)之前的時代。這導致這些語言出現(xiàn)了許多變種,阻礙了其發(fā)展。
盡管Smalltalk 有一個漂亮的開發(fā)模型,但它太另類了。開發(fā)基于修改鏡像而不是源代碼文件。它類似于直接操縱真實的數(shù)據(jù)庫。這與人們習慣的方式完全不同。無論有多么優(yōu)異都不重要,人們還是會選擇熟悉的語言。
參考鏈接:https://medium.com/geekculture/what-makes-a-programming-language-succeed-de7c0d15b7f9
聯(lián)系客服