在写第一行代码很久以前,我就酷爱文学。现在,我写JavaScript,不计其数。我正在写一本关于JavaScript的书。
JavaScript凭啥能吸引那么多文艺青年?说到它有限的语法所具备的表达潜能,我倒是有几点不成熟的想法,不过那是另外一个话题了。哎,如果那些大作家都喜欢上JavaScript,会咋样?你说他们会用JavaScript写出点什么东西来?作为海明威的十足拥趸,我的第一反应也是这老爷子不可能喜欢编程序(包括程序员)。话虽如此,我还是愿意相信在对它的各种非议中,其实潜藏着足以打动人心的一点:它是一门很文艺的语言,你说呢?它表面上简单粗陋、平淡无奇,而实质上却引人入胜、内涵十足。
代码审查之母
前些天,我做了一个梦。梦见我让海明威还有其他四位作家给我写点JavaScript,特别是得写一个能返回指定长度斐波纳契数列的函数。我发现这些作家解决问题的方法各有千秋,很有意思。不过确实都写得不错,至少都实现了既定的功能(连安德烈·布勒东都写出来了)。下面就是他们交给我的作业。
欧内斯特·海明威(美国作家)
|
|
毫不奇怪。海明威的代码非常凝练,没有浪费一个词一个变量。代码没什么出奇之处,甚至显得有点迂腐,可这正是海明威作品的长处。没有烦琐的逻辑,也没有花里胡哨的变量名。就那么简单直白地把活儿干了,干完完事儿。
海明威没心情跟傻瓜逗闷子,如果你想要的是一个长度小于2的数列,他根本不睬你:“我累啦,你的问题很白痴。”
威廉·莎士比亚(英国诗人、作家)
|
|
这位文豪啰嗦了点,可也是独树一帜了。注意他的注释(不算场名和台本),典型的英文抑扬格五音步格律——共十对音节,每音步(两个音节)的重音都落在第二个音节上。在他的戏剧中,莎士比亚经常会脱离严格的抑扬格五音步格律以示强调,比如增加一个音节,或者采用交替重音。在这个编程作业中,他好像也运用了同样的技巧。码如其文。
安德烈·布勒东(Andre Breton,法国诗人和评论家,超现实主义创始人之一)
|
|
作为超现实主义运动的倡导者,布勒东主张梦想比现实更有趣,应该作为创作的出发点。他的变量命名颇具超现实主义色彩。尽管并非无可挑剔,但他的作品的确几近完美,真挚又美好。在他有意识的表达中,蕴含着一幅无意识的梦幻图景。可以把这个作业看成华美诗篇Facteur Cheval的再创作。
布勒东在这个斐波纳契函数中总是喜欢使用老相好的名字,他把结果想象成了一个史前舰队。他的方案逻辑优雅,巧妙地采用了逗号运算符在galleons、brigantines和bassoons之间同时迁移元素。向安德烈致敬!
罗贝托·波拉尼奥(Roberto Bolano,智利诗人和小说家)
|
|
如果这辈子没看过波拉尼奥的著作,那你的生命是不完整的。波拉尼奥的作品忽而精于事故,忽而憨态可掬,让人叹为观止。他的叙事风格以毫无悬念的坦诚见长。人类的弱点始终存在,但温暖幽默地传达出每一个弱点,却无不令人沉醉、催人振奋。
一如既往,他的编程作业也流露出了一种不安、局促和无知。他给出的解答尽管颇显才情,可总让人觉得有几分累赘。偏执依旧,跑题依旧,他好像更愿意向我们展示似乎很有意思,但其实毫无用处的天才数学家名录。
以下几方面也是波拉尼奥的特点,比如长短段并列、忘记加分号(对应着他小说中缺失的引号),以及隐含地使用全局变量——暗示每个变量注定会在后续章节中再次现身。
查尔斯·狄更斯
|
|
我不是狄更斯的粉丝。我基本同意亨利·詹姆斯(美国著名小说家和批评家)的恶评:
“要是让我们冒险评价一下他的文学成就,可以称他为最肤浅的小说家。没错,这么说等于把它归入了他所处的文学领域的低等行列,但我们愿意承认这一点。把狄更斯先生归入最伟大的小说家之列,我们是过意不去的。因为他除了人物角色,并没有创造其他任何东西。他没有对我们理解人物角色多给任何资料。”
——亨利·詹姆斯谈查尔斯·狄更斯,评《我们共同的朋友》,1865年12月21日
他的肤浅从他的斐波纳契作业中可见一斑。没错,变量名还算中规中矩,但却是他无法把握实质性内容和内心理解不到位的表现。他没有从实质上领会斐波纳契数列的含义,倒是一心想通过乘法解决问题。哎。
最终点评
不管是老道(Crockford)的极力维护,还是干巴巴的计算机科学课,条条框框始终是JavaScript的敌人。有些开发者喜欢手册和样板,结果就是Java。JavaScript的趣味性源自它天性就不刻板,以及由此生发的无限可能。自然语言也具有相似的特点。最好的作者和最优秀的JavaScript开发者一定会对这门语言神魂颠倒,没有一天不在探索和实践它,从而塑造自己的风格、自己的习惯,还有自己的表达方式。
就这些,希望你喜欢。恐怕大都是无稽之谈。
本文作者:余震(Freak)
本文出处:Rockjins Blog
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN许可协议。转载请注明出处!