如何選擇教學(xué)語(yǔ)言
如果你正在教授編程課,你該用哪種語(yǔ)言呢?
我喜歡這個(gè)問(wèn)題,因?yàn)樗泻芏嗖诲e(cuò)的答案,彼此存在很大差異,不同的方法對(duì)于編程的理解有著不同的思考。
我在普林斯頓大學(xué)上的第一堂正式的編程課是COS 217,由優(yōu)秀老師Anne Rogers講解(當(dāng)時(shí)我覺(jué)得是可怕的)。這個(gè)課程采用C語(yǔ)言,這門課的聰明之處在于從機(jī)器開(kāi)始。我們不只是學(xué)習(xí)C,還學(xué)到了用來(lái)編程的機(jī)器是如何運(yùn)行的。我就是在這里首次接觸到了指令計(jì)數(shù)器、堆棧幀、寄存器和分級(jí)存儲(chǔ),太讓人振奮了。
C鼓勵(lì)你從機(jī)器開(kāi)始,而Scheme【注1】想讓你從計(jì)算的數(shù)學(xué)基礎(chǔ)開(kāi)始。你不需要理解λ演算【注2】,這得益于Scheme的簡(jiǎn)潔核心,你可以在此之上構(gòu)建豐富多彩的計(jì)算世界。其核心具有表現(xiàn)力,足以引入多種不同的語(yǔ)言,包括函數(shù)式語(yǔ)言與命令式語(yǔ)言、面向?qū)ο笳Z(yǔ)言和邏輯程序設(shè)計(jì)。
經(jīng)典課程是MIT的6.001,也就是熟知的SICP,計(jì)算機(jī)程序的構(gòu)造和解釋。悲劇的是,這節(jié)課在MIT網(wǎng)站已經(jīng)下線了,但是這本書還有,即使你多年前已經(jīng)完成了最后的計(jì)算機(jī)科學(xué)課程,它還是值得一讀的。
MIT用基于Python的課程取代了SICP,這體現(xiàn)了一種較廣的趨勢(shì)。根據(jù)Philip Guo的一項(xiàng)非正式研究所強(qiáng)調(diào)的,很多學(xué)?,F(xiàn)在教授Python,尤其是針對(duì)早期的入門課程。我對(duì)這個(gè)選擇有著復(fù)雜的感受。Python是一門非常友好的語(yǔ)言,但是這種友好性也附帶了一些問(wèn)題。
在一定程度上我覺(jué)得是比較明顯的,根據(jù)我的面試經(jīng)歷,應(yīng)聘學(xué)生選擇編碼的語(yǔ)言就是Python。在很多場(chǎng)合,Python是理想的面試語(yǔ)言,因其簡(jiǎn)潔、可讀性強(qiáng)的語(yǔ)法,在空間有限的白板上寫代碼,是完全可以接受的。不過(guò)我看到了,學(xué)習(xí)Python的學(xué)生經(jīng)常搞不清楚這門語(yǔ)言的、相當(dāng)粗略的語(yǔ)義模型。大量用Python編程的部分學(xué)生不能猜到Python的列表(list)是如何被實(shí)現(xiàn)的,更不要說(shuō)他們有能力解釋生成器或裝飾器之類的、語(yǔ)言特性的語(yǔ)義了。
這里真的不是說(shuō)Python不好。畢竟,存在一些偉大的工具,你可以完全不用理解其工作原理就可以把工作搞定。但是用不同的方式,Scheme和C鼓勵(lì)你從底層理解發(fā)生了什么,某種教學(xué)的力量就存在于此??傊瑢?duì)于早期的入門課程,特別是對(duì)于那些不打算最終成為計(jì)算機(jī)科學(xué)家或全職程序員的人來(lái)說(shuō),我認(rèn)為Python是一個(gè)不錯(cuò)的選擇。但是,對(duì)于這種情況之外使用Python,我是持保留態(tài)度的。
就個(gè)人而言, 我感到想當(dāng)被鼓勵(lì)的一個(gè)進(jìn)展就是靜態(tài)類型語(yǔ)言的出現(xiàn),特別是ML語(yǔ)言【注3】做為教學(xué)語(yǔ)言。在過(guò)去的幾年,我非常榮幸地訪問(wèn)了布朗大學(xué)、康奈爾大學(xué)、賓夕法尼亞大學(xué)、卡內(nèi)基梅隆大學(xué)和哈佛等學(xué)校,并發(fā)表演講,這些學(xué)校使用Ocaml和Standard ML兩種方言。
ML語(yǔ)言已經(jīng)具備了優(yōu)秀理由的基礎(chǔ)。首先,它分享了很多Scheme優(yōu)雅的編程思想,即使它的核心不像Scheme那樣有著迷人的簡(jiǎn)約。但是ML比Scheme有更廣的延伸,因?yàn)槟憧梢韵驅(qū)W生展示編程里的類型化角色。盡管有著更廣的延伸,OCaml和SML屬于相對(duì)簡(jiǎn)單的語(yǔ)言,用于教學(xué)而不是日常應(yīng)用,才是最重要的。
我看到很多語(yǔ)言上的選擇,唯一不能讓我自己接受的是Java。當(dāng)然,Java是廣泛使用的業(yè)內(nèi)語(yǔ)言,但不代表它就是一門優(yōu)秀的教學(xué)語(yǔ)言。在我看來(lái),教學(xué)語(yǔ)言的關(guān)鍵要素是簡(jiǎn)潔,我剛才提到的所有其它選擇都有著某種方式的簡(jiǎn)潔:C是機(jī)器之上的最少的層;Scheme和ML是基于計(jì)算的簡(jiǎn)單數(shù)學(xué)模型;Python是易于使用的語(yǔ)言。
從各種角度說(shuō),Java都不簡(jiǎn)潔。尤其不容易入門,你需要告訴學(xué)生,所有細(xì)節(jié)可以忽略而不是理解。(是的,public static void main,我看到了?。┧鼪](méi)有C的簡(jiǎn)單、透明的執(zhí)行模式。像Scheme和ML核心的、優(yōu)雅計(jì)算機(jī)核心演算,是根本看不到的。我能看到Java的唯一真正優(yōu)勢(shì)在于好找工作,好像對(duì)我來(lái)說(shuō)還不能算足夠的論據(jù)。
當(dāng)你考慮挑選一門教學(xué)語(yǔ)言時(shí),你不只是為學(xué)生挑選一些在課堂上編程的指令。你正在挑選一種智力上的思想,學(xué)生將從中看到你教給他們的所有經(jīng)驗(yàn)。你應(yīng)該認(rèn)真地找到這個(gè)思想。
- 原文地址:https://blogs.janestreet.com/how-to-choose-a-teaching-language/
- 注1:Scheme是一種函數(shù)式編程語(yǔ)言,是Lisp的兩種主要方言之一(另一種為Common Lisp)。不同于Common Lisp,Scheme遵循極簡(jiǎn)主義哲學(xué),以一個(gè)小型語(yǔ)言核心作為標(biāo)準(zhǔn),加上各種強(qiáng)力語(yǔ)言工具(語(yǔ)法糖)來(lái)擴(kuò)展語(yǔ)言本身。http://zh.wikipedia.org/wiki/Scheme
- 注2:λ演算(英語(yǔ):lambda calculus,λ-calculus)是一套用于研究函數(shù)定義、函數(shù)應(yīng)用和遞歸的形式系統(tǒng)。http://zh.wikipedia.org/wiki/Λ演算
- 注3:ML 是一個(gè)通用的函數(shù)式編程語(yǔ)言,它是由愛(ài)丁堡大學(xué)的Robin Milner及他人在二十世紀(jì)七十年代晚期開(kāi)發(fā)的。今天在ML家族中有好幾種語(yǔ)言:兩種主要的方言是Standard ML和Caml,其他的包括F# - 針對(duì)Microsoft .NET平臺(tái)的開(kāi)放研究項(xiàng)目。 ML中的思想影響了眾多的語(yǔ)言,例如Haskell,Cyclone和Nemerle。http://zh.wikipedia.org/wiki/ML語(yǔ)言
原文鏈接:http://www.labazhou.net/2014/11/how-to-choose-a-teaching-language/