The Problem with Programming(翻译)
2006-12-11 19:21 by 老赵, 4812 visits前言:
这是一次访谈。访谈的对象是大名鼎鼎的Bjarne Stroustrup,“C++之父”的称号注定他永远是大师。这次他在接受了Technology Review的采访,对于软件开发的目前状况谈了他的看法,指出了不少问题。那么这些问题是否真的如他所述?按照我个人的习惯,我始终把对于大师的“尊敬”和对于其言论的“吸收”相分离,我们不妨围绕着这次Bjarne Stroustrup的谈话内容,展开我们的讨论吧。
原文链接:
http://www.technologyreview.com/InfoTech/17831
翻译:
Bjarne Stroustrup,C++编程语言的发明者,维护了他的珍宝,并且提出了大多数软件代码都存在的问题。
在上世纪80年代到90年代期间,Bjarne Stroustrup设计并实现了C++,这一目前最为流行的面向对象编程语言。它的出现影响了之后其它不计其数的编程语言,包括Java。
C++具有典型的计算机“高级”语言特性(保留了自然的“人类”语言特性),目前依旧有数百万的程序员在使用它。大量PC上的,以及如今互联网时代的系统和应用程序都由C++编写而成。虽然如此,这个语言也受到了不少争议,主要是因为它“声名狼藉”地难以学习与使用。另外,Stroustrup的设计也让程序员在使用C++时容易犯下非常严重的错误,虽然C++给了他们相当的自由。
Stroustrup,曾在AT&T贝尔实验室担任研究员多年,如今在休斯敦附近的Texas A&M University的计算机科学与工程系担任教授。
Technology Review:为什么大多数软件都那么低劣?
Bjarne Stroustrup:有些软件以任何标准来衡量都相当优秀,看看Mars Rovers,Google和Human Genome项目,多高的软件质量!五十年前,大多数人,尤其是大多数专家,会认为上面这些例子的每一个都是不可能完成的。我们科技文明的基础在于软件,所以如果软件低劣到了无以复加的地步,我们大多数人现在都应该已经死了。
另一方面,看着现在“平均水平”的代码我都想哭了。程序结构低劣地骇人听闻,程序员明显没有仔细思考过它们的正确性,算法,数据结构或者可维护性。大多数人根本不读代码,他们只会看着IE浏览器发呆。
我认为我们(就是指我们这些软件开发人员)真正的问题在于我们永远处于一种紧急状态,想尽一切办法来完成工作。我们在大多数情况下会进行反复的测试,使用了大量的“暴力”测试,这的确产生了“微量”的奇迹——不过这远远不够。
软件开发人员越来越擅长于在不可靠部分基础上建造可靠的系统,这可是非常困难的技术。但是造成困难的原因是我们经常不知道我们究竟该如何做:我们仅仅是将一些“相关”的东西集中起来,最终得到了差强人意的系统。我个人更倾向于去了解一个系统什么时候会工作,以及它为什么会工作。
TR:那么该如何解决我们现在这种糟糕的状况?
BS:理论上来说这很简单:更好的培训我们的开发人员,适用更加合适的设计方法,做出更有弹性的设计。奖励正确,稳固和安全的系统。惩罚糟糕的情况。
不过实际上这是不可能的。人们会奖赏那些发布更快,更便宜,虽然充满Bug的软件的开发人员,因为现在人们喜欢更炫更酷的新玩意儿。他们不想遇到麻烦,他们不愿意学习一些和计算机进行交互的新方法,不喜欢将发布推迟,也不愿意为质量付额外的钱(除非很明显已经预先知道了——不过往往这种情况下还是不愿意)。只要用户的行为不真正得到改变,软件供应商也就不太可能改变。
我们不可能把世界暂停二十年,让我们把从咖啡机到金融系统的每一样东西重新编写一遍。另一方面,想把混乱的状况理清楚已经是件代价昂贵,危险,而且沉闷的事情了。我们需要有重大的改进,而且只能按部就班地进行。它们必须从一些主要的部分入手,而且任何单独的改变都是不够的。
有一个叫做“学术烟窗”的问题妨碍了这一点:太多人把某些方面当作是万能药了。更好的设计方法能够起作用,更好的规格说明技术能够起作用,更好的编程语言、更好的测试技术、更好的操作系统、更好的中间件、更好地理解应用程序域、更好地理解数据结构和算法等等,都能够起作用。例如,类型论、基于模型的开发和形式方法都能够毫无争议地在某些方面起到非常重要的作用。但是它们如果同时排斥其它的方法,每一个都会使一个大规模的项目失败。人们只能将他们知道和他们见过的东西运用到工作中去,否则他们还能怎么做呢?但是只存在极少数的人,他们的技术已经成熟到能够在需求和资源中找到平衡。
TR:C++的目的是让程序员能够更努力地工作,以写出更高效的代码。贝尔实验室在当时需要一种语言,它能够让一些聪明绝顶的人们用来编写代码,并将它们运行在不是非常快的电子交换系统(ESS - Electronic Switching System)上。现在已经出现了大量的软件开发人员,计算机也已经变得非常迅速了,这对于C++的瞄准点是不是有所损害呢?
BS:C++并不仅仅是针对大型交换系统设计的,它面向了各种范围的应用程序。贝尔实验室是各种难以计数范围内的有趣项目的发源地,它使用了各种各样的计算机和操作系统。当然,贝尔实验室里程序员的“平均水平”比大多数人们概念中程序员的“平均水平”要高出许多,而且在那里比大部分其它的地方都更加重视软件的可靠性以及性能。
“性能”依旧是我感兴趣,并且大多数应用程序都还难以避免的问题:响应接口,打开和关闭应用程序。软件开发人员增加了一个又一个多余的软件抽象层次,结果大大限制了当代计算机硬件的高速运算能力。我们似乎已经遇到了硬件以线性方式提高速度的瓶颈,但是在很多情况下,我们能够从软件那里得到大量的提高。
这意味着,C++的确成为了一个过于“面向专家”的语言——在培养一个普通程序员的正规教育水准已经没落的时候。但是,解决问题的办法不是以编程语言来妥协,而是应该使用各种各样的语言来培养更多的专家。有很多语言可供这些专家使用——C++是其中一个。
TR:请您回顾一下,在您设计C++时,有没有决定更倾向于运行时的性能而牺牲一些开发效率,安全性或软件的可靠性呢?
BS:嗯,我想我没有做这个交换。我希望得到优雅而高效的代码,有时我的确做到了。这些(割裂性能和正确性,性能和开发时间的)二分法过于低劣了。
一开始,我把C++作为一个系统程语言来设计的:我希望能够编写设备的驱动程序,嵌入式系统以及其它一些我需要直接操作硬件的程序。接下来,我希望C++能成为一个设计工具的优秀语言。这不仅需要一定的适应性和性能了,而且还要有优雅地表示接口的能力。在我看来,如果希望建造一个高端的东西,构造一个完整的应用程序,你需要先去购买,开发或者借来已经有合适抽象的类库。大多数情况下,当开发人员遇到了C++方面的问题,其真正原因是因为他们没有使用合适的类库——或者他们无法找到可用的类库。
而其它的语言已经设法更直接地支持了开发高端的应用程序。
这种做法的确有效,不过这种支持往往把一种语言变得特殊化。就我个人而言,我不会设计一个工具只能做那些我想做的东西——我的目标是使它变得能够适应更普通的情况。
TR:您对于下面的这个事实是怎么看的呢?C++既被许多开发人员指责和憎恨,与此同时却又被广泛使用?为什么它如此成功?
BS:这个问题答案是:世界上有两种语言,一种是人人都抱怨的语言,另一种是没有人使用语言。
在所有有用的系统中,使用可怕的语言编写出来的系统,比使用优雅的语言编写出来的系统要多——而且多得多。编程语言的目的是帮助人们开发好的系统,这个“好”会有很多种定义,我对它的简单定义是:正确,可维护并且足够迅速。从美学角度来说,一个语言首先必须考虑的是“有用”,它必须有能力让真实世界里的程序员拿来表示真实世界里的想法,并且足够简洁。
C++能够成功的主要原因很简单,它能够满足它有限的设计目标:它能够非常直接并高效地表达各式各样的想法。C++设计的目的并非仅仅是让开发人员能够很好的作一件事情,或者避免人们做出被认为是“错误”的事情,我更关注的是它的普适性和性能。
我能肯定,每个不喜欢C++语言的程序员都有其喜欢的语言。然而,我的一个朋友参加了一个会议,主持人让听众举手表决:一、有多少人不喜欢C++;二、有多少人使用C++写程序。第一类人的数量是第二类的两倍。一个人不喜欢他不熟悉的事物往往是被认作为偏见。同时,抱怨的人往往比支持者显得喧闹——通情达理的人会承认缺陷。我认为我所了解的C++的毛病比了解其它任何事情都要多,但是我知道如何避免它们并且知道如何使用C++的长处。
另外,你自然不能期待被C++打败的语言的支持者们能够非常有礼貌的对待C++。软件开发并不以承认专家的地位为目标——当然我希望它最终能够这样。科学在这方面是不同的,当一个工具、技术或者理论获胜时,人们把它当作进步。在软件领域,竞争对手或者前辈的贡献并没有被广泛认可,赏识,甚至不能被理解。
TR:在The Design and Evolution of C++中,您声称Kierkegaard影响了您的语言概念。这是在开玩笑吗?
BS:的确可能显得有些自命不凡,不过我并没有开玩笑。如今关于软件开发的思考,很大部分是集中在组,团队和公司上的。经常发生的是:个人独特的天才或者技能都被完全淹没在所谓的公司“文化”中了。公司的实践,可能对有特殊能力或技术天赋的个人有完全的冲突。我认为这种对于技术人员的管理是一种摧残和浪费。Kierkegaard是一个“个体主义”的支持者,他强烈反对“群众”,并且对于其美学和伦理学方面行为的重要性有着一些非常严谨的讨论。我无法指着某个特别的语言特性说:“看,这里受到了这个十九世纪哲学家的影响”。尽管我不是特别喜欢Kierkegaard的宗教哲学,但是他是我的思想根源,让我不愿去除语言“专家级别”的特性,不愿废除可能被“滥用”的语言特性,不愿意把它限制为只是“我认为有用”的那种语言。
TR:您最后悔的是什么?
BS:没有后悔!嗯,当然我想过我可能可以做的不同,而且更好。但是说真的,那时候的我是谁?1984年的Bjarne?他可能没有我现在那么有经验,但是他不会比我笨,甚至比我现在还要聪明,他对于1984年事物比我现在有着更好的理解。C++已经创造了那么多的系统,改善了我们的生活,它显著地影响了之后的语言以及系统。这些事情绝对值得骄傲。
(点击这里查看我们与Stroustrup访谈的第二部分)
Kierkegaard(克尔凯郭尔),19世纪的哲学家,一般被视为现代存在主义之父。不过我对他和存在主义也不甚了解……