作者 | Mike Loukides
譯者 | Sambodhi
策劃 | Tina
最不受歡迎 / 最令人畏懼的編程語(yǔ)言有哪些?這些編程語(yǔ)言為什么令人畏懼?對(duì)它們的評(píng)價(jià)是否公正?
在 StackOverflow 的 2020 年度開發(fā)者調(diào)查中,有一張表格,顯示的是“最受歡迎、最令人畏懼和最想要的編程語(yǔ)言”。最受歡迎的和最想要的編程語(yǔ)言,嗯,是有點(diǎn)無(wú)聊。倒是那個(gè)最令人畏懼的就有意思多了。正如托爾斯泰(Tolstoy)所說的:“幸福的家庭都是相似的,而不幸的家庭則各有各的不幸。”(All happy families are alike; each unhappy family is unhappy in its own way.)
那么,這些令人不快的、不受歡迎的編程語(yǔ)言都是哪些呢?為什么程序員如此害怕使用這些編程語(yǔ)言呢?如果有機(jī)會(huì)的話,很難不會(huì)加入一些理論,甚至說一些不明智的話?;蛘邽橐恍┮?yàn)殄e(cuò)誤的原因而不喜歡的編程語(yǔ)言辯護(hù)。
更準(zhǔn)確地說,StackOverflow 統(tǒng)計(jì)的是“正使用該語(yǔ)言或技術(shù)進(jìn)行開發(fā),但沒有表示有興趣繼續(xù)使用的開發(fā)人員的百分比。”這聽上去沒有“恐懼”那么可怕;“沒有表示有興趣繼續(xù)使用一種語(yǔ)言的工具”這一提法的本身就是一種相當(dāng)模糊的畏懼暗示。我做過的很多事情我都不想再做了,包括編寫產(chǎn)生 shell 腳本的 troof 宏。但我們不用擔(dān)心這個(gè),對(duì)吧?
最不受歡迎的語(yǔ)言列表與最廣泛使用的語(yǔ)言列表相似,如 RedMonk、Tiobe 和 O'Reilly Learning 上的搜索結(jié)果所示。這一點(diǎn)也不奇怪;C++ 之父 Bjarne Stroustrup 曾說,“世界上只有兩種語(yǔ)言,一種飽受詬病,另一種沒人使用。”(There are only two kinds of languages: the ones people complain about and the ones nobody uses.)這話說得很有道理,至少在這項(xiàng)調(diào)查中是這樣。如果你有數(shù)百萬(wàn)用戶,要做到讓很多人不喜歡你并不難。因此,在不受歡迎的語(yǔ)言列表中看到 C 這樣的多年老牌語(yǔ)言和像 Java 這樣的新秀也就不奇怪了。
Kevlin Henney 和我認(rèn)為,最不受歡迎的語(yǔ)言列表也反映了從事大型遺留項(xiàng)目的程序員的意見,而不是短程序。不喜歡某一門編程語(yǔ)言的原因可能是“道德連坐”:因?yàn)椴幌矚g一個(gè)龐大的、過時(shí)的、文檔最少的代碼庫(kù),以及每次修復(fù)一個(gè) Bug 都會(huì)破壞其他東西的架構(gòu)風(fēng)格。因此,在榜單上看到曾經(jīng)被廣泛使用但卻不再受歡迎的編程語(yǔ)言也就不足為奇了。人們也很容易愛上一門古怪的語(yǔ)言,這種語(yǔ)言對(duì)于某個(gè)項(xiàng)目來說非常完美,但你再也見不到它了。(就拿我來說,這種語(yǔ)言是 Icon。你試試吧,你可能會(huì)喜歡這門語(yǔ)言。但它卻不在任何人的清單上。)
最令人驚訝的是當(dāng)一種語(yǔ)言不合時(shí)宜的時(shí)候:當(dāng)它比你預(yù)期的明顯更多或更少不受歡迎時(shí)。這就是我要思考的問題。因此,在進(jìn)行了初步的討論之后,下面是一些討論的結(jié)果:
自誕生以來,Java 就一直是人們愛恨交加的語(yǔ)言。我參加過 USENIX 會(huì)議,在會(huì)議上,James Gosling 第一次談到 Java(遠(yuǎn)在 1.0 之前),人們離開會(huì)議室后都在談?wù)?Java 是有多么可怕——那時(shí)候并沒有人真正使用過 Java 語(yǔ)言,因?yàn)樗€沒有發(fā)布。在這項(xiàng)調(diào)查中,Java 排名第 9 位。鑒于 Java 的聲譽(yù),給出這樣的排名應(yīng)該已經(jīng)很夠意思了。
如果這個(gè)列表中有一種編程語(yǔ)言與大型項(xiàng)目相關(guān),那就是 Java。關(guān)于 Java 有很多令人討厭的地方:盡管其中很多都與 Java 成長(zhǎng)過程中程序員形成的不良習(xí)慣有關(guān),而不是與語(yǔ)言本身有關(guān)。如果你發(fā)現(xiàn)自己在濫用設(shè)計(jì)模式,請(qǐng)退后一步看看自己在做什么;把所有東西都變成設(shè)計(jì)模式就是一個(gè)信號(hào),表明你并沒有理解模式到底是用來干什么的。(如果你需要復(fù)習(xí)的話,可以參閱 《深入淺出設(shè)計(jì)模式》(Head First Design Patterns) 或“四大金剛”合著的經(jīng)典書籍《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》(Design Patterns: Elements of Reusable Object-Oriented Software)。如果你開始編寫 FactoryFactoryFactory,請(qǐng)停下來好好走一走。如果你正在編寫 ,那就無(wú)需這樣做了。但 Java 并不會(huì)讓你這么做的。描述性的名稱還是很好的;長(zhǎng)得離譜的名稱(以及深得離譜的包層次結(jié)構(gòu))卻并非如此。我總是試圖在每行代碼上都有一個(gè)連貫的想法。你不能在名字只有半行長(zhǎng)的時(shí)候這么做。但這不是 Java 的錯(cuò),而是 Java 程序員的一種文化怪癖。
Java 是冗長(zhǎng)的,但這不一定就是個(gè)問題。正如一位并非 Java 愛好者的人曾經(jīng)告訴我的那樣,類開始時(shí)的所有聲明實(shí)際上都是文檔,而文檔在大型項(xiàng)目尤為重要。一旦你知道了數(shù)據(jù)結(jié)構(gòu)是什么,你就可以很好地猜測(cè)這個(gè)類是做什么的。我發(fā)現(xiàn) Java 比大多數(shù)其他語(yǔ)言更容易閱讀和理解,部分原因在于它非常明確——大多數(shù)優(yōu)秀的程序員意識(shí)到,他們花在閱讀別人的代碼上的時(shí)間要比編寫自己的代碼要多。
當(dāng)我發(fā)現(xiàn) Ruby 在榜單上居然排名第 7 位時(shí),讓我倍感驚訝。Ruby 比 Java 更不受待見嗎?這是為什么?我用 Ruby 編寫過一些有趣的程序;在很大程度上,它是一種“按我的意思去做,而不是按我說的去做”的編程語(yǔ)言,15 年前,就是這個(gè)承諾讓很多程序員愛上了這門語(yǔ)言。
但如果我們把 Ruby 放在大型系統(tǒng)的環(huán)境中予以考慮的話,它還是有意義的。編寫模棱兩可的代碼并不難,至少對(duì)于一般的觀察者來說是這樣。如果一個(gè)函數(shù)或方法被打上“猴補(bǔ)丁”而產(chǎn)生一些非標(biāo)準(zhǔn)行為,那么就很容易與之發(fā)生沖突,而這些修改卻很少被記錄下來。元編程在 Rails 等框架得到了出色的應(yīng)用,但是我一直對(duì) Ruby 庫(kù)中的神奇功能方面感到困擾。這些功能都不利于大型項(xiàng)目。
許多年前,我在 Ruby 或 Rails 會(huì)議上曾聽到有人這樣說:“沒有任何大型項(xiàng)目,Ruby 中的所有東西都能減少 90% 的代碼行數(shù)?!蔽乙恢闭J(rèn)為 LOC 是一個(gè)愚蠢的指標(biāo)(譯注:LOC,length of the code,即代碼的長(zhǎng)度)。就算你相信 Ruby 真的減少了 90% 的代碼行(反正我不信),一個(gè)大數(shù)目的 10% 仍然是一個(gè)很大的數(shù)字,特別是如果你有責(zé)任消化這些代碼,包括背后發(fā)生的事情。Ruby 很有趣,我現(xiàn)在還用它來編寫快速腳本(雖然我基本上已經(jīng)改用 Python 來做了),但它會(huì)是大型項(xiàng)目的首選語(yǔ)言嗎?那可能會(huì)讓我害怕地跑掉。
R 在“最令人畏懼的名單”中排在第 10 名。我認(rèn)為這是因?yàn)橐环N誤解。R 既是也不是一種通用編程語(yǔ)言。一些統(tǒng)計(jì)學(xué)家告訴我,“你們程序員不明白,R 是一個(gè)統(tǒng)計(jì)工作臺(tái),并不是一種編程語(yǔ)言。它不是 Python 的什么怪異版本?!蔽以啻斡眠^ R,但當(dāng)我讀完 Vince Buffalo 的《Bioinformatics Data Skills》(譯注:暫無(wú)中文版)中有關(guān) R 的教程后,我終于“明白了”(至少是部分明白了)。循環(huán)和 if 語(yǔ)句在該教程的最后只有幾頁(yè),而不是你最先學(xué)習(xí)的概念之一。為什么要這樣?因?yàn)槿绻阏_地使用 R,你就不會(huì)需要它們了。它的設(shè)計(jì)目的是讓你不必使用它們。如果你使用的是更傳統(tǒng)的語(yǔ)言,你可能會(huì)發(fā)現(xiàn)自己在與這門語(yǔ)言作斗爭(zhēng),而不是使用它。條件邏輯和迭代的實(shí)現(xiàn)有更好的方法。
它還有助于使用最好的工具和庫(kù):RStudio 是一個(gè)非常好的 R 集成開發(fā)環(huán)境,而 Tidyverse 是一組用于處理數(shù)據(jù)很棒的庫(kù)。然而具有諷刺意味的是,這甚至可能是問題的一部分:有了優(yōu)秀的圖形庫(kù)和 Web 框架,R 突然看起來不太像一個(gè)專門的統(tǒng)計(jì)工作臺(tái),而更像一個(gè)通用的工作臺(tái)了。
許多程序員似乎正在用另一種眼光看待 R——也許是為了分析 COVID 數(shù)據(jù)?在 2020 年 7 月的報(bào)告中,R 從 Tiobe 指數(shù)的第 20 位躍升至第 8 位。這是一個(gè)巨大的變化。不管是什么原因,如果你用它工作,而不是反對(duì)它,那么 R 將是一個(gè)更愉快的環(huán)境。它是非常有意見的,而且這些意見是統(tǒng)計(jì)學(xué)家的意見,不是程序員的意見。
Python 在這個(gè)榜單上排在第 23 位。對(duì)于一個(gè)使用如此廣泛的編程語(yǔ)言來說,這個(gè)排名是非常低的。Python 很容易讓人喜歡;我之所以喜歡 Python 僅僅是因?yàn)樗サ袅嘶ɡㄌ?hào)。但除此之外,它還有什么值得人們?nèi)ハ矚g呢?我總是講“不要選擇語(yǔ)言,要選擇庫(kù)”,而 Python 就有很棒的庫(kù),尤其是在數(shù)值計(jì)算方面。Pandas、Numpy、Scipy 和 scikit-learn 都是人們喜歡 Python 的好理由。像列表解析(list comprehensions)這樣的功能就消除了許多與傳統(tǒng)控制結(jié)構(gòu)相關(guān)的簿記。Python 既適用于快速而棘手的任務(wù),也適用于大型項(xiàng)目。如果我想用電子表格做點(diǎn)什么,我?guī)缀蹩偸鞘褂?Python。(我嗎?數(shù)據(jù)透視表?)而像 Jupyter 這樣的工具可以很方便地記錄你的實(shí)驗(yàn)過程。
從“大項(xiàng)目”的角度來看,Python 很容易閱讀;不會(huì)因?yàn)榍短椎幕ɡㄌ?hào)而令人感到眼花,而且由于包含了解析(comprehension)、映射(map)和其他功能,嵌套的級(jí)別也更少。它具有合理的面向?qū)ο蟮奶匦裕ūM管公認(rèn)有些古怪)。我又回到了一些舊的循環(huán)腳本,并且經(jīng)常能夠完全不使用循環(huán)就編寫它們。如果你想把一個(gè)連貫的想法放在一條線上,那就是所有可能世界中最好的?!禤ython 之禪》(The Zen of Python)中有一個(gè)重要的口號(hào)是“明了優(yōu)于隱晦”(Explicit is better than implicit);你很少會(huì)去猜測(cè)別人是什么意思,或者試圖破譯“發(fā)生的”一些意想不到的魔法。Python 獲得了最受歡迎的編程語(yǔ)言的稱號(hào),最大限度地減少人們的反感。它擁有一系列平衡的特性,這使得它成為小型項(xiàng)目和大型項(xiàng)目的理想選擇。
對(duì)于排名第 16 位的 JavaScript,我們?cè)撊绾慰创??我是沒什么好說的。這是一種以隨機(jī)和無(wú)序的方式發(fā)展起來的語(yǔ)言,程序員最終認(rèn)識(shí)到它的強(qiáng)大和高效,這在很大程度上要?dú)w于 Doug Crockford 的經(jīng)典著作《JavaScript 語(yǔ)言精粹》(JavaScript: The Good Parts)。一種像 JavaScript 一樣被廣泛使用的語(yǔ)言,在最令人畏懼的的語(yǔ)言排行榜上只排在第 16 位,它肯定是做對(duì)了什么。但我不一定要喜歡它。
當(dāng)然還有很多要說的。毫無(wú)疑問,VBA 是最不受歡迎的語(yǔ)言。我承認(rèn)我完全不了解 Objective-C(排名第 2),我從來沒有任何理由去使用這門語(yǔ)言。盡管我很早以前就討厭 Perl,但令我驚訝的是,Perl 是如此不受人們待見(排名第 3),但有些傷口永遠(yuǎn)不會(huì)愈合??纯?Perl 7 發(fā)布幾年后會(huì)發(fā)生什么,這將是一件有趣的事情。匯編語(yǔ)言(排名第 4)是一種后天習(xí)得的品味(而且不是一門單一的語(yǔ)言)。如果你不學(xué)著去愛它,你就會(huì)討厭它。如果你不喜歡它,你真的不應(yīng)該去使用它。你幾乎總是可以避免使用匯編語(yǔ)言,但當(dāng)你需要直接使用硬件時(shí),你就別無(wú)選擇。C 和 C++(排名分別為第 5 和第 8)給了你很大的空間,但對(duì)于幾乎任何項(xiàng)目,它們都能讓你盡可能接近硬件,而無(wú)需擔(dān)心使用匯編語(yǔ)言的問題。它們是消失在過去呢,還是會(huì)永遠(yuǎn)與我們同在呢?我猜是后者;需要 C 的性能和普遍性的項(xiàng)目實(shí)在太多了。它是現(xiàn)代計(jì)算機(jī)中幾乎所有重要內(nèi)容的基礎(chǔ)。
猜測(cè)編程語(yǔ)言以及人們喜歡或討厭它們的原因是一件很有趣的事。它可能有用,也可能沒用。但我所說的不一定有用,你聽聽就好,別當(dāng)真。
參考閱讀:
https://www.oreilly.com/radar/the-least-liked-programming-languages/
服務(wù)器和數(shù)據(jù)庫(kù)是企業(yè)信息系統(tǒng)最基礎(chǔ)的組成部分,關(guān)系到企業(yè)線上服務(wù)的可靠性和核心數(shù)據(jù)的安全。為了解各企業(yè)業(yè)務(wù)應(yīng)用負(fù)荷的部署情況以及上云趨勢(shì),InfoQ 特別發(fā)起了本次關(guān)于“服務(wù)器與數(shù)據(jù)庫(kù)”的調(diào)研活動(dòng)。在此邀請(qǐng)您作為代表,提供有價(jià)值的意見,我們會(huì)認(rèn)真閱讀,細(xì)心采納。
聯(lián)系客服