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 进行翻译

评论