2003年,保羅·格雷厄姆(Paul Graham)在文中提到,他的公司決定使用Lisp(一門(mén)編程語(yǔ)言)。在文章中他將Lisp描繪成計(jì)算機(jī)語(yǔ)言界的法語(yǔ),它獨(dú)特、深邃,能夠表達(dá)難以描述的事物(亦即法語(yǔ)je ne sais quoi所指)。他指出自己公司相比競(jìng)爭(zhēng)對(duì)手的優(yōu)勢(shì)在于Lisp。
如果Lisp像法語(yǔ),那么現(xiàn)如今的JavaScript就像英語(yǔ)一般。盡管二者的語(yǔ)法不一致,但英語(yǔ)是世界上最廣泛使用的語(yǔ)言,JavaScript是最廣泛應(yīng)用的計(jì)算語(yǔ)言。
然而,JavaScript仍未得到與其他語(yǔ)言同等的尊重。盡管它的使用率在創(chuàng)業(yè)公司和大型公司中持續(xù)增長(zhǎng),但若非必要,人們不會(huì)認(rèn)為它是一門(mén)有用的語(yǔ)言。大公司的高級(jí)工程師聲稱(chēng)它不是一門(mén)“真正的”編程語(yǔ)言,許多人并不知道除了操作像素外它還能被用于何處。
作為一名JavaScript工程師,我希望更深入地了解公眾對(duì)這門(mén)語(yǔ)言的看法,并觀察這些觀點(diǎn)在現(xiàn)實(shí)中到底有多牢不可破。我發(fā)現(xiàn),一些批評(píng)有失水準(zhǔn),但更多的批評(píng)則是有意義的。
不斷增長(zhǎng)的生態(tài)系統(tǒng)
除了樣式效果外,JavaScript也被越來(lái)越多地應(yīng)用于軟件開(kāi)發(fā),例如后端任務(wù)、Web服務(wù)器以及數(shù)據(jù)處理。Zeit首席執(zhí)行官Guillermo Rauch指出,JavaScript“不是人為設(shè)計(jì)出來(lái)的,它是在進(jìn)化過(guò)程中得到的結(jié)果。它成型很快,起初只關(guān)注一個(gè)很小的目標(biāo),后來(lái)都是市場(chǎng)的力量改造了這門(mén)語(yǔ)言。
Rauch的公司提供一個(gè)僅在瀏覽器和服務(wù)器中使用JavaScript的開(kāi)源Web框架,事實(shí)證明,許多公司都在做同樣的事情。
Rauch的公司提供了一個(gè)僅在瀏覽器和服務(wù)器上使用JavaScript的開(kāi)源Web框架。 事實(shí)證明,許多公司都在做同樣的事情。根據(jù)展示公司技術(shù)棧信息的網(wǎng)站StackShare.io的數(shù)據(jù),在后端語(yǔ)言的選取上,相比Python(4000)或Java(3900),更多公司使用JavaScript(6000)。這個(gè)網(wǎng)站面向的更多是創(chuàng)業(yè)公司,但它從側(cè)面反映出JavaScript是一個(gè)不斷增長(zhǎng)的生態(tài)系統(tǒng)。以下是展示不同公司技術(shù)棧極各自市場(chǎng)份額的維恩圖(數(shù)據(jù)來(lái)自StackShare.io)。
技術(shù)公司后端服務(wù)編程語(yǔ)言剖面圖(市場(chǎng)占有率估值)
再來(lái)看看編程工作的數(shù)據(jù)吧,Indeed.com上的一個(gè)看法告訴我們,在美國(guó),大多數(shù)編程工作都使用Java,但JavaScript并沒(méi)有落后,如下圖所示:
對(duì)JavaScript有正面影響的其他統(tǒng)計(jì)數(shù)據(jù):
在Github上JavaScript開(kāi)源項(xiàng)目的數(shù)量最多(比Java多出50%)。NodeJS被評(píng)為StackOverflow 2017年開(kāi)發(fā)者調(diào)查中最受歡迎的框架。JavaScript是Stack Overflow中最流行的編程語(yǔ)言。對(duì)JavaScript的批評(píng)
我咨詢(xún)過(guò)一位Oracle的朋友,他們的工程師對(duì)JavaScript有什么顧慮。他說(shuō)“由于JavaScript是一門(mén)解釋型無(wú)類(lèi)型語(yǔ)言,對(duì)于系統(tǒng)編程來(lái)說(shuō)它不是一門(mén)理想的編程語(yǔ)言”,這種針對(duì)JavaScript的投訴非常普遍。JavaScript函數(shù)接受任意類(lèi)型的參數(shù),但在Java中,如果參數(shù)不是特定類(lèi)型1就會(huì)引發(fā)錯(cuò)誤。
function doSomething(literallyAnything) { return; }我又咨詢(xún)另外一位在谷歌工作的朋友,他向我指出NodeJS的一些公開(kāi)的>問(wèn)題,他說(shuō),一些錯(cuò)誤雖然微乎其微,但他會(huì)認(rèn)為這個(gè)框架不夠成熟。
Rauch指出,JavaScript的垃圾回收不是最理想的。另一個(gè)批評(píng)是Java和Python更適合數(shù)據(jù)科學(xué)類(lèi)的項(xiàng)目,如機(jī)器學(xué)習(xí)和自然語(yǔ)言處理。這可能與這些語(yǔ)言可用的庫(kù)有關(guān),而非批判JavaScript的內(nèi)在缺陷。學(xué)術(shù)界對(duì)Java和Python的依賴(lài)也助長(zhǎng)了這種論調(diào)。
上述幾位工程師都曾提到,每當(dāng)討論編程語(yǔ)言時(shí),經(jīng)常聽(tīng)到其他工程師貶低JavaScript。大家對(duì)于JavaScript用于后端任務(wù)依然心存疑慮,但是大部分?jǐn)骋馑坪跤峙c語(yǔ)言和生態(tài)系統(tǒng)的現(xiàn)狀無(wú)關(guān)。
JavaScript藝術(shù)的現(xiàn)狀
JavaScript在過(guò)去5年中已經(jīng)走過(guò)很長(zhǎng)一段路,早期JavaScript用例一般像Facebook的“Like”按鈕這樣的功能,每當(dāng)用戶(hù)點(diǎn)擊“Like”圖標(biāo),頁(yè)面不會(huì)刷新,但會(huì)改變頁(yè)面狀態(tài),這種特性只能通過(guò)JavaScript在網(wǎng)絡(luò)上實(shí)現(xiàn)。
開(kāi)發(fā)者幾年前開(kāi)始通過(guò)JavaScript來(lái)制作單頁(yè)面應(yīng)用程序(SPA)。術(shù)語(yǔ)“單頁(yè)”是指在瀏覽器中這些應(yīng)用程序只加載一次代碼,所有后續(xù)視圖都是通過(guò)JavaScript生成的。反對(duì)者認(rèn)為,用戶(hù)需要花很長(zhǎng)時(shí)間才能完成初始下載,在手機(jī)上更是長(zhǎng)達(dá)20-30秒!
在過(guò)去的兩年中,向?yàn)g覽器發(fā)送JavaScript代碼的技術(shù)已得到顯著提高(參見(jiàn):webpack)。這可以解決JavaScript Web應(yīng)用緩慢的加載速度,提升性能并創(chuàng)建更好的用戶(hù)交互體驗(yàn)。這是目前Web開(kāi)發(fā)領(lǐng)域最先進(jìn)的技術(shù)。
伴隨著技術(shù)進(jìn)步,出現(xiàn)了新的JavaScript范式。狀態(tài)管理庫(kù)將計(jì)算機(jī)科學(xué)原理應(yīng)用于用戶(hù)交互,JavaScript工程師的門(mén)檻變得更高。
在這些變化的背景下,對(duì)于早期階段的公司來(lái)說(shuō),使用JavaScript作為后端語(yǔ)言非常有意義,如果您已擁有優(yōu)秀的前端JS攻城師,此舉可以讓它們更輕松地協(xié)作,審核和共享代碼。
盡管JavaScript最初是一門(mén)瀏覽器中的語(yǔ)言,但在計(jì)算機(jī)科學(xué)的各個(gè)方面-Web、移動(dòng)端、物聯(lián)網(wǎng)和后端服務(wù)中,它都變得更加普遍。工程師是明智的,不要因?yàn)樗麄儗?duì)語(yǔ)言過(guò)時(shí)的看法而解雇他們。其實(shí)JavaScript一直是一門(mén)“真正的”編程語(yǔ)言,只是此時(shí)此刻,這種聲明會(huì)比其他任何事情更容易被誤解。
總結(jié)
從這些觀察結(jié)果可以看出,JavaScript已經(jīng)達(dá)到以下這些成為一流編程語(yǔ)言的標(biāo)準(zhǔn):
被創(chuàng)業(yè)公司和大型私營(yíng)公司用作后端服務(wù)框架(NodeJS)有一個(gè)蓬勃發(fā)展的開(kāi)源社區(qū)(在Github上最活躍)作為一門(mén)專(zhuān)業(yè)技能,有大量的招聘需求要求掌握J(rèn)avaScript知識(shí)(Indee.com)最后,一家公司決定貫徹某種技術(shù)方案都是需要妥協(xié)的。我們?cè)?strong>Commandiv這款產(chǎn)品中就同時(shí)使用JavaScript作為前端和后端服務(wù)語(yǔ)言,但這并不適合搜有人,我們這么做決定一部分原因是因?yàn)槲颐词煜avaScript這門(mén)語(yǔ)言。為了在創(chuàng)業(yè)初期快速啟動(dòng),請(qǐng)您使用最趁手的工具。
也就是說(shuō),我認(rèn)為質(zhì)疑JavaScript是否是一種“真正的”編程語(yǔ)言的時(shí)代已經(jīng)過(guò)去,它的旅程遠(yuǎn)沒(méi)有結(jié)束,但是其應(yīng)用率和改進(jìn)速度使我對(duì)其前進(jìn)道路充滿(mǎn)信心。
感謝Alim S. Gafar對(duì)本文進(jìn)行審核。
湯姆·金伯格(Tom Goldenberg)是Commandiv的首席技術(shù)官兼聯(lián)合創(chuàng)始人,Commandiv是一個(gè)人投資平臺(tái)。
附注
盡管該語(yǔ)言不支持靜態(tài)類(lèi)型,但像Facebook和微軟這樣的公司已經(jīng)發(fā)布了添加此功能的庫(kù)(Facebook發(fā)布了Flow,微軟發(fā)布了TypeScript)。