幫你提升 Python 的 27 種程式語言

oschina發表於2015-10-23

27 種語言

  • 過程型程式語言: C, Rust, Cython
  • 物件導向資料建模語言: Java, C#, Eiffel
  • C 的物件導向衍生語言: C++, D
  • 面向陣列的資料處理: MATLAB/Octave, Julia
  • 統計數資料分析: R
  • 計算型管道建模: Haskell, Scala, Clojure, F#
  • 事件驅動程式設計: JavaScript, Go, Erlang, Elixir
  • 漸變型別: TypeScript
  • 動態超程式設計: Hy, Ruby
  • 實用問題解決: Lua, PHP, Perl
  • 計算型思維: Scratch, Logo

作為這個世界上最流行的程式語言之一的合作設計者,我經常遇到一種令人非常沮喪的行為( Python 社群和其它領域中都存在)就是社群中有影響力的人嘗試去在其它開源社群中灌輸對於”缺失“的恐懼感,並以此驅動別人對本社群做出貢獻(我自己偶爾也會做出這樣不當的行為,當別人掉進這個陷阱時我也更容易覺察出來)。

雖然借鑑其他程式語言社群的經驗是一件好事,但用基於恐懼的方法來推動行動有很大問題,社群成員為了吸引程式碼貢獻者的注意,容易把其他社群的成員視為競爭對手,而不是作為潛在的盟友共同迎接挑戰,推動軟體開發技術的進步。還會導致社群排斥那些喜歡其他程式語言的人,把他們當做敵人。

事實上,我們希望有更豐富的跨平臺開源程式語言可供選擇,程式語言是最重要的思維工具,可以把我們的想法轉換成計算機能理解的明確的條款。如果人們發現了某種語言既適合他們的大腦又能直接解決問題,這就很好了,不必關心他們到底選的是那種語言。

因此我要給 Python 社群提三個具體的要求和一個更廣泛的建議,首先說這些要求:

1.當我們想要激勵部落成員,提高社群吸引力時,我們不應該使用恐懼法,相反我們應該使用自豪法。當使用恐懼法激勵時,比如說這樣的話:“如果我們不解決問題 X,那麼 Python 開發者將會減少,他們將會轉而去使用語言 Y”,那麼我們就在故意地向全世界自由貢獻程式碼的人傳遞負能量。但如果我們使用自豪法,說出來的話將是這樣的:“Python 中的問題 X 的確難以解決,看看語言 Y 的社群,他們用一個極好的方法解決了這個問題,我們也可以在 Python 中嘗試這個解決方案,以同樣優雅的方式解決 Python 中的問題”。積極地強調“以我們自己的努力為自豪”,有利於促進 Python 社群中不斷學習的文化,還會不斷促進與其他社群關係的發展。

2.剋制對其他程式語言社群蔑視的態度,特別是對那些有大牛存在,能自己解決遇到的問題,不必等待商業軟體供應商屈尊解決問題的社群。世界上的大多數重要的問題都不是利益驅動的問題(那些人想要解決問題,不是為了謀取財富,也沒有機構出錢資助他們),所以我們應該鼓勵和讚揚那些加緊嘗試解決問題的人。不必管他們使用的是什麼技術。

3.如果我們認識的人剛開始學習程式設計,即使他們所選的程式語言是我們自己所不喜歡的。我們也要支援他們,因為他們比我們清楚什麼更適合他們的大腦。所以對我們合適的語言不一定適合他們。如果他們開始對當初的選擇感到沮喪,以至於完全打消了他們學習程式設計的積極性,這時給他們推薦程式語言才更有意義。這個建議甚至也對我們當中做過改進網路安全方面工作的人有用,對於原本不安全的語言,我們的解決方式是,通過改善作業系統中的沙盒功能,漸進地破除這個語言選擇障礙,用原生系統的安全屬性,改善了程式語言預設行為,不應該從應用安全的角度評價程式語言的好壞,迷惑初學者。(如果有人請程式設計新手寫了一個未經審計的軟體,卻部署為處理安全敏感的問題,這不是程式設計師的問題,而應該怪那個部署的人沒有盡職調查軟體的來源和安全屬性。)

我更多的建議是針對人開始遭遇 Python 的核心程式集的境界,也因此開始探索更多的 Python 自身的“思維工具”。

我們做 Python 核心開發過程的一部分事情是由於領會的特點具有在其他語言我們具有優勢,是否能夠用一種合適的方式讓 Python 程式碼容易讀寫。這意味著學習別的程式語言能夠明確特定的風格,並且在 Python 中程式設計提高人對軟體開發的認識。

為了有助於這樣的努力, 我已經列出了下面可供探索的領域,還有一些對這些領域可能提供額外見解的語言。我儘可能的連結到 Wikipedia 頁面而不是直接轉向相關的首頁,因為維基百科經常會給出一些有趣的歷史背景,當選擇一門新的程式設計言作為一項學術型的練習而不是被立即用來實踐性使用的時候,這些背景值得去探索。

然而就我個人而言, 我熟悉許多的程式語言(並且已經使用了其中的一些進行開發生產系統) 。所有的推薦包括我間接瞭解的語言(或通過閱讀一些材料和設計文件,又或者是從和我信任的朋友之間的交流中得知一門語言的優勢和劣勢)。

本應該有很多的與沿出現在名單之中,但是對於列出來的這些特定的語言只是隨意的一些子集,它們從某些程度來講是基於我自己的興趣而選出來的(比如說:我主要的興趣點在於佔支配地位的Linux,Android 和 Windows生態系統,所以在這裡我就忽略了封閉但是更加有利可圖的以 Apple 為中心的 Objective-C 和 Swift 程式語言,而且我對於專注於藝術環境的程式語言就不太瞭解,如Processing,我甚至需要猜測從其中學到的東西怎麼樣可以指導一個 Python 開發者)。對於一個更全面的程式語言名單而言需要考慮很多因素,除了考慮一個程式語言能夠指導你成為一個開發者外,IEEE Spectrum 的一年一度關於程式語言流行度和增長的排名也非常值得了解一下。

程式導向程式語言 C,Rust,Cython

Python 預設的執行模型是過程型的:我們從主模組的頂部開始然後一句一句執行。所有的 Phthon 對於其他資料和計算模型的方法支援都是基於它是過程型的這一特性。

C 語言毫無疑問仍然是底層程式語言的統治者. 它是實現 Python 直譯器的核心語言,同樣也是實現 Linux 作業系統核心的核心語言。作為軟體開發人員,學習 C 語言是學習更多關於軟體所執行的底層硬體的最好起點 - C 語言經常被描述為“可移植的組合語言”,通常使用 C 語言編譯器作為交叉編譯器,為新的 CPU 體系結構編譯出第一個應用程式。

Rust,相比之下, 是一個由 Mozilla 建立的比較新的語言。它能夠進入這個名單的原因是,Rust 吸取了工業界已知的關於不能在 C 語言中做什麼的教訓,並且被設計成可以與 C 庫互操作的語言,它對硬體的控制達到了和低階系統程式語言相同的精度,但它使用不同的編譯時方法進行資料建模和記憶體管理,在結構上消除了許多常見的困擾 C 程式的的缺陷(比如快取溢位、重複釋放記憶體錯誤、空指標訪問以及執行緒同步問題)。我是一名嵌入式系統工程師,通過培訓具備了最初的專業經驗,我已經看到,當前被 C 語言和定製彙編程式碼統治的各個領域很有可能會被 Rust 取代。

Cython 也是一種預設的更底層的語言,但是與通用目標語言 C,Rust 不同,Cython 主要用於書寫 CPython 擴充套件模組。Cython 被設計作為一個 Python 的超集,讓程式設計師選擇何時支援純 Python 語法的靈活性,當 Cython 語法支援的擴充套件使其可以生成的程式碼相當於本地C程式碼的速度和記憶體效率。

學習這些語言之一是以實用的角度增強其對記憶體管理,演算法效率,二進位制介面相容性,軟體可移植性,將原始碼轉換成執行系統的深刻理解。

物件導向的資料建模: Java, C#, Eiffel

程式設計中最主要的任務之一是為現實世界的狀態建模,這方面最通常的方法是面嚮物件語言所提供的那些原生的語法支援:把資料結構、操作這些資料結構的方法組合成類。

Python原生設計上就可以直接使用物件導向的特性,而不需要一上來先學習如何編寫自己的類。不是每種語言都才有這樣的方式 - 對於本節列出的這些語言,學習物件導向的設計思想是使用這些語言的前提。

得益於 Sun Microsystems 在 20 世紀 90 年代中後期對 Java 語言的市場推廣,Java 成了很多大專院校電腦科學入門課程的預設語言。雖然現在在很多教育領域它正被 Python 淘汰,但它在商業應用程式開發領域仍然是一種最受歡迎的語言。有一系列其它語言針對公共的 JVM(Java 虛擬機器)執行時的實現,包括 Python 的 Jython 實現。Android 系統的 Dalvik 和 ART 環境是基於 Java 程式設計 API 實現的。

C# 在很多方面與 Java 相似,在 Sun 和 Microsoft 解決關於 J++(微軟實現的 Java 語言)和標準 JAVA 不一致的問題失敗後,它是作為J++的替代語言出現的。像 Java 一樣,它也是一個受歡迎的商業應用開發語言,有一系列其它語言針對共享 .NET CLR(公共語言執行庫)的實現,包括 Python 的 IronPython 實現(原始的 IronPython 1.0 中的核心元件被抽取出來建立 .NET 動態語言執行庫的中間層)。在很長的一段時間裡,.NET是隻能在 Windows 系統中使用的專有技術,有一個跨平臺的開原始碼 mono 重新實現了.NET,但在 2015 年初,微軟宣佈了 .NET 開源計劃。

與列表裡大多數語言不同,我並不推薦在日常使用 Eiffel。它之所以在推薦列表裡,是因為這門語言有著大量優良的物件導向設計思想,包括以“正確可信”作為程式的設計目標。(同時,Eiffel 也告訴我對於大多數的軟體開發,並沒有以“正確可信”為設計目標,這是因為正確可信的軟體確實無法妥善處理不確定的情況。當很多相關約束還不清楚,需要在不斷迭代的過程中去逐步完善的時候,這種設計理念就完全不適合了)

學習這類程式語言,就需要去熟悉繼承模型、契約設計、類不變項、前置條件、後置條件、協變(covariance)、逆變(contravariance)、方法查詢路徑、泛型程式設計,以及其他各種在 Python 的型別系統上也支援的特性。此外還有很多標準庫模組和第三方框架,會用到“顯示的物件導向”設計風格,例如 unittest 和 loggingmodules,以及 Django 框架裡基於類的 view。

物件導向的 C:C++, D

使用 CPython 的一種方式,是把它的核心當做一種“包含物件的 C 語言”的程式設計環境 – CPython 是通過 C 語言的風格去實現物件導向程式設計,也就是用 C 的結構體描述資料,然後把結構的例項指標作為第一個引數傳給那些資料處理函式(也就是 CPython的C 裡面的 omnipresentPyObject* 指標)。這種設計模式被有意複製到 Python 裡,在例項方法和類方法需要顯示的指定 self 或者 cls 引數。

C++ 的目標是在原始碼級完全相容 C 語言,在此之上增加了一些高階特性,例如原生的物件導向程式設計支援和基於模板的元程式開發。C++ 的晦澀和複雜是臭名昭著的(即使 2011 年的語言標準的更新解決了大量最糟糕的問題),不過就算這樣,C++ 仍然是很多場景下的選擇,包括 3D 建模圖形引擎和跨平臺應用開發框架,如 Qt。

D 程式語言也很有趣,因為它和 C++ 的關係很像 Rust 與 C 語言之間的關係:設計 D 語言的目的是,既要保留 C++ 的大部分優點,也要避免 C++ 中存在的很多缺陷(比如缺乏儲存安全性)。與 Rust 不同,D 語言不是一個從零開始設計的全新程式語言,相反,它是直接從 C++ 衍生出來的語言,儘管它不像 C++ 那樣是 C 語言的嚴格超集,但它遵守一個設計原則,任何落入 C 語言和 D 語言公共子集中的程式碼,在兩種語言中的行為必須相同。

學習這些語言有利於深刻理解把高階語言特徵和底層 C 執行時模型相結合的複雜性。學習 C++ 也有助於使用 Python 操作已有的用 C++ 編寫的庫和工具包。

面向陣列的資料處理: MATLAB/Octave, Julia

面向陣列的程式設計用於數值程式設計模型:基於矩陣代數和相關的數值方法。

雖然 Python 的標準庫並沒有直接支援,不過在語言設計上已經做了考慮,一系列語法和語義上的功能支援,有助於第三方庫 NumPy 以及類似的面向陣列的工具。

在很多情況下,Python科學計算 軟體系列都被當做專用的 MATLAB 程式設計環境的替代者,被廣泛用於科學和工程上的建模、模擬和數值分析。開源專案 GNU Octave 的目標是在語法上與MATLAB程式碼相容,讓人可以比較物件導向程式設計的這兩種方式。

Julia 是另一個相對較新的語言, 它的主要特點是支援面向陣列程式設計和基於型別的函式過載.

學習一種這樣的語言有助於深入理解 Python 科學計算工具包的威力,同時,學習這樣的語言有助於研究如何利用 OpenCL 和 Nvidia 的 CUDA 等類似的技術實現硬體級併發執行,也有助於研究如何使用 Apache Spark 和 Blaze 等資料處理框架實現分散式資料處理。

統計資料分析語言: R

由於有越來越多的大資料集需要處理。因此需要一種免費的能處理這樣的資料集的分析工具,程式語言 R 就是一種這樣的工具,它特別注重統計資料分析和視覺化。

學習 R 語言有助於深入理解 Python 科學計算工具包的統計功能,特別是其中的資料分析庫 pandas 和統計視覺化庫 seaborn 。

計算管道建模語言:Haskell, Scala, Clojure, F#

物件導向資料建模和麵向陣列資料建模主要用於對資料進行靜態建模,有兩種建模方式,一種是把資料儲存在物件的各個屬性中,另一種是把結構化的資料儲存為陣列。

相比之下,函數語言程式設計語言更強調以計算流的形式對資料進行動態建模。只要學一下函數語言程式設計基礎,就會顯著提高使用資料轉換操作對資料建模的能力,這對於使用其他正規化的程式語言(比如程式導向、物件導向、面向陣列的程式語言)開發應用程式也是有幫助的。

Haskell 是一個函數語言程式設計語言,對 Python 的設計產生過重大的影響, 最明顯的就是 Python 2.0 引入的列表解析。

 

Scala 毫無疑問是基於JVM的函數語言程式設計語言,與Java, Python和R一樣,是Apache Spark資料分析平臺的四門主要程式語言之一。在設計上支援函數語言程式設計方式的同時,Scala的語法、資料模型和執行模型在設計上儘量避免為原有的Java程式設計師帶了太大的障礙(從這個角度上看,Scala更恰當的分類應該是有著強函式式語言支援的物件導向的程式語言)。

Clojure是另一門基於JVM的函數語言程式設計語言,被看作是Lisp的一個變種。它在我們的清單中具有一席之地,是因為它為Python的函數語言程式設計工具箱toolz的實現帶來靈感。

我自己對F# 並不熟悉,不過由於它是 .NET CLR 推薦的語言,所以還是值得關注的。

學習這些程式語言,有助於瞭解 Python 自身的計算管道建模工具,包括容器推導表示式、生成器、生成器表示式、functools 和 itertools 標準庫模組,和第三方函式式 Python 工具如 toolz。

事件驅動程式語言:JavaScript, Go, Erlang, Elixir

計算管道是處理資料轉換和分析問題的一種很好的方法,不過很多問題需要程式以持久的方式執行,等待事件發生,然後處理這些事件。對這類服務,通常可以併發的處理多個事件,來實現同時為多個使用者(或者至少多個行為)提供服務。

JavaScript 最初是為瀏覽器開發的事件處理程式語言,可以讓 web 開發人員處理客戶端本地的使用者行為(例如滑鼠移動和按鍵)和事件(例如頁面渲染結束)。所有現代的瀏覽器都支援 JavaScript,與 HTML5 的 DOM 一起,已經成為使用者介面的外觀和行為事實上的標準。

Go 是Google設計出來的,設計這個語言的目的是為了建立高度可擴充套件的網路服務,Go語言非常適合開發命令列程式。從設計程式語言的角度看,最引人注目的是Go語言在它的核心併發模型中使用了“順序通訊過程(Communicating Sequential Processes)”這一概念。

Erlang 是愛立信設計出來的,設計這個語言的目的是為了製造高度可靠的電話交換機以及類似的裝置,著名的開源框架RabbitMQ的訊息伺服器就是用Erlang實現的。Erlang使用Actor模型實現了核心併發原語,不允許不同執行緒直接共享資料,執行緒間的通訊只能靠傳遞訊息。儘管我自己從來沒有使用過Erlang語言, 但我的第一份工作涉及到了一個基於Actor模型開發的併發框架,它是一個前愛立信工程師用C++開發的,我自己也基於TSK(任務)和MBX(郵箱)原語開發過這樣的框架,是在德州儀器的輕量級DSP/BIOS執行時(現在叫TI-TROS)中實現的。

Elixir 能夠出現在這個名單中的理由是,雖然它執行在Erlang虛擬機器中,與程式語言Erlang具有相同的併發語義,但它也包含了一系列額外的語言級特徵,提供了更全面的開發環境,更容易吸引從其他程式語言(比如Python、Java或Ruby)轉過來的開發者。

學習一種這樣的語言有助於深入理解Python本身是如何支援併發和並行的,包括原生協程、基於生成器的協程、concurrent.futures和asyncio標準庫模組、第三方網路服務開發框架(比如Twisted和Tornado)、Django中新引入的channels概念和GUI 框架中的事件處理迴圈。

動靜混合型別: TypeScript

Python 3.5 引入的特性裡,最有爭議的一項是新的型別模組,為 Python 體系加上了混合型別的支援。

對於那些接觸過的靜態型別程式語言主要是 C, C++ 和 Java 的開發者來說,這簡直就是一個及其可怕的想法。

Microsoft 的 TypeScript 為 JavaScript 應用提供動靜混合型別支援,讓你對這個概念會有好一些的看法。TypeScript 程式碼會編譯成 JavaScript 程式碼(編譯後不包含任何執行時型別檢查),主流的JavaScript 庫的 TypeScript 註釋(annotations)在DefinitelyTyped程式碼庫裡可以找到。

正如 Chris Neugebauer 在澳大利亞 PyCon 大會的報告上指出的那樣,這很像是 Python 與型別提示庫 typeshed 以及類似 mypy 那樣的型別推導和分析工具之間的關係。

本質上,TypeScript 和 Python 的型別提示都是實現特定測試程式的方式,不管是獨立檔案(常規的測試程式),還是內嵌在主程式碼裡(類似靜態程式語言的型別宣告)。不管哪種情況,你都可以執行單獨的命令檢查剩餘的程式碼是否符合已知的型別約束(對於 JavaScript 和 TypeScript,在編譯階段會隱式的去完成,對於 Python 的型別提示,則是可選的靜態分析任務)。

動態元程式設計: Hy,Ruby

像 C、C++、C#、Java 這樣的程式語言給 Python 帶來的一個有點讓人不安特性是“程式碼即資料”:類似函式和類都是執行時物件,可以被其他物件操作。

Hy 是一個 Lisp 的變種,可以在 CPython 虛擬機器和 PyPy 虛擬機器上執行。Lisp 在“程式碼即資料”上做到了極致,Lisp 程式碼本身就是由描述需要實現的操作的巢狀的列表組成的(這門語言的名字就源自”LISt Processor”)。Lisp 風格的語言,最強大的一點是它們可以很輕鬆的實現自己的領域特定語言(DSL),不過這有時候也為閱讀其他人的程式碼帶來困難。

Ruby 在很多方面都與 Python 很類似,但是作為更為開放的社群,Ruby 更接受動態元程式設計,而對於 Python,這方面只是“支援,但不鼓勵”。這方面的功能包括重定義類加入一些方法,用閉包實現語言核心結構如迭代器。

學習這些語言可以幫助深入瞭解 Python 自身的動態元程式設計的支援,包括函式和類裝飾、monkeypatching(動態修改程式碼)、unittest.mock 標準庫模組以及第三方物件代理模組入如wrapt(我還沒找到什麼程式語言有助於瞭解 Python 的元類(metaclass),如果有人有好的建議,可以在評論裡告訴我。元類的高階特性包括核心型別、抽象基類、列舉型別和混合型別(動態型別和靜態型別混合)表示式的執行時執行)。

實用主義者:Lua, PHP, Perl

流行的程式語言通常並不是孤立的 —— 他們屬於龐大的生態系統的一部分(商業和社群都是這樣),此外還有終端使用者、框架開發者、工具開發者、教育人員等等。

Lua是一門流行的程式語言,主要作為指令碼引擎內嵌於大型的程式裡。值得一提的例子有,為魔獸爭霸遊戲客戶端編寫的外掛,在很多 Linux 發行版存在的 RPM 工具也內建了 Ruby。與 CPython 相比,Lua 執行時大小隻有其十分之一,並且它的弱反省(weaker introspection)的能力也能讓它更容易獨立於應用程式的其他部分和宿主作業系統。一個值得提到的來自 Lua 社群對 Python 生態系統的貢獻是,CPython 和 PyPy 採用 LuaJit FFI(Foreign Function Interface)作為其 JIT 友好的 cffi 介面庫的基礎。

PHP 是另一個受歡迎的程式語言,由於PHP擅長生成HTML頁面,被早期的虛擬伺服器主機提供商廣泛使用,因此它作為 LAMP stack(Linux-Apache-MySQL-PHP)的組成部分被廣為人知。儘管PHP在設計中存在很多令人苦惱的概念上的缺陷,它仍然成了很多著名的開源web 服務的基礎,包括Drupal內容管理系統、WordPress部落格引擎和支撐Wikipedia的MediaWiki引擎。PHP也能支撐很多重要的服務,比如眾包社群所使用的分散式事件報告平臺 Ushahidi。

和PHP一樣,Perl 也是Linux系統上的一個受歡迎的語言,與PHP不同,Perl不是作為網站開發平臺被人熟知的,它更常見的用途是作為系統管理員管理系統的工具,它既能使用正規表示式處理字串又能處理基於文字的Linux作業系統命令的輸出結果。只使用Perl就能處理所有的任務,不需要再使用Whensh、awk和sed等工具了。

學習其中的一門語言並不能提供任何好的見解在審美上漂亮或者在理念上簡潔的程式語言設計。可能的結果是在實踐中提供一些程式語言的結構和採納的知識,以及瞭解關於偶然的機會、歷史的積累和降低入門門檻(通過重新分配使預設變得可能)所起到的作用,這些都強於語言本身固有的能力。

特別是,它可以提供一些見解關於 CKAN、OpenStack NFV、Blender、SciPy、OpenMDAO、PyGMO、PyCUDA、 Raspberry Pi Foundation 和 Python 的專案意義,通過廣泛的商業組織,確保 Python 生態系統的機構投資持續進行。

數值計算的思想:Scratch,Logo

最後想說的是,我常常陷入這樣的討論,即結構化程式設計和麵向物件倡導者的爭論。後者自稱物件導向程式語言和結構化程式語言一樣易學。

當我們談論的是通過具體的數值實驗來教學(機器人學),研究物件在模擬軟體中的模型有著直接現實世界的參照物時,比如學生們可以接觸到感測器,發動機,繼電器等。我認為支援物件導向的小夥伴們有一定的道理。

然而對於其他人來講,我遇到的一個典型的挑戰是:拿起一本食譜,將其中一個菜譜轉換成你認為易學的物件導向程式語言,然後找到一個理解這門程式語言的學生,沿著我的思路,來繼續轉換這個菜譜。(我期待著看到學術研究人員真正踐行這樣的學習過程,——我會發自內心的為這樣的情況感到欣慰。)大多數的情況下,小夥伴們不必遵循這樣的流程——僅僅需要在頭腦中進行思維的實驗就足以讓他們感受到要想學會這“易學的”程式語言需要多少預備知識。

然而另外一個解決此問題的方法是學習那些用於教育小孩子數值計算的程式語言。

其中一種最流行的莫過於 Scrach,它是一種讓學生利用拖動的方式來操作封閉的圖形化環境,從而可以看到圖形化介面中相應的移動和反應的程式設計介面。像 Scrach 這樣的圖形化環境是一種類似於利用連環畫幫助孩子們逐步學習讀書認字的方式的程式設計方式。

然而,這種利用一種特殊教育目的程式語言來操作一個圖形化介面的想法並不新奇,隨著的早期最經典環境之一的 Logo 環境在 2 0世紀 60 年代的建立(類似於 Python 自己的海龜模組),那時候,你所接觸的主要的東西是一個“海龜”,你可以用命令它的移動來畫線,從而改變圖形環境。通過這種方式,像命令列、迭代、狀態(例如:向上劃、向下劃)都以一種建立在人們的自然直觀的思維方式(想象一下,假如你是一隻海龜,如果向右旋轉 90 度將會發生什麼?)的基礎上來介紹。

迴歸本源,作為一名富有經驗的程式設計師,重新學習以上的任何一門程式語言是最有效的方式來忘掉所學(拋棄一些輪子):這些語言工具所涵蓋的概念幫助我們回想起那些我們曾經認為理所當然的概念,但是需要以初學者的眼光重新學習。當我們這麼做的時候,因為我們更加願意回想起整個的邏輯鏈條,包括那些我們之前認為理所當然而省略的思維步驟,我們會更加有效地和學生以及其他的初學者一起工作。

相關文章