如何向新手程式設計師介紹程式設計?

2015-01-19    分類:其他、程式設計開發、首頁精華5人評論發表於2015-01-19

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

學習Java,他們都說很easy。

作為一名剛從斯康星大學麥迪遜分校電腦科學系畢業的大學生,我通過一些程式設計課程認識了很多使用Java的朋友。現在很多學校都在從別的程式語言(大多是C ++)轉教Java,一項於2014年7月所做的研究表面截至調查時間為止,39個頂級美國CS專案已經有22個使用Java作為入門課程。

那麼,到底是什麼使得Java能從眾多的教學語言中脫穎而出?縱觀各個方面,我們發現了一些蛛絲馬跡:

  • 語法相對比較簡單(相較於C語言和C++),難點較少(還是相較於C語言和C++)。語法越簡單就意味著新手需要掌握的規律就越少,這對新手而言絕對不亞於一個福音。
  • Java相較於一些傳統的教學選擇,如C和C++,比較不容易出錯,因為很多操作都會自動檢查。如果你想要訪問的陣列超出了其界限或者使用空物件產生了異常,那程式就會通過漂亮的堆疊跟蹤告訴你出了什麼錯誤,哪裡出了問題(直接將範圍縮小到造成這個問題的原始檔中)。與此相比,C語言和C++,如果訪問了空指標,那麼程式就像炸彈一樣毫無預警地爆炸,絲毫不留給你任何有用的提示資訊(除非你是在偵錯程式中執行,所以我們必須學會使用偵錯程式,以防萬一)。而要是C語言和C++的陣列越界的話,那就更悲劇了,因為在很多例子中,甚至會有記憶體中陣列元素值莫名其妙被改寫的情況。然後你只能面對著這個崩潰的程式,目瞪口呆、完全束手無策。這絕對是分分鐘逼瘋一個程式設計師的節奏!
  • 有了垃圾回收器就意味著你並不需要親自來管理記憶體。用new關鍵字建立物件之後,那它將永遠保留在記憶體中(只要有任意一個地方引用即可)。而且使用完這個物件後,垃圾回收器就會為你清理掉這個物件。
  • Java在行業中的應用非常廣泛,因此,從理論上講,我們在學校裡學到的知識可以直接轉化成真正的工作。TIOBE程式設計指標將它列為第二門最為常用的程式語言。無論你是否同意TIOBE的準確分析,但是你不得不贊同Java被廣泛使用的這個現狀。
  • Java是物件導向的。你可以建立包含資料的物件,然後編寫方法用來描述作用於這些資料的行為。

上面這些聽上去真美!但是卻並不完整。

迂迴策略

幾乎所有的程式設計師編寫的任何語言的第一個程式都是“Hello World”。它所做的就是顯示一些訊息(傳統上都會選擇“Hello World”),然後退出,非常簡單。下面是用Java寫的Hello World程式:

public class Hello {
public static void main(String[] args) {
System.out.println("hello, world");
}
}

一些對於程式設計全然陌生的人就會心有疑問了 ,然後這時候如果你是老師的話,嘿嘿,麻煩就來了。想要一下子就能將所有內容通通解釋給學生聽,可能會成為壓垮駱駝的稻草,所以,你最好採取迂迴策略。
“請問,public是什麼意思?”——現在沒必要考慮這些,以後我們會深入探討。
“class是什麼?”——現在沒必要考慮這些,以後我們會深入探討。
“static是什麼意思?”——現在沒必要考慮這些,以後我們會深入探討。
……等等,都可以這麼說。

但是值得一提的是,無論是教什麼內容,我們都應該將其分解成一塊塊容易消化理解的組成部分。封裝(public關鍵字)、物件導向的程式設計(class和static)、陣列(String[ ])以及命令列引數(args)這些重要的知識都應該適時地解釋給學生。當然,對於那些尚處於程式設計啟蒙階段的新生來說,要想一口吃成個大胖子未免太過於天方夜譚了。我認識的很多朋友,他們在其他領域絕對算個佼佼者,但是碰到這些程式設計概念問題也立馬一個頭兩個大。就像是在代數中突然引入這個:

一旦我們知道了這些符號的含義,那麼理解起來似乎也沒有那麼困難。但是對那些才涉足這一領域的新生來說,這完全不亞於是無字天書啊。再則,迂迴策略雖然鼓勵了學生使他們不至於立馬洩氣,但是從另一個角度講,卻只是表面化地展示某種“神奇”成果,並沒有分析解釋其原理。但是我想說,如果你想成長為一名真正的教師,這種方法與你的理念應該是背道而馳、截然相反的。例如Hello World這個例子,

  • Java嚴格物件導向,並要求每一個函式(或“方法”,在Java中的說法)被放置在一個類中。如果你還沒閱讀過Execution in the Kingdom of Nouns這篇優秀文章,那我強烈推薦你去讀一下。它的主要內容可以概括為,“倡導物件導向的程式設計就像是為客人量身定製服裝一樣”。向那些對if語句和for迴圈這些概念還是一團漿糊的新生解釋物件導向的設計原則,絕對是個糟糕的“呼叫”。要著眼於將工作分解為一個一個可以寫成函式的小片段,然後我們再回過頭來講什麼是OOP。
  • Java規定,所有的物件都是以堆的形式分配的,所以所有的物件變數都是指標。現在你需要解釋的是值和引用之間的差異,就像為什麼int、boolean、float在賦值和比較時與strings的行為就是有所不同。類似於這些衍生出來的問題共同組成了一個一致性的解釋工作原理的心智模式——作為程式設計師這個是必備——但是其過程異常艱鉅。

Java對於開發程式(無論大小範圍)而言或許真心是門超棒的程式語言,但是對於初學者而言這傢伙絕對算不上友好。

那麼我們應該教什麼語言呢?

既然如此,那有人會問,那我一開始先學點簡單的概念,然後在這些的基礎上再深入學習Java,不就成了?!但是很抱歉,Java表示臣妾做不到!

那麼我們該怎麼做呢?下面這兩種合情合理的開啟程式設計之路的方法或許能讓你有一種醍醐灌頂之感:

  • 低水平的起始點,然後一步步提升難度。教你如何使用計算機,這樣你就可以直接用C語言寫一些簡單的程式。然後再在這個基礎上,構建更高層次的電腦科學結構體系。
  • 高水平的起始點,然後再一步步降低難度。先教授電腦科學的理論和一種程式語言,這種程式語言得非常容易實現,並且毋須擔心底層機器的細節,例如Python,在這裡就是一個挺不錯的選擇,因為它不受正面載入Java需求的影響。然後再分解計算機是如何一步步實現這些理論的。

現在,第2個方法變得越來越風靡,從本文開篇提及的研究——Python已經超越Java成為了使用最廣的程式設計入門語言這一事實——可見一斑。

無論你選擇哪種方法,關鍵是要保持學生對此的興趣。如果你選擇的是低水平起始點的方法,可以使用Arduino或機器人技術套件,以便於學生可以在物理世界中觀看他們寫的程式碼。話說,我剛一開始用C語言為一支機器人團隊編寫程式碼,我就被這個奇幻的世界深深地迷住了:看著120磅的鋼管和轉動馬達因為我寫的程式碼而動起來的時候,那感覺真心是太神奇、太不可思議了。如果你選擇的是高水平起始點的方法的話,不妨利用庫中資源來製作視訊遊戲或者其他圖形程式。

程式設計特別的不可思議。除了你的想象力還有表達能力,其他沒有別的東西可以限制你。找到學生的興趣切入點,寓教於樂,從易到難,循序漸進,教會他們如何使用工具,授之以魚不如授之以漁,讓他們在程式設計的世界中自由瘋狂地成長。

譯文連結:http://www.codeceo.com/article/introduce-programming.html
英文原文:How should you introduce people to programming?
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章