编程之美
作者:林纳斯·托瓦兹(Linux 创始人),《只是为了好玩》一书中的章节节选。
----------------------------------
我不知道该如何真正解释我对编程的痴迷,但我会尽力一试。对于从事编程的人来说,这是世界上最有趣的事情。它是一场比国际象棋复杂得多的游戏,在这场游戏中,你可以自己制定规则,而最终结果完全取决于你的创造。
然而,对于外行来说,它看起来却是地球上最无聊的事情。
编程最初的兴奋感,有一部分是很容易解释的:那就是当你告诉计算机去做某件事时,它就会去做。精确无误地执行。永远如此。毫无怨言。
这一点本身就很有趣。
但是,单纯的盲目服从,虽然一开始很吸引人,但显然不能成为一个讨人喜欢的伙伴。编程之所以如此引人入胜,是因为,虽然你能让计算机做你想做的事,但你必须想办法如何实现它。
我个人确信,计算机科学与物理学有很多共同之处。两者都关乎世界在相当基础的层面是如何运作的。当然,区别在于,物理学需要你弄清楚世界是如何构成的,而在计算机科学中,你则创造了世界。在计算机的范畴内,你就是创造者。你最终能够控制发生的一切。如果你足够优秀,你就能成为上帝。在一个小范围内。
我这么说,可能已经得罪了地球上大约一半的人口。
但事实如此。你可以创造自己的世界,唯一能限制你的是机器的能力,以及——如今越来越常见的——你自身的能力。
想象一下树屋。你可以建造一个功能齐全、有活板门并且结构稳固的树屋。但所有人都知道,一间仅仅是建造得很坚固的树屋,和一间美观的、创造性地利用了树木本身特点的树屋,两者之间是有区别的。这关乎艺术与工程的结合。这也是编程能够如此迷人并带来回报的原因之一。功能性常常是次要的,趣味性、美观性或震撼性才是重点。
这是一种创造力的实践。
当初吸引我进入编程世界的,正是探索计算机工作原理的过程。我最大的乐趣之一,是发现计算机就像数学一样:你可以创造一个拥有自己规则的世界。在物理学中,你受限于既有规则。但在数学中,就像在编程中一样,任何事情只要能自洽,都是可行的。数学不必受任何外部逻辑的约束,但它本身必须是合乎逻辑的。任何数学家都知道,你完全可以建立一套数学方程组,其中 3+3=2。事实上,你可以做任何你想做的事,但随着复杂性的增加,你必须小心,不要创造出在你所构建的世界里自相矛盾的东西。那个世界要想变得优美,就不能包含任何瑕疵。编程就是这样运作的。
人们之所以如此迷恋计算机,原因之一是它能让你体验自己创造的新世界,并探索什么是可能的。在数学中,你可以进行关于“可能性”的脑力体操。例如,大多数人想到几何时,他们想到的是欧几里得几何。但计算机帮助人们将不同的几何形态可视化,那些完全非欧几里得的几何形态。有了计算机,你可以将这些虚构的世界变为现实,亲眼看看它们的样子。还记得曼德博集合吗?——那些基于伯努瓦·曼德博方程组的分形图像。这些图像是一个纯粹数学世界的视觉呈现,在计算机出现之前是绝无可能被看到的。曼德博只是为这个不存在的、与现实毫无关联的世界设定了任意的规则,但结果却创造出了令人着迷的图案。借助计算机和编程,你可以构建新的世界,有时那些图案真的美不胜收。
当然,大多数时候你并不会做那样的事。你只是在编写一个程序来完成某个特定任务。在这种情况下,你不是在创造一个新世界,而是在计算机的世界里解决一个问题。这个问题需要通过思考来解决。而只有特定类型的人才能坐在屏幕前,静静地把事情想通。只有像我这样又呆又怪的“极客”才能做到。
操作系统是一台机器上所有其他程序运行的基础。创造一个操作系统是终极的挑战。当你创造一个操作系统时,你是在为所有运行于这台计算机上的程序创造它们所生存的世界——基本上,你在制定规则,规定什么是可接受的、可以做的,以及什么是不可以做的。每个程序都在做类似的事,但操作系统是最基础的。这就像是在为你创造的国度制定宪法,而所有在计算机上运行的其他程序都只是普通法律。
有时这些法则并不合理。但“合理”正是你为之奋斗的目标。你希望能够审视自己的解决方案,并意识到你用正确的方式得出了正确的答案。
还记得学校里那个总能答对题的人吗?他/她解题的速度比所有人都快得多,并且之所以能做到,是因为他/她并没有刻意去“解题”。那个人没有去学习题目“应该”怎么做,而是用正确的方式去思考了问题本身。一旦你听到答案,就会觉得豁然开朗,理应如此。
计算机领域也是如此。你可以用暴力破解法,那种愚蠢地、不断消磨问题直到它不再是问题的方法;或者,你也可以找到正确的方法,然后问题会突然迎刃而解。你从另一个角度看待问题,然后你便会顿悟:它之所以成为一个问题,仅仅是因为你看待它的方式错了。
关于这一点,最伟大的例子或许并非来自计算机领域,而是来自数学。据说,伟大的德国数学家卡尔·弗里德里希·高斯上学时,他的老师感到很无聊,于是为了让学生们有事可做,便让他们把从 1 到 100 所有的数字加起来。老师以为这会花掉孩子们一整天的时间。但这位崭露头角的数学家五分钟后就带着正确答案回来了:5050。解决方法并不是真的把所有数字一个个加起来,因为那既令人沮丧又愚蠢。他发现的是,1 加上 100 等于 101。接着 2 加上 99 也等于 101。然后 3 加上 98 还是 101。以此类推,50 加上 51 等于 101。在几秒钟内,他注意到这就是 50 对 101,所以答案是 5050。
这个故事的真实性或许有待商榷,但其要点是明确的:一个伟大的数学家不会用漫长而乏味的方式去解决问题,因为他能看透问题背后的真正模式,并应用该模式以一种更优越的方式找到答案。这一点在计算机科学中也绝对适用。当然,你可以直接写一个程序来计算总和。在今天的计算机上,这轻而易举。但一个伟大的程序员会仅仅通过巧妙的思考就知道答案。他会懂得如何编写一个优美的程序,以一种全新的、并最终被证明是正确的方式来解决问题。
为了一件事苦思冥想三天,却仍然不知道如何用更好、更优美的方式解决它,这种经历中究竟有什么魅力,依然很难解释清楚。但一旦你找到了那种方式,那便是世界上最棒的感觉。