小题大做——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……”即使这恰恰就是它在内部的真实工作方式。你首先想讲的是宏观图景,是教会计算机做有用之事的基本原理。否则,你只会让初学者感到挫败,并让他们误以为自己不够聪明,不适合学编程。编程是充满乐趣的,而入门是最关键的一步。所以,别用一层又一层不必要的抽象来毁掉这种体验。
链接
- 对本文的回应(近十年后):为什么 Kotlin 可能比 Java 和 Python 更适合作为第一门编程语言
随机一篇博客
评论
登录后参与讨论