原文见:http://www.technologyreview.com/InfoTech/17831/ 
    翻译:xeon 11/29/2006

  在20世纪的80年代和90年代,Bjarne Stroustrup设计并实现了C++程序语言。C++普及了面向对象编程,同时也影响了包括Java在内的诸多其它的程序语言。
  C++仍然是“高级”原型计算机语言(保留了自然语言的特性),时至今日仍然有数以百万计的程序员在使用C++。在PC与Internet时代,C++编写出了众多的系统与应用程序。即使如此,C++仍然饱受争议,其主要原因一是臭名昭著地难学难用,一是Stroustrup的设计允许开发者为了自由而犯下严重的程序错误。
  在AT&T贝尔实验室做了多年研究员的Stroustrup,现在是休斯敦附近的德州农工*R>学(Texas A&M University)工程学部计算机科学教授。 
  Technology Review: 为什么绝大多数的软件糟糕透顶?
  Bjarne Stroustrup: 有些软件无论用任何尺度衡量都是相当优秀。 想一想火星漫步者探测器,Google以及人类基因组计划。这就是高质量软件!15年前,大多数人,尤其是大多数专家,都会说上述例子简直就是异想天开。我们的技术文明依赖于软件,所以如果软件真的如同其糟糕的名声一样不堪的话,我们中的大多数人现在就应该作古了。
  另一方面,看看那些“平均水平”的代码段都会让我失声痛哭。软件结构骇人听闻,程序员压根就不会深思熟虑正确性、算法、数据结构以及可维护性。大多数人不会真正地去读代码,他们只是发现IE或者Windows挂了,他们的手机丢失来电,从报纸上读到了最新的病毒新闻,然后呢,他们开始打寒战。
  真正的问题是“我们”(我们软件开发人员)永远处于一种紧急状态,不放过任何一根救命稻草来完成工作。我们会创造很多小奇迹,这是通过试用并发现错误,过分使用暴力方式,以及许许多多的测试做到的。但是,尽管如此,这仍然远远不足。
  软件开发人员开始善于这种巧技,脱离开不可靠部分来搭建相对可靠的系统。障碍在于,我们通常并不确切知道是如何做到这一点的:一个系统只是“有那么一点儿进化”成为最低限度可以接受我个人更倾向于了解一个系统何时可以运转,以及为什么它会运转。 

  TR:我们怎么样来弥补现在的尴尬处境?
  BS:理论上讲,答案相当简单:给予软件开发者更好的教育,使用更加合适的设计方法,设计时考虑灵活性与持久。奖励那些正确,稳定,安全的系统。惩罚那些乱七八糟的东西。
  实际上这是不可能的。人们总是奖励那些第一个完成廉价且漏洞百出的软件的开发者。这是因为人们现在想要的是新奇的小玩意。他们不想要麻烦,不想学习与计算机交互的新方法,不想为了质量而花费额外的付出(除非这是事先就很明显的问题。但即使如此,仍然经常被刻意忽视)。如果用户行为没有发生真正的变化,软件提供商根本不希望变化。
  我们没法让时光暂停10年,以便来重新编写所有的程序,从咖啡机到金融系统。另一方面,虚度光阴是一件昂贵,危险,令人沮丧的事情。显著的提高是必须的,但这只能一步一步的来。而且提高必须是全方位的,一个单一的改变是不够的。
  一个问题是“理论壁垒”大行其道:太多的人们把某些东西当作能够医治百病的万灵丹。更好的设计方法能解决问题,更好的规范技术能解决问题,更好的程序语言能解决问题,更好的测试技术能解决问题,更好的操作系统能解决问题,更好的中间件基础架构能解决问题,更好的理解应用领域能解决问题,不一而足。例如,型论、基于模型开发、形式化方法无疑在某些领域可以提供显著的促进作用,但是如果把这些方法作为解决方案而排斥其它方法,在大规模的项目中是必然导致失败的。人们总是在推行他们知道的方法和他们看到确实生效的方法,要不然能怎么办呢?然而很少有人在技术上成熟到能够在需求与资源之间取得平衡。

  TR:程序员努力工作的回报是高效率的代码,这就是隐藏在C++背后的思想。贝尔实验室希望有这样一种语言,少数真正聪明的人可以用这种语言来为诸如电子开关系统(ESS)等低速计算机编写应用。今天,软件开发人员越来越多,计算机的速度越来越快。这有损于C++的观点么?
  BS:C++并不是特地为大型开关机设计的,而是为了林林总总的应用。贝尔实验室是这么一个地方,她拥有范围广阔到难以想象的有趣的项目,这些项目跨越各个范畴,基本上使用了所有总类的计算机和操作系统。但是有一点是肯定的,当时贝尔实验室的平均水平程序员(average programmer[1])比大多数人观念中的“平均水平程序员更有才干,而且与绝大多数其它单位相比,贝尔实验室非常重视可靠性和性能(以这个顺序)的重要。
  在很多应用中,性能仍然是一个关键问题。这些应用中,我感兴趣的是:接口的敏感程度,应用的启动与关闭时间。现代计算机硬件的惊人性能被软件开发者牢牢压制,他们在过分详细的(软件)抽象层上边叠床架屋,添加了左一层右一层。看上去我们已经达到了硬件线性速度的极限,但是在很多情况下,我们从软件角度可以赢回若干个数量级的性能提高
  有种说法,当平均水平软件开发者所接受的有效正式教育水平下降的时候,C++实际上就变成了非常的“专家友好(expert friendly)”。然而,因为某些人无法理解而修改程序语言并不是一个解决方案,应该使用不同类型的程序语言并且培养更多的专家。总是要有一些语言是为专家使用的,而C++就是其中的一员

  TR:回顾一下,在设计C++的过程中,在程序员的效率、安全以及软件运行时效率可靠性上作出的取舍难道不是一个原则性错误么?
  BS:唔,我不认为我做过这种取舍。我想要的是优雅并有效的代码。有些时候我获得了。这种二分法(在效率和正确之间,效率与程序员时间之间,程序与高级之间,等等等等)纯粹是扯淡。
  我所做过的设计是这样的,C++首先要是一个系统级的编程语言:我希望能够编写设备驱动、嵌入式系统以及能够直接使用硬件的代码。其次,我希望对于设计工具来说,C++是一个好的语言。这除了对灵活性和性能有要求外,还能够表达出优雅的接口来。那时我的观点是:如果你想要做点儿高级的事儿,搭建完整的应用,你首先要去购买,编译,或者借用提供了适当抽象层的库。当人们使用C++有麻烦的时候,经常真正的问题是他们没有合适的库,或者他们不知道如何找到可用的库。
  其它的语言则尝试更直接地支持高级应用。
  这管用,但是这种支持是以特化作为代价的。以我个人来说,我不愿意设计一个只能做我想要的事的工具——我的目标是泛性

  TR:你如何面对这种现象:C++被许多程序员广泛抨击的同时又被广泛使用?为什么C++如此成功?
  BS:俏皮点儿的回答是,世界上只有两种语言:一种是每个人都在抱怨的,一种是没有人用的。
  用“丑陋”的语言书写的有用的系统比用“漂亮”的语言写出来的更多,多很多。程序语言是用来搭建良好的系统,这里的“良好”可以用很多种途径来定义。我的简要定义是:正确,可维护,足够快。从美学角度(首要是这种语言必须有用)来说,语言必须允许现实世界的程序员简洁并以小额付出来表达现实世界的想法。
  C++成功的主要原因是它达到了它毫无野心的设计理念:C++可以直接有效地表达相当大范围的想法C++并没有被设计成为了完美地解决某个特定问题或者去阻止人们做一些“不好”的事情。事实上,我把精力放在泛性和性能上。
  我确信对于每个不喜欢C++的程序员,总是会有一种语言让他喜欢。然而,我的一位朋友曾经参加一个会议,主要讲演者要求听众举手来回答两个问题。第一个是有多少人不喜欢C++,第二个是有多少人用C++写过程序。回答第一个问题的人数是回答第二个问题人数的两倍对于你不知道的事情表示不喜欢,那么这就是一种偏见。同样的,反对者的声音永远比支持者高,态度永远比支持者坚定。这是因为理智的人们知道他们喜欢的事物是有瑕疵的。我想比起其它语言,我更了解C++的毛病,但是我也知道如何避免这些问题,如何利用C++的长处。
  当然,也不要指望那些败北于C++的语言的支持者能够对C++有多礼貌。软件开发没有那种程度的专业性质,尽管我希望最终会这样。科学在这方面是不同的,当一个新工具新技术,或者新理论胜出的时候,人们认为这是一种进步。在软件行业,竞争对手或者先辈作出的贡献并没有被广泛认知,感激,甚至理解

  TR:在《C++语言的设计和演化》一书中,你声称Kierkegaard[2]是你的语言概念的影响因素之一。这是玩笑么?
  可能我有点儿自抬身价,不过这不是玩笑。许多关于软件开发的思考聚焦在小组,团队,公司上。这总是基于这个观点,个体被完全淹没在团体“文化”中,不考虑个体特有的才能和技能。团体实践可能对那些技能突出,对待技术主动的个体有着直接的恶劣影响。我认为对技术人群进行如此的管理是残忍且浪费的。Kierkegaard反对“扎堆”,是个体主义的坚定拥趸,他有一些关于美学与伦理行为重要性的严肃讨论。我没法指出某个特定的语言特性然后说:“看,这就是那个19世纪哲学家的影响结果”。但是我不愿意丢弃“专家级”特性,废除“误用”,以及限制一些特性使之只支持我认为有用的使用场景,Kierkegaard是这些概念的根源之一。尽管如此,我并不特别喜欢Kierkegaard的宗教哲学。

  TR:你最遗憾的是什么?
  BS:没有遗憾!唔,当然我梦想我能够做得不同,做得更好。但是严肃地说,我能对谁放马后炮呢?1984[3]年,那个处于丰产期的Bjarne?他可能比我经验少,但是绝对不会不如我聪明,甚至要更睿智一些,而且他对于1984年的世界比我了解得更好。C++已经被用来搭建了很多提高我们生活质量的系统,也对后来的语言与系统产生了很有意义的正面影响。这就是值得骄傲之处。

译注:
[1] average programmer见《Tao of Programming》一书,指介于wise programmer和 foolish programmer之间的一类人。
[2] Kierkegaard是丹麦哲学家,全名S?ron Aabye Kierkegaard,是一名虔诚的基督徒 ,强调个体的存在,反对教条主义。
[3] 1984年是C++从理论走向商业化重要的一年

“Java is not platform-independent, it is the platform”-----B. S (Bjarne Stroustrup)
“Java并非平台无关,它本身就是平台”-----C++之父 比雅尼·斯特劳斯特鲁普

C++之父主页:http://www2.research.att.com/~bs/homepage.html

编程的毛病——C++之父访谈的更多相关文章

  1. 《IT老外在中国》第11期:首次访华的编程巨匠、C#之父Anders

    见到Anders的时候,他正专注的倾听国内开发者的提问,一副远视眼镜斜歪着架在头顶,宽松的深蓝色休闲毛衫随意套在白色圆领T恤外. 如果不是他那专注的神情,以及现场见证开发者对他的狂热崇拜,很难想象这位 ...

  2. linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid

    本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...

  3. 怎么理解js的面向对象编程

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  4. Linux 进程--父进程查询子进程的退出状态

    僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它 ...

  5. JavaScript面向对象之我见

    序言 在JavaScript的大世界里讨论面向对象,都要提到两点:1.JavaScript是一门基于原型的面向对象语言 2.模拟类语言的面向对象方式.对于为什么要模拟类语言的面向对象,我个人认为:某些 ...

  6. iOS-屏幕适配-UI布局

    iOS 屏幕适配:autoResizing autoLayout和sizeClass 一.图片解说 -------------------------------------------------- ...

  7. .NET Framework3.0/3.5/4.0/4.5新增功能摘要

    Microsoft .NET Framework 3.0 .NET Framework 3.0 中增加了不少新功能,例如: Windows Workflow Foundation (WF) Windo ...

  8. Masonry -- 使用纯代码进行iOS应用的autolayout自适应布局

    简介 简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstraints. 项目主页: Masonry 最新示例: 点击下载 项目简议: 如果再看到关于纯代 ...

  9. TypeScript的全部资料,以后都放这儿了

    很早之前就听说TypeScript了(以下简称TS),但总是用难以抽出时间给自己找到这个冠冕堂皇的理由.最近又心血来潮,打算写TS的博客了,毕竟TS核心开发者也是C#之父,像我这么热爱C#的人,怎么可 ...

随机推荐

  1. 雪碧图(sprite)

    雪碧图 是一种将网页上常用且不经常变动的小图标集中在一张大图中,根据网页需求来显示图片的技术. 可以提高网页加载速度,增加用户体验. 其原理是通过html块状元素建立一个满足需求的视图窗口,然后在窗口 ...

  2. hive 分区操作记录

    创建分区: alter table table_name add partition (dt='20150423') location '/data/text/20150423';

  3. 5.6.3.7 localeCompare() 方法

    与操作字符串有关的最后一个方法是localeCompare(),这个方法比较两个字符串,并返回下列值中的一个: 如果字符串在字母表中应该排在字符串参数之前,则返回一个负数(大多数情况下是-1,具体的值 ...

  4. Android开发中出现cannot be resolved to a variable错误,也就是R文件不能生成。

    最近开始学过习Android开发,配置完成开发环境后,在创建第一个Android项目就出现了cannot be resolved to a variable错误,也就是R文件不能生成的问题. 以下是从 ...

  5. python10min系列之多线程下载器

    今天群里看到有人问关于python多线程写文件的问题,联想到这是reboot的架构师班的入学题,我想了一下,感觉坑和考察的点还挺多,可以当成一个面试题来问,简单说一下我的想法和思路吧,涉及的代码和注释 ...

  6. linux和windows的文件互传

    Linux →→→Windows 1.使用secureCRT:下载文件只需在shell终端仿真器中输入命令"sz 文件名",即可利用Zmodem将文件下载到本地某目录下. 2. s ...

  7. js 中的bind函数

    bind是Function.prototype中内置函数 作用是指定函数作用域 代码参考 http://blog.csdn.net/load_life/article/details/7200381 ...

  8. Spring RESTful服务接收和返回JSON最佳实践

    http://blog.csdn.net/prince_hua/article/details/12103501

  9. DropBox为什么一直那么红——靠用户体验,旗帜鲜明,它要保存的是你的重要随身资料,并且开放API

    链接:http://www.zhihu.com/question/19705960/answer/71742127来源:知乎 看到这个问题竟然从11年答到现在,有趣的是这几年里国内云存储行业变化也是蛮 ...

  10. c#读写共享内存操作函数封装

    原文 c#读写共享内存操作函数封装 c#共享内存操作相对c++共享内存操作来说原理是一样,但是c#会显得有点复杂. 现把昨天封装的读写共享内存封装的函数记录下来,一方面希望给需要这块的有点帮助,另一方 ...