跳轉到內容

程式設計科學/導論

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

我的一個學生曾經在學習完我的程式語言課程後評論道,她從一個“語法編碼者”成長為了一名計算機科學家。她曾經只知道足夠的語法才能讓程式編譯並執行,但現在她可以識別一個可計算的問題,篩選出一組解決問題的策略,權衡它們的優缺點,並用一個健壯的程式實現所選策略。

我對此轉變可以稍微自豪一下,但我認為榮譽應該歸功於我選擇的教科書,SICP:“程式的結構與解釋”由哈羅德·阿貝爾森、傑拉爾德·傑伊·薩斯曼和朱莉·薩斯曼撰寫。這本書被親切地稱為“巫師書”,是一本很棒的教材,它挑戰學生去學習計算和資料的本質。早期版本的這本書把我帶上了從語法編碼者到計算機科學家的相同旅程。這本書非常多才多藝,在一些大學被用作計算機科學入門教材,在另一些大學被用作程式語言教材。事實上,我告訴我的學生,如果他們被困在荒島上,只能帶一本計算機科學教材[1],SICP應該是他們的首選。

像SICP這樣的教材的存在,無疑阻礙了建立這本教材,但我們還是開始了這項任務。如果SICP有什麼缺點,那就是它選擇了Scheme作為程式語言來闡釋其中的概念。雖然作者很好地解釋了他們的選擇,但使用Scheme可能阻止了SICP作為計算機科學入門課程教材的更廣泛採用。

這不是Scheme的缺點,Scheme是一種優雅、有趣且易於學習的語言,而是因為學生需要學習“實用”語言的狹隘觀點。如今,實用意味著程式語言C以及從中衍生出來的語言,C++和Java,它們都添加了面向物件,同時保持了類似C的語法。這種轉向面向物件的趨勢是Scheme的第二個,也許是更有效的批評,因此SICP作為入門教材的選擇也是如此;Scheme缺乏正式的面向物件[2]。雖然已經有很多嘗試將面向物件新增到Scheme和LISP類語言中,但結果看起來很像一個維多利亞風格的房屋加了一個牧場風格的擴充套件——實用,但美學上令人不快。

Sway程式語言

[edit | edit source]

Sway程式語言的想法源於這種環境。我一直使用簡化的C類虛擬碼來教授演算法課程[3],而我教授程式語言的經驗讓我相信我可以實現虛擬碼語言的很大一部分。我選擇了Sway這個名字,因為我經常會把虛擬碼拼錯成psuedocode,我認為應該讀作Sway-dough-code。

我設計Sway是為了讓它擁有幾乎與Scheme相同的優雅和所有樂趣,但使用類似C的語法來幫助學生從Sway過渡到C、C++或Java等工業級語言。此外,Sway結合了之前其他人發表的面向物件研究和我在這個領域的研究,包含了一個非常簡單但令人討厭的面向物件和繼承系統。Sway應該很有趣的想法,讓新手更容易接觸到這種語言。重點是:我想要教授關於計算和計算策略的知識,而不是如何用一些玩具語言編寫一個for迴圈。為此,教學語言需要具有表現力,越具有表現力越好。此外,我希望避免Niklaus Wirth的Pascal程式語言的陷阱,這種語言(如Sway)是為教學而設計的。Wirth選擇了相當嚴格的語言模型,以便語言更容易學習。在這種模型下,語言處理器生成的錯誤資訊通常會非常直接地指出導致問題的錯誤[4]。不幸的是,這種語言缺乏靈活性,無法發展。這種僵化導致Pascal在很大程度上被邊緣化了。

Sway被設計為以我無法預料的方式發展,並且我賦予Sway一些特性,我相信這些特性為語言提供了堅實的基礎,使其能夠發展。不利的一面是,這種內建的靈活性有時會導致一些相當模糊的錯誤資訊。例如,缺少一個分號可能會生成一個“缺少表示式”的錯誤資訊,而不是期望的“缺少分號”資訊。為了彌補這種權衡,我們特別注意使Sway成為單語言[5]。也就是說,編寫程式的完全相同的結構可以用來除錯(修復錯誤)。事實上,與大多數教科書不同,這本書提供了一個連結,指向關於Sway程式除錯的完整章節,從平凡的(打印表達式)到崇高的(在程式中執行互動式直譯器)。

本書的組織結構

[edit | edit source]

這本教科書是為那些希望在繼續學習傳統的CS1課程之前進行一些程式設計練習的學生設計的。程式設計科學透過非傳統的方式學習教材內容。與專注於語言特性不同,重點是使用程式語言幫助學生理解完全不同的領域中的材料。在這種情況下,這個領域是微積分入門。學生透過編寫解決微積分問題的簡短演算法來學習程式設計。同時,學生學習微積分,從而在學習第一門微積分課程之前獲得一些練習機會。

在我看來,目前的CS1教科書存在一些缺陷。第一個是它們傾向於百科全書式。因此,計算機科學中許多偉大的概念都被大量細節所掩蓋。我不希望,而且我懷疑許多學生也不希望,去閱讀一本800頁(甚至更厚)的教科書。另一個缺陷是,當使用例子來激發語言特性時,會偏離例子來介紹一些新的語言結構,從而破壞了敘述。另一個缺陷是,例子通常是人為編造的,並沒有多少說服力來激勵學習CS。

TSOP試圖透過利用線上託管教科書帶來的優勢來解決前兩個缺陷。當在TSOP中完成某些任務時需要特定的語言結構時,讀者會被告知按照連結學習有關該結構的資訊(如果需要)。這些連結指向Sway參考手冊中的部分,Sway參考手冊是TSOP的配套教材。這些小提示不會干擾整體敘述的流程。最後的缺陷透過使用例子(微積分)得到改善,這些例子無疑對計算機科學專業學生有益。

TSOP的章節完全遵循西爾瓦努斯·P·湯普森編著的《微積分變得容易》,並由馬丁·加德納更新。對於已經瞭解微積分的學生來說,TSOP(以及Sway參考手冊)可以獨立使用。對於希望同時學習微積分和程式設計的學生來說,《微積分變得容易》是必要的,也是令人安慰的伴侶。

註釋

[edit | edit source]
  1. 沒有學生曾經詢問過這種情況如何發生。
  2. 可以透過使用函式閉包來實現封裝的效果,但Scheme缺乏允許這些類似物件的閉包從其他閉包繼承功能的方法。
  3. 我使用科曼、萊瑟森和裡維斯特的“演算法導論”教材來教授這門課。這是另一本偉大的計算機科學教材,被親切地稱為CLR或“白皮書”,儘管後來的版本不再是白色的。不幸的是,學生覺得書中使用的虛擬碼比不使用更令人困惑。
  4. 新手學生常見的抱怨是“這個錯誤資訊毫無意義”。大多數實用語言都會遇到與實際錯誤不一致的錯誤資訊。為了證明Pascal的錯誤系統,我記得作為一名學生,Pascal編譯器告訴我我在某個地方忘記了一個分號,並詢問我是否希望它為我插入分號!
  5. 作為單語言的例子,據說要精通C程式設計需要學習三種語言:C,語言本身,cpp,C預處理器,以及gdb,C的偵錯程式。


令人恐懼的概念

華夏公益教科書