C++之父谈编程

编程爱好者

编程中的教与学

编程爱好者自然是无比关心自己学习的方法、进度的,而教的方法在一定程度上也指明了自学者的方向。现在就让我们先来听听大师对于教与学的看法和主张。

问:能否谈谈你对传统编程教学的看法和你的主张?

Bjarne:这是过去一年左右里一直占据着我大部分注意力的一个问题。我志愿教授电子工程/计算机工程专业大学一年级的学生编程,我认为我们目前教编程的传统方法不够严谨也不够广阔。我们社会的文明进步是建立在软件上的,因而必须培养更好的软件专家。

我认为已经到了我开始培养新手程序员的时候了,在这之前我都是把精力放在专家上。我基本的设想是让学生成为专家,使他们最终能够编出可靠的并且别人可以信赖的软件,这就意味着在培养新手时要求更高,要将重点放在对程序正确性和处理错误的训练上。

这种方法和传统的方法不同,传统的教学方法往往花费数周的时间来区分那些令人迷惑的C++基本类型,并且浪费宝贵的时间来处理诸如声明和循环上的一些迷人眼目的语法细节。我称我的方法为“深度优先法”,因为我们首先教我们的学生足够的知识去做一些有用的工作,然后才在这有限的基础上拓宽他们的理解能力和对工具的使用能力。反过来,我认为学生们学习编程的态度或者理念也应该如此。

问:能否谈谈您的具体教学方法?

Bjarne:既然我教学的目标是让学生制造现实世界中可用的软件,我也非常重视标准库的应用和设计。对于C++标准库工具的教学,例如向量(vector)和字符(string)从第一周就该开始应用,在第一个月之内类(class)就应该介绍,在第二个月之内介绍图形(graphics) 和继承性(inheritance)。

我所有的教学都是在实例的基础上进行的。我通过典型的例子来使学生理解,用亲身的体会来解释一些规则。自然地,我就要求学生写大量代码—如果你不读也不写大量代码的话你就学不会编程。

在第一阶段,学生必须经过亲身写代码,体会解题过程中出现的实际问题;第二个阶段必须好好体会亲身所犯的错误,并且学会克服他们。这其中,调试、错误处理,还有学会将大问题分解成小问题,从最小的组件来编程是非常重要的。

问:我们经常批评我们现在的C++教育不够现代、不够科学,您是通过“深度优先法”来教授学生的,请再简单谈谈您的教学方法和传统方法在理念上的不同?

Bjarne:传统的教授编程的方法是不行的,学完一些课程的学生写不出很好的代码。说得更激进一点,他们甚至不知道什么是好的代码。我的方法可以避免这种情况发生。我已在300名学生身上实验成功。

对于程序员来说这是非常关键的——包括新程序员,要了解基本概念和基本技能,但仅仅了解程序设计语言的基本构造是不够的。另一方面,如果没有一种编程语言我们就不可能教授编程的技能和规则,因此,要完全掌握一种语言工具,做尽可能多的练习是必需的。

很显然,这种教育方法不仅仅局限于C++语言,我的方法可以应用于任何其他语言。

面向金钱还是面向对象

既然请C++之父来谈编程,就没有办法回避面向对象这个有趣的问题。C++正是和面向对象有着非常紧密联系的语言,作为一种非商业化语言,它已经影响了世界范围内数十亿美元的设计决策。让我们来看看C++之父对这些问题的看法。

问:有人说Java是纯粹面向对象的,而C#更胜一筹,而还有很多人说它们纯粹是面向金钱的。以您之见呢?

4-g14-2-2.jpg
这是Bjarne通过《电脑报》对全国程序员的祝愿

Bjarne:我喜欢“面向金钱”这个词,还有Andrew Koenig说的“面向大话”我也喜欢。C++可不面向这两个东西。对这点我还想指出,我认为纯粹性并非什么优点。C++的优点恰恰在于它支持多种有效的编程风格(也可以说是多种思维模型吧)及其组合。最优雅最有效也最容易维护的解决方案常常涉及一种以上的风格。如果一定要用吸引人的字眼,那么可以说C++是一种多思维模型的语言。

在软件开发的庞大领域,需求千变万化,我们起码需要一种支持多种编程的设计风格的通用语言,而且很可能需要一种以上。再说,世界之大,总容得下好几种编程语言吧?那种认为一种语言对所有应用和每个程序员都是最好的看法,根本就是荒谬的。

问:您对面向对象是怎样理解的?它是不是一种好的可接受的编程思考方式?有没有学习OO(面向对象)必须的有用的工具?

Bjarne:OO技术在现在的软件发展中扮演了非常重要的角色,但并不是唯一的方法。像泛型程序设计(generic programming),用C++ 模板也是另一种方法。这些方法必须通过综合应用才能编写出一流的、最可读的、最易于维护的、最高效的程序。但没有任何一种方法是适合所有要求的。

我主要用C++来编程。我觉得C++是一种学习和实践OO思想很好的编程语言。

问:大家都在谈论数学和计算机科学的关系,能否谈谈您的看法?

Bjarne:两者并没有很强的直接联系,但是有一部分编程的实质包含在里面---像学数学一样,编程有时也需要很严密的思维。自从古希腊以来,数学就被用来训练人们的逻辑思维,并且我觉得如果不用数学的话很难想象能编出好的程序来。当然也有一些计算机领域,用到了高深的数学知识,然而,这些领域通常是非常专业的。

数学,特别是数学思维是计算机科学的一个支柱,经验主义是另一支柱。通过观察和测量来帮助理解实际的发展,用以调整我们的系统和行为,这两方面我们都需要。计算机科学不是仅仅用来证明定理的,也不是仅仅用来收集数据的。为了有效地实践计算机科学和发展高质量软件,更需要同时进行数学和经验的训练。