來源:周神的博客 | Rockjins Blog
原文:http://byfat.xxx/if-hemingway-wrote-javascript
在寫第一行代碼很久以前,我就酷愛文學(xué)?,F(xiàn)在,我寫JavaScript,不計其數(shù)。我正在寫一本關(guān)于JavaScript的書。
JavaScript憑啥能吸引那么多文藝青年?說到它有限的語法所具備的表達潛能,我倒是有幾點不成熟的想法,不過那是另外一個話題了。哎,如果那些大作家都喜歡上JavaScript,會咋樣?你說他們會用JavaScript寫出點什么東西來?作為海明威的十足擁躉,我的第一反應(yīng)也是這老爺子不可能喜歡編程序(包括程序員)。話雖如此,我還是愿意相信在對它的各種非議中,其實潛藏著足以打動人心的一點:它是一門很文藝的語言,你說呢?它表面上簡單粗陋、平淡無奇,而實質(zhì)上卻引人入勝、內(nèi)涵十足。
代碼審查之母

前些天,我做了一個夢。夢見我讓海明威還有其他四位作家給我寫點JavaScript,特別是得寫一個能返回指定長度斐波納契數(shù)列的函數(shù)。我發(fā)現(xiàn)這些作家解決問題的方法各有千秋,很有意思。不過確實都寫得不錯,至少都實現(xiàn)了既定的功能(連安德烈·布勒東都寫出來了)。下面就是他們交給我的作業(yè)。
歐內(nèi)斯特·海明威(美國作家)
function fibonacci(size) {
var first = 0, second = 1, next, count = 2, result = [first, second];
if(size < 2)
return "the request was made but it was not good"
while(count++ < size) {
next = first + second;
first = second;
second = next;
result.push(next);
}
return result;
}
毫不奇怪。海明威的代碼非常凝練,沒有浪費一個詞一個變量。代碼沒什么出奇之處,甚至顯得有點迂腐,可這正是海明威作品的長處。沒有煩瑣的邏輯,也沒有花里胡哨的變量名。就那么簡單直白地把活兒干了,干完完事兒。
海明威沒心情跟傻瓜逗悶子,如果你想要的是一個長度小于2的數(shù)列,他根本不睬你:“我累啦,你的問題很白癡?!?/p>
威廉·莎士比亞(英國詩人、作家)
function theSeriesOfFIBONACCI(theSize) {
//a CALCKULATION in two acts.
//employ'ng the humourous logick of JAVA-SCRIPTE
//Dramatis Personae
var theResult; //an ARRAY to contain THE NUMBERS
var theCounter; //a NUMBER, serv'nt to the FOR LOOP
//ACT I: in which a ZERO is added for INITIATION
//[ENTER: theResult]
//Upon the noble list bestow a zero
var theResult = [0];
//ACT II: a LOOP in which the final TWO NUMBERS are QUEREED and SUMM'D
//[ENTER: theCounter]
//Commence at one and venture o'er the numbers
for (theCounter = 1; theCounter < theSize; theCounter++) {
//By divination set adjoining members
theResult[theCounter] = (theResult[theCounter-1]||1) + theResult[Math.max(0, theCounter-2)];
}
//'Tis done, and here's the answer.
return theResult;
//[Exuent]
}
這位文豪啰嗦了點,可也是獨樹一幟了。注意他的注釋(不算場名和臺本),典型的英文抑揚格五音步格律——共十對音節(jié),每音步(兩個音節(jié))的重音都落在第二個音節(jié)上。在他的戲劇中,莎士比亞經(jīng)常會脫離嚴格的抑揚格五音步格律以示強調(diào),比如增加一個音節(jié),或者采用交替重音。在這個編程作業(yè)中,他好像也運用了同樣的技巧。碼如其文。
安德烈·布勒東(Andre Breton,法國詩人和評論家,超現(xiàn)實主義創(chuàng)始人之一)
function Colette(umbrella) {
var staircase = 0, galleons = 0, brigantines = 1, armada = [galleons, brigantines], bassoon;
Array.prototype.embrace = [].push;
while(2 + staircase++ < umbrella) {
bassoon = galleons + brigantines;
armada.embrace(brigantines = (galleons = brigantines, bassoon));
}
return armada;
}
作為超現(xiàn)實主義運動的倡導(dǎo)者,布勒東主張夢想比現(xiàn)實更有趣,應(yīng)該作為創(chuàng)作的出發(fā)點。他的變量命名頗具超現(xiàn)實主義色彩。盡管并非無可挑剔,但他的作品的確幾近完美,真摯又美好。在他有意識的表達中,蘊含著一幅無意識的夢幻圖景??梢园堰@個作業(yè)看成華美詩篇Facteur Cheval的再創(chuàng)作。
布勒東在這個斐波納契函數(shù)中總是喜歡使用老相好的名字,他把結(jié)果想象成了一個史前艦隊。他的方案邏輯優(yōu)雅,巧妙地采用了逗號運算符在galleons、brigantines和bassoons之間同時遷移元素。向安德烈致敬!
羅貝托·波拉尼奧(Roberto Bolano,智利詩人和小說家)
function LeonardoPisanoBigollo(l) {
if(l < 0) {
return "I'd prefer not to respond. (Although several replies occur to me)"
}
/**/
//Everything is getting complicated.
for (var i=2,r=[0,1].slice(0,l);i<l;r.push(r[i-1]+r[i-2]),i++)
/**/
//Here are some other mathematicians. Mostly it's just nonsense.
rationalTheorists = ["Archimedes of Syracuse", "Pierre de Fermat (such margins, boys!)", "Srinivasa Ramanujan", "Rene Descartes", "Leonhard Euler", "Carl Gauss", "Johann Bernoulli", "Jacob Bernoulli", "Aryabhata", "Brahmagupta", "Bhaskara II", "Nilakantha Somayaji", "Omar Khayyám", "Muhammad ibn Mūsā al-Khwārizmī", "Bernhard Riemann", "Gottfried Leibniz", "Andrey Kolmogorov", "Euclid of Alexandria", "Jules Henri Poincaré", "Srinivasa Ramanujan", "Alexander Grothendieck (who could forget?)", "David Hilbert", "Alan Turing", "von Neumann", "Kurt G?del", "Joseph-Louis Lagrange", "Georg Cantor", "William Rowan Hamilton", "Carl Jacobi", "évariste Galois", "Nikolay Lobachevsky", "Rene Descartes", "Joseph Fourier", "Pierre-Simon Laplace", "Alonzo Church", "Nikolay Bogolyubov"]
/**/
//I didn't understand any of this, but here it is anyway.
return r
/**/
//Nothing happens here and if it does I'd rather not talk about it.
}
如果這輩子沒看過波拉尼奧的著作,那你的生命是不完整的。波拉尼奧的作品忽而精于事故,忽而憨態(tài)可掬,讓人嘆為觀止。他的敘事風(fēng)格以毫無懸念的坦誠見長。人類的弱點始終存在,但溫暖幽默地傳達出每一個弱點,卻無不令人沉醉、催人振奮。
一如既往,他的編程作業(yè)也流露出了一種不安、局促和無知。他給出的解答盡管頗顯才情,可總讓人覺得有幾分累贅。偏執(zhí)依舊,跑題依舊,他好像更愿意向我們展示似乎很有意思,但其實毫無用處的天才數(shù)學(xué)家名錄。
以下幾方面也是波拉尼奧的特點,比如長短段并列、忘記加分號(對應(yīng)著他小說中缺失的引號),以及隱含地使用全局變量——暗示每個變量注定會在后續(xù)章節(jié)中再次現(xiàn)身。
查爾斯·狄更斯
function mrFibbowicksNumbers(enormity) {
var assortment = [0,1,1], tally = 3, artfulRatio = 1.61803;
while(tally++ < enormity) {
//here is an exceedingly clever device
assortment.push(Math.round(assortment[tally-2] * artfulRatio));
}
//should there be an overabundance of elements, a remedy need be applied
return assortment.slice(0, enormity);
}
我不是狄更斯的粉絲。我基本同意亨利·詹姆斯(美國著名小說家和批評家)的惡評:
“要是讓我們冒險評價一下他的文學(xué)成就,可以稱他為最膚淺的小說家。沒錯,這么說等于把它歸入了他所處的文學(xué)領(lǐng)域的低等行列,但我們愿意承認這一點。把狄更斯先生歸入最偉大的小說家之列,我們是過意不去的。因為他除了人物角色,并沒有創(chuàng)造其他任何東西。他沒有對我們理解人物角色多給任何資料?!?/p>
——亨利·詹姆斯談查爾斯·狄更斯,評《我們共同的朋友》,1865年12月21日
他的膚淺從他的斐波納契作業(yè)中可見一斑。沒錯,變量名還算中規(guī)中矩,但卻是他無法把握實質(zhì)性內(nèi)容和內(nèi)心理解不到位的表現(xiàn)。他沒有從實質(zhì)上領(lǐng)會斐波納契數(shù)列的含義,倒是一心想通過乘法解決問題。哎。
最終點評
不管是老道(Crockford)的極力維護,還是干巴巴的計算機科學(xué)課,條條框框始終是JavaScript的敵人。有些開發(fā)者喜歡手冊和樣板,結(jié)果就是Java。JavaScript的趣味性源自它天性就不刻板,以及由此生發(fā)的無限可能。自然語言也具有相似的特點。最好的作者和最優(yōu)秀的JavaScript開發(fā)者一定會對這門語言神魂顛倒,沒有一天不在探索和實踐它,從而塑造自己的風(fēng)格、自己的習(xí)慣,還有自己的表達方式。
就這些,希望你喜歡??峙麓蠖际菬o稽之談。