深入理解Atwood定律
在Jeff Atwood發(fā)表于2007年的這篇博客里,他提出了著名的“Atwood定律”,即”任何能夠用JavaScript實(shí)現(xiàn)的應(yīng)用系統(tǒng),最終都必將用JavaScript實(shí)現(xiàn)。“ (Any application that can be written in JavaScript, will eventually be written in JavaScript.)那么,這位大牛為何如此推崇JavaScript呢?如何真正理解他提出的這個(gè)定律?這就必須完整地看懂他的博文才行。以下是本人在學(xué)習(xí)過(guò)程中閱讀的主要內(nèi)容摘要:
在他的這篇博文中,他首先提到了另外一位更重量級(jí)的大神,互聯(lián)網(wǎng)之父Tim Berners-Lee 在他的著作 《最小功效原則》中的一段話(huà):
“在過(guò)去的40年中,計(jì)算機(jī)科學(xué)一直在開(kāi)發(fā)盡可能功能強(qiáng)大的語(yǔ)言?,F(xiàn)在我們必須領(lǐng)會(huì)這樣的道理:要選擇功能最不強(qiáng)的解決方案而不是***的。語(yǔ)言的功效越小,對(duì)于儲(chǔ)存在該語(yǔ)言中的數(shù)據(jù)你能做的事情就越多。如果你把程序?qū)懗珊?jiǎn)單的描述性形式,任何人都可以編寫(xiě)一個(gè)程序來(lái)分析它。比如,如果一個(gè)包含了天氣數(shù)據(jù)的網(wǎng)頁(yè),里面使用RDF 格式來(lái)描述這些數(shù)據(jù),用戶(hù)就可以把它當(dāng)做一個(gè)表格來(lái)查找,也許求它的平均值,或者用它繪圖,或把它和其他信息結(jié)合在一起進(jìn)行推理分析。另一個(gè)極端情況是,這些天氣信息是用漂亮的Java applet描繪出來(lái)的。雖然這樣可能做出很酷的用戶(hù)界面,但它完全無(wú)法用于分析。找到這個(gè)頁(yè)面的搜索引擎會(huì)壓根不知道這些數(shù)據(jù)是什么或者是干什么用的。唯一能發(fā)現(xiàn)Java applet的含義的方式就是讓它在一個(gè)人面前運(yùn)行起來(lái)。”
說(shuō)實(shí)話(huà),本人看完這一段有些困惑:JavaScript和Java、PHP這些語(yǔ)言相比,對(duì)于搜索引擎對(duì)數(shù)據(jù)進(jìn)行提取和分析方面并不見(jiàn)得有什么本質(zhì) 的優(yōu)勢(shì)嘛。想了半天還是似懂非懂:這篇文章寫(xiě)于1998年,當(dāng)時(shí)還沒(méi)有Web 2.0的概念,網(wǎng)站的功能主要是發(fā)布公開(kāi)訪(fǎng)問(wèn)的內(nèi)容,Java applet都算是“很酷”的用戶(hù)界面了,所以從邏輯上Berners-Lee 關(guān) 注搜索引擎的自動(dòng)分析是自然的,而且他的例子里并沒(méi)有推崇JavaScript,舉的例子是更為描述性的語(yǔ)言,比如HTML,對(duì)于數(shù)據(jù)提取的確有其優(yōu)勢(shì), 而JavaScript當(dāng)時(shí)作為純前端頁(yè)面效果的語(yǔ)言,只是配合HTML使用。但是隨著Facebook這樣的Web 2.0平臺(tái)出現(xiàn),用戶(hù)貢獻(xiàn)的內(nèi)容成為互聯(lián)網(wǎng)信息的主要來(lái)源,很多動(dòng)態(tài)數(shù)據(jù)已經(jīng)無(wú)法被搜索引擎自動(dòng)搜索到,他的上述分析似乎就有點(diǎn)過(guò)時(shí)了?也許是因?yàn)槲艺J(rèn)識(shí) 的高度不夠吧。不管怎么樣,他的文章中對(duì)于編程語(yǔ)言選擇的最小效能原則依然是成立的,這也是Atwood提出其定律的理論基礎(chǔ)。
Jeff Atwood在博客中引用完上述文章后說(shuō):“這個(gè)思想后來(lái)被編入了正式的W3C文檔,最小功效規(guī)則。我提出了一個(gè)這個(gè)規(guī)則的推論,它是程序員文化最近的流行元素 之一,我稱(chēng)之為Atwood定律:任何能夠用JavaScript實(shí)現(xiàn)的應(yīng)用系統(tǒng),最終都必將用JavaScript實(shí)現(xiàn)。”
為了理解這段邏輯,就需要再閱讀這篇W3C文檔。 它比較了從最基本的描述性語(yǔ)言(例如HTML和結(jié)構(gòu)化數(shù)據(jù)庫(kù))到一些圖靈完備語(yǔ)言(如C和JavaScript)等在自動(dòng)分析數(shù)據(jù)難易程度的不同,然后分 析說(shuō):“在發(fā)布信息的時(shí)候,有很多關(guān)于語(yǔ)言功效和復(fù)雜度的維度需要考慮。比如,語(yǔ)法簡(jiǎn)單明了的語(yǔ)言會(huì)比語(yǔ)法結(jié)構(gòu)復(fù)雜的語(yǔ)言更易于分析。如果一種語(yǔ)言把簡(jiǎn)單 計(jì)算包裝在不必要的機(jī)制(比如對(duì)象創(chuàng)建或者線(xiàn)程管理)中,也會(huì)類(lèi)似地阻礙信息提取。” 此外文章還提出了輕量級(jí)語(yǔ)言開(kāi)發(fā)的功能更穩(wěn)定可靠:既然用它編寫(xiě)的代碼更易于分析,也就更容易發(fā)現(xiàn)其中容易出錯(cuò)的地方。***文章提出了一個(gè)實(shí)踐原則:“在所有適合于在互聯(lián)網(wǎng)上表達(dá)信息、約束條件或程序邏輯的編程語(yǔ)言中,選擇功能最不強(qiáng)的一個(gè)來(lái)使用。”
好了,看到這里意思基本上清楚了,語(yǔ)言的語(yǔ)法結(jié)構(gòu)越簡(jiǎn)單,數(shù)據(jù)提取和分析就越容易,對(duì)于開(kāi)發(fā)互聯(lián)網(wǎng)應(yīng)用就越理想。如果對(duì)象創(chuàng)建和線(xiàn)程管理都是“不必 要的機(jī)制”,那么作為一種基于原型而不是類(lèi)的面向?qū)ο蟮恼Z(yǔ)言,JavaScript就是***的:它沒(méi)有類(lèi)的概念,但所有東西都是對(duì)象,無(wú)需創(chuàng)建過(guò)程就能存 在,而且它是單線(xiàn)程的。同時(shí),JavaScript也走向了后端,Node.js之類(lèi)的框架和MongoDB之類(lèi)的NoSQL數(shù)據(jù)庫(kù)讓W(xué)eb開(kāi)發(fā)實(shí)現(xiàn)了 JavaScript的前后端通吃。
這應(yīng)該就是Jeff Atwood定律的由來(lái):JavaScript既能獨(dú)立完成所有互聯(lián)網(wǎng)應(yīng)用所需的功能開(kāi)發(fā),同時(shí)又是主流編程語(yǔ)言中最為輕量級(jí)的。我想,這個(gè)邏輯應(yīng)該就是 Atwood認(rèn)為JavaScript將成為統(tǒng)治未來(lái)互聯(lián)網(wǎng)世界的編程語(yǔ)言的根據(jù)吧。另外我覺(jué)得還有一個(gè)很重要的事實(shí),那就是JavaScript已經(jīng)獲 得了所有瀏覽器的支持,幾乎所有的網(wǎng)站都已經(jīng)在使用它,再加上JSON標(biāo)準(zhǔn),相比其他語(yǔ)言,它已經(jīng)占據(jù)了有利地形。
他在這篇博客的***還說(shuō):”如果你喜歡那篇文章,我推薦你再看《Berners-Lee的架構(gòu)和哲學(xué)精髓》網(wǎng)頁(yè)中的其他部分。雖然里面的內(nèi)容對(duì)于互聯(lián)網(wǎng)時(shí)代是比較老了,里面只有兩篇是去年寫(xiě)的,但它還是包含了發(fā)明互聯(lián)網(wǎng)的那個(gè)家伙的一些教誨和洞見(jiàn),它們經(jīng)歷了時(shí)間的考驗(yàn)卻仍然閃著金光。”
***我必須感慨一下:大牛的一些名言聽(tīng)起來(lái)似是而非,不經(jīng)過(guò)細(xì)致的閱讀是很難真正理解其邏輯的,而且即使細(xì)致閱讀了,可能因?yàn)樗季S方式和實(shí)踐機(jī)會(huì)的 限制,完全理解其精髓也是很難的,在這樣低的基礎(chǔ)上再想有什么創(chuàng)新就更難了。這大概也是中關(guān)村的挨踢水平遠(yuǎn)遠(yuǎn)低于硅谷,中國(guó)的互聯(lián)網(wǎng)公司大都只能依賴(lài)山寨 的方式生存的原因吧。