本文已经纳入编程语言应该学些什么,作为引子。
我国绝大多数高校,是从C语言教学开始的。从数据抽象、行为抽象的角度看,C语言并不是合适的入门级编程语言(后面再解释)。现行教学体系中,编程类课程有一个存在很久的问题:语法派的教学。教学方式上,很多人不是在讲授如何编程,而是在讲一门语言的语法。
以谭浩强先生为代表的教学体系,就是语法派的教学。他们常常从最开始就错了:变量与常量——这两个概念为什么放在一起讲?而且要求学生死记硬背一些乱七八糟的东西,例如printf,i+++i、0[array]之类;看看他们的书,一本书几百个#include <stdio.h>、main...。这些传统,一直延续到C++和Java教学中。
直到讲面向对象编程了,偏偏使用C++。至少教学用的C++版本,是很不适合教学的,它不是简明而自然的体系。更加离谱的是,教学中一上来就是“Animal a;",这个东西——说a,有的垃圾Java书籍中也称之为对象。我有理由怀疑,他们可能真的不知道“Animal a;”干了什么。在我讲OOD时,要求学生不得随意使用new创建对象——因为要针对接口编程,更别说在栈中创建对象了。栈中创建的对象,必然属于具体类,如果它的子类有新数据,只得阉割...不敢多态...在介绍对象抽象时,将指出面向对象教学中更多的问题。
现在有些学校讲授Python,按照我的判断,又会把它当成C来讲。
超越具体的某种编程语言,考虑一下,什么是变量(variable)?变量是一种标识符(identifier),一个软件实体的名字。在C/Java语言中,变量表示一个存储场所,是源代码中保存值的符号化地址。一些垃圾教材称变量是其值可变的量,这种说法有两个问题。(1)变量的反面——其值不可变的量,其实不是文字/常量,而是命名常量。例如:public static final int X = 123。(2)这种说法对学习其他语言构成障碍。例如函数式语言的变量,C++中的“Animal a;"。
经过上面的啰啰嗦嗦,在讲授一门语言时,应该介绍什么呢?我认为,简单地说,三大抽象(如果是面向对象的语言)+其编程范式。