跳轉到內容

像計算機科學家一樣思考:用 Python 學習(第二版)/前言

來自華夏公益教科書,開放的書籍,開放的世界

作者:傑弗裡·埃爾克納

這本書的存在得益於網際網路和自由軟體運動使合作成為可能。三位作者——一位大學教授、一位高中老師和一位專業程式設計師——從未面對面地合作過,但我們能夠緊密合作,並得到了許多其他人的幫助,他們花時間和精力向我們傳送反饋。

我們認為這本書證明了這種合作的好處和未來可能性,這種合作的框架是由理查德·斯托爾曼和自由軟體基金會建立的。

我如何以及為什麼開始使用 Python

[編輯 | 編輯原始碼]

1999 年,大學理事會的高階預科(AP)計算機科學考試首次使用 C++ 語言進行。正如全國許多高中一樣,更換語言的決定對弗吉尼亞州阿靈頓的約克鎮高中的計算機科學課程產生了直接影響,我在那裡任教。到目前為止,Pascal 是我們第一年和 AP 課程的教學語言。為了保持過去給學生兩年接觸同一種語言的做法,我們決定在 1997-98 學年將第一年課程改為 C++,以便與大學理事會下一年對 AP 課程的改變保持一致。

兩年後,我確信 C++ 並不是向學生介紹計算機科學的最佳選擇。雖然它當然是一種非常強大的程式語言,但它也是一種極其難以學習和教授的語言。我發現自己經常與 C++ 難以理解的語法和多種實現方式作鬥爭,結果是,我失去了許多本不應該失去的學生。我確信必須有更適合我們第一年課程的語言選擇,於是,我開始尋找 C++ 的替代方案。

我需要一種可以在我們的 GNU/Linux 實驗室以及大多數學生在家使用的 Windows 和 Macintosh 平臺上執行的語言。我希望它是免費軟體,這樣學生無論收入多少,都可以在家使用它。我希望這種語言能夠被專業程式設計師使用,並且擁有一個活躍的開發者社群。它必須支援過程式和麵向物件的程式設計。最重要的是,它必須易於學習和教授。當我帶著這些目標調查各種選擇時,Python 脫穎而出,成為最合適的候選者。

我請約克鎮的一位有才華的學生馬特·阿倫斯試用 Python。兩個月後,他不但學會了這門語言,還編寫了一個名為 pyTicket 的應用程式,讓我們的員工可以透過網路報告技術問題。我知道,馬特不可能在這麼短的時間內用 C++ 完成如此大規模的應用程式,而這一成就,加上馬特對 Python 的積極評價,表明 Python 正是我一直在尋找的解決方案。

尋找教科書

[編輯 | 編輯原始碼]

在決定下一年在我兩門入門計算機科學課程中使用 Python 後,最迫切的問題是缺乏可用的教科書。

免費文件來救場了。早些時候,理查德·斯托爾曼把我介紹給了艾倫·唐尼。我們都寫信給理查德,表達了我們對開發免費教育材料的興趣。艾倫已經寫了一本面向第一年計算機科學學生的教科書,《像計算機科學家一樣思考》。當我讀到這本書時,我立刻意識到我想要在我的課堂上使用它。它是我見過的最清晰、最有幫助的計算機科學教材。它強調了程式設計中涉及的思維過程,而不是特定語言的特性。閱讀它立刻讓我成為一名更好的老師。

《像計算機科學家一樣思考》不僅是一本優秀的書,而且是在 GNU 公共許可證下發布的,這意味著它可以免費使用,並可以修改以滿足使用者的需求。當我決定使用 Python 後,我想到可以將艾倫的原始 Java 版本的書翻譯成新的語言。雖然我無法獨自編寫教科書,但有了艾倫的書作為參考,我就可以做到,同時證明了軟體中使用的協作開發模型也可以在教育材料中發揮作用。

過去兩年,為這本書工作對我自己和我的學生來說都是有益的,我的學生在這個過程中發揮了很大的作用。由於我可以在有人發現拼寫錯誤或難懂的段落時立即進行更改,所以我鼓勵他們透過給每個導致文字更改的建議增加一分獎勵,讓他們在書中尋找錯誤。這有雙重好處:鼓勵他們更仔細地閱讀文字,以及讓文字得到最重要評論者的仔細審查,即使用它學習計算機科學的學生。

對於關於面向物件程式設計的後半部分內容,我知道需要一個比我更有實際程式設計經驗的人來完成它。這本書在未完成的狀態下停留了將近一年,直到開源社群再次提供了完成它的必要手段。

我收到了克里斯·邁爾斯的一封電子郵件,表示對這本書感興趣。克里斯是一位專業程式設計師,去年開始在俄勒岡州尤金的萊恩社群學院使用 Python 教授程式設計課程。教授這門課的前景讓克里斯找到了這本書,他立即開始幫助我們。到學年末,他在我們網站上建立了一個配套專案——[http://openbookproject.net http://openbookproject.net]_,名為 Python for Fun_,並與我一些最優秀的學生一起擔任大師老師,引導他們超出我的能力範圍。

用 Python 介紹程式設計

[編輯 | 編輯原始碼]

過去兩年,翻譯和使用《像計算機科學家一樣思考》的過程證實了 Python 適合教授初學者。Python 極大地簡化了程式設計示例,使重要的程式設計概念更容易教授。

文字中的第一個示例說明了這一點。它是傳統的 hello, world 程式,在 Java 版本的書中看起來像這樣

在 Python 版本中,它變成了

即使這是一個簡單的示例,Python 的優勢也顯而易見。約克鎮的計算機科學 I 課程沒有先決條件,因此許多看到這個示例的學生正在看他們的第一個程式。他們中有些人無疑有些緊張,因為他們聽說計算機程式設計很難學。Java 版本總是迫使我在兩個不令人滿意的選擇之間做出選擇:要麼解釋 `class Hello`, `public static void main`, `String[] args`, `{`, and `}`, 語句,並冒著在剛開始就讓一些學生感到困惑或害怕的風險;要麼告訴他們,別擔心那些東西,我們以後會講,並冒著同樣的風險。課程中這一階段的教育目標是向學生介紹程式設計語句的概念,並讓他們編寫他們的第一個程式,從而向他們介紹程式設計環境。Python 程式恰好包含完成這些事情所需的必要內容,僅此而已。

比較每個版本的書中程式的解釋文字,可以進一步說明這對初學者的意義。在 Java 版本中,對 Hello, world! 的解釋有七段;在 Python 版本中,只有幾句話。更重要的是,缺少的六段並不是關於計算機程式設計中的重大概念,而是關於 Java 語法的細節。我發現整個書中都出現了這種情況。Python 版本的文字中消失了整段,因為 Python 更清晰的語法使它們變得多餘。

使用像 Python 這樣的高階語言,可以讓老師延遲講解機器低階細節,直到學生擁有足夠的背景知識才能更好地理解這些細節。因此,它創造了在教學上優先考慮事物的能力。這方面最好的例子之一是 Python 處理變數的方式。在 Java 中,變數是用來儲存值的名稱,如果它是一個內建型別,它就是一個儲存值的名稱;如果它不是,它就是一個物件的引用。解釋這種區別需要討論計算機如何儲存資料。因此,變數的概念與機器的硬體密切相關。對於計算機科學和代數的初學者來說,強大的變數概念本身就已經足夠困難了。位元組和地址並不能幫助解決這個問題。在 Python 中,變數是一個指向事物的名稱。對於初學者來說,這是一個更容易理解的概念,也更接近他們在數學課上學到的變數含義。今年,我教授變數時比以前容易多了,而且我花在幫助學生解決變數問題上的時間也更少了。

Python 在教學和學習程式設計方面另一個例子是它的函式語法。我的學生在理解函式方面一直存在很大的困難。主要問題集中在函式定義和函式呼叫之間的區別,以及引數和實參之間的相關區別。Python 憑藉其簡潔的語法,為我們解決了這個難題。函式定義以關鍵字def開頭,所以我只需要告訴學生:當你定義一個函式時,用def開頭,後面跟著你要定義的函式名;當你呼叫一個函式時,只需呼叫(輸入)它的名字。引數與定義相關,實參與呼叫相關。沒有返回值型別、引數型別或引用和值引數來阻礙我們,所以我現在能夠在不到之前一半的時間內教授函式,而且學生的理解能力也更高。

使用 Python 提高了我們計算機科學課程對所有學生的有效性。我看到了更高的整體成功率和更低的挫敗感,這與我使用 C++ 或 Java 教學時相比有了很大的改善。我以更快的速度獲得了更好的結果。更多的學生在課程結束後能夠建立有意義的程式,並且對程式設計的體驗抱有積極的態度。

建立社群

[編輯 | 編輯原始碼]

我收到了來自世界各地的電子郵件,人們都在使用這本書來學習或教授程式設計。一個使用者社群已經開始形成,許多人透過向位於 [http://openbookproject.net/pybiblio http://openbookproject.net/pybiblio]_ 的配套網站傳送材料來為該專案做出貢獻。

隨著 Python 的持續增長,我預計使用者社群的增長將會持續並加速。這個使用者社群的出現以及它為教育工作者之間進行類似合作所帶來的可能性,是我參與這個專案中最令人興奮的部分。透過共同努力,我們可以提高可用材料的質量,節省寶貴的時間。我邀請您加入我們的社群,期待您的來信。請寫信至 [mailto:jeff@elkner.net jeff@elkner.net]_。

Jeffrey Elkner
弗吉尼亞州阿靈頓州長職業技術學院
弗吉尼亞州阿靈頓

華夏公益教科書