個人の開発生産性を爆上げする(Vimのススメ)


はじめに

SkillnoteVPoEの安藤です。
今回はほぼタイトルオチ(かつ、色々な人がそれぞれの視点で書いている)な話題ですが、社内向けにも発信したいモチベーションがあってnote記事として公開しようと思います。

記事を書こうと考えた背景

Skillnoteではアジャイル開発を取り入れており、少しずつですが慣れや定着化が見られるようになってきました。
今までは「お手本のある開発」が中心だったものが、だんだんと「ニーズを掘り起こしながら進める開発」に変遷してきており、これにマッチした開発プロセスに変更している、という前提があります。

また、エンジニアの人数が増えてきたこと、技術レベルや背景が異なるメンバーが増え、プロダクトやドメイン知識の差が大きくなってきたことも相まって、その差分を埋めるためにペアプログラミングの取り組みなども活発化するようになってきました。

自分自身もペアプログラミングの経験がなかったのですが、最近機会があってナビゲーターの役割を担うことがあり、このときに感じたことが本記事を書くきっかけとなりました。

ペアプログラミング(ナビゲーター)を経験した感想

既にペアプログラミングの取り組み自体は実施しており、少しずつメリットやデメリット、効果を発揮するシーンなどが知見としてまとまり始めています。

ペアプログラミングの知見の一部(ペアのふり返りなども記載されています)

今回はドメイン設計をコードに落とし込む部分でペアプログラミングに参加したのですが、設計フェーズは「ああでもないこうでもない」と思い悩むことも多いため、この時点で壁打ち相手としてその場でディスカッションしたり、アドバイスできたことは大きなメリットでした。
オンラインで4時間付きっきりのペアプログラミングだったのですが、肌感覚としてこれを1名かつレビューのやり取りで実施したとすると、タイムラグ含めて2, 3日はかかっていたと思います。
これが4時間にギュッと集約できたのは非常に効果的でした。

また、このときナビゲーターをやっていたこともあり、ドライバーの作業効率をもっと上げられるとも思いました。
具体的には、キーボードやマウス操作、リファクタリング操作について、例えば1ワード中の特定の文字部分を消す操作(マウスでカーソルを該当箇所に持っていき、そこからBackSpaceを何度も叩く)などといった細かい点ですが、チリツモだけど1つ1つの作業を効率化できれば、全体としてもっと早く開発できると感じました。

そこで、途中からそのような操作についても着目しながらナビゲーター役をしており、以下の2点を主な感想として持ちました。

  • IDEをもっと使いこなす(キーボードショートカットをもっと使い倒す)

  • テキストエディタ上の操作をよりキーボードだけで完結させる

前者はかなり特定のプロダクト(Skillnoteは標準ツールとしてIntelliJを採用しています)専用知識となるため割愛し、より汎用的である後者について、社内にも共有してみると反応がありそうだなと感じ、書き下していこうと思います。

Vimを使うことで嬉しくなることは何か?

この点については本当に色々な人が書いているのですが、ペアプログラミングをしていて、これができたら更に嬉しいのでは?という点に絞って記載することを主眼とします。
また、「これはVimのことじゃなくてViのことだよね」といった感想もあると思いますが、それこそ「IntelliJのVim Pluginを使おうね」みたいなことを前提としているため、敢えてVimと呼んでいます。(つまりコンソール作業は対象としていません)

というわけで、毎度前置きが長いですが以下本題。。

  1. キーボード操作のみで完結できるカーソル移動

  2. キー操作1回で実施できるUndo

  3. 強力な範囲選択

  4. キー操作1回で実施できるファイル内検索

  5. 強力な置換

キーボード操作のみで完結できるカーソル移動

カーソル移動は数あるPC作業の中でも最もマウス操作で実施するものだと思いますが、Vimであればマウス操作を8割くらいはキーボード操作のみで完結させられ、かつマウス操作よりも場合によっては高速で、狙った位置を外さず移動できるようになります。

  • ワード単位での移動

  • 行頭、行末への移動

  • ファイルの先頭行、末尾行への移動

  • ページ単位の移動

  • カーソル位置の記憶、ジャンプ

キー操作1回でできるUndo

u

これだけです。一般的には「Ctrl+Z」が用いられることが多いと思いますが、Redoと比較しても圧倒的に多く使うUndoが「u」のみで済むのは、人によっては「Ctrlの位置を確認するために目線をディスプレイから切る」必要もなくなり、効果の程を感じていただけると思います。
(ちなみに、Redoは「Ctrl+R」なので、一般的なキー操作と同じです)

強力な範囲選択

「ダブルクォーテーションに囲まれた文字列を消したい」「シングルクォーテーションに囲まれた文字列を、シングルクォーテーションも含めて書き換えたい」といったことがマウスを使わずとも可能となります。
(このケースであれば、キー操作3回のみ)

また、HTMLやVueなどの「タグに囲まれた文字列をコピーしたい」や「カッコに囲まれた範囲を選択(検索)したい」といったこともキー操作3回で実施できるようになります。

矩形選択機能もあり、多少応用にはなりますが「1行の長さがガタガタしているファイルの文末全てにセミコロンを挿入する」なんてことも6回くらい操作が必要ですが、マウスなしで確実に実施できたりします。
(ExcelでSQLを組み上げて、文末セミコロンだけVimで処理する、みたいな。。むしろ非効率かもしれないですが笑)

キー操作1回で実施できるファイル内検索

*

これだけです。(実体は、いくつかのコマンドのシンタックスシュガーですが)
また、次のワードへのジャンプも「n」「N」のみで良く、カーソル移動手段としても良く利用します。

強力な置換

プロパティの名前を変えたり、「同じようなロジックなので、特定のクラスをコピーして、それを元にベース実装を作りたい」という場合などに超強力です。
多少sedの知識(というかUnixの正規表現の知識)が必要になりますが、シンプルな置換はパターンがほぼ決まっているので都度調べなくともすぐに手に馴染むようになります。(sed / awk でオライリー本が1冊書けるほどのボリュームなので、深入りすると大変ことになりますが笑)

置換は多少応用になるのと、IDEのリファクタリング機能が優れている点(例えばクラス名の変更に対して他クラスで宣言しているプロパティ名も変換してくれるなど)も多くあるため、ケースバイケースで採用していくことになると思います。

まとめ

いかがでしたでしょうか。
こちらに挙げた操作は全て「マウス操作不要」という点が特徴です。
つまり、キーボードから手を離すという強制的なコンテキストスイッチが働く操作をしなくとも良い、という点に置いて非常に効率的なものとなります。
コーディングをしていると「安藤さんはコーディングが早い」と言われることがあるのですが、その1つの秘訣は「異常なほどマウス操作を嫌う」ところにあるんだろうな、と最近感じました。

なぜそれを嫌うのかというと、手の移動時間が発生する=少しでも空白時間が発生する=コンテキストスイッチにつながる、という点なのだろうな、と考えています。
キーボードへの投資を渋らないことと、とも言われるように、いかに脳の動きとキーインプットを同期させるか、ということはエンジニアの最もベーシックな生産性の向上施策なんだなということをペアプログラミングを通して学ぶことができました。

今回は自分がこだわっているVimについて語ってしまいましたが、社内にはHHKB Studioを発売後すぐに購入した人や、トラックボールマウスこだわり派など、色々な工夫をしているメンバーがいます。
個人の生産性最大化やガジェット話について興味を持っていただけた方、カジュアル面談を随時受け付けていますので、是非気軽にお話にきてください!


この記事が気に入ったらサポートをしてみませんか?