程式語言成功的秘訣是什麼? -erik

banq發表於2021-08-26

本文討論影響 C、C++、Java、C#、Perl、Python、Ruby、JavaScript、Objective-C 和 Swift 等語言成功的因素。
20 多年來,我選擇了不同的語言,並反思了它們的優缺點。回想起來,我想我可以看到許多常見的模式,說明為什麼某些語言成功而其他語言失敗。
 

解決痛點
成功的語言傾向於解決困擾開發人員的問題。在早期,效能是一個主要問題,因為計算機真的很慢。C 程式語言之所以流行,很大程度上是因為它允許人們編寫快速的程式碼。相比之下,LISP 和 Smalltalk 由於效能低下而受到阻礙。
C++ 流行是因為它解決了 C 程式碼的許多問題,而 Java 是因為它解決了許多 C++ 問題。就像 Swift 解決了許多 Objective-C 問題一樣。Perl——雖然在今天不那麼流行——變得非常流行,因為它極大地簡化了 shell 程式設計。
在很多方面,人們可以說 Python 之所以流行,是因為它為 Perl 造成的混亂提供了一種解決方案。Ruby 透過跳入其中而廣受歡迎。在某種程度上,這是一種解決 Perl 痛點的不同方式,同時又不放棄許多讓人們喜歡 Perl 的東西。但是你不能不考慮相容性和熟悉度來談論這個。
 

熟悉度和相容性
許多語言旨在用 C 解決問題。最著名的例子是 C++。它使用的語法與 C 非常相似。它甚至與原始碼相容,因此您可以將現有的 C 程式碼與新的 C++ 程式碼混合使用。這使得采用變得容易得多。
現在 Java 無法提供原始碼相容性,但它提供了熟悉度。它大量借用了許多人已經熟悉的 C/C++ 語法,同時簡化了許多概念。它出現在 OOP 風靡一時的時候,Java 透過承諾在 Java 中你甚至不能編寫免費函式來大肆宣傳。一切都必須是方法;這就是物件導向的Java!有點愚蠢的噱頭,但從營銷的角度來看,它的效果非常好。這是一個人們可以理解的簡單資訊,即使邏輯有問題。
JavaScript 建立者注意到 Java 的廣泛流行並接受了 Java 風格的語法。因此,它透過熟悉的語法幫助推動了採用。在語義上它完全不同並不重要。人們是膚淺的,如果語法看起來很熟悉,那麼人們認為這意味著它很容易學習。
Perl、Ruby 和 Python 存在於某種平行宇宙中。Unix 不僅帶來了 C 程式設計,還帶來了 shell 指令碼。對於簡單的任務和自動化,shell 指令碼比 C 程式有明顯的優勢。人們開始編寫更大的 shell 指令碼,而 shell 語法不太適合這種情況。Perl 出手相救。它是一種更合適的語言,但它的語法對於編寫 shell 指令碼的人來說非常熟悉。因此,任何習慣使用 Bash shell 的人都可以輕鬆掌握 Perl。
這使 Perl 成為一種用於文字處理的瑞士軍刀。它有正規表示式,您可以與它互動工作。它與 C、C++ 和 Java 有著不同的利基。
Python 和 Ruby 是可以利用這一成功的語言。它們也是可以在 Unix shell 中輕鬆執行的 shell 語言。雖然從 Bash 中移除了更多,但它們仍然提供了對 Perl 程式設計師來說看起來很熟悉的工作方式。它們可以吸引那些熟悉更合適的語言(如 Java)的人,同時對 shell 友好。
因此,即使源不相容,它們也建立在熟悉的基礎上。
 

壟斷
令人驚訝的是,某種壟斷安排將一種語言推到了頂峰。例如,JavaScript 作為 Web 語言就被隨意地建立起來了。因為它成為了網頁的標準,它壟斷了客戶端 Web 開發。隨著 Web 變得非常流行,JavaScript 也必然如此。
Objective-C 和 Swift 是完全相同的其他例子。在 iPhone 大受歡迎並且人們愛上智慧手機應用程式之前,Objective-C 是一種相對晦澀的語言,幾乎只在 Apple 生態系統中使用。我是早期的粉絲之一。事實上,在 Objective-C 成為 Apple 的一部分之前,我是一個粉絲,因為它來自 NeXT 公司,這是史蒂夫賈伯斯在 80 年代被踢出蘋果後創辦的。
對我來說,吸引力在於 C 的效能與 Smalltalk 的優雅物件模型相結合。當然,這種令人討厭的擔憂並沒有真正為一種語言創造大眾吸引力。但真正讓它變大的是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 年代開始做的事情。
斯威夫特是同樣的想法。Apple 宣佈這是未來,它將取代 Objective-C。這幾乎保證了該語言的巨大市場份額。
 

殺手級應用
雖然我提到的因素可能會使語言達到一個不錯的流行水平,但可能無法解釋為什麼它們變得非常流行。通常,語言中的某些功能可以最終構建某種殺手級應用程式。
例如,Ruby 具有強大的超程式設計功能。這使得構建 Ruby on Rails 成為可能,這讓 Ruby 變得非常龐大。
對於 Objective-C 和 Swift,我猜你可以說殺手級應用是 iPhone 應用。
很難對 JavaScript 做出相同的結論,因為它的 Web 壟斷將始終確保其主導地位。然而我認為可以說 Node.js 是一項真正鞏固了 JavaScript 地位的開發。
雖然 Python 長期以來一直很受歡迎,但真正讓它走紅的是資料科學和機器學習的興起。這些領域需要互動式解決方案。編譯語言不太適合。Python 已經將 NumPy 和其他解決方案用作槓桿,並且沒有面臨太多競爭。JavaScript 被鎖定在 Web 上。Perl 是一種只寫語言。Matlab 是商業化的,並且在牙齒上變得很長。並且都沒有提供 OOP 或函數語言程式設計,只是簡單的舊過程程式設計。Lua 主要適用於嵌入,沒有豐富的庫生態系統。R 有古怪的語法和混亂的生態系統,對程式設計師沒有吸引力。
然而,你可以說 R 變得相對較大,部分原因是資料分析的興起和大資料成為行業的主要痴迷。
 

易於學習和使用
一門語言可以解決很多痛點並提供很大的優勢,但如果它不易於使用和學習,它就無處可去。請注意,這兩件事並不總是相同的,取決於上下文。例如,C++ 是一種極其複雜的語言,而且並不是很容易使用。那麼它到底是如何變得如此受歡迎的呢?
因為它依託於 C 的成功。對於有 C 經驗的人來說,學習 C++ 不會那麼難。當 C++ 流行起來時,它是一種比今天簡單得多的語言。在這裡,臨界質量和社群的概念開始發揮作用。成功推動著自身的成功。一旦一種語言擁有一個龐大的社群、教程、大量用它編寫的軟體、願意僱用的公司,那麼該語言幾乎不管其缺陷如何都會繼續發展。但是您不能僅僅將 C++ 的成功歸因於它的社群,因為這並不能解釋它最初是如何獲得該社群的。
同樣重要的是要注意,易用性也往往是膚淺的。例如,Objective-C 是一種比 C++ 簡單得多的語言。然而人們通常會認為 C++ 更容易學習,因為它的語法看起來更熟悉。熟悉是強大的驅動力。
Java 在今天可能不是那麼簡單的語言,但是當它出現時,它看起來比 C++ 有了很大的改進。開發人員不必瞭解引用、指標、指向指標的指標、地址運算子以及使 C++ 開發變得複雜的各種低階內容。
在這方面,Go 程式語言是 90 年代的一種似曾相識。它是一種非常簡單的最小語言,但它不會像 Java 那樣受到 OOP 炒作的影響。相反,它試圖更緊密地遵循 C 的哲學。我記得 Go 出來後不久就嘗試過。當時我是一名 C++ 開發人員,但我用 Python 編寫了一些有用的小型命令列工具來幫助我的工作流程。
我記得在短短几天內就學會了Go。
我很驚訝我能以多快的速度用它來處理嚴肅的事情。對於任何做過 C 和 Python 程式設計的人來說,這些庫和語法似乎都很熟悉。這幾乎有點像使用指令碼語言。我記得它很快取代了 Python 作為我的小型實用程式的 goto 語言。靜態型別檢查有助於捕獲錯誤,但它不會像在 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 雖然有一個漂亮的開發模型,但太不同了。開發基於修改影像而不是原始碼檔案。它類似於操縱代表生活環境的資料庫。這與人們習慣的完全不同。不管它有多優越。人們會選擇熟悉的東西。

相關文章