英文原文:How to choose a teaching language
译/腊八粥
如果你正在教授编程课,你该用哪种语言呢?
我喜欢这个问题,因为它有很多不错的答案,彼此存在很大差异,不同的方法对于编程的理解有着不同的思考。
我在普林斯顿大学上的第一堂正式的编程课是 COS 217,由优秀老师 Anne Rogers 讲解(当时我觉得是可怕的)。这个课程采用C语言,这门课的聪明之处在于从机器开始。我们不只是学习C,还学到了用来编程的机器是如何运行的。我就是在这里首次接触到了指令计数器、堆栈帧、寄存器和分级存储,太让人振奋了。
C 鼓励你从机器开始,而 Scheme【注1】想让你从计算的数学基础开始。你不需要理解λ演算【注2】,这得益于 Scheme 的简洁核心,你可以在此之上构建丰富多彩的计算世界。其核心具有表现力,足以引入多种不同的语言,包括函数式语言与命令式语言、面向对象语言和逻辑程序设计。
经典课程是 MIT 的 6.001,也就是熟知的 SICP,计算机程序的构造和解释。悲剧的是,这节课在 MIT 网站已经下线了,但是这本书还有,即使你多年前已经完成了最后的计算机科学课程,它还是值得一读的。
MIT 用基于 Python 的课程取代了 SICP,这体现了一种较广的趋势。根据 Philip Guo 的一项非正式研究所强调的,很多学校现在教授 Python,尤其是针对早期的入门课程。我对这个选择有着复杂的感受。Python 是一门非常友好的语言,但是这种友好性也附带了一些问题。
在一定程度上我觉得是比较明显的,根据我的面试经历,应聘学生选择编码的语言就是 Python。在很多场合,Python 是理想的面试语言,因其简洁、可读性强的语法,在空间有限的白板上写代码,是完全可以接受的。不过我看到了,学习 Python 的学生经常搞不清楚这门语言的、相当粗略的语义模型。大量用 Python 编程的部分学生不能猜到 Python 的列表(list)是如何被实现的,更不要说他们有能力解释生成器或装饰器之类的、语言特性的语义了。
这里真的不是说 Python 不好。毕竟,存在一些伟大的工具,你可以完全不用理解其工作原理就可以把工作搞定。但是用不同的方式,Scheme 和C鼓励你从底层理解发生了什么,某种教学的力量就存在于此。总之,对于早期的入门课程,特别是对于那些不打算最终成为计算机科学家或全职程序员的人来说,我认为 Python 是一个不错的选择。但是,对于这种情况之外使用 Python,我是持保留态度的。
就个人而言, 我感到想当被鼓励的一个进展就是静态类型语言的出现,特别是 ML 语言【注3】做为教学语言。在过去的几年,我非常荣幸地访问了布朗大学、康奈尔大学、宾夕法尼亚大学、卡内基梅隆大学和哈佛等学校,并发表演讲,这些学校使用 Ocaml 和 Standard ML 两种方言。
ML 语言已经具备了优秀理由的基础。首先,它分享了很多 Scheme 优雅的编程思想,即使它的核心不像 Scheme 那样有着迷人的简约。但是 ML 比 Scheme 有更广的延伸,因为你可以向学生展示编程里的类型化角色。尽管有着更广的延伸,OCaml 和 SML 属于相对简单的语言,用于教学而不是日常应用,才是最重要的。
我看到很多语言上的选择,唯一不能让我自己接受的是 Java。当然,Java 是广泛使用的业内语言,但不代表它就是一门优秀的教学语言。在我看来,教学语言的关键要素是简洁,我刚才提到的所有其它选择都有着某种方式的简洁:C是机器之上的最少的层;Scheme 和 ML 是基于计算的简单数学模型;Python 是易于使用的语言。
从各种角度说,Java 都不简洁。尤其不容易入门,你需要告诉学生,所有细节可以忽略而不是理解。(是的,public static void main,我看到了!)它没有C的简单、透明的执行模式。像 Scheme 和 ML 核心的、优雅计算机核心演算,是根本看不到的。我能看到 Java 的唯一真正优势在于好找工作,好像对我来说还不能算足够的论据。
当你考虑挑选一门教学语言时,你不只是为学生挑选一些在课堂上编程的指令。你正在挑选一种智力上的思想,学生将从中看到你教给他们的所有经验。你应该认真地找到这个思想。