導讀:本文來自 reay z 的編譯投稿,英文原文《Teaching Java in school is just as controversial as an interview with Justice Gray》寫於2008年7月,原文中某些觀點,現在看來可能不妥。另外,譯文中有些不妥之處,伯樂線上已改進。以下為全文。
今天我讀了一篇好文,這是對紐約大學電腦科學教授 Robert Dewar採訪的一篇跟進文章。我等您讀完再繼續說。讀完了?好的,現在我們能好好交流下了。我必須說,我完全同意 Dewar 教授對當今畢業生的主要觀點。(自爆下,我拿到了華盛頓大學的計算機和軟體系統學位,但我在學校主要用C++ 。)
他的一個主要觀點是Java有很多庫。從上文中引用Dewar部落格的一段話:
“如果你去商店買本關於Java的書,你會發現在1200頁中,有300頁是關於Java語言,有900頁是講各方面庫。 用Java,你是可以很輕鬆地快速做東西(但不是很仔細)……故而你是可以用最少知識匆匆拼湊做東西, ”他說。“但對我來說,這不是軟體工程,倒像是某種“乾耗級別”(consuming-level )的程式設計。”
首先他說的對,Java強大的原因之一就是它有很多庫。還有 PHP、.Net 和 Perl 也有很多庫。當然他們都不能用來驅動飛機或者火箭發射。但他們用在電子商務、管理公司、守護私人健康資料 、執行軍隊的裝備和建立無用的社交網站。那麼問題是什麼?是不是Java不再是商業世界的流行語言?(當然不是)。是不是Java不是適宜用來教學生學習程式設計的語言?(當然不是)。是不是我們沒有用正確的方法教電腦科學。因為你在看這個部落格,所以我假設你是想知道這個答案的,所以我的答案是:
我們並沒有用正確的工具來教正確的東西。
允許我稍微解釋一下:
電腦科學太難了,所以只有帶點神經質的書呆子才能掌握。
CS(電腦科學)這個專業嚇倒了不少人。計算機很嚇人,計算機很複雜,計算機是給那些盯著命令列一整天的神經質呆子。這是我從學其他非 CS 專業的人那裡聽來的全部。
除數學、化學、物理專業的人,才需要上 CS 課。
當我在學校的時候,有很多學科拿畢業證需要讀過入門程式設計(在華盛頓大學那是CSE 142 和後續 CSE 143 )。當我上高中時,我通過社群大學的running start專案讀了相當於 CSE 142 的課程。那門課是用C++,通過一年的學習,我獲得了相當於 CSE 142的學分。所以我解放了大學一年級,閒了一年。那門課有挑戰性,但並不過分而且那門課只有20-25人參加,所以每個人都有很多機會從教授那裡得到個人輔導。
我選了 CSE 143 在我上華盛頓大學的第一年(那是1999年,所以現在可以算出我的歲數了)而且在那時那門課用的是C++。我當時已經懂C++了,但那門課對我來說依舊頗具挑戰性。我想起當時我們的第一次考試,滿分100分我考了44分,但仍然高於平均分。有很多人放棄了那門課。還記得我們的一個專案陷入 dll 地獄,沒有一個人能讓這程式碼 Build 和連結。連助教也無法讓它執行。我的朋友Kevin,他是CS的高年級學生,他也無法讓它執行起來。教授最後讓我們交上來我們所有的東西,即使他不能編譯和執行。這幾乎讓我討厭計算機。這讓很多學生說,靠,這糟透了,然後放棄這門課。
這正是Java試圖解決的問題
Java沒有“dll地獄”。有一個良好支援Java的IDE。它是免費的。它能執行在所有的平臺上,並且不需要為此改變程式碼。語法很友好。它有很多庫,你能用那些庫裡的類來實現大多數資料結構和演算法,例如linked-lists, b-trees, heaps, hashtables等等還有常見的搜尋、排序演算法。現在學生只需要關於程式碼和如何讓程式碼執行起來。像過去那樣,鼓搗編譯器使其執行和擔心程式設計環境的情況,沒有了(或最少化了)。如果一個學生喜歡用程式碼來解決問題,他們也許會選擇這樣做而不是被除錯編譯工具和IDE弄得無比沮喪。大學應該首先讓CS看起來不那麼恐怖,我認為Java可以做到這一點。
Java是如何至少導致了10個新問題
第一個問題是如何用Java教學生。Java有100000個不同的庫,並不意味者你必須使用他們。而且大多數庫都是用Java寫的,難道不是嗎?所以這是第一個問題:當你開始教資料結構和演算法時,你必須實實在在地教它們,你不能簡單第讓學生用那些庫去建立程式。也許教雜湊表的一個好例子就是展示 Java HashTable的類,寫一個程式來從一個HashTable中存取值。現在,自己寫一個 HashTable類實現Map介面,並且輸出實現。重複這樣做以學習其他的資料接哦股和演算法。喔,問題解決了。
所以既然學生學了Java,我們可以用Java做任何事,是嗎?
不是的。你不能教Java裡的所有東西。你只能教Java裡的一些東西。我曾上過一個50%課堂內容是教Java的作業系統課,這麼做是因為演示多執行緒概念用Java比C++更簡單。但這並不意味著我不會用C++中多執行緒程式設計,而是在Java中debug它更簡單一些,這可以讓我專注於其他事情上。同樣,在我們必須實現的虛擬檔案系統的檔案 IO 上,Java通過操作實際的檔案 IO 讓虛擬檔案系統實現更容易,但是我們只有一個超大檔案,而且在這個檔案中有我們的inodes和資料,我們必須建立一個“檔案”實現,它模仿讀寫我們的超大檔案。再說一次,在不需要關心格式化實際硬碟驅動和與之互動的情況下,幫助我理解概念。這是重點:
Java允許你專注於問題的解決,而不需要關心工具和程式設計環境。如果專注於概念不依靠工具和程式設計環境,那麼Java是一個好的選擇。
通過一個對你來說很難管理記憶體的程式語言,來學習記憶體管理
這估計是Java作為一個學習工具最大的問題。作為一個開發人員,你必須對機器如何操作東西例如記憶體或者其他東西有深刻的理解。在Java中你完全不需要關心記憶體,所以這使得Java不是一個合適學習記憶體管理的工具。像C那樣的語言真是一個最好的學習工具,因為它必須手動地做任何事情。實際上,我認為理解記憶體如何運作的最好方法,是去你能實際上看到地址模型和它們之間不同的地方。這幫助我理解指標,勝過任何其他的東西。這帶領我們到:
這無法學習機器語言,除非通過一個真實的機器
Java是一個虛擬機器,但我們想要理解真正的機器。計算機如何運作,背後原則的知識很重要,特別是當一些東西往壞地方發展的時候。在你離開學校後的職業生涯中,你也許並不會再使用匯編。你未來也不會寫驅動或者編譯器。但如果你正在用這些工具(我認為編譯器也是一種工具),理解他們如何工作很重要,否則它們一旦不工作時,你將不能找出原因。你需要通過真正看到硬體如何工作來學習它。你需要能真正這幾一個相對簡單的邏輯線圈。你需要知道這些線圈如何用來組裝一臺計算機。這些東西並不難如果教的好的話。組合語言是關於硬體和軟體介面的,所以學好它很重要。我學了motorola68000彙編,它比 x86彙編簡單,但還是很好地演示了指標。現在我知道:
1 2 3 4 5 |
; html-script: false ]int a = 5 int * b = a int* b = 5 |
的區別,在機器內部這是由彙編命令表達的。這幫我理解記憶體如何工作,而且這使我寫出的程式不會發生記憶體洩漏。
但是,這些東西在教育系統中消失了
我(和很多人)認為Java是一個好的面嚮物件語言。很多人有一個或二個星期來完成關於多型的作業。這很酷,但你並不理解繼承。他們不會教你為什麼用繼承和如何正確地使用它。他們不教任何東西關於模式、重構,或者簡單地教授一些用物件程式設計的內容。我認為這些本應該被教的內容是很重要,很多大學畢業生因為不曾被教這些東西而不具備這些知識。我認為Java是一個好的工具去教這些東西。
還有測試
沒有人教如何測試程式碼或者甚至如何使程式碼可測試。我並不是在講執行應用程式並檢查輸入和輸出。我在將單元測試,整合測試和自動化測試。知道必須測試和單元測試很重要是遠遠不夠的。你需要理解累死test doubles, test automation等類似的東西,和如何寫程式碼使之能單獨被測試。Java是一個很好工具做這些。
其他一些東西
你如何建立一個大專案?如何自動化建立?如何管理原始碼?分支是什麼?有很多東西是有經驗的程式設計師認為理所當然的,但我們必須在一些地方學到這些東西。也許我們在經歷了這些問題後明白了這些東西,或者在工作中其他人告訴我們。這需要在學校就開始。別專注於一個特別的技術,而是要學習這些概念和了解這些概念為什麼重要。程式碼在這種課堂中並不是最重要的,你可以使用你想用的任何語言。但是,記得這門課的目地是管理程式碼,而不是寫程式碼,所以別給學生製造程式碼上的難題。用一些已有程式碼,做細微改動,迫使學生用版本管理工具,去改變構建過程,去考慮更復雜的東西。
最後的想法
很多大學堅持Java,因為很多學生已經知道它,這是最小公分母。如果你想讓你學生從世界程式設計師的最小公分母中出來也沒問題。程式設計師的一個重要技能就是學習新語言。這有助於在科技更新中保持勞力競爭力。如果你只教Java,那麼問題將會是你的學生將沒機會快速掌握一門新語言。
所以我的解決方案是:
●使用本學科最適宜的語言教授課程。入門課程應當教些能讓程式編譯並執行的東西。Java是一個理想選擇,但 C# 也可以。入門課程的重點是程式設計的入門,而不是如何鼓搗編譯器的入門。
●每個學生應該被要求在校時用最少4種程式語言。其中之一應該是彙編,其中之一還應該是物件導向程式語言。HTML不是一種程式語言。
●傳授如何編寫出色程式碼。漂亮的程式碼不等於帶註釋的程式碼。這需要強制在每門課中執行。但這本身就是一個門具體課程中執行,並且最好是學生生涯開始之初儘快執行。課程內容應覆蓋設計模式、OO設計的原則、單元測試等等。
●要求學生在通過入門課程後,在每堂課中都使用版本管理工具。大學應該提供學校的vcs給每個同學。這並不像聽起來那麼困難。
●編譯器、硬體、作業系統課程應該是強制的(有時候,其中部分並非需強制)。在硬體課程的最後一個專案中,我曾寫過一個反彙編程式用匯編語言。這很難,但並非不可能。班上每個成員至少能收穫能工作的東西。我的反彙編程式,也能正確地反彙編自身。
●學生應該被強制與同班的其他人合作。合作可以包括一起工作,但也可能包括程式碼審查(code review)和結對程式設計。
●永遠不要在全班面前強制 review 一個學生的程式碼,除非那個學生同意這麼做,但匿名程式碼審查和在私人場合review都是可以的。我知道這在商業世界是不必遵守的,但我們在學校,而且我們並不想疏遠學生。我認為這是一個折中策略,我們將仍可以傳授程式碼審查的價值,並引導學生,並且不讓學生有要放棄這個課程的念頭。
●所有課程都應該落實到寫一些程式碼。
●在課堂上,教授/教師應該至少提供一塊漂亮程式碼,用於演示。這有助於學生去閱讀漂亮的程式碼。這同樣有助於學生閱讀糟糕的程式碼,並知道它不好在哪裡。
最後,如果你是一位教授、大學管理人員或者其他相似的,如果你想要與我細談關於這個主題,我將很高興在任何時間與你聊聊。我談了這麼多,是因為我熱烈地相信這很重要,我將會盡一切力量去讓電腦科學教育變得更好。如果你正在讀這些,我建議你也將這作為優先做的事情。去和你本地的大學談談,給你的教授寫郵件,去當地學校,特別是高中和社群大學演講,鼓勵學生去電腦科學系。除非你做點什麼,否則你是不會知道你對別人的影響力有多大。
【伯樂線上注】:為了更好校對這篇譯文,費了不少時間,尤其是原文標題中提到的 Justice Gray(法官葛雷),搜尋好久,才找到他所涉及的有爭議案件,就是一件美國排華案件,即:1893年馮越亭訴美國案。
簡要摘編:1892年制定的吉爾裡法案,是美國有史以來對華人最嚴厲的法案,其他國家的移民都不須帶任何身分證明檔案,但在美華人必須申請居民許可證並隨身攜帶,若未攜帶就會被認定是非法居留而被逮捕,需先服一年苦役後,再被驅逐出境。
此案一出,立即受到華人社會的反對,中華會館( Six Companies )呼籲華人不要去註冊,認為此法案是違憲的法案,沒有法律效力,這個種族歧視的法案違反了美國憲法的權利宣言( Bill of Rights )。與其繳費註冊,不如把錢集資打官司。
馮越亭是 1879 年到美國的勞工,沒有入籍,是居住在紐約市的合法永久居民,沒有任何回國定居的計劃。馮越亭響應中華會館的號召,拒絕按照侮辱人身的種族歧視法律去註冊。由於沒有註冊證,美國憲兵在沒有逮捕令的情況下不經過正當程式就逮捕了馮越亭。
中華會館請律師為馮打官司,認為吉爾裡法案違憲,一直上訴到最高法院。 但最高法院大法官以五票對三票判決馮越亭等敗訴。這五票中,就有 Gray 的一票。他認定吉爾裡法案有效,並稱“美國是一個主權國家,有權利排斥任何人、任何種族,並將之驅逐出境。” ——摘編自《美國華人法律史》
英文原文:Jeff Tucker ,譯文由 reay z 編譯並投稿於伯樂線上。伯樂線上也歡迎其他朋友投稿。提示:投稿時記得留下微博賬號哦~
【如需轉載,請標註並保留原文連結、譯文連結和譯者等資訊,謝謝合作!】