學(xué)生的第一門編程語言應(yīng)該是什么?
“學(xué)生第一次開始學(xué)習(xí)計算機科學(xué)(computer science,CS)時,應(yīng)該從哪種編程語言開始學(xué)習(xí)?”這一問題一直讓教育工作者備受困擾。來自密歇根大學(xué)的計算機科學(xué)教授 Mark Guzdial 也對此進(jìn)行了大量思考與研究,然而其近期發(fā)表在《ACM 通訊》上的一篇文章則指出,他的兩個來自不同學(xué)校的 CS 同事都認(rèn)為,學(xué)生的第一門課程學(xué)習(xí)何種編程語言并不重要,重要的是 CS 的學(xué)習(xí)成果。因為如果學(xué)生很好地學(xué)習(xí)了這些概念,那么他們接下來就可以簡單地將其應(yīng)用到任何要學(xué)習(xí)的語言當(dāng)中。
對此,Guzdial 則在文中指出,當(dāng)這個領(lǐng)域還處于比較早期的階段的時候,這種想法或許是正確的。但那是在 20 世紀(jì) 60 年代末,課程剛剛建立的時候;而今天,所有不同年齡段和經(jīng)驗水平的學(xué)生都在學(xué)習(xí)如何編程,且他們最終都有著不同的需求。
對于這一問題,不同的大學(xué)也仍然有不同的答案,這從某種程度反映了他們的教學(xué)理念和看法。THENEWSTACK 指出,斯坦福大學(xué)在 2017 年就曾因其計算機科學(xué)專業(yè)的入門計算課程的一些變化引起了強烈的反響。
斯坦福大學(xué)的學(xué)生報紙報道稱,斯坦福大學(xué)計算機科學(xué)榮譽教授 Eric Roberts 花了五年時間致力于將該課程從 Java 過渡到 JavaScript,并最終創(chuàng)建了該課程基于 JavaScript 的新試驗版本。因此,該課程被命名為 CS106J,而不是 CS106A。這一變化涉及到創(chuàng)建新的教科書和作業(yè)、以及培訓(xùn)新的助教,Roberts 本人也從退休狀態(tài)中走出來教授該課。
此前,斯坦福大學(xué)的入門課程一直是基于 C 語言編程的(更早之前是 Pascal 語言)。然而在 2002 年,Roberts 通過編寫教科書、并與其他教師合作重組課程和作業(yè),幫助學(xué)校將課程轉(zhuǎn)向了 Java。根據(jù) Roberts 的說法,Java 很早就被設(shè)計為“互聯(lián)網(wǎng)語言”。但在過渡到 Java 十多年后,他又認(rèn)為,Javascript 已經(jīng)取代了 Java 作為網(wǎng)絡(luò)語言的地位。
現(xiàn)在,再次查看斯坦福大學(xué)的教學(xué)大綱,你會發(fā)現(xiàn) CS106A 似乎正在使用 Python(和 PyCharm IDE),而 CS106B 的教學(xué)大綱則表明他們正在使用 C++。
與此同時,哈佛大學(xué)自己的入門課程 CS50 多年來則一直堅持使用多語言方法。在第一周,學(xué)生們采用 Scratch 編寫程序,之后切換到 C 語言;接著在后面幾周再次切換到 Python,再然后是 JavaScript。該課程的官方 FAQ 解釋稱,"CS50 不是只教一種語言,而是向?qū)W生介紹一系列'程序性'編程語言,每一種都是在概念上建立的。最終的目標(biāo)是讓學(xué)生覺得他們不是'學(xué)會了如何在 X 中編程',而是他們'學(xué)會了如何編程'。 "
至于為什么要從 C 語言開始,該課程的講師 David J. Malan 教授則認(rèn)為,學(xué)習(xí) C 語言的幾周讓學(xué)生有機會了解所有編程語言的一些基本構(gòu)件,同時也提供了解釋緩沖區(qū)溢出這一關(guān)鍵安全概念的機會。
"我認(rèn)為在一周時間內(nèi)用 C 語言實現(xiàn)一個哈希表(或 trie),然后在一周左右后僅用一行 PHP 或 JavaScript 代碼就能實現(xiàn)同樣的內(nèi)容,這也是一件很強大的事情"。此外,C 語言也是一種相對較小的語言,所以 "到了學(xué)期中期,學(xué)生們幾乎已經(jīng)了了解到了所有的東西(除了 unions 和函數(shù)指針)。"
不過,ACM Communications 的一篇文章指出,截至 2014 年,Python 已經(jīng)成為美國頂級計算機科學(xué)課程(包括麻省理工學(xué)院和加州大學(xué)伯克利分校)的入門課程中最受歡迎的語言。具體來說,排名前 10 位的 CS 系中有 8 個(80%),排名前 39 的系中有 27個(69%)在 CS0 或 CS1 的入門課程中教授Python。Java 緊隨 Python 之后,其次分別是 MATLAB、C、C++,然后是 Scheme 和 Scratch。
2016 年,三位英國研究人員進(jìn)行的一項調(diào)查則指出,在英國大學(xué)中,使用 Java 的課程是 Python 的兩倍多。“盡管事實上,相同的受訪者認(rèn)為 Python 更容易教學(xué)和學(xué)習(xí)”。對此,研究人員引用的一個可能的解釋是:由社區(qū)指數(shù)衡量的長期的行業(yè)流行。
而溫斯頓-塞勒姆州立大學(xué)的三位研究人員在 2019 年為 ACM 的計算機科學(xué)教育小組撰寫的一篇論文中甚至認(rèn)為,每個計算機科學(xué)學(xué)生也應(yīng)該掌握大數(shù)據(jù)和云計算的基礎(chǔ)知識,并擁有一些在云中部署和管理大數(shù)據(jù)應(yīng)用程序的實踐經(jīng)驗。還提出,與其單獨開設(shè)云計算課程,不如將這些材料整合到多個本科計算機科學(xué)課程中。
根據(jù)英國研究人員的說法,向初級程序員教授什么仍然是一個重要問題。他們的論文認(rèn)為,不能輕易掌握編程幾乎肯定意味著不能在計算機科學(xué)領(lǐng)域取得進(jìn)展。并指出,因此自從大學(xué)開始進(jìn)行計算機科學(xué)教學(xué)以來,先教哪種語言的問題一直存在著激烈的爭議。
密歇根大學(xué)教授 Guzdial 則仍然認(rèn)為,學(xué)生從哪種語言開始學(xué)習(xí)是很重要,但他也希望教育工作者重新審視一個形成性假設(shè)。他在自己的 ACM 文章中回顧了 1979 年的一項研究,該研究認(rèn)為,一旦學(xué)生學(xué)會了更廣泛的語義概念,他們就可以將其應(yīng)用于任何后續(xù)語言(只需要掌握相對容易的語法差異)。
但是 Guzdial 指出,在那個時代,大多數(shù)計算機科學(xué)的學(xué)生都是傳統(tǒng)的大學(xué)生。早期進(jìn)入計算機科學(xué)的學(xué)生通常比今天學(xué)習(xí)編碼的普通學(xué)生具有更強的數(shù)學(xué)背景。因此,早在 20 世紀(jì) 70 年代末,教育工作者可能高估了轉(zhuǎn)換編程語言的難度,因為他們最終只是在已經(jīng)理解的數(shù)學(xué)基礎(chǔ)上教授編程。
Guzdial 認(rèn)為,如果我們根據(jù)學(xué)生已經(jīng)知道的數(shù)學(xué)來教授編程語言的語義,那么新的語法只是一種新的數(shù)學(xué)形式主義。我們沒有必要讓編程與數(shù)學(xué)有關(guān),如果我們不期望學(xué)生首先了解數(shù)學(xué),也許早在 40 多年前就能期望更多的人學(xué)習(xí)編程。
本文轉(zhuǎn)自O(shè)SCHINA
本文標(biāo)題:學(xué)生的第一門編程語言應(yīng)該是什么?
本文地址:https://www.oschina.net/news/149329/students-first-programming-language