最近看到新闻,Eclipse 的市场份额持续下滑,而 Intellij IDEA 异军突起终于坚持不懈的超越了 Eclipse 成为了 Java 程序员的首选开发工具。
有感于此,回想起这么些年来写过不同的语言,用过不少的编辑器。以前的程序员和现在的程序员他们都各用什么编辑器编程,不同语言的程序员偏爱什么样的编辑器来写程序呢?
编辑器与语言
先来看看下面这张图,来自 TIBOE 2016 十月最新的编程语言流行度排行。
Java 以后端和安卓开发为主,牢牢占据第一。Java 的历史不过短短二十年出头,开发工具编辑器的变化从前五年的群雄混战到后来 JBuilder 一统江湖。再之后 Eclipse 开源横空出世取 JBuilder 而代之,当年 Eclipse 能战胜 JBuilder 正是因为其开源免费而且社区极其活跃。考虑开发工具市场属于小众,高技术门槛而低利润空间,本以为被开源免费这么一冲击,会再无商业公司单独以此为核心业务了。没想到的是打败 Eclipse 的竟然是来自商业软件开发工具公司 JetBrains 的 Intellij IDEA,真是二十年来又一轮回,不禁唏嘘。
后端的 C 和 C++ 开发想必还是用数十年不变的来自远古时期的 Vi 或 Emacs,关于这两个神奇的编辑器我们下面再详述,暂时按下不表。而 C# 自然是用微软系无所不能的编辑器 Visual Studio,对于我一个使用 Mac 的程序员确实没怎么用过微软的工具,也就不多说了。而 JavaScript 作为现在前端的统治语言才是最让我困惑的,在我还在写一些 Web 页面的时期(可能三、四年前)就一直没找到过觉得适合 JavaScript 的编辑器。如今前端百花竞放,好不热闹,看到的每一个前端程序员似乎都在用着不同的编辑器。
编辑器与神
两个神奇的编辑器:vi 或 Emacs。它们都是诞生于 1976 年,MIT 的 Richard Stallman 和 Guy Steele 完成了 Emacs 的第一版,同时期在 Berkeley 的 Bill Joy 写出了 Vi。
它们各自围绕着完全不同的设计理念,其间差别巨大,各自都有自己的粉丝团并相互鄙视。有点像《火影》漫画里千手和宇智波一族争战多年,但目前这两大编辑器尚未达成过一致——也就是从未有过一个同时集两大编辑器特点于一身的编辑器出现过。
Emacs 围绕的核心理念是快捷键和自定义的配置扩展,编辑器提供了一组命令并绑定在一系列的快捷键上。如果你发现有什么想要的功能默认快捷键没有提供,你可以自己去编程扩展它。所以,这个编辑器内置了 Lisp 语言解释器,所有的配置都是通过这种语言来完成的。因此,要用好 Emacs,你得先学会一门语言,而 Lisp 则是计算机历史上第二个高级语言。为了用个编辑器还得先学门语言,如此折腾,怪不得有「神」之编辑器一说。
因为 Emacs 对于高级功能的满足就是提供一门可编程语言自己去编程完成,所以有句夸张的说法是:“Emacs 是伪装成编辑器的操作系统。”
而 Vi 则完全是另一种风格,它是基于命令的组合理念。在说组合之前,先需要了解 Vi 的几种基本模式。Vi 有三种模式:
- 命令模式(Command mode)
- 插入模式(Insert mode)
- 底线命令模式(Last line mode)
其中插入模式就是普通的编辑打字用,而命令模式才是用来组合的。怎么理解命令组合?这里举个简单的例子,以 Vi 中的删除命令是d,那么它删除什么?这看你怎么去组合它,比如另外一个命令 w 表示前移一个字,$ 表示移动到一行末尾,所以一组合 dw 这个命令表示删除一个字,d$ 则表示删除整行。之后你再学会一个新命令 y 表示复制文本,所以你应该知道怎么组合命令来复制当前所在行的文本了吧。
Vi 相比 Emacs 显然没那么折腾。当你熟练了 Vi 后就会在编辑文本时有一种运指如飞的感觉,所以 Vi 在江湖上又称编辑器之「神」。
只是唯一的问题是 Vi 的命令实在太多,你想要达到运指如飞的感觉,可能先要把电脑桌面换成下面这个。
然后日复一日,天天使用,想必终有大成之日(反正我是没能大成,一直磕磕碰碰,一阵不用就忘了)。而对于一个初学 Vi (之前只用过类似 Notepad 这类编辑器的用户)刚上手的用户来说,他的内心会有两个疑问:怎么输入?怎么关掉?而相比而言一个刚上手的 Emacs 用户心中的疑问会少一个:好了,我试着敲了一些字母了,现在,怎么关掉?
上面是网上一张经典编辑器学习曲线图,有些年头了,图中有些编辑器已经消失在历史长河中。我们只需要看看 Vi 和 Emacs 的曲线就好了。如果你真得尝试过这两个神奇的编辑器,就会对这个学习曲线有心有戚戚焉的感觉。
事实上现在直接用这两个神奇编辑器的人不多了,从 Vi 发展下来只有一个 Vim 对其进行了增强,听说最近还发布了新版本。而从 Emacs 的核心理念发展继承下来编辑器想必很多人都用过这两个:Sublime Text 和 Atom。
Sublime Text 使用 Python 代替了 Emacs 中的 Lisp。Lisp 实在太古老了,Python 好歹还是前面编程语言排行榜第五嘛,大家的学习兴趣和群众基础都会好很多。而 Atom 是 Github 近年新出的编辑器,它使用 CoffeeScript 取代 Lisp。这是什么语言?好像排行榜里没有。它不过是 JavaScript 的马甲,简单说就是 CoffeeScript 会被编译成 JavaScript。
编辑器与程序员
世界上有三种程序员,一种用 Emacs,一种用 Vi,剩下的是用其它编辑器的。对,剩下的那部分多半都是在用各类 IDE 的程序员,而事实上现在用 IDE 的程序员可能占据了多数。
而编程语言排行榜第一的 Java,我想很多 Java 的初学者都是从 IDE 开始的。因为相比通用的编辑器,Java 的 IDE 确实提供了更高的效率。十多前我开始的 IDE 是 JBuilder,而在 Java 刚诞生的年代,它的第一个 IDE 是 Symantec 开发的 Visual Café,它几乎是以席卷市场的姿势迅速占据了 Java 开发工具第一名的地位。后来同时期的竞争者还有 IBM 的 Visual Age For Java,至于 Borland 的 JBuilder 几乎是最后起跑的参赛者。但 Java 的开发工具之战似乎是一场漫长的马拉松比赛,除了一开始的表现之外,更重要的是比谁能够撑得比较久。JBuilder 以决绝的姿态后来居上,以每年一个大版本的速度持续迭代,在第四年也就是 JBuilder 4.0 时完成了反超,占据了超过 50% 的市场份额。
而 2001 年 12 月左右,IBM 终于宣布把 Visual Age For Java 开放给 Eclipse 计划,正式结束了 Visual Age For Java 五年来在 Java 开发工具市场的竞争,而这正是对 Eclipse 诞生影响最重大的事件。之后 Eclipse 以开源免费开放的架构推出后,虽然 Borland 也算是一家传奇公司(曾有另一成功产品 Delphi)其态度充满了商业的严谨,而 JBuilder 也堪称经典,但 Eclipse 的那种潇洒和自由,用户的那种强烈归属感,溢于言表,而我使用的最后一版停留在了 JBuilder X。
作为一名十来年的 Java 程序员,我在近两年又逐步从 Eclipse 切换到了 Intellij IDEA。曾经潇洒自由的 Eclipse 似乎变得越来越笨拙与卡顿了,所以程序员又找到了新欢抛弃了旧爱。
不过无论是编辑器也好,IDE 也罢,都是工具。而工具是用来放大你的才干,提升你的效率的。所以我并不支持那种一辈子只需要用好一种编辑器的程序观。事实上在我眼中,我把工具分成两派:
- Default
- Preference
Default 指工具背后的程序观是提供足够好的默认功能,绝大部分时候(99%)你只需要使用工具提供的默认功能,而默认的功能包括一些品味性的选取(比如:颜色、背景、字体)都是开发工具的人眼中最合适的选择。
Preference 则是随意的提供一些默认功能,然后提供极强的可定制化和可扩展性,让用户按照自己的偏好去定制使用。
我感觉,Apple 大部分的软硬件产品反映的都是 Default 背后的程序观。而 Linux/Unix 世界大部分的软件都反映了 Preference 的程序观。而应用到编辑器,我自己则一直选择符合 Default 程序观的产品,因为我对用好工具去解决面临的问题的兴趣超过去折腾工具本身啊。
有完全不用 IDE 的 Java 程序员么?据我所知没有,但我知道一个不太用 IDE 的 Java 程序员——Joshua Bloch。他是一个著名的 Java 程序员了,JDK 集合框架和多个其他库的编写者,以及 Effective Java 一书的作者。他对编辑器或工具的看法是:“因为我是个老家伙了,Emacs 的快捷键已经长在我的脑袋里了。”,所以他习惯用 Emacs 来自己写一些小程序或库,但对一些需要多人合作的大东西,还得求助于现代 IDE 的帮助,比如:Intellij IDEA。
从某种意义上,我是支持这种极简主义的编程观点的。现代 IDE 尝试集成太多功能,把编译、调试、打包、运行集于一身,在方便的同时,也无怪乎 IDE 变得越来越笨重。用好工具的诀窍就是搞清楚工具背后的核心理念以及搞清楚我到底为什么必须用这个工具,而不是工具提供了什么我就需要去用。
...
这篇文章是在 Atom 编辑器上完成的,它的 Default 模式几乎满足了我的全部需求。在满足 Preference 的前提下兼具灵活和强大,除了让用户学一门编程语言还有别的办法么?是的,我还不会 CoffeeScript。