殺雞用牛刀——把 Java 當作第一門程式語言
原文由 Matthias Endler 于 發布,訂閱此部落格
前陣子我跟住在附近的一位學生聊到他初學程式的經驗。他們在學校開始學 Java,結果很快就發現那簡直是一場惡夢。
我們很多人都是用 BASIC 或 Pascal 這類語言入門的。那時候沒有物件導向、沒有複雜的檔案 I/O,幾乎也沒有模組化……但那反而很棒。在 BASIC 裡,你只要寫:
PRINT "HELLO WORLD"這樣就完成了。這其實就是一個可以執行的程式,解決了一個最基本、也最常見的問題:在螢幕上輸出一段文字。
如果想用 Java 做同樣的事,你得這樣寫:
public class Main {
public static void main (String[] args) {
System.out.println("Hello, world!");
}
}你看得出來,為了完成這個最簡單不過的任務,你需要具備多少程式設計知識嗎?如果要向新手解釋這段程式,聽起來大概會像這樣:
建立一個名為 Main 的類別,裡面包含一個回傳型別為 void、接受字串陣列作為單一參數的 main 方法,並使用
PrintStream類別中out物件的println方法,將你的文字作為單一參數傳入。
——只是別忘了你的大括號。這樣一來,你最初那幾個小時的程式學習時光,保證會充滿「樂趣」。
好吧,那替代方案是什麼呢?我承認,現在已經沒人想再寫 BASIC 了,因為它缺乏處理圖形用的強大標準函式庫(其實 Java 也沒有),而且擴充性很差。這個語言必須簡潔明瞭。它應該要夠快,能應付數值運算,但又不能像那些僵硬的 C 系括號語言那樣冗長(抱歉了,C++ 的朋友們)。它應該要有平緩的學習曲線,並能提供即時的回饋(編譯式語言在這點上往往很爛)。它應該要鼓勵乾淨的程式碼,並獎勵最佳實務。而能滿足這一切的語言,就是 Python。
而且 Python 還有更多優點:數以百計的函式庫幾乎能幫你處理任何事情、與常見的 IDE 整合良好(Eclipse 上的 PyDev、IDLE……),以及精確而優雅的語法。
上面那個程式用 Python 來寫,就是這樣:
print("Hello World")在這個階段,你完全不需要懂什麼物件導向、作用域和函式參數。沒有那些繁瑣的庶務。沒錯,它是直譯式語言,但對初學者來說,這根本不是問題。
如果你還沒被說服,在 Java 裡印出並格式化文字輸出,對進階的程式設計師來說還算相對簡單,但真正折磨人的部分是從檔案輸入開始:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class fileIO {
public static void main(String[] args) {
String filename = "test.txt", line;
try {
BufferedReader myFile =
new BufferedReader(new FileReader(filename));
while ( ( line = myFile.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}我聽到你說:「老兄,檔案 I/O 本來就很複雜啊,本來就是這樣。」這話沒錯……就內部運作來說的確是這樣。但初學者應該要拿到一個簡單易用的介面。Python 示範了該怎麼做:
file = open("test.txt")
text = file.read()
print(text);這段程式碼完全契合我們對流程的自然理解:「電腦打開一個檔案,把它讀出來,然後印出來」。連五歲的小孩都聽得懂。沒有人一開始會這樣解釋:「在你能讀取檔案之前,你需要一個運作在 FileReader 之上的 BufferedReader……」即使這段話精確地描述了內部的運作方式。你一開始應該要先講解全貌。教電腦如何完成有用工作的基本原理。否則,你只會讓初學者感到挫折,並讓他們誤以為自己不夠聰明、不適合寫程式。寫程式是件有趣的事,而入門的那一步是最關鍵的。所以,別用一層又一層不必要的抽象化來毀了那份體驗。
相關連結
隨機一篇部落格
留言
登入後參與討論