Programming and Writing

Salvatore Sanfilippo

编程与写作

一年前,我暂停了自己的编程生涯,开始写一部小说,当时我以为这项新活动与此前的工作截然不同。写下——更常是重写——无数文字之后,我几乎可以确定事实恰恰相反:编写大型系统和写小说有许多共同之处,采用的过程也很相似。

这两项活动最明显的相似之处在于,它们都需要写东西。代码不是用自然语言写成的散文,但它有一套固定规则(语法);某些形式大多数程序员都会觉得很自然,也有一些形式虽然在形式上正确,读起来却很难理解。

不过,这两项活动之间还有更深层的联系:优秀的程序和优秀的小说,都是由运作良好的局部元素与整体元素共同构成的。优秀的代码必须由编写良好、易于阅读的单条语句组成,但从整体上看,程序的不同部分必须彼此正交(orthogonal,正交),设计协调一致,并且交互清晰。优秀的小说同样必须在微观和宏观这两个尺度上都取得成功。句子必须写得好,但整体结构以及各部分之间的关系同样至关重要。

编程和写作之间一个不那么结构性的联系,在于从事其中任何一项时都需要具备的驱动力:想要成功,就必须取得进展;想要取得进展,就必须保持持续性。人们普遍认同,至少目前,程序和小说都不会自己写出来。然而,二十年的代码写作经历极大地帮助了我应对这一点;我知道,只有每天坐下来写,事情才会发生:有一天写一百个字,另一天写两千个字,但很少有哪一天我不在纸面上写下文字。如果你写过并非只是大型系统的“填充物”、而是自己创作出来的代码,那么你也知道,编程中同样会出现 writer block(写作障碍)。唯一的区别在于,对大多数人来说,你是一名工程师,所以如果你不工作,你就是懒惰。而同样的懒惰,落在艺术家身上时,却会被赋予创作过程中某个迷人环节的形态。

差异。

我认为写作和编程之间最明显的区别在于:小说一旦写完、编辑完并最终定稿,基本上就保持不变了。确实有一些作家会在多年后重新回到自己的小说,出版一个修复了 bug 的版本,但这种情况很少见,而且即使发生,也只是一次性的过程。代码会随着时间不断演进,持续面对源源不断的变更,而这些变更往往由多人共同完成。这个简单的事实对这两种过程产生了深远影响:程序员常常认为,一个系统的第一个版本可以相当不完善;毕竟以后还有时间改进。另一方面,作家知道,每部小说自己只有一颗子弹,甚至可以说,写散文在很大程度上就是重写的行为。重写句子、整章内容,以及听起来虚假的对话,有时要重写两遍、三遍,甚至十遍。

在这方面,我认为编程可以从写作中学到一些东西:当编写一个新系统的第一个核心时,当最初的创作者仍然独自一人、与外界隔绝、能够做任何事情时,她应该假装这个初始核心就是自己唯一的一颗子弹。在系统诞生的过程中,她应该一遍又一遍地重写这个原始 kernel(内核),以找到尽可能好的设计。我的假设是,这个初始设计会对之后发生的一切产生巨大影响:从一个结构良好的初始设计出发,让系统有机成长,即使多年后已经远离最初的创作,即使最初的核心只是系统最终规模的一小部分,也会得到更好的系统。

如果你感兴趣,这里快速更新一下我的科幻小说。经过多次自我审阅后,我把手稿发给了我的编辑 Giulio Mozzi(朱利奥·莫齐)。他会在几周后把修改建议发给我。我会根据他的意见开始新一轮审阅,并希望在一两个月内完成小说。然后,我终于可以出版意大利语版本了。与此同时,定稿后的小说也会交给我在美国的译者;等她完成翻译后,英语版本也会出版。这是一段漫长的旅程,但我非常享受其中的过程。