テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

IDEをアンインストールしてVimを使おう

私はコーディング用EditorとしてVimを使っている. そこには多量のプラグインが入っており, 全部使いこなしているとは到底言いがたいが, プラグインがなければ生産性はとてつもなく落ちる. もはや, そこらに転がってる糞エディタでは何もする気が起きない. しかしそれ以上にIDEは嫌だ. Eclipse, IntelliJ, NetBeans, VisualStudio, ... 吐き気がする. この記事では, そんな個人的な思いをぶちまけようと思う.

私のIDE批判は実体験に基づく. 私のプログラミング歴は, その濃度に波はあれども, バカでも分かるCとかいう本にトライしてforループの理解で挫折してから, 今年で8年を迎えることが明らかになった. Vimを使っていたのはこのうちたったの3年, 色々な道具を試しては捨ててを繰り返して, 完全にVimに落ち着いた. Vimより原理的に優れたエディタは存在する. しかし私は一生Vimを離れることはないと思う. ブレインマシンインターフェイスによるエディタが出てきて, 考えたことを思考スピードでエディティング出来るようになったらさすがに乗り換えるが, それ以外ではまずあり得ない. Vimがなかったら, 修士号もとれなかったし, dm-lcも開発出来なかった. 色々なソフトウェアを作ってきたが, どれもVimを使っていたから出来たのだと思う. 道具というのはそれほど重要なものだ. 弘法は明らかに筆を選ぶ.

京大電気系では, プログラミング演習の前に, UNIX環境でTexを使う練習が始まる. レポートはTexで提出することが求められる. ここでのエディタは, Emacsだった. もし, EmacsじゃなくてViないしはVimだったら, 今頃おれはもっと優れたプログラマになっていたと思う. だから, 京大電気系ではEmacsではなくVimを教えるべきだと強く主張する. しかしEmacsを使う理由は分かる. Viはご存知のとおり, モードの切り替えがあるし, 学習曲線が急であることを否定出来ない. では, 「入門Vi」という講座を個別に作ってそれを必須にすべきだ. エディティングは人間の基本であるから, その道具に対する投資は十分に回収出来る. 外部講師を招いて, エディタ講義があってもいい. どの分野でも, プログラミングの重要度は上がっているはずである. そしてエディティングは, プログラミングの基礎である. 早くタイプ出来れば, クイックに実行出来れば, それだけ学習・開発の効率は上がる.

ご想像のとおり, それから私は, 汎用エディタとしてEmacsを使っていた. Emacsはそれでも, ふつうのエディタよりは良かった. C-aやC-eでひょいひょいと動けるし, C-kを押せば一行分を一気に消すことも出来る. 私はViというエディタの存在すら知らなかったから, Emacsは(恥ずべきことだが)むしろ良いものだとすら思っていたかも知れない. eと押すとemacs -nwが走るような短縮も作ったかも知れない. EmacsTexを書くには良いエディタだと思うし, ほとんどのエディティングはTexだったから, それはそれで良かったのかも知れない.

研究室に入って, 私はJavaという言語を書くことになった. Rubyを書いたことはあったので, すぐに書くことが出来たし, すいすいとモノを作っていった. しかし, 私が使ったのはEclipseだった. Eclipseは, Javaに対しては無敵の存在だった. なんだか良く分からないがコードを書いてRunボタンを押せばプログラムが走るし, ユニットテストも簡単に作れる. グラフィカルデバッガも充実しているしプロファイラもある. 自動リファクタリング機能もあって, renameや関数抽出などはボタン一つで出来てしまうし, それはそれは効率良く作業を進めることが出来た. しかしそれは全くもって, おれの本質的な力ではなかったと後で気づいた.

修士に入っていくつかの企業を受けた. もっと前からVimを使っていたら受かっていたとは全く思わないが, 少なくとも後悔することはなかった. 私は, ホワイトボードプログラミングがあまり出来なかった. それどころか苦手意識も持った. Eclipseは, 私をコードに集中させてくれた. 設計技法に集中することが出来た. だから, 多くを学ぶことが出来た. しかし私は同時に, Eclipseがないと何も出来ない人になっていた. さらに, 今思うと書くコードが大げさだった. Eclipseの補助があれば, 多少複雑なコードでも管理することが出来てしまう. 自動リファクタリングを前提とした設計手法というものが存在しうるとも考えていた. しかしそれらは本当のプログラミングではなかった. 私がKISSをうまくなったのは, Vimによってコーディングを開始し始めてからである.

それに気づいたのはホワイトボードプログラミングの一件からだけではない. 修士に入って私は, 色々な言語に興味を持ち始めた. そこで私は悩んだ. 新しい言語にはEclipseのプラグインがないからだ. Scalaのプラグインは今でこそまともになっているが当時は糞だった. Haskellのプラグインなんかなかった. Pythonも書こうかと思ったが, PyDevとかいう糞プラグインは使い方が全く分からず明らかに大げさだった. こうして, 私は, IDEに依存することの恐ろしさを知った. プログラマは年に一つ言語を勉強しなければならないとされる. その新しい言語を学ぶ時に, IDEがまともになるのをいちいち待つのだろうか?そんなことしてたらいつまでも楽しめない. 成長もない. 加えて, IDEの上でコーディングをしていると, ソフトウェアがどうやってビルドされるのかも全く分からない. Javaで閉じているのが楽だから, マルチ言語プログラミングも出来ない. 他ツールとの連携もしようとしない. バージョンコントロールツールというのは何だ?全く分からなかった. IDEを使っていたら, プログラマとしての人生が完全に滅ぶと思った. IDEは確かに, ハマれば強い. しかし, 単一のEditorに深く習熟することでIDEの嵌り状態に近い効率を出すことが可能になるはずだと思った. IDEが行なっている色々な作業も, ツールを組み合わせることで実現すべきだと思った. 小さなツールを組み合わせて大きなことを行うスタイルの方が, 変化に強いし, 何より楽しい.

私は, プラグマティックプログラマに書いてあるエディタ比較を元に, jEdit, Emacs, Vimを比較対象とした. jEditは全くダメだった. Javaなので起動がアホみたいに遅い. 当時は気づいてなかったが, remoteで使えないから習熟度をどの場面でも活かすことが出来ない. ではEmacsVimか. 私は両方のオライリー本を買って完全に読み, コマンドと自分のフィーリングの相性を見た. 結論が, Vimだった. フィーリング以外にも, 私の手はそれほど大きくないため, Emacsキーバインドが不可能であることも理由だった(tmuxのprefixも私は, C-bからC-aに変更している. C-bは遠すぎる). Linux開発者の多くがVimを使っているという記事も参考にした. 私はLinuxカーネルプログラマになろうと思っていたから, そこで使われているエディタを使った方がいいと思った.

こうして私は, M2の半ばあたりでVimを習得して, 今まで3年間, Vimを使い続けている.

プログラミングを始めてから気づけば8年が経っていた. 最近, dm-lcを作ったことによって, プログラマとしてようやくステージに立ったという意識を持てるようになった. もし私がVimをもっと早い段階から使っていたら, 今頃もっと優れたプログラマになっていたと思うので, 若い人に同じ罠に嵌ってほしくないと思ってこんな記事を書いた.