几乎所有的软件学院(包括我的学院),在上导论性质的编程课时,都采用C语言(以下简称C)教学,而且主要是教授C的语法和使用。这意味着:
一、C是大多数学生学的第一个编程语言;
二、大多数学生在学校接触编程的时候,一开始主要精力集中在编程语言上。
所以有两个疑问:
一、用C教初学者合适吗?
二、学编程的时候应该一开始就以编程语言为主吗?
第一个问题,我的答案很明确,那就是不合适。而对于第二个问题,我认为初学者在初期应该以程序设计方法为主,而不是编程语言。
刚刚去世的大师Dennis
Ritchie把自由度最大限度的留给了程序员,但并没有为初学者着想,且事实恰恰与之相反。
C对初学者而言最有价值的内容是过程式的编程方法以及函数的概念。
函数是初学者不能避免的,但是除了这些,C还有一大堆会分散初学者注意力的细节:
- 变量和函数使用之前一定要声明;声明完了还不能用,还要定义!声明和定义的区别是什么?声明变量和函数的时候一定要写上类型,调用的时候却不用,导致调用形式和声明形式很不一样。
- 指针与其它类型变量的一大差异在于它的声明形式与使用形式还不一样!输出的时候可以直接传入变量,输入的时候却要加上个&;
- 定义数组的时候一定要确定元素个数;使用的时候不能越过数组边界否则会报错;一维数组和指针在传入函数的时候是一样的;但大多数时候有绝对明显的区别!
- 运气差的话可能还会遇上整数溢出;
- 还有那复杂起来绝对能令人抓狂的函数原型……
这些points现在看来全都是理所当然,但谁敢说自己学C的时候没有被这些问题困扰过?
当然这些并非C的缺陷,许多特性是Ritchie为了保持C的简洁以及对机器的控制力而有意为之,但却成了初学者纠缠的陷阱和前进的障碍。并不是说新生吃不得一点苦头,而是不应纠缠于语言细节,失去对编程思想的把握。这不仅分散了注意力,更重要的是扼杀了想象力!C终究是面向机器而不是面向人的编程语言。然而能够让编程者可以不用关心这些细节而把精力集中在解决问题上的编程语言是存在的,这样的语言才更适合初学者。
综上所述,我认为用C教初学者绝不合适。甚至,C++也不合适,因为上述的不利因素同样存在。至于Java,Joel
现在谈谈第二个问题:学习编程一开始的重心应该是编程方法而不是编程语言。“编程方法”这个词与“编程思想”、“编程风格”、“编程范式”以及“编程技术”都有相通甚至相同之处,因此下面我将混用这几个术语。
所谓编程方法,或编程范式,或编程思想,是指某一类典型的编程风格,为程序员看待问题和程序提供一个视角,也决定了程序员对程序执行的看法。编程方法也可以理解为通过编程解决实际问题的方法。通常一个编程语言会支持一或多种编程范式。不同的编程范式能有效处理不同的问题,而有一些编程范式能处理的问题域比较大,因此广为流行(如结构化编程)。
脱离编程语言谈编程方法是不切实际的,而忽略编程方法则无法用手上的语言设计出能有效解决问题的程序。编程方法虽然受制于编程语言的表示,却能够跨越编程语言的边界,因此编程方法的抽象层次要高于编程语言。初学者理应站在比较高的层次上开始学习生涯,原因是这样能够尽早接触程序设计的核心:用计算机解决实际问题。既然是核心知识,为什么不让学生更早地掌握呢?反观现在的课程大多数只是让学生在语言细节中挣扎,却忽视了更重要的知识。
我的想法是学校应该为一年级新生设计这样一门编程导论课程:基于某个编程语言来教授编程方法。这种语言应该非常简单,只用2到3个课时就能让零基础的学生学会用;但这种语言同时要足够强大到能够展现各种编程方法,这门课的大部分时间让学生学习程序设计法方法。
说了这么多,以编程思想为先的教学不仅有好处,更重要的是:这是可行的。前面说到存在让编程者集中精力解决问题的语言,Scheme就属于这样的语言,足够简单也足够强大。Scheme有多简单呢?美国有个ProgramByDesign计划,在数目超过600所的高中教授编程,对,高中。网上有许多Scheme的简明教程(宋国伟先生的Scheme语言概要(上)(下)就很不错,米国人也有很好的教程),这些教程的内容放在课堂上,也不会超过2到3个课时,但足够学生用这些简单的语言元素去学习和掌握编程方法。
——TT