學習程式設計之前一定要學習數學嗎? - CACM

banq發表於2021-06-28

人們曾經認為人生學習的第一種程式語言很重要,但是現在上下文情況完全不同了,人們不必一定要學習數學以後才開始學習程式設計,而是可以直接從學習程式語言開始。學習數學可以成為更好的程式設計師,但是學習程式設計的大多數人都不想成為更好的程式設計師,專業程式設計師和電腦科學家只是其中的一小部分,而且電腦科學專業CS畢業的學生往往是為了找工作,而不是成為最好的程式設計師,甚至都不是專業程式設計師,更別談電腦科學家了:
專家一直在研究當學生在 Python 和 Java 之間遷移時哪些知識會轉移,哪些不會轉移(請參閱此處的論文),研究認為:當我們考慮為非 CS 專業的學生教授程式設計時,第一種程式語言尤為重要。如果學生想成為資料科學家,R 或 Python 比學習C更有意義,但是,並非今天學習程式設計的每個人都希望或需要像電腦科學家那樣輕鬆地切換語言的能力。
過去,人們侷限於這樣一個教授程式設計的思路:學習第一種語言需要能開發出語義概念和特定語法知識,而學習第二語言只涉及學習新的語法即可。這個想法的前提條件是假設這兩種都是保留相同的語義結構,但是實踐種人們還是可能學習具有完全不同語義的第二語言,例如 LISP 或 MICRO-PLANNER,則可能會發生與學習第一語言一樣困難或更難。所以,這種想讓程式設計師學習程式語言變得簡單的教程程式設計思路如今也許過時了。

為什麼第一種程式語言無關緊要? 
過去,當電腦科學這個領域還年輕時,第一種程式語言確實很重要:在 1960 年代後期首次定義 CS 課程時,重點是學習程式設計的數學基礎。如果我們根據學生已經知道的數學來教授程式語言的語義,那麼新的語法只是數學的新形式。數學家喜歡用不同的形式或不同的方法探索相同的想法。對於有很強數學背景的學生來說,第一種程式語言和未來的程式語言只是學生已經知道東西的不同符號而已。
但是今天,如果一位程式設計學習者並沒有學習過數學呢?如果他是六年級學生在數學課上掙扎還沒搞懂數學,而同時他正在上第一節 CS 課怎麼辦?如果圖形設計師試圖編寫了PhotoShop指令碼但避開數學課怎麼辦?如果編碼學習者是一個“討論式程式設計師”(參見此處的論文),他只希望能夠與程式設計師討論他們的任務與解決方案,但實際上並不想開發軟體,該怎麼辦?現代編碼學習者與 1970 年代的學習者大不相同啦。

因此,現在我們不必一定讓程式設計與數學相關,討論式程式設計師很難找到讓他們可以學習的資源,因為需要他們關注邏輯和數學(請參閱此處的論文),但我們可以幫助討論式程式設計師無需數學即可學習程式設計(請參閱此處的論文)。如果我們不期望學生程式設計前首先了解數學,我們就能夠教更多的人學習程式設計了。

 

駭客新聞網友
上面這篇文章試圖淡化數學,也許你確實可以教更多人程式設計,但如果他們學習和使用數學,他們會成為更好的程式設計師。
不過,今天學習程式設計的大多數人都不想成為更好的程式設計師,大多數學習程式設計的人是 K12 學生、終端使用者程式設計師或討論式程式設計師。專業程式設計師和電腦科學家只是其中的一小部分。是的,他們可能需要數學才能擅長併發程式設計。不是每個人都會做併發程式設計。
在沒有學習數學的情況下直接學習程式語言,最大問題是學生掌握以後就沒有什麼可比的,因此自然而然地認為該語言的設計決策反映了一些深刻的潛在真理,該語言是事情應該做的方式而不是其時代的產物和其設計師的特定目標。
為什麼人們調查發現:學生在將他們的程式設計基礎知識從一種語言轉移到另一種語言時遇到困難呢,也許是因為他們似乎一開始就沒有真正理解它們,這是教學和測試的失敗,並不是因為沒有學習數學而妨礙了他們轉移。
另外一方面,“程式設計基礎”因語言而異。難以想象,一個學習 Python 程式設計的學生會開發出與使用 C或 Haskell(對型別和語義理論的理解)的學生相同型別的基本理解。
大多數程式設計師並不是電腦科學家。即使大多數擁有電腦科學學位的人本質上也不是電腦科學家,他們強迫自己完成課程作業以便找到工作(主要是網路,幾乎不使用他們所教的任何東西)。
 
第一語言非常重要,我通常推薦 javascript,原因如下

  • - 它是 / 高度 / 可訪問的(任何帶有瀏覽器的計算機都可以編譯和執行 javascript - 你只需要讓瀏覽器載入檔案)
  • - 它與 C 風格語言共享許多語法(這使得遷移到其他語言更容易)
  • - 它在如何執行規則方面“放鬆”(現在,這是有爭議的,是否應該允許學習者擺脫以後會困擾他們的錯誤,或者是否應該讓學習者從一開始就步履蹣跚並被迫精確, IMO 前者比後者更容易讓人們提高技能)
  • - 它(目前)具有商業價值(也就是說,你可以在你的簡歷上找到一份使用 javascript 的工作)

 
我的軼事經歷:
  • 我在大學裡上一節非常乏味的 Java 課:這太糟糕了!我夢想讓計算機做一些有趣的事情,但結果證明程式設計很爛,而且學習起來很無聊!(我最終退出並走上了不同的道路)
  • 20 年後,我從各種免費的線上資源中自己學習 Python:這太不可思議了!我可以讓計算機做任何事情,這一切都有意義!我還能學到什麼?!?

對我來說,它需要擁有正確的入門語言和正確形式的資源才能完成(透過影片學習課程,因為我對某個主題很好奇,比課堂效果要好得多)。
 
作者似乎在暗示計算機教育正在進入這種狀態,在這種狀態下,學生成為專業人士的可能性很小。但我仍然認為,舊的語言教學系統仍有一席之地,並期待一些學生繼續在前沿做出貢獻。
 
第一語言應側重於入門。Python 在這方面工作得非常好。啟動最少,學生可以在幾分鐘內開始編寫功能程式碼。
後續語言應與其類的內容和重點相匹配(即 C 用於資料結構和演算法,C/C++/Rust 用於系統程式設計,Java/C#/C++ 用於 OOP 類,Haskell/Clojure/等用於函數語言程式設計類等)
 
目前大學中的程式設計教學狀況非常糟糕。大學現在的做法是,您可以用一種或兩種語言獲得一些超級基本的指導,然後剩下的一切都需要自己照顧。







 

相關文章