许多重要人物之所以成名,或者是因为其改变了历史或者是因为其创造了历史,Bjarne Stroustrup先生,C++之父,属于后者;归结个人成功的原因,理由可能有许多,但他只有浅显的两个一点点:他比多数人天真和理想主义那么一点点;比多数人花在解决问题上的时间多一点点。
C++程序设计语言是一种承前启后,被数以百万计的程序员应用在各个领域中的语言,我们正在使用的Windows操作系统,我们上网用的浏览器IE无不是出自C++的手笔。
C++是一种重要的和比较流行的计算机语言之一,也是未来十年内仍然发挥重要作用的语言。
C++语言是一种通用的应用广范的程序设计语言,是一种既支持传统的结构化程序设计,又支持面向对象程序设计的系统复杂的语言。C++对C语言的扩充首先由 Stroustrup先生于1980年在贝尔实验室提出的,于1983年改名为C++。尽管C++的祖先C语言是世界上最受喜爱和应用最广的专业程序设计语言之一,但C++的发明是必需的。C++的本质就是让程序员理解和管理更大更复杂的程序。而对这种语言有着最大贡献的C++之父又是怎样一个人呢?
Bjarne Stroustrup先生,1950年生于丹麦港口城市奥尔胡斯,1975年在奥尔胡斯大学毕业,1979年获得剑桥大学计算机科学博士学位。他是C++语言的设计者和实现者,现在是得克萨斯州A&M大学计算机系教授。1979年他来到美国的新泽西州并加入贝尔实验室,与C语言之父、1983年图灵奖得主Dennis Ritchie以及大名鼎鼎的Brian Kernighan(两人合著《C程序设计语言》)共事多年,期间参与了贝尔实验室的C语言标准化活动。他的研究兴趣十分广泛,包括分布式系统、操作系统、仿真、设计以及编程,Bjarne还积极推动C++的ANSI/ISO标准化。
20世纪90年代以后,Bjarne Stroustrup步入人生的最辉煌时期。
1990年,Bjarne荣获《财富》杂志评选的“美国12位最年轻的科学家”称号。
1993年,由于在C++领域的重大贡献,Bjarne获得了ACM该年度的 Grace Murray Hopper大奖并成为ACM院士(成立于1947年的ACM协会是历史最悠久、目前世界上最大的教育和科学计算协会,成为ACM院士是个人成就的里程碑)。
1995年,BYTE杂志颁予他“近20年来计算机工业最具影响力的20人”的称号。
除了他的专业研究领域外,他对历史,通俗文学,摄影,运动,旅行和音乐等有广泛的兴趣。他对C++语言的推广也做出了极大的贡献,他写的书“The C++ Programming Language《C++程序设计语言》”已经成为这种语言中最为流行的学习资料,至少被翻译成18种语言。
问: 您的生活是怎样和计算机联系在一起的?
Bjarne Stroustrup:我也不晓得自己到底是怎样和计算机联系在一起的。当我上高中时,不知什么原因总觉得计算机科学是数学的某种实用形式。而事实不完全是这样,或者至少从软件的发展上看并不是如此,但正是这种误解使得我在还不知计算机为何物时选择了 “计算机科学数学” ,作为我学习的专业,并获得了我的硕士学位。我写完第一个程序后,就着了迷,曾没有回过头。正象大家所看到的,很幸运,我找到了一个使自己的才能可以很好地发挥的位子。
问:您怎样教育自己的孩子和学生们?
Bjarne Stroustrup:多数情况下,我是通过实例来进行教学的。我认为多数人过高的估计了言语的影响力,而过低的估计了这种影响力是怎样达到的过程。我尽量通过把理论和实践相结合起来以更好地达到目的,这样可以比仅用理论或仅用实践示例来教育更能取得事半功倍的成效。我尽量举出实例,从这些活生生的实例中引导归纳出一般的规则和概念。
问:您觉得怎样才是学编程的好方法?学习语言时一种好的工具是不是必需的?
Bjarne Stroustrup: 这是过去一年左右里一直占据我大部分注意力的一个问题。我志愿教授电子工程/计算机工程专业大学一年级的学生编程,我认为我们目前教编程的传统方法不够严谨也不够广阔。我们社会的文明进步是建立在软件上的,因而必须培养更好的软件专家。我认为已经到了我开始培养新手程序员的时候了,在我此之前我都是把精力放在专家上。我基本的设想是让学生成为专家,使他们最终能够编出可靠并且别人可以信赖的软件,这就意味着在培养新手时要求更高,要将重点放在对程序正确性和处理错误的训练上。既然目标是为了制造现实世界中可用的软件,我也非常重视标准库的应用和设计。对于C++标准库工具的教学,例如向量(vector)和字符(string)从第一周就该开始应用,在第一个月之内类(class)就应该介绍,在第二个月之内介绍图形(graphics)和继承性(inheritance)。这种方法和传统的方法不同,那些教学方法往往花费数周的时间来区分那些令人迷惑的C++基本类型,并且浪费宝贵的时间来处理诸如声明和循环上的一些迷人耳目的语法细节。我称我的方法为“深度优先法”,因为我们首先教我们的学生足够的知识去做一些有用的工作,然后才在这有限的基础上拓宽他们的理解能力和对工具的使用能力。
我所有的教学都是在实例的基础上进行的。我通过典型的例子来使学生理解,用亲身的体会来解释一些规则。自然地,我要求学生写大量代码—如果你不读也不写大量代码的话你就学不会编程。第一阶段如下,学生必须经过亲身写代码,体会解题过程中出现的实际问题;第二个阶段必须好好体会亲身所犯的错误,并且学会克服他们。这其中,调试、错误处理,还有学会将大问题分解成小问题,从最小的组件来编程是非常重要的。
问:数学和计算机科学有什么关系吗?
Bjarne Stroustrup: 两者并没有很强的直接联系,但是有一部分编程的实质包含在里面---象学数学一样,编程有时也需要很严密的思维。自从古希腊以来,数学就被用来训练人们的逻辑思维,并且我觉得如果不用数学的话很难想象怎样才能编出好程序来。当然也有一些计算机领域,用到高深的数学知识。然而,这些领域通常是非常专业的。数学,特别是数学思维是计算机的一个支柱。经验主义是另一支柱,通过观察和测量来帮助理解实际的发展,用以调整我们的系统和行为。两方面我们都需要。计算机科学不是仅仅用来证明定理的,也不是仅仅用来收集数据的。为了有效地实践计算机科学和发展高质量软件,更同时需要数学和经验的训练。
问: 您以前在欧洲学习而现在在美国工作,您觉得欧美有什么学术传统区别?怎样才算是一种好的大学教育呢?尤其对计算机科学来说。现在的大学有部分学生中途退学,您怎样看待这一现象呢?
Bjarne Stroustrup:这很难回答。欧洲和美国都幅员辽阔,而且有很多不同的学术传统。真的不好总结,并且在两地都有一些非常好的大学科系,这不是很容易区别和下结论的。
很少有学生离开学校去开公司,较多的是离开学校去从事一些有较高收入的工作,但大多数人还是完成了学业。我印象中那些放弃了计算机科学学习转而投入业界工作的是会为此感到后悔的。从长期眼光来看学位对一个好工作来说是重要的,特别是学生在他们最后一年或最后几年的学习。当然也确实有些相反的例子,但那些人通常永远不会再从事真正的技术工作,而转为商业管理人员了,如果那是他们想做的,那一个学位并不是必须的。我一直认为:一个学生如果还未获得学位,最好不要离开学校。
问:我们经常批评我们现在的C++教育不够现代、不够科学,您是通过“深度优先法”来教授学生的,您是否觉得在一个学生学习早期有些难吗?我们该如何做呢?
Bjarne Stroustrup:这是必然的。传统的教授编程的方法是不行的,学完这些课程的学生写不出很好的代码。说得更激进一点,他们甚至不知道什么是好的代码!我的方法可以避免这种情况发生。我已在300名学生身上实验成功。对于程序员来说这是非常关键的——包括新程序员——了解基本概念和基本技能。但仅仅了解程序设计语言的基本构造是不够的。另一方面,如果没有一种编程语言我们就不可能教授编程的技能和规则,因此,对一种语言工具充分掌握,做尽可能多的练习是必需的。
问:您对面向对象是怎样理解的?它是不是一种好的可接受的编程思考方式?有没有学习OO必须的有用的工具?
Bjarne Stroustrup:OO技术在现在软件发展的扮演了非常重要的角色,但并不是唯一的方法。象泛型程序设计(generic programming),用C++ 模板是另一种方法,这些方法必须通过综合应用来,才能创造出:一流的、最可读的、最易于维护的、最高效的程序。但没有任何一种方法是适合所有要求的。
我主要用C++来编程。我觉得C++是一种学习和实践OO思想很好的编程语言。
下面的四个问题有来之Lippman的回答
1, 一个优秀的程序员应该具备什么素质?
Lippman:不仅是C++,对所有的语言而言,我认为一个好的程序员应该具备独立性,而且要不惧困难,你必须心甘情愿的面对失败。所谓的独立性就是因为有时你要能独处,你必须相信你能处理你明白的事情。我认为一个好的程序员要具备创造性,而管理人员要确保程序员有独立的空间,成为他们自己。
2, 中国的程序员被一些人认为是吃青春饭的,程序员好像转向管理职位才有职业发展空间,你怎么看?
Lippman:我所认识的一些Unix创立者被提升为部门主管,但他们拒绝了提升,回到了程序员的职位上,因为他们认为这是自己能做得最好的地方。总之,最后辞掉了部门主管的职位,回去做研究去了。
在美国,我们认为一个好的程序员并不意味着他能成为一个好的管理人员。如果仅仅是为了金钱的原因而强迫程序员们去从事管理工作,这与公司的最佳利益是相违背的。因此我们发明了一个所谓的"多层升迁路径",随着技术经验的增长,微软分别为程序员设置了程序员、高级程序员以及MPS等等不同级别的技术职位。微软能认识到你的能力,如果你愿意成为管理人员,当然是可以的,但你不必做你不开心的事情,只用尽量保持你编程的创造性。
在上世纪八十年代,美国的公司都被一个相同的问题所困扰,起因就是迫使年龄大的编程人员不再从事编程工作。我猜想在中国,随着程序员年龄的增长,这种问题也会发生!
3, 为了避免30岁时被炒掉,你对程序员有什么建议吗?
Lippman:我想如果你不喜欢编程,那么编程的生活将是十分恐怖的!而且如果你仅仅是出于对金钱的考虑而选择程序员这一职业,而并不是真心喜爱这个工作,那么我奉劝你还是早点抽身的好。
但是,如果你喜欢创造,那么你可以考虑做一名程序员。今天的世界离不开电脑,几乎没有什么事情不是由电脑来运作的。而且你可以想想编程是一件多么奇妙的事情啊。我认为,电脑技术是人类历史上最具创造力的技术,你必须能感受到它的奇妙。很多人也认为电脑技术很奇妙,试图弄清楚究竟是怎么一回事,可是非常困难,因为他们的思维不具备逻辑性。
如果你不喜欢编程,那么不必强迫自己做一名程序员。当然我们需要好的管理人员,但是我觉得一名好的程序员比一名管理人员更有价值,因为我们有太多的优秀管理人才,但优秀的程序员却并不多。
4, 你如何看待C++语言的未来和C++与C#的关系
Lippman:如果你想做web service,asp等等,c++将不会很适用,因为这个语言不灵活,它太繁复了,它不是为了网络服务(Web service)而设计的。
C#就是为了网络需求而设计的,.net的理念就是并不是一种语言能解决所有的问题。如果你在开发的时候发现另一个工具更好,那么你就可以选择另一个工具。Java也一样。只能解决对应领域的问题。
永远不要去追逐技术,而是应该把精力放在你希望参加的领域里。
记得1991年Java出现的时候,人们预言c++将会消失,可这并没有发生,而是SmallTalk消失了。当Linux出现的时候,人们又说微软有麻烦了,可实际上是Sun有了麻烦。C##并不会威胁到C++,在微软我们在一栋大楼里工作。我相信C++现在表现得很好,在微软起着重要的作用。我们为整个社区做出了很多贡献。