熱點(diǎn)技術(shù):編輯器背后的程序觀
最近看到新聞,Eclipse 的市場份額持續(xù)下滑,而 Intellij IDEA 異軍突起終于堅(jiān)持不懈的超越了 Eclipse 成為了 Java 程序員的首選開發(fā)工具。
有感于此,回想起這么些年來寫過不同的語言,用過不少的編輯器。以前的程序員和現(xiàn)在的程序員他們都各用什么編輯器編程,不同語言的程序員偏愛什么樣的編輯器來寫程序呢?
編輯器與語言
先來看看下面這張圖,來自 TIBOE 2016 十月最新的編程語言流行度排行。
Java 以后端和安卓開發(fā)為主,牢牢占據(jù)第一。Java 的歷史不過短短二十年出頭,開發(fā)工具編輯器的變化從前五年的群雄混戰(zhàn)到后來 JBuilder 一統(tǒng)江湖。再之后 Eclipse 開源橫空出世取 JBuilder 而代之,當(dāng)年 Eclipse 能戰(zhàn)勝 JBuilder 正是因?yàn)槠溟_源免費(fèi)而且社區(qū)極其活躍??紤]開發(fā)工具市場屬于小眾,高技術(shù)門檻而低利潤空間,本以為被開源免費(fèi)這么一沖擊,會(huì)再無商業(yè)公司單獨(dú)以此為核心業(yè)務(wù)了。沒想到的是打敗 Eclipse 的竟然是來自商業(yè)軟件開發(fā)工具公司 JetBrains 的 Intellij IDEA,真是二十年來又一輪回,不禁唏噓。
后端的 C 和 C++ 開發(fā)想必還是用數(shù)十年不變的來自遠(yuǎn)古時(shí)期的 Vi 或 Emacs,關(guān)于這兩個(gè)神奇的編輯器我們下面再詳述,暫時(shí)按下不表。而 C# 自然是用微軟系無所不能的編輯器 Visual Studio,對(duì)于我一個(gè)使用 Mac 的程序員確實(shí)沒怎么用過微軟的工具,也就不多說了。而 JavaScript 作為現(xiàn)在前端的統(tǒng)治語言才是最讓我困惑的,在我還在寫一些 Web 頁面的時(shí)期(可能三、四年前)就一直沒找到過覺得適合 JavaScript 的編輯器。如今前端百花競放,好不熱鬧,看到的每一個(gè)前端程序員似乎都在用著不同的編輯器。
編輯器與神
兩個(gè)神奇的編輯器:vi 或 Emacs。它們都是誕生于 1976 年,MIT 的 Richard Stallman 和 Guy Steele 完成了 Emacs 的第一版,同時(shí)期在 Berkeley 的 Bill Joy 寫出了 Vi。
它們各自圍繞著完全不同的設(shè)計(jì)理念,其間差別巨大,各自都有自己的粉絲團(tuán)并相互鄙視。有點(diǎn)像《火影》漫畫里千手和宇智波一族爭戰(zhàn)多年,但目前這兩大編輯器尚未達(dá)成過一致——也就是從未有過一個(gè)同時(shí)集兩大編輯器特點(diǎn)于一身的編輯器出現(xiàn)過。
Emacs 圍繞的核心理念是快捷鍵和自定義的配置擴(kuò)展,編輯器提供了一組命令并綁定在一系列的快捷鍵上。如果你發(fā)現(xiàn)有什么想要的功能默認(rèn)快捷鍵沒有提供,你可以自己去編程擴(kuò)展它。所以,這個(gè)編輯器內(nèi)置了 Lisp 語言解釋器,所有的配置都是通過這種語言來完成的。因此,要用好 Emacs,你得先學(xué)會(huì)一門語言,而 Lisp 則是計(jì)算機(jī)歷史上第二個(gè)高級(jí)語言。為了用個(gè)編輯器還得先學(xué)門語言,如此折騰,怪不得有「神」之編輯器一說。
因?yàn)?Emacs 對(duì)于高級(jí)功能的滿足就是提供一門可編程語言自己去編程完成,所以有句夸張的說法是:“Emacs 是偽裝成編輯器的操作系統(tǒng)。”
而 Vi 則完全是另一種風(fēng)格,它是基于命令的組合理念。在說組合之前,先需要了解 Vi 的幾種基本模式。Vi 有三種模式:
- 命令模式(Command mode)
- 插入模式(Insert mode)
- 底線命令模式(Last line mode)
其中插入模式就是普通的編輯打字用,而命令模式才是用來組合的。怎么理解命令組合?這里舉個(gè)簡單的例子,以 Vi 中的刪除命令是d,那么它刪除什么?這看你怎么去組合它,比如另外一個(gè)命令 w 表示前移一個(gè)字,$ 表示移動(dòng)到一行末尾,所以一組合 dw 這個(gè)命令表示刪除一個(gè)字,d$ 則表示刪除整行。之后你再學(xué)會(huì)一個(gè)新命令 y 表示復(fù)制文本,所以你應(yīng)該知道怎么組合命令來復(fù)制當(dāng)前所在行的文本了吧。
Vi 相比 Emacs 顯然沒那么折騰。當(dāng)你熟練了 Vi 后就會(huì)在編輯文本時(shí)有一種運(yùn)指如飛的感覺,所以 Vi 在江湖上又稱編輯器之「神」。
只是唯一的問題是 Vi 的命令實(shí)在太多,你想要達(dá)到運(yùn)指如飛的感覺,可能先要把電腦桌面換成下面這個(gè)。
然后日復(fù)一日,天天使用,想必終有大成之日(反正我是沒能大成,一直磕磕碰碰,一陣不用就忘了)。而對(duì)于一個(gè)初學(xué) Vi (之前只用過類似 Notepad 這類編輯器的用戶)剛上手的用戶來說,他的內(nèi)心會(huì)有兩個(gè)疑問:怎么輸入?怎么關(guān)掉?而相比而言一個(gè)剛上手的 Emacs 用戶心中的疑問會(huì)少一個(gè):好了,我試著敲了一些字母了,現(xiàn)在,怎么關(guān)掉?
上面是網(wǎng)上一張經(jīng)典編輯器學(xué)習(xí)曲線圖,有些年頭了,圖中有些編輯器已經(jīng)消失在歷史長河中。我們只需要看看 Vi 和 Emacs 的曲線就好了。如果你真得嘗試過這兩個(gè)神奇的編輯器,就會(huì)對(duì)這個(gè)學(xué)習(xí)曲線有心有戚戚焉的感覺。
事實(shí)上現(xiàn)在直接用這兩個(gè)神奇編輯器的人不多了,從 Vi 發(fā)展下來只有一個(gè) Vim 對(duì)其進(jìn)行了增強(qiáng),聽說最近還發(fā)布了新版本。而從 Emacs 的核心理念發(fā)展繼承下來編輯器想必很多人都用過這兩個(gè):Sublime Text 和 Atom。
Sublime Text 使用 Python 代替了 Emacs 中的 Lisp。Lisp 實(shí)在太古老了,Python 好歹還是前面編程語言排行榜第五嘛,大家的學(xué)習(xí)興趣和群眾基礎(chǔ)都會(huì)好很多。而 Atom 是 Github 近年新出的編輯器,它使用 CoffeeScript 取代 Lisp。這是什么語言?好像排行榜里沒有。它不過是 JavaScript 的馬甲,簡單說就是 CoffeeScript 會(huì)被編譯成 JavaScript。
編輯器與程序員
世界上有三種程序員,一種用 Emacs,一種用 Vi,剩下的是用其它編輯器的。對(duì),剩下的那部分多半都是在用各類 IDE 的程序員,而事實(shí)上現(xiàn)在用 IDE 的程序員可能占據(jù)了多數(shù)。
而編程語言排行榜第一的 Java,我想很多 Java 的初學(xué)者都是從 IDE 開始的。因?yàn)橄啾韧ㄓ玫木庉嬈?,Java 的 IDE 確實(shí)提供了更高的效率。十多前我開始的 IDE 是 JBuilder,而在 Java 剛誕生的年代,它的第一個(gè) IDE 是 Symantec 開發(fā)的 Visual Café,它幾乎是以席卷市場的姿勢迅速占據(jù)了 Java 開發(fā)工具第一名的地位。后來同時(shí)期的競爭者還有 IBM 的 Visual Age For Java,至于 Borland 的 JBuilder 幾乎是最后起跑的參賽者。但 Java 的開發(fā)工具之戰(zhàn)似乎是一場漫長的馬拉松比賽,除了一開始的表現(xiàn)之外,更重要的是比誰能夠撐得比較久。JBuilder 以決絕的姿態(tài)后來居上,以每年一個(gè)大版本的速度持續(xù)迭代,在第四年也就是 JBuilder 4.0 時(shí)完成了反超,占據(jù)了超過 50% 的市場份額。
而 2001 年 12 月左右,IBM 終于宣布把 Visual Age For Java 開放給 Eclipse 計(jì)劃,正式結(jié)束了 Visual Age For Java 五年來在 Java 開發(fā)工具市場的競爭,而這正是對(duì) Eclipse 誕生影響最重大的事件。之后 Eclipse 以開源免費(fèi)開放的架構(gòu)推出后,雖然 Borland 也算是一家傳奇公司(曾有另一成功產(chǎn)品 Delphi)其態(tài)度充滿了商業(yè)的嚴(yán)謹(jǐn),而 JBuilder 也堪稱經(jīng)典,但 Eclipse 的那種瀟灑和自由,用戶的那種強(qiáng)烈歸屬感,溢于言表,而我使用的最后一版停留在了 JBuilder X。
作為一名十來年的 Java 程序員,我在近兩年又逐步從 Eclipse 切換到了 Intellij IDEA。曾經(jīng)瀟灑自由的 Eclipse 似乎變得越來越笨拙與卡頓了,所以程序員又找到了新歡拋棄了舊愛。
不過無論是編輯器也好,IDE 也罷,都是工具。而工具是用來放大你的才干,提升你的效率的。所以我并不支持那種一輩子只需要用好一種編輯器的程序觀。事實(shí)上在我眼中,我把工具分成兩派:
- Default
- Preference
Default 指工具背后的程序觀是提供足夠好的默認(rèn)功能,絕大部分時(shí)候(99%)你只需要使用工具提供的默認(rèn)功能,而默認(rèn)的功能包括一些品味性的選取(比如:顏色、背景、字體)都是開發(fā)工具的人眼中最合適的選擇。
Preference 則是隨意的提供一些默認(rèn)功能,然后提供極強(qiáng)的可定制化和可擴(kuò)展性,讓用戶按照自己的偏好去定制使用。
我感覺,Apple 大部分的軟硬件產(chǎn)品反映的都是 Default 背后的程序觀。而 Linux/Unix 世界大部分的軟件都反映了 Preference 的程序觀。而應(yīng)用到編輯器,我自己則一直選擇符合 Default 程序觀的產(chǎn)品,因?yàn)槲覍?duì)用好工具去解決面臨的問題的興趣超過去折騰工具本身啊。
有完全不用 IDE 的 Java 程序員么?據(jù)我所知沒有,但我知道一個(gè)不太用 IDE 的 Java 程序員——Joshua Bloch。他是一個(gè)著名的 Java 程序員了,JDK 集合框架和多個(gè)其他庫的編寫者,以及 Effective Java 一書的作者。他對(duì)編輯器或工具的看法是:“因?yàn)槲沂莻€(gè)老家伙了,Emacs 的快捷鍵已經(jīng)長在我的腦袋里了。”,所以他習(xí)慣用 Emacs 來自己寫一些小程序或庫,但對(duì)一些需要多人合作的大東西,還得求助于現(xiàn)代 IDE 的幫助,比如:Intellij IDEA。
從某種意義上,我是支持這種極簡主義的編程觀點(diǎn)的?,F(xiàn)代 IDE 嘗試集成太多功能,把編譯、調(diào)試、打包、運(yùn)行集于一身,在方便的同時(shí),也無怪乎 IDE 變得越來越笨重。用好工具的訣竅就是搞清楚工具背后的核心理念以及搞清楚我到底為什么必須用這個(gè)工具,而不是工具提供了什么我就需要去用。
...
這篇文章是在 Atom 編輯器上完成的,它的 Default 模式幾乎滿足了我的全部需求。在滿足 Preference 的前提下兼具靈活和強(qiáng)大,除了讓用戶學(xué)一門編程語言還有別的辦法么?是的,我還不會(huì) CoffeeScript。