倔强、天赋与让人开怀 《程序员》:你开始编程的原因是什么,为何将此作为事业? Larry Wall:从某种意义上看,计算机仍是前沿,就像狂野的美国西部,在那里,牛仔或农夫在荒野中闯荡,在一片新土地上卓有成效地开始生活,帮助周围的人,开辟新天地。不过想把这些事儿做好,得善于解决问题。 我喜欢解决难题,因为我倔强又执着。对许多职业来说,倔强的性格比聪明的头脑更重要,计算机编程会回报那些倔强的人,即使万事开头难。 另外,我觉得我有这方面的天赋,而我受到的教育是“随天赋而来的是责任”——天赋越大责任就越大。这是从上几辈人那里传承而来的生活方式,我以此为准则,并把它传给下一代。 但这不仅仅与挑战或责任有关。在内心深处,编程带给我喜悦,让我由衷地欢笑。我将编程视为一种挥发创意的方式,像艺术家那样。我的朋友、《计算机程序设计艺术》作者Knuth同样认为编程既是科学也是艺术(你从书名就能看出)。有的艺术家使用油彩或黏土,而我凭借的则是计算机、语言,以及使用计算机语言的人组成的社区。这就是我的艺术媒介。 《程序员》:你提到了“天赋”。在你看来,编程的能力更多是与生俱来的,还是后天学习更重要? Larry Wall:其实很多人并不觉得我那么有天赋。有人把我早期的代码作为过于精巧以至难于理解的范例。有时明明是将不同的关注点隔离开更好,我却总在同一段代码中做太多事情。年轻时的我,倾向牺牲可读性来换取速度。 我擅长什么呢?我善于发现不明确的东西。我知道什么时候一件事可通过多种方法完成,或至少我会察觉自己的做法不见得是唯一方法或最佳方法。实际上,之所以我还算一名不错的语言设计者,部分原因正在于此,因为我意识到了取舍在所难免,完美的语言并不存在。 我所做的事既需要先天能力又需要训练。先天能力之一就是认清自己的未知领域,不要装懂。再多的训练都不能代替这种能力,明晰已知与未知的关联——有时你以为尽在掌握,有时你以为一无所知,但实际情况并不如你所见这么简单。 所以这跟做具体的事情来提高自己关联并不大。开车时,我总在想怎样开得更好,这种求知欲不像开关那般说开就开,说关就关。学习无处不在,无时不在。 《程序员》:你生活的追求是什么?希望达成怎样的目标? Larry Wall:我的目标永远是让人开怀,不管用什么方法。 开心好,让别人开心更好,教别人学会让别人开心还要好。然后,教别人学会教别人学会让别人开心…… 让别人开心,最好的方式之一就是授人以创新的手段,提供新的游戏、新的题目,介绍新的朋友来交流,新的场所来娱乐,新的世界去探索并演绎新故事。创造一种编程语言很像创造一个奇幻世界,人们可以享受它的乐趣并将它继续延伸。创新其乐无穷,最能使人开怀。 《程序员》:对你影响最大的人和书分别是什么? Larry Wall:我是一名基督徒,因此必须回答耶稣和《圣经》。 就个人而言,我从事计算机和语言学全都缘于我的朋友Gary Simons。他比我大几岁,大学时是学院里的主程序员,毕业时,学院让他找个人接替这一职位,他便选了我。后来他成为语言学者(如今他在国际语言暑期学院,负责民族语系,关于世界上到底有多少种人类语言,他可能是最权威的专家)。 我也从其他书籍和作者那里学会了如何生活与思考。年轻时我非常喜欢John Bunyan的《天路历程》和Jules Verne的《神秘岛》。年长之后喜欢Tolkien的《指环王》。非小说类喜欢Umberto Eco的《The Search for the Perfect Language》。 语言学家谈语言《程序员》:如果作个比喻,你觉得自然语言(相对于数学或建筑)更贴近编程语言吗?如果不是,我们在谈论编程语言和自然语言的关系时,有什么需要特别注意的吗? Larry Wall:太有趣了,我刚提到Umberto Eco的书就是关于你的这个问题。他认为完美语言不可能存在,因为完美的语言不适合用于沟通。自然语言太过复杂,不适合做任何东西的完美比喻。通常,最好的比喻就是最简单的比喻,同时也是不完美的。 甚至可以说比喻必须不完美,否则就不是比喻了。比喻的全部意义在于说一件事指另一件事,依赖听者的智力取走上下文中成立的部分,忽略不成立的部分。 我想有人会声称人类语言在处理近似方面远胜数学和建筑,尽管数学能够描述近似,而建筑学家一直都在近似——只要大楼别倒下就行。 然而,数学和建筑学的目标跟语言很不一样。数学和建筑意在构造坚实不倒之物,沟通和艺术只是其次要目标。而对语言来说,沟通是首要目标,构筑经得起时间检验的东西却是次要的,除非你是诗人、小说家或剧作家。 因此,计算机语言实际是介于二者之间的,一方面,你不想程序失败;另一方面,程序又承担着困难的任务——同时与两种截然不同的听众沟通。程序必须与机算机沟通,又不得不与其他程序员沟通,最好两者都不要困惑。 《程序员》:有一种观点,编程语言就像物种,会形成进化树,有的分支会死掉。你认为Perl处在什么位置?多年之后,你觉得语言会演化成什么样子?哪些特性会繁荣,又有哪些会枯萎? Larry Wall:这好比讨论未来哪种基因会繁荣,答案是不可知的。我们知道的是,有的语言专长于一个小生态位而获得了成功。类似于吃竹子的熊猫,PHP“吃”初级用户设计的网页,而且只要这个Web编程的生态位存在,它就可能继续成功下去。竹子没有了,熊猫也就没有了。但在地球的历史上,最成功的机体大多是通才,而不是专才。鸟类当中,企鹅更像专才,只在一个地方生活,而乌鸦却遍布世界,因为它们几乎能生长在任何地方并找到食物,此外它们还非常聪明。这也是我们为Perl 6设置的目标。 在“The Hundred-Year Language”一文中,Paul Graham说得很好:我们无法知道一种延续了100年的语言到那时会是什么样子,但我们确定,它将从一种可演化的、能在一百年间满足新需求的语言起步。Perl 6的设计秉持了这种可进化性的理念,那些最严格的规则多数都刻意保持语言对新需要的适配(严格的一遍解析和自时序语法便是两个例子)。当前的设计就大量使用了从内部派生新语言的方法,处理诸如引号和模式匹配等次级语言,针对外部意图派生新语言也是一回事。 至于Perl 5会不会很快消失,我想指出的是,细菌、鱼类、蠕虫和各种简单的古生物依然遍布世界,尽管更复杂、更聪明的生命体已演化出来(至少我们自认为自己更聪明,可有时我并不十分确定)。 《程序员》:跟刚起步时相比,你在编程观念上最大的变化是什么? Larry Wall:开始时,业内的程序设计几乎全是命令式和过程式的,甚至用所谓的高级语言也是一样。我们花费大量的时间告诉计算机按何种次序做事,即使那些事情不一定非要按序执行。为此,优化器必须格外努力地工作,弄清楚哪些地方我们把次序定得过于死板,从而重新排列代码,让程序运行得更快。 如今我写的程序少了些命令式,多了几分声明式。我更愿意找到一种方法,告诉计算机我期望发生的事情,让计算机自己确定事件的次序。不同人类语言之间的主要区别并不在于你能说什么,而在于你必须说什么。例如在英语中,你总要说清事物是单数还是复数,而汉语中却不需要。同样,什么事情是我不应该告诉计算机的?我的语言是否允许我不说?这方面我想了很多。 举个例子,并行编程时,我尽量不写显式的循环,因为显式循环隐含着次序。Perl 6中我们有用于声明无须关心次序的并行机制。 有时,为了模拟现实,我们关心状态信息的位置,为此我们使用OO把那些状态隔离成对象。“有状态的对象”即是管理对不断发生的副作用。 也有时,我们想做数学式的思考,完全不想讨论计算的状态,为此我们使用FP(函数式编程)范式,而不是OO,来把计算的状态隐藏在调用栈和持续的运算中。我们使用函数和其他抽象来隐藏副作用,从而不必考虑它们。与OO不同的是,FP把副作用藏在对象之外,而不是对象之内。 |