5
我從事軟件開(kāi)發(fā)的相關(guān)工作已經(jīng)有15年了。目前的工作主要集中于Web和移動(dòng)應(yīng)用方面。在這么多年里,我對(duì)JavaScript的態(tài)度可能比較能代表一大群程序員的看法:從一開(kāi)始對(duì)JS的不屑一顧到最后驚奇它的表現(xiàn)和潛力。
曾經(jīng)的JavaScript像玩具一樣
在2000年那會(huì)兒,我也從事過(guò)一段web應(yīng)用開(kāi)發(fā)。開(kāi)發(fā)平臺(tái)是Windows,主要使用Asp。那個(gè)時(shí)候的JavaScript主要用途是檢驗(yàn)頁(yè)面輸入數(shù)據(jù)是否正確。錯(cuò)誤的時(shí)候,會(huì)彈出個(gè)警告窗口。當(dāng)時(shí)整個(gè)Web開(kāi)發(fā)、應(yīng)用環(huán)境,實(shí)際上都是十分簡(jiǎn)陋的。Web開(kāi)發(fā)者看待JavaScript估計(jì)就如同玩具一般。因?yàn)樗茏龅恼娴氖鞘钟邢?。如果你能找?000年時(shí)候的有關(guān)JS的IT圖書(shū),內(nèi)容多半大同小異,充斥著告訴你怎么用JS做個(gè)什么跑馬燈,怎么制造煩死人的彈窗,如此這般。這些內(nèi)容也進(jìn)一步抑制了大家對(duì)js的期望。
后來(lái),我轉(zhuǎn)向C/C++,因?yàn)椤罢嬲某绦騿T使用C++”。這一轉(zhuǎn)身就是很多年,我對(duì)JS的印象,也就止于那點(diǎn)功用了。
這幾年,因?yàn)榉N種變化,我又轉(zhuǎn)回來(lái)了。這個(gè)時(shí)候再回顧Web開(kāi)發(fā),已經(jīng)可以用天翻地覆來(lái)形容。相關(guān)的概念層出不窮,發(fā)展出的各種技術(shù)、工具,五花八門(mén),讓人眼花繚亂。而且更要命的是,這些知識(shí)除了基礎(chǔ)的幾類(lèi),大部分都十分的不穩(wěn)定,并且在這種不穩(wěn)定的情況下迅速發(fā)展,以瘋狂的速度淘汰更新。今天還在用的工具,可能明天就有更新、更好的了。
為什么會(huì)這樣?因?yàn)樯鐣?huì)需要的熱點(diǎn)在這里:需求推動(dòng)。這個(gè)社會(huì)的生活、生產(chǎn),逐漸轉(zhuǎn)移到了網(wǎng)站上、移動(dòng)端,這就是這些領(lǐng)域快速發(fā)展進(jìn)步的主因。
這個(gè)時(shí)候再回頭看當(dāng)年的玩具語(yǔ)言:JavaScript,也早已今非昔比。
它已經(jīng)成長(zhǎng)為網(wǎng)絡(luò)時(shí)代不可或缺的前端頂梁柱?,F(xiàn)在已經(jīng)不可想象沒(méi)有JS的網(wǎng)站是否還能正常運(yùn)行。不僅如此,它的觸角居然還深入到了后端服務(wù),Node.js方興未艾。一些新一代的產(chǎn)品,如MongoDB,甚至內(nèi)置了JS語(yǔ)言支持,作為應(yīng)用交互的工具。
這是很多人都無(wú)法想象到的情景,包括我在內(nèi)。對(duì)此,我不得不回過(guò)頭看一下,思考JavaScript為什么會(huì)擁有現(xiàn)在的地位。
冥冥之中注定的語(yǔ)言
JavaScript的總體設(shè)計(jì)有亮點(diǎn),但問(wèn)題也很多。它是作者在10天內(nèi)設(shè)計(jì)出來(lái)的。因?yàn)闀r(shí)間倉(cāng)促,很多細(xì)節(jié)未及推敲、深思熟慮就推上了市場(chǎng),以至于充斥了漏洞、糟粕。Douglas Crockford在《JavaScript語(yǔ)言精粹》(英文名《JavaScript:The Good Parts》)里面提到:“Javascript中糟粕的比重超出了預(yù)期。”(注:Douglas Crockford,JavaScript開(kāi)發(fā)社區(qū)最知名的權(quán)威,是JSON、JSLint、JSMin和ADSafe之父,著有《JavaScript: The Good Parts》。)
連Brendan Eich(JavaScript的創(chuàng)造者)自己都說(shuō):"與其說(shuō)我愛(ài)它,不如說(shuō)我恨它。它是C語(yǔ)言和Self語(yǔ)言一夜情的產(chǎn)物。十八世紀(jì)英國(guó)文學(xué)家約翰遜博士說(shuō)得好:'它的優(yōu)秀之處并非原創(chuàng),它的原創(chuàng)之處并不優(yōu)秀。'(the part that is good is not original, and the part that is original is not good.)"
但是,似乎是在冥冥之中注定,JavaScript在一開(kāi)始就抓到了未來(lái)編程語(yǔ)言的方向:函數(shù)式編程。
“JavaScript設(shè)計(jì)的最出色的就是它的函數(shù)的實(shí)現(xiàn)。它近乎接近于完美。...... 函數(shù)在javascript中是頂級(jí)對(duì)象,它是第一個(gè)成為主流的Lambada語(yǔ)言,它是披著C外衣的Lisp。”
—— Douglas Crockford
讀過(guò)《黑客與畫(huà)家:硅谷創(chuàng)業(yè)之父Paul Graham文集》(主要介紹黑客即優(yōu)秀程序員的愛(ài)好和動(dòng)機(jī),討論黑客成長(zhǎng)、黑客對(duì)世界的貢獻(xiàn)以及編程語(yǔ)言和黑客工作方法等話(huà)題)的人,都會(huì)記得作者的預(yù)言:Lisp才是語(yǔ)言的終極趨向。(注:LISP源自列表處理LISt Processing的縮寫(xiě),由來(lái)自麻省理工學(xué)院的人工智能研究先驅(qū)John McCarthy在1958年基于λ演算所創(chuàng)造,是一種通用高級(jí)計(jì)算機(jī)程序語(yǔ)言,長(zhǎng)期以來(lái)壟斷人工智能領(lǐng)域的應(yīng)用,也是第一個(gè)函數(shù)式程序設(shè)計(jì)語(yǔ)言。)
硅谷創(chuàng)業(yè)之父Paul Graham
函數(shù)式編程的流行之勢(shì)
函數(shù)式編程并不是新發(fā)明,它的歷史甚至比一些主流語(yǔ)言還早。因?yàn)樾阅芎蛯?shí)現(xiàn)等問(wèn)題,一直飽受冷落。而如今,計(jì)算機(jī)的硬件性能大大提高,改變了很多事物。原本不夠經(jīng)濟(jì)的,變得可行;原本不夠好的,在新條件下變得不錯(cuò)。鑒于函數(shù)式編程的優(yōu)良特性和強(qiáng)大能力,它的流行其實(shí)并不意外。“過(guò)程化->面向?qū)ο?>函數(shù)式”的應(yīng)用開(kāi)發(fā)范型發(fā)展趨勢(shì)是可以預(yù)見(jiàn)的。
這些年,腳本語(yǔ)言大行其道,使用Python/Ruby/PHP代替原本靜態(tài)語(yǔ)言開(kāi)發(fā)的應(yīng)用比比皆是,傳統(tǒng)的C/C++應(yīng)用開(kāi)始逐漸縮減到桌面應(yīng)用、高性能服務(wù)器應(yīng)用、驅(qū)動(dòng)、系統(tǒng)接口等領(lǐng)域。因?yàn)榇蟛糠值膽?yīng)用的性能已經(jīng)不是問(wèn)題,CPU相對(duì)過(guò)剩,I/O、網(wǎng)速才是瓶頸,因?yàn)槿藗兛偸歉匾曢_(kāi)發(fā)效率。而JavaScript因?yàn)橐婚_(kāi)始就有這樣的設(shè)計(jì)能力,把握住了技術(shù)的先機(jī),緊隨了這股浪潮。
當(dāng)然,運(yùn)氣也不可或缺。世界上的編程語(yǔ)言至少也有個(gè)幾百種。一種語(yǔ)言想獲得認(rèn)可并得到流行,光有好的技術(shù)設(shè)計(jì)是不夠的,它還需要位置乃至契機(jī)。
編程語(yǔ)言要找到適合自己應(yīng)用的領(lǐng)域,深深的扎下根來(lái),并以此為基地,向外伸展。這個(gè)時(shí)間,有時(shí)候需要20年以上。比如PHP專(zhuān)注于Web開(kāi)發(fā),C對(duì)于系統(tǒng)開(kāi)發(fā)不可缺少,Python在科學(xué)計(jì)算、網(wǎng)絡(luò)編程有諸多應(yīng)用。
在2004年,JavaScript就得到了一次契機(jī):Google推出了使用Ajax技術(shù)的Gmail郵箱,那堪比桌面的無(wú)刷體驗(yàn),引發(fā)了業(yè)界轟動(dòng)和模仿浪潮。而Ajax的操作核心就是JavaScript。此后,JS在瀏覽器中的地位變得十分穩(wěn)固,已經(jīng)成了事實(shí)標(biāo)準(zhǔn)。在2009年,基于Google強(qiáng)大V8 JS引擎的Node.js出現(xiàn)了,它意味著JS向其它領(lǐng)域開(kāi)始進(jìn)軍,發(fā)揮它的語(yǔ)言威力。微軟當(dāng)年也宣稱(chēng)在服務(wù)器端可以?xún)?nèi)置支持JavaScript,不過(guò)這完全不可比。
網(wǎng)絡(luò)時(shí)代的需要,JavaScript捷足先登。瀏覽器一開(kāi)始就綁定了JS腳本技術(shù),這讓它取得先發(fā)優(yōu)勢(shì)。當(dāng)年的瀏覽器大戰(zhàn)后,微軟的瀏覽器占據(jù)統(tǒng)治地位,IE里面是可以編寫(xiě)vbscript的,但微軟在網(wǎng)絡(luò)時(shí)代的停滯不前,讓他丟失了很多機(jī)會(huì)。
由于網(wǎng)絡(luò)帶來(lái)的低成本信息交互以及更低的開(kāi)發(fā)、部署成本,越來(lái)越多的產(chǎn)品基于瀏覽器做為界面。JS在應(yīng)用開(kāi)發(fā)上當(dāng)仁不讓。業(yè)界出于需求,制定了幾版相關(guān)的技術(shù)標(biāo)準(zhǔn),比如HTML、CSS、JS便都有了自己的位置和開(kāi)發(fā)標(biāo)準(zhǔn)規(guī)范,它們相互緊密協(xié)作,融為一體。Web應(yīng)用開(kāi)始侵蝕以往的桌面應(yīng)用。
時(shí)間證明了JavaScript的價(jià)值,它并沒(méi)有被淹沒(méi)在歷史的發(fā)展里。只要應(yīng)用領(lǐng)域有足夠的渴求,原本有很多不足的東西也會(huì)獲得強(qiáng)大的推動(dòng)力,把它改造的更好。
Brendan Eich在今年年5月份做了一個(gè)PPT,回顧了JS語(yǔ)言的創(chuàng)造過(guò)程和這20年的發(fā)展、前景。(觀看地址:http://brendaneich.github.io/ModernWeb.tw-2015/ )
那么我也借用他的話(huà)來(lái)結(jié)尾吧:
My advice:always bet on JS.
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。