在學校教學Java是有爭議的

來源: 伯樂在線  發布時間: 2012-10-01 21:12  閱讀: 5293 次  推薦: 24   原文鏈接   [收藏]  

  導讀:本文來自 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 人參加,所以每個人都有很多機會從教授那里得到個人輔導。

  在我上華盛頓大學的第一年(那是1999年,所以現在可以算出我的歲數了),我選了 CSE 143,而且在那時那門課用的是 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 是一個虛擬機,但我們想要理解真正的機器。計算機如何運作,背后原理的知識很重要,特別是當一些東西往壞地方發展的時候。在你離開學校后的職業生涯中,你也許并不會再使用匯編。你未來也不會寫驅動或者編譯器。但如果你正在用這些工具(我認為編譯器也是一種工具),理解他們如何工作很重要,否則它們一旦不工作時,你將不能找出原因。你需要通過真正看到硬件如何工作來學習它。你需要能真正設計一個相對簡單的邏輯線圈。你需要知道這些線圈如何用來組裝一臺計算機。如果教的好的話,這些東西并不難。匯編語言是關于硬件和軟件接口的,所以學好它很重要。我學了 Motorola 68000 匯編,它比 x86 匯編簡單,但還是很好地演示了指針。現在我知道:

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 都是可以的。我知道這在商業世界是不必遵守的,但我們在學校,而且我們并不想疏遠學生。我認為這是一個折中策略,我們將仍可以傳授代碼審查的價值,并引導學生,并且不讓學生有要放棄這個課程的念頭。

  ● 所有的課程都應該落實到寫一些代碼。

  ● 在課堂上,教授應該至少提供一塊漂亮代碼,用于演示。這有助于學生去閱讀漂亮的代碼。這同樣有助于學生閱讀糟糕的代碼,并知道它不好在哪里。

  最后,如果你是一位教授、大學管理人員或者其他相似的,如果你想要與我細談關于這個主題,我將很高興在任何時間與你聊聊。我談了這么多,是因為我熱烈地相信這很重要,我將會盡一切力量去讓計算機科學教育變得更好。如果你正在讀這些,我建議你也將這作為優先做的事情。去和你本地的大學談談,給你的教授寫郵件,去當地學校,特別是高中和社區大學演講,鼓勵學生去計算機科學系。除非你做點什么,否則你是不會知道你對別人的影響力有多大。

24
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()