The Beauty of Programming

有些人对编程有着极大的热情,写出来的代码也非常优秀,创造了操作系统、语言、工具、软件。然而有更多的程序员没有那么优秀,至少没有他们认为的那么优秀,我就是其中之一。我错误的认为不停学习编程语言、不停读各种编程书就可以成为编程的高手,事实上我并没有成为这样的人也没有读那么多编程书。这个过程一点也不快乐,甚至是痛苦,我深知自己并没有领悟编程的真谛,我用错误的方式来这件事情。

Linus Torvalds 写的 The Beauty of Programming 尝试去解释编程有趣在什么地方,而我看到学习编程的另一种方法。

“It’s a game much more involved than chess, a game where you can make up your own rules and where the end result is whatever you can make of it.” 编程是一种比象棋更有意思的游戏,在编程领域,你可以制定自己的规则,并且依照这个规则来做任何你想做的事。 具体这些规则指的是什么,恕我愚拙,暂时还不知道,我猜测或许像所有编程语言一样,规则就是指令集(Instruction Set),语言能够做的最基本事情的集合,所有的别的功能(function)都是构建在这之上的。

“What makes programming so engaging is that, while you can make the computer do what you want, you have to figure out how.” 使得编程如此迷人的是你必须自己找到如何让计算机做你希望完成的事情的方法。 从字面意思该是这样去理解:不论你想做什么,你都得自己去找到那个算法。然后,首先得找到一件想让计算机做的事。以前我总以为读了一本编程语言的书就是掌握了这门语言,我错了,因为我没有用它来做任何事,仅仅只是被动让大脑接收这些信息是不足以掌握的。Practice and more practice is really what I need right now,我需要的练习而不是更多的语法,用已经掌握的语言去解决问题才能真正学会编程,看再多的书都不会。

“I’m personally convinced that computer science has a lot in common with physics. Both are about how the world works at a rather fundamental level. The difference, of course, is that while in physics you’re supposed to figure out how the world is made up, in computer science you create the world.” 我个人认为计算机科学和物理学很相似。它们的目标都在于如何使得所有一切只构建于几条基本的规则。只不过物理学在真实世界找到这些规则,而计算机科学用规则去创造世界。 所有物体都必须按照牛顿三大定律去运行,计算机科学真的也有这么几个强有力而完备的规则吗?它们是什么?它们如何运转的?毕竟我从来没有创造过一个 Linux ,所以我很难去理解。

“The functionality often is second to being interesting, being pretty, or being shocking.” (编程的)功能性相对于兴趣,优雅,让人震惊来说永远处于第二位。 写程序不仅要实现它,而且要实现的优雅完美,美到极致,这才是程序员所追求的美。编程是艺术和工程的结合。

“One of the biggest joys was learning that computers are like mathematics: You get to make up your own world with its own rules.” 编程最大的快乐在于它像数学一样,你可以通过自己的规则来构建世界。 我还记得欧几里得几何只通过5条公理来构建了整个几何世界,但这些规则必须是自统一(self-consistent)的,能够由底向上推倒出来。整个数学领域都是这样的。而在编程领域,你可以自定义自己的规则,然后由这些规则来构建整个世界。我猜想任何一门编程语言都是构建在它之上的所有软件的规则吧。

“One of the reasons people have become so enamored with computers is that they enable you to experience new worlds you can create, and to learn what’s possible.” 计算机迷人的一个原因在于她能够使你去创造世界,并且了解她的无限可能。

“That person didn’t learn how the problem was supposed to be done but, instead, just thought about the problem the right way. And once you heard the answer, it made perfect sense.” (用计算机解决问题)并不是用期望的方法去解决它,而是找到那个直击核心的方法。一旦找到了那个方法,你就知道那就是完美的答案。 跳脱出思维的枷锁,跳脱出既定的方法,或许,你从另外一个角度能看到真正完美的答案。

“You can do something the brute force way, the stupid, grind-the-problem-down-until-it’s-not-a-problem-anymore way, or you can find the right approach and suddenly the problem just goes away. You look at the problem another way, and you have this epiphany: It was only a problem because you were looking at it the wrong way.” 你可以用简单粗暴的方法,或者你会找到真正的解决之道。只有在这个时候,当你从不同的角度去看问题的时,会产生这样的顿悟:只有当你从一个错误的角度去看问题时,问题才是问题。

“He would know to write a beautiful program that attacks the problem in a new way that, in the end, is the right way.” 他将会知道从一个新的角度写出一个漂亮的程序来解决问题,会被证明最终这是正确的方法。

从以上 Linus 的说法可以看出,编程吸引人的地方在于基于简单的规则用优雅的方法去构建无限可能的世界。愚钝的我还不知道这些简单的规则是什么?用他们怎样去构建编程的世界。但我想谈谈用优雅的方法去解决问题。什么是编程?编程不是静态的过程,不是吸收,而是产出。就像写作、绘画是一样的,它不似阅读那样仅仅通过接收就能完成。必须要写出代码(code)来描述解决问题的方法,这才是编程的本质。之前,我一直以为多读几本编程书就是学习编程,读的多了就能够写出更好的更健壮优雅的代码,其实,方向有点偏离。必须深入去思考各种编程问题,并用深思熟虑的优雅的方式去解决它,实现成代码——不管是C++,Java,Python还是别的什么语言——才是真正的学习编程。20小时学习新事物 中我已经给出了大量的编程问题,从小问题开始,一步步去解决它们才能够掌握编程这门技艺。