小題大作——以 Java 作為第一門程式語言
最近我和住在附近的一位學生聊到他初學程式設計的經驗。他們在學校開始學 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……」即使這正是它在內部實際運作的方式。你一開始應該先解釋全貌,也就是教電腦如何完成有用工作的基本原理。否則,你只會讓初學者感到挫折,並誤導他們以為自己不夠聰明、學不會程式設計。寫程式是很有趣的,而踏出第一步是最關鍵的一步。所以,別用一層又一層不必要的抽象來破壞這個體驗。
連結
- 對本文的回應(將近十年後):為什麼 Kotlin 作為第一門程式語言可能比 Java 和 Python 更好
隨機一篇部落格