编程是一门艺术吗?
2006-10-23
仅仅使用软件的人们 通常意识不到编写软件有多么困难。噢,设计部分和最初开发部分都很有趣。最困难的部分是使其正确运行(且运行速度足够快)。对于程序员而言,这就好比一餐开始时是美味的双层牛奶巧克力咖啡干酪饼,而结束时却是菠菜奶油沙司。
之所以说编程仍是一门艺术而不是一门科学或工程学科,是因为我们还不能将其分解成多个组成步骤,而后机械地进行。一旦我们在此方面获得成功,在某种程度上就会出现一种新的可能性:在编程时采用以人为本的设计语言 (PODL) 编写程序,通过编程来证明程序的正确性以及分析和支持语义查询。然而到那时,编程依然是一门艺术,也就是其中含有那么多传统智慧。
但是,如同许多传统智慧一样,此类比经不起进一步推敲。事实上,编制程序(我干这行已经有 20 多年了)根本一点都不像艺术 —— 至少不像写小说(我干这一行也已经有 20 多年了)那样的艺术。让我用两个片段(一个程序片段和一个散文片段)来说明我的观点吧。
第一个片段是一个用于分析 Visual C++® 7.1 的词法分析程序的一部分。该片段如下所示:
if ( index >= TokenID::lastKeyword() ) {
string token = tokenString( index );
if (( isdigit( token[ 0 ] )) || ( token[0] == ‘-’ )) {
#ifdef TELL_ME
display( "!! TokenSet::tokenIdentify: ", "文字数字:", token );
#endif
return TokenID::TK_Literal;
}
} if ( index >= TokenID::lastKeyword() ) {
string token = tokenString( index );
if (( isdigit( token[ 0 ] )) || ( token[0] == ‘-’ )) {
#ifdef TELL_ME
display( "!! TokenSet::tokenIdentify: ", "文字数字:", token );
#endif
return TokenID::TK_Literal;
}
}
第二个片段是我在大约 27 年前所撰写的一个故事的开头,那时我居住在亚利桑那州的图森市,从事散文教学和创作:
We were her pride of 10, Miss Steward named us: the Prodigal, Phoenix, Benjamin, and perspicacious, pacific Suzanne. Hush, child. Benjamin, be still, Miss Steward commanded him gently. People are never just.
两个片段都经过了精心设计 —— 也就是说,我预先花费了大量时间来设计整个工作的体系结构,而且这些片段反映了我所付出的设计努力。该程序有一个性能缺陷 —— 我是按值而不是按指针在关联的字符串表中检索字符串条目的。如果将该代码投入生产,则很明显需要进行修订。这与正确性无关,而只是与性能有关。对于较小的源代码程序,速度上的差异不可测量,因此我选择了更简洁但更慢的对象语法,因为我不喜欢 C/C++ 的指针操作标志。
尽管我的散文没有吸引数百万读者,但那些确实阅读散文的人都很欣赏其在严格的符号框架下编织情感的巧妙方法。那些不欣赏散文传统的人认为它故弄玄虚,因为它毫无作用。艺术的目的是以特定的可塑性媒体(对于散文而言就是词语)在公共事件中反映出个人感情以及个人私生活的真实性。当然,它不像程序那样具有与生俱来的内在价值。
我喜欢程序的设计过程,喜欢弄清楚程序的不同部分是如何相互作用的。我喜欢定义抽象或抽象族。我将其视为自己的人物塑造。并且,我喜欢编制接口,因为它们就是我的人物彼此之间所做的事情。这其实就是我编写程序的方式。
我不喜欢编写表达式和语句。我希望我们能有一种符号式编程语言,这样我就能够更好地用其进行思考并将其记在我的脑海中了。坦白地讲,我无法使算术表达式和括号嵌套保持清晰。尽管我能记住八个单独的文本部分,对其进行对比和回显,但我搞不清楚在我所设计的类及其接口之外的程序的意义。
在 John Markoff 所著的 PC 行业大事记《What the Dormouse Said》(睡鼠述)中,他声称最初幻想家使人人都能够支配计算机的目标已经实现。但是他错了。该目标仅实现了一半。如果一个人本身不会编程,怎么能说该人已拥有了计算机的全部威力?我们还没有实现他们的梦想,因为我们还未弄清楚如何将编程变成一门艺术,以使人人都能够分享它。在我们实现此目标之前,编程仍旧既不属于学科范畴,也不属于艺术领域。目前,编程只不过是一种新式“炼金术”。没有人能真正理解它,也没有人能将规范变成真金。
Stanley B. Lippman 从 1984 年开始在 Bell 实验室与 C++ 的发明者 Bjarne Stroustrup 一起研制 C++。之后,Stan 在迪斯尼和梦工厂从事形象动画方面的工作,并担任了《Fantasia 2000》(幻想曲 2000)的软件技术总监。此后他一直担任 JPL 的名誉顾问,并在 Microsoft 的 Visual C++ 团队中兼任设计师。
本文摘自 MSDN 杂志2006 年 10 月刊。