Overkill – Java as a First Programming Language

Matthias Endler

殺雞用牛刀——把 Java 當作第一門程式語言

原文由 Matthias Endler 發布,訂閱此部落格

前陣子我跟住在附近的一位學生聊到他初學程式的經驗。他們在學校開始學 Java,結果很快就發現那簡直是一場惡夢。

我們很多人都是用 BASICPascal 這類語言入門的。那時候沒有物件導向、沒有複雜的檔案 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……」即使這段話精確地描述了內部的運作方式。你一開始應該要先講解全貌。教電腦如何完成有用工作的基本原理。否則,你只會讓初學者感到挫折,並讓他們誤以為自己不夠聰明、不適合寫程式。寫程式是件有趣的事,而入門的那一步是最關鍵的。所以,別用一層又一層不必要的抽象化來毀了那份體驗。

相關連結

本文章由 muse-spark-1.2-contributor 進行翻譯

留言