選單

程式語言成功的幾大要素

作者 | Erik Engheim

譯者 | 彎月   責編 | 孫勝

出品 | CSDN(ID:CSDNnews)

最近,有人在推特上討論程式語言如何才能取得成功。有人提到了社群、營銷、低成本的開發人員等等。

然而,我認為這些因素與程式語言的成功並沒有太大關聯。20 多年來,我使用過很多程式語言,也反思過它們的優缺點。在本文中,我想總結一些常見的模式,說明為什麼有些語言取得了成功,而有些語言則失敗了。

解決痛點

如果程式語言沒有解決任何實際的開發人員問題,那麼也走不長遠。成功的語言都會解決困擾開發人員的問題。在早期,效能是一個主要問題,因為那時的計算機真的很慢。C 程式語言之所以流行起來,很大程度上是因為人們可以利用 C 編寫速度非常快的程式碼。相比之下,LISP 和 Smalltalk 由於效能低下,其發展就非常有限。

C++ 流行是因為它解決了很多 C 程式碼中的問題,而 Java 是因為它解決了許多 C++ 的問題。就像 Swift 解決了許多 Objective-C 的問題一樣。Perl(雖然現在不怎麼流行了)變得非常流行,是因為它極大地簡化了 shell 程式設計。

從很多方面來說,Python 之所以流行,是因為它針對 Perl 帶來的混亂提供了一種解決方案。而Ruby 也因同樣的原因廣受歡迎。從某種程度上說,它們透過不同的方式解決了 Perl 的痛點,同時又沒有放棄許多 Perl 的優點。說到這裡,我們不得不提相容性和熟悉度。

熟悉度與相容性

許多語言都利用 C 來解決問題。最有名的例子就是 C++。它使用的語法與 C 非常相似,甚至可以與 C 的程式碼相容,因此你可以將已有的 C 程式碼與新的 C++ 程式碼混合起來使用。這樣採用 C++ 的門檻就會降低。

Java雖然沒有提供原始碼相容性,但它提供了熟悉度。它大量借用了許多人熟悉的 C/C++ 語法,同時簡化了許多概念。Java 誕生之時,面向物件非常流行,它藉助了面向物件的熱潮,並宣稱Java 甚至不允許編寫自由函式。一切都必須是方法;這是面向物件的Java!雖然這是個有點愚蠢的噱頭,但從營銷的角度來看,效果非常好。這種說法很容易被人們接受,即便邏輯有問題。

JavaScript的建立者注意到了 Java 的廣泛流行,並採納了 Java 風格的語法。因此,JavaScript 透過熟悉的語法推動了採用。即便語義上完全不同也不重要。人們是膚淺的,如果語法看起來很熟悉,人們就會覺得這門語言很容易學習。

而Perl、Ruby 和 Python 像是存在於平行宇宙中。Unix 不僅帶來了 C 程式設計,還帶來了shell 指令碼。對於簡單的任務和自動化,shell 指令碼明顯比 C 程式更有優勢。人們紛紛開始編寫大型 shell 指令碼,然而 shell 語法不太適合大型指令碼。於是,救星 Perl 出現了。它是一種更合適的語言,而且對於熟悉shell 指令碼的人來說,Perl 的語法非常熟悉。因此,任何習慣使用 Bash shell 的人都可以輕鬆掌握 Perl。

於是,Perl 成為了文字處理界的“瑞士軍刀”。它有正則表示式,你可以與之互動。它與C、C++ 和 Java 有著不同的市場。

Python和Ruby 的成功也借鑑了這類經驗。它們也是可以在 Unix shell 中輕鬆執行的 shell 語言。雖然二者在 Bash 之外也有很多用途,但它們的語法讓 Perl 程式設計師倍感親切。它們吸引了熟悉非指令碼語言(比如 Java)的程式設計師,同時對 shell 也很友好。

因此,它們也建立在熟悉的基礎之上,儘管原始碼不相容。

壟斷

令人驚訝的是,透過壟斷的方式將某種語言推向頂峰的做法也很常見。例如,作為 Web 語言,JavaScript 設計得相當隨便。但由於它成為了網頁的標準,因此壟斷了客戶端 Web 開發。隨著 Web 越來越流行,JavaScript 的普及度也水漲船高。

Objective-C和Swift 的情況也完全相同。在 iPhone 大受歡迎、人們愛上智慧手機應用之前,Objective-C 是一種相對難懂的語言,幾乎只有蘋果生態系統使用。我是早期的粉絲之一。事實上,在 Objective-C 被納入蘋果之前,我就是它的粉絲,該語言來自 NeXT 公司,是喬布斯在 80 年代被踢出蘋果公司後創辦的。

對於我來說,Objective-C 的吸引力在於它結合了 C 的效能與 Smalltalk 優雅的物件模型。當然,這種只有技術宅男才會關注的點並沒有對大眾帶來太多吸引力。真正讓 Objective-C 得到發展的是iPhone。Mac OS X 基於 NeXTSTEP,而 iPhone OS 基於 Mac OS X。在 NeXT 和 OS X 的世界中,Objective-C的地位如同 Unix 系統中的 C 一樣,完全主宰一切。

事實上,我們可以說 C 流行起來的原因也大抵相同。就像 iPhone 的流行成全了 Objective-C 一樣,Unix 的流行也將 C 推向了巔峰。Unix 中所有重要的功能都是用 C 編寫的,因此如果你想攻克 Unix,首先必須學習 C。這就是 70 年代人們紛紛開始C 的原因。

Swift的發展思路也大致相同。蘋果宣佈 Swift 是未來,它將取代 Objective-C。這就等於保證了該語言的巨大市場份額。

殺手級應用

雖然上述因素可以讓程式語言達到一定的流行度,但可能還不足以解釋為什麼這些語言會如此流行。通常,這些語言中的某些功能可以構建某款殺手級的應用。

例如,Ruby 具有強大的超程式設計功能。因此,有人構建了 Ruby on Rails,而這反過來又推動了 Ruby 的發展。

對於Objective-C 和 Swift,我猜你會說殺手級應用是iPhone 應用。

對於JavaScript,我們很難得出相同的結論,因為其在 Web 的壟斷始終可以確保主導地位。然而我認為,可以說 Node。js 的開發鞏固了 JavaScript 的地位。

雖然長期以來 Python 一直很受歡迎,但真正讓它走紅的是資料科學與機器學習的興起。這些領域需要互動式解決方案。編譯語言不太適合。Python 擁有 NumPy 以及其他解決方案,並且沒有面臨太多競爭。JavaScript 被鎖到了 Web 上。Perl 是一種非常難讀懂的語言。Matlab 走的是商業路線,而且年頭太久遠。並且二者都沒有提供面向物件程式設計或函數語言程式設計,只是簡單的程序式程式設計。Lua 主要適用於嵌入,沒有豐富的庫生態系統。R 有古怪的語法和混亂的生態系統,對程式設計師沒有吸引力。

然而, R 相對發展得還不錯,部分原因是資料分析的興起,以及軟體行業對大資料的痴迷。

易於學習和使用

一門程式語言可以解決很多痛點,並提供很大的優勢,但如果不易於使用和學習,也走不長遠。請注意,易學和易用並不一定是一回事。舉個例子,C++ 是一種極其複雜的語言,而且使用也很不方便。那麼,它是如何變得如此受歡迎的呢?

因為它藉助了 C 的成功。對於有 C 經驗的人來說,學習 C++ 不會特別難。而且當初 C++ 流行起來的時候,它遠比如今簡單得多。此處,我們還要提一下臨界質量和社群的概念。一個成功會推動另一個成功。某種語言一旦擁有龐大的社群、教程、大量用它編寫的軟體、願意招聘的公司,那麼無論該語言存在何種缺陷,都會得到發展。但是也不能將 C++ 的成功完全歸功於社群,因為這並不能解釋最初它是如何俘獲社群的。

還有一點也很重要,易用性往往是表面上的。例如,Objective-C 是一種比 C++ 簡單得多的語言。然而人們通常會認為 C++ 更容易學習,因為它的語法看起來更熟悉。熟悉感是強大的驅動力。

如今的 Java 可能並不是一種簡單的語言,但在它剛出現時,很多改進都超過了 C++。開發人員不必瞭解引用、指標、指向指標的指標、地址運算子以及各種導致 C++ 開發複雜化的底層概念。

在這方面,90 年代的 Go 程式語言也有類似的感覺。它是一種非常簡單的小型語言,但是沒有像 Java 那樣受到面向物件 炒作的影響。相反,它努力遵循 C 的理念。我記得當初 Go 剛問世不久我就嘗試了一下。當時我是一名 C++ 開發人員,但我用 Python 編寫了一些小型命令列工具,來簡化我的工作流程。

我記得,我只用了短短几天就學會了 Go。我很驚訝它的速度竟然如此之快。對於接觸過 C 和 Python 程式設計的人來說,Go 的庫和語法似乎都很熟悉。幾乎有點像使用指令碼語言。我記得,很快 Go 就取代 Python,成為我編寫小工具的首選語言。靜態型別檢查有助於發現 bug,而不會像 C++ 那樣扼殺生產力。當時在我看來,Go 必然會成功。它不僅易學、熟悉、而且效能良好,並解決了真正的痛點,比如併發等。

那時,我實際上並不關心併發。我只是在比較 Julia、C#、Java、Erlang 和 Swift 的併發系統時嘗試了 Go 併發。那時我才意識到 Go 的提升有多明顯。

然而,我認為 Python、Ruby 和JavaScript 的興起,很大程度上也要歸功於學習這些語言的簡單性。

未能成功的語言

說起未能成功的語言,我不禁會想起 Haskell、Standard ML、OCaml、F#、LISP、Scheme、D 和 Smalltalk。這些語言都很棒,可以解決實際問題。然而,儘管經過了多年的努力,它們始終未能取得任何進展。為什麼呢?

Haskell是一種面向各種程式設計極客的語言。從很多方面來看,我都像是會寫大量誇讚 Haskell 有多麼了不起的文章,並再三預言 Haskell 革命即將來臨。然而,我幾乎從未寫過關於 Haskell 的文章。為什麼?

也許是因為我也是 UX 的忠實粉絲,有時會寫一些有關易用性和使用者介面設計的文章。從某種數學和技術的角度來看,Haskell 看起來像是天才的傑作。然而,從易用性的角度來看,我覺得它不及格。

沒錯,它具有數學優雅和簡單性,完全不同於 C++ 的混亂。然而,高階抽象數學,無論多麼優雅,都不是普通人可以輕鬆掌握的。相反,儘管英語十分混亂,人們還是可以學習英語。很多英語的拼寫毫無邏輯,缺乏一致性。然而,人們可以容忍這些問題。儘管微積分在概念上更簡單,但普通人卻完全掌握不了。

這就是這些語言失敗的地方。通常,它們都具有數學之美,但它們的構建方式並不適合我們愚鈍的大腦。這些語言的知音人可能會覺得意難平。看似極樂世界盡在掌握,只可惜有些人就是不開竅。有時,可能只是你太聰明瞭,無法理解普通人的難處。

我個人認為 LISP、Scheme 和 Smalltalk 曾有過機會。對於這些語言,我認為問題不在學習有困難,而是缺乏熟悉度。與程式設計世界已經習慣的語法相比,它們都包含一些奇怪的語法。另一個原因是生不逢時。它們根本無法達到當時所需的效能。這些都是開源專案和網際網路出現之前的時代。這導致這些語言出現了許多變種,阻礙了其發展。

儘管Smalltalk 有一個漂亮的開發模型,但它太另類了。開發基於修改映象而不是原始碼檔案。它類似於直接操縱真實的資料庫。這與人們習慣的方式完全不同。無論有多麼優異都不重要,人們還是會選擇熟悉的語言。

參考連結:https://medium。com/geekculture/what-makes-a-programming-language-succeed-de7c0d15b7f9

10 月 23-24 日,“長沙·中國 1024 程式設計師節”重磅來襲。嶽麓對話、技術英雄會、主題論壇演講、第 16 屆中國 Linux 核心開發者大會( CLK )、第 13 屆中國開源駭客松等多場硬核技術競賽紛紛亮相。此外,還有程式設計師吐槽大會、創新產品展與現場體驗等諸多特色活動,邀你一起體驗一年一度、專屬程式設計師的盛大嘉年華!

☞Angular 導致公司損失數十億美元!