`
huobengle
  • 浏览: 908956 次
文章分类
社区版块
存档分类
最新评论

编程:是一门艺术

 
阅读更多

1. 引言

"(program(computers) == *art) ? so : what"
“只有大约5%的程序员能够在编写代码时创造出艺术。其他95%一定是为了取得成功的科学家,不是艺术家。”

  谈及“艺术”,人们自然会联想到“美”、“技艺”、“灵感”等词,但很少会把它和“计算机编程”这听起来似乎无趣的词联系在一起。而Donald Knuth,《计算机编程的艺术》多卷书的作者,通过他的著作,成功地展现了计算机编程的艺术。随后他又在图灵奖演说[1]中对计算机编程的艺术做了科学地论述和诠释。他不是第一个这么做的人,但无疑他是最成功的一个。Guido van Rossum,Python的设计者,如是说:

“我同意Knuth对‘艺术’一词的定义(或使用)。对于我来说,它和创造性联系十分紧密,而这对于我的工作非常重要。如果(计算机编程)其中没有艺术,它将没有任何乐趣,而我也不会在30年之后仍然从事它。”

  编写优美的程序需要灵感和高超的技巧,就像诗人写诗,画家作画,建筑师构筑,充满了乐趣、挑战和美。优雅的程序会像诗歌一样耐人寻味,像名画那样大开眼界,像教堂一样堂皇华丽。所以,计算机编程也同样是一门艺术,程序员就是创造这种艺术的艺术家。

  2. 编程之美

  什么样的程序才是美的程序?这个问题似乎没有完整的答案。一个很酷的Demo或一个很炫的视频游戏都能让我们赞叹不已。Doom和Half Life可以说把3D技术推向了极至,这种程序总能给人一种视觉上的美,就像画家手中的美丽油画,只是程序员们的画布在电脑屏幕上,画笔是键盘。Linux也是一种美,一种开放的美,从Unix那里继承来的优雅的设计,强大的可移植性,丰富的工具,这让它看起来像优秀建筑师们设计的一座富丽堂皇的教堂。这些美是显而易见的。还有一种美,隐藏在程序背后,流动于源代码之中。什么又是美的代码呢?可能它们一看上去就很美。这里有一个惊人的宏定义的C代码集合[2]:允许程序建立常量,使它们看上去像是屏幕上的图形!程序的自描述能力大大加强!

#define X )*2+1
#define _ )*2
#define s ((((((((((((((((0 
static unsigned short stopwatch[] =
{
s _ _ _ _ _ X X X X X _ _ _ X X _ ,
s _ _ _ X X X X X X X X X _ X X X ,
s _ _ X X X _ _ _ _ _ X X X _ X X ,
s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
s X X _ X X X X X _ _ _ _ _ X X _ ,
s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
s _ _ X X X _ _ _ _ _ X X X _ _ _ ,
s _ _ _ X X X X X X X X X _ _ _ _ ,
s _ _ _ _ _ X X X X X _ _ _ _ _ _ ,
s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
};

  这种只能在Usenet或混乱C代码竞赛中才能见到的代码虽然没有多少实际用处,但它的确能让我们感受到代码 —— 一堆有规则的符号 —— 也能创造出视觉上的美。也可能是程序使用的技巧 —— 算法很美,就像汉诺塔程序,快速排序程序,自然而然地使用递归让它们看起来很紧凑,易读,这当然也是一种美,是只有程序员才能体会到的美。还有一种美,深藏在代码之后,是程序的设计思想之美,一种需要领悟的美。Unix带给我们的不仅是它的强大功能,还有它那深邃的设计哲学[3]:

“小巧就是美的。”(Small is beautiful.)
“让每个程序都擅长做一件事。”(Make each program do one thing well. )
“一切都是文件。”(Everything is a file.)
“沉默是金。”(Silence is golden.)
“让操作系统内核小而轻巧。”(Make operating system kernels small and lightweight.)

  这些思想在Unix设计中不失为黄金法则。这种美将穿越时空,千古流传,让Unix不仅仅是一个优秀的操作系统,而成为一门计算机领域的哲学。

  人们都喜欢美的东西,程序员们更是珍视美的程序,我们把那些创造美好程序的人尊称为“黑客”。 Paul Graham认为黑客和画家很相似[4]:

黑客和画家的共同之处是,他们都是创造者。和作曲家,建筑师,作家一样,黑客和画家尝试去做的也是创造好的东西。他们本身并不做研究,但是如果在创造好东西的过程中发现了一些新的技术,那就更好了。

  好的画家是艺术家,那么好的程序员——黑客——也是艺术家。这也就不难理解为什么很多Unix内核黑客都留着艺术家式的络腮胡了。

  3. 编程之巧

  灵巧的程序像含蓄的诗歌,需要仔细领悟,用心去体会,茅塞顿开后方能回味无穷。真乃“会当临绝顶,一览众山小”!同样是求pi,但是只有简单的四行C代码却能打印出pi的前800位的程序定会让我们大开眼界[5]:

int a=10000,b,c=2800,d,e,f[2801],g;
main(){
for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);
}

  黑客们不会墨守陈规,他们不断地创新,寻找更巧的方法来解决同样的问题。曾经流行编写这样一种程序,它能够打印它自己的全部代码。程序员们努力寻找最短的这种程序。这虽然没多大实际用处,但是充满了挑战性,黑客们把这当作乐趣。看看下面的程序[6]是多么怪异。

char *f="char *f= %c%s%c;main(){printf(f,34,f,34,10);} %c";
main(){printf(f,34,f,34,10);}

  计算机编程吸引人的很大一部分在于它需要高超的技巧,也正是这些技巧才使我们看到了美,从中得到了乐趣。而且,我发现,当限制增加时,技巧将会更高,乐趣也会随之增加。来写这样一段程序,让它在屏幕上打印1~1000之间的数字。这对于一个新手来说也是小菜一碟,一个for 循环就搞定。好,我们加一个限制,不许使用任何循环。这时你得动一番脑筋了,不过你还是会想到用递归可以完成。不错,我们再加一个限制,也不许用递归。这可能把你难住了,你可能会认为不可能有这样的程序,那看看下面的程序吧:

#include <stdio.h>
#define A(x) x;x;x;x;x;x;x;x;x;x;
int main (void)
{
int n = 1;
A(A(A(printf ("%d ", n++))));
return 0;
}

  既没有用循环,也没有用递归,而是使用了宏!我们常常惊讶于世界各地著名的Warez组织推出的64k的3D动画,那么小的程序,往往有难以想象的效果。它们把64k的限制和汇编的威力运用到了极限,这种技术让人叹为观止。64k似乎并没有限制住其艺术性,反而起了促进作用。并且,当你对系统有足够的了解时,乐趣将会更多。因为你可以使用技巧和系统开玩笑了,欺骗它,作弄它,甚至攻击它。看下面的程序:

void main() {
int x;
x = 0;
x = 1;
printf("%dn",x);
}

  想一想,如何才能让程序跳过“x=1;”这一句而在屏幕上打印0?如果你对系统堆栈了解的话,你可能会给出类似下面的程序[7]:

void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
 
ret = buffer1 + 12;
(*ret) += 8;
}
 
void main() {
int x;
 
x = 0;
function(1,2,3);
x = 1;
printf("%dn",x);
}

  它利用了调用函数时堆栈的变化,改变函数的返回地址,跳过了“x=1;”这一句而直接执行下面的printf!它成功的欺骗了系统!如果把返回地址改成你预先放置的一段代码的首地址,那么你将会劫持系统,让它运行你的那段代码。如果那段代码足够巧,你将能获得系统的完全控制权!这也是缓冲区溢出的基本原理。我想,这种技巧将会让你兴奋不已,丝毫不亚于陶醉在自己诗里的诗人。我们已经看到:巧妙产生美,并与之形成艺术的雏形。

  4. 编程之乐

  计算机给人的乐趣在于,如果你有什么好的想法,你可以马上实验去得到结果。当然,你可能不会立刻得到正确答案,而必须坐下来,盯着电脑屏幕,苦思冥想求解问题的有效方法,通过不断的尝试去验证你的结果。可以通过找到正确的方法,使问题突然消失,也可以换一个角度,突然灵光闪现:原来是这样!

  编程是对创造力的训练,好的程序员不会循规蹈矩,不会使用平庸的方法去解决问题,而是根据自己的见解去寻找更简单的方法,因为他们能看到隐藏在问题背后的实质。然后他们会写出全新而漂亮的程序去验证他们的方法。“不过还是很难说清楚,闭门苦思冥想地要找到解决某个问题的漂亮答案,为什么竟会有如此巨大的魅力。但是,你要是曾经有过找到更好方法的经历,你就会明白,这简直是无以伦比的感觉。”[8]这种感觉能让我们快乐得像一个孩子,乐不知疲。

  这种“无以伦比”的感觉,流动在程序员体内,让程序员们为之痴迷,疯狂。而痴迷的程序员从他艺术性的创造中得到了难以言传的乐趣,并让为之上瘾。 Linux之父在他的传记[8]中这样谈及他所体会的编程的乐趣:

编程给人带来最初的兴奋很好解释:那就是通过编程你可以支配一台计算机,你叫计算机做什么,它就做什么,永远准确无误,而且毫无怨言。这本身就很有意思。

它比下棋之类的游戏更有乐趣得多,因为它可以由你自己来制定游戏规则。而你制定什么样的规则,也就会导出与此规则相符合的结果。

在电脑世界中,你就是创世者,你对所发生的一切拥有最终的控制。如果你功力深厚,你可以是上帝——在一个较小的层面上。

  无疑,乐在其中,外行人永远体会不到,毕竟“子非鱼安知鱼之乐”。无穷无尽的乐趣让程序员们模糊地体会到了作为艺术家的快乐,并且开始享受他们的工作。

  5. 结论

  Rob Pike曾悲观地叹息:“那种艺术消失了。”[9]但是,我想当他看到诸如《汇编语言的艺术》和《Unix编程艺术》之类的书时,他也会高兴。这种艺术并没有消失,而且还会流传下去。我们不应该因“为艺术而艺术”而感到不好意思。正如Knuth所言[1]:

“我们已经看到,计算机编程是一门艺术,因为它把积累的知识应用于世界,因为它需要技巧和灵巧,尤其是因为它创造出了美的目标。模糊地意识到自己是一个艺术家的程序员将会享受他所做的工作,而且将会把它做得更好。”

  或许,我们应该为了“艺术”的圣杯,举起我们的双刃剑打斗一番。但是,比起剑来,我更喜欢犁头,我本人。

9
4
分享到:
评论

相关推荐

    编程之道--编程是一门艺术

    要学习编程是要有很大恒心和毅力的,首先你要明确自己的目标,想好自己编程是为了干什么。如果你学习仅仅只是一时想编出QUAKE和成为比尔盖次的冲动,那么我劝你还是应该不要开始学习,因为这样的目标很难支持你日后...

    C++模板元编程:编译时的编程艺术

    C++模板元编程是C++语言的一种高级编程技术,它利用模板的特性,在编译时而非运行时进行类型推导、算法优化和代码生成,以此来提高程序的效率和...模板元编程对于追求程序性能极致的开发者来说,是一门不可或缺的技术。

    程序员编程艺术pdf可编辑

    程序员编程艺术pdf可编辑,教你如何将编程作为一门艺术

    深入C#并发编程:掌握锁和同步的艺术

    ### 深入C#并发编程:掌握锁和同步的艺术 在现代软件开发中,多线程编程已经成为不可或缺的一部分,特别是在高性能和高并发的应用场景下。C#作为一门功能强大的编程语言,在处理并发编程方面提供了丰富的工具和支持...

    Flutter异步编程:掌握Streams和Futures的流动艺术

    Flutter使用Dart语言作为开发语言,这是一门简洁、强类型、并且专为客户端应用性能设计的编程语言。 ### Flutter的主要特点包括: 1. **跨平台**:Flutter允许开发者编写一次代码,同时编译为iOS和Android两个平台...

    (1条消息)【零基础小白如何入门 Python 编程】- CSDN.pdf

    编程不仅仅是一门科学,也是一门艺术,它要求我们既要有扎实的理论基础,也需要具备将理论应用到实践中的能力。因此,实际动手编写代码要比纯粹的理论学习更为重要。 在教学方法上,作者提到了自己在教学过程中的...

    Java安全编程:输入验证与SQL注入防护的艺术.pdf

    Java安全编程是一门深奥的学问,其中,输入验证与SQL注入防护占据了至关重要的地位。在Web应用开发过程中,用户输入处理不当将直接导致安全漏洞。最为人熟知的漏洞之一便是SQL注入攻击,攻击者通过输入恶意SQL代码,...

    unix 编程艺术

    ### Unix编程艺术 #### 一、Unix哲学与编程原则 Unix作为一款历史悠久的操作系统,其设计哲学和编程原则对后来的计算机...无论是对于新手还是有经验的程序员来说,《Unix编程艺术》都是一门值得深入研究的重要课题。

    Python 编程:让屏幕绽放满屏烟花秀.zip

    在当今信息化时代,编程已经成为了一项重要的技能,尤其对于年轻一代来说,学习编程就如同学习一门新的语言一样重要。Python作为一种简单易学、功能强大的编程语言,在全球范围内得到了广泛的应用和推广。它不仅适用...

    数码艺术哲学:信息时代艺术世界的探索.pdf

    数码艺术哲学作为一门跨学科的研究领域,结合了哲学、艺术学以及信息技术,旨在理解和定义这个由数字编码、虚拟现实和网络交互构成的艺术世界。 文章指出,数码艺术的核心特征在于它的非物质性、可计算性、联机性...

    JavaScriptDOM编程艺术(第2版)PDF版本下载.txt

    随着时间的发展,JavaScript已经成为了一门功能强大的编程语言,并且拥有庞大的生态系统,包括Node.js、React、Angular等流行框架和库。 ### 二、DOM概念详解 #### 2.1 DOM定义 DOM(Document Object Model,文档...

    多处理器编程的艺术

    在多处理器编程平台上进行编程时,即使熟练掌握了系统提供的各种同步语句,但是所编写的程序还是差强人意,问题在于多处理器编程时一门艺术和科学结合的学科,希望这本书能给你帮助。

    汇编语言编程艺术(清晰版).

    编程是一门艺术!此书极为清晰地讲述了汇编语言的来龙去脉,让你感受到汇编并不痛苦。

    javascript Dom 编程艺术

    JavaScript是Web开发中最重要的一门语言,它强大而优美。无论是桌面开发,还是移动应用。JavaScript都是必须掌握的技术。W3C的DOM标准是开发Web应用的基石。已经得到所有现代浏览器的支持,这使得跨平台Web开发成了...

    C语言艺术编程——浅谈艺术编程之举一反三、灵活运用.pdf

    C语言作为一门经典的编程语言,在计算机科学与工程领域拥有深远的影响。随着技术的发展,编程不仅仅是解决问题的工具,更成为一种艺术,即艺术编程。本文将深入探讨C语言艺术编程的概念,特别关注于“难一易一难”...

    创意编程收集.zip

    在这个压缩包中,"awesome-creative-coding-master"目录下包含了各种开源项目,这些项目不仅展示了编程技术的应用,更体现了编程作为一门艺术的可能性。 1. **生成艺术**:生成艺术是创意编程的一个重要分支,通过...

    给程序员的话《编程新手真言》(PDF)

    《编程新手真言》是一本面向初入编程领域的学习者的指南,旨在帮助新手程序员避开常见误区,提升编程技能。PDF格式使得这本书易于在线阅读和下载,方便编程爱好者随时随地学习。以下将从标题、描述和标签中提取出的...

    计算机编程艺术

    编程不仅仅是一门科学,更是一种创造性的过程,涉及逻辑思维、美学设计等多个方面。 - **目标读者**:本书适合对计算机编程感兴趣的初学者、中级开发者以及希望进一步提升编程技能的专业人士阅读。 - **内容特点**...

    JavaScript DOM编程艺术

    JavaScript DOM编程艺术是一门至关重要的Web开发技能,它涉及到如何使用JavaScript语言来操作网页的结构、样式和内容。DOM,即文档对象模型(Document Object Model),是HTML和XML文档的一种标准化表示方式,允许...

    Scala编程艺术入门

    本书《Scala编程艺术入门》由Mark C. Lewis撰写,旨在介绍Scala语言及其在编程中的应用。书中不仅包含了Scala语言的语法和结构,还涵盖了数据结构、排序、搜索、并发编程等计算机科学的基础知识。作者特别强调了...

Global site tag (gtag.js) - Google Analytics