Findy Engineer Lab

エンジニアの"ちょい先"を考えるメディア

他人がやっていない事こそ強みになる。テキストエディタに人生を全振りしたエンジニアのキャリア戦略とは

はじめまして。Shougo(@ShougoMatsu) という者です。私は現在、日中ソフトウェアエンジニアとして働く傍ら、GitHub Sponsorsで支援を頂いてテキストエディタ(Vim、neovim)本体を改善する活動やテキストエディタプラグイン開発を行っています。

今回「自分自身のキャリアを振り返り、スキルを向上させるために取り組んできたこと」について解説してほしいという依頼がありました。自分がプラグイン開発を始めてから、もう15年という長い月日が経っていて、世間ではテキストエディタの大ベテランと思われているようです。もうそこまで来てしまったのかと思うと同時に、時間さえかければ誰でもここに到達できると私は考えています。

私をはじめ誰しも最初は初心者です。右も左も分からない状態から始まるのです。私の経験が「自分はこれからどうすればよいのか分からない」「何か強みを持ちたい」と思っている人の参考になるのではないかと考えています。

自分が得意と思うこと、やりたいことに注力する

Findy Engineer Labの過去記事にこのようなものがありました。

findy-code.io

私もこの記事に近い考えを持っています。人は同じ24時間を生きています。つまり、使える時間は有限であるということです。同様に気力体力も有限です。何かに時間を使うということは、他の何かに時間を使えないということです。

何かに一生懸命になり疲れてしまったら、他のことをやる気力なんて失われてしまうことでしょう。日中仕事に追われていたら、趣味を楽しむ時間がなくなります。私は環境の変化でテキストエディタの開発から離れる人を大勢見てきました。

「自分の向き・不向き」と考えると非常に難しいので、「自分がやりたいこと・やりたくないこと」と考えると非常に分かりやすいかと思います。自分がやりたくないことというのは時間効率が非常に悪くなるので、いかにやりたくないことをやらないかということに尽力すると、自分がやりたいことに思いきり時間を使えるようになります。

やりたくないことについては必要になったときだけ勉強する、いわゆる「遅延式勉強法」です。我々エンジニアが勉強するべきことは山のようにあり、すぐに新たな技術が登場します。だから効率的に勉強することはとても大事なのです。自分が疎い分野は他人に教えてもらうなり、都度調べるなりして乗り切りましょう。

一つのことに集中して取り組んでみる

私が見る限り、何かを成し遂げた人は集中して一つのことに取り組んでいる傾向が強いと思います。世間でいう天才と呼ばれる人ですら自分の得意分野に長い時間をかけているというのに、一般人が時間をかけずして何かを成すことなどできるでしょうか。一つのことに集中して時間を使いつつ、学習効率が悪くなってきたらその分野の応用として横にも知識を広げていくと、効率的に知識を増やせると私は考えています。

例えば同じテキストエディタ技術であっても、組み込み環境とWeb開発環境では求められる経験が異なります。環境構築する際にもテキストエディタをうまく活用するように考えると、応用しやすいと思います。

世間ではあらゆる分野で成功し、一見何でもできそうな人がいます。過去記事の「苦手を捨てる決断により広がった世界」を読むと、そのような人は特質系と呼ばれ、万能で畏怖されているようですが、私はちょっと違った見方をしています。その何でもできそうな人は飽きっぽく、ある分野で一通りの成果を出すと飽きてしまうので、複数の分野に手を出しているだけではないかと思うのです。私は一つの分野に集中してしまうので、そのような人の気持ちは分かりませんが、飽きやすい人は確かに存在します。それはジェネラリスト向きの気質ということでしょう。

一つの分野に集中するということのリスクとリターン

もちろん、一つの分野だけに時間を投入することにはリスクがあります。その分野が時代遅れになってしまったり、世の中で使われなくなったり、技術開発が止まったりと選択にはリスクがつきものです。しかしそのリスクをとらなければ今の自分はいなかった、15年間プラグイン開発をすることはなかったのも事実です。

もし注力している技術が直接的に使われなくなっても、この時間は無駄ではなかった、全ての技術は裏でつながっていると考えるのがよいでしょう。新しい技術も既存の技術の上に成り立っているので、実際に全て使えなくなることは少ないです。

リスクを最小限に抑えたいならば、他に応用可能な技術に注力するというのも一つの手です。特定の製品でしか使えない技術はすぐに廃れる可能性が高いですが、より汎用的な技術であれば廃れる可能性は低く応用が可能です。テキストエディタなら、そのテキストエディタ固有の技術を勉強するのではなく、LSPといった汎用技術のほうを勉強することなどが挙げられますね。他にも数学は仕事で直接役立つことは少ないですが、応用できる範囲が非常に広い技術としてよく知られています。

人がやっていないことこそ強みになる

テキストエディタに全部の時間をかける、これは非常にリスクが高い行為なので誰もやらなかったのだと思います。しかし私はやりました。だからこそテキストエディタ界では有名人になることができました。人がやらないことをあえて本気でやるというのは「何か強みを持ちたい」人には必要なことではないでしょうか。

世間ではあまり評価されないマイナーな技術であっても、マイナーな技術だからこその強みはきっとあるはずです。メジャーな技術は既にやっている人が多く、そこで頭角を現すのはよほど初期からやっていないと困難です。マイナーな技術なら深く研究されていないので、簡単に第一人者になることが可能です。

Note: ちなみに、私にとってテキストエディタはあらゆる事象に応用できる汎用技術なので、技術の陳腐化を恐れてなどいません。

なぜプラグインをリニューアルするのか

私は5〜6年おきにプラグインを作り直すことが多いです。これは、プラグイン開発という活動を長く続けるための一つの手段となっています。リリースから5〜6年も経てば、世の中のトレンドは変化しています。最初は新鮮であったプラグインも、徐々に時代遅れになっていくものです。

リリースから時間が経つと、プラグインを利用する人たちに実装や設計への不満がたまっているでしょうから、新たに作り直してリニューアルするのは理にかなっているのです。プラグインがいつまで経ってもリニューアルされない場合は、それこそ作者にもうモチベーションがないのだと考えてよいでしょう。

私が知る限り、プラグインをリニューアルする人はほとんどいません。そもそも新しいプラグインが登場してもその勢いは一年も持たないですし、もしくは細々としたメンテナンスのみです。作者の更新が止まったときに、それを上回る新たなプラグインが登場し、置き換えられるというパターンが多いです。実質的に別の人がリニューアルしているということなのですね。

なぜこうなるかというと、プラグインをリニューアルするというのはとてつもないエネルギーが必要だからです。最初のプラグインはなんとか完成できたとしても、そこでやる気は尽きてしまい2回目、3回目も開発するモチベーションが上がりません。それにリニューアルしたプラグインは最初完成度が低いものなので、必死の思いでリニューアルしたのにその恩恵をなかなか受けることができません。私自身もプラグインのリニューアルでかなり苦しんだのでよく分かります。

私は常にプラグイン開発のことを考え、世の中のトレンドを追っていくことでプラグイン開発のモチベーションを維持するようにしています。そこまでして自力でリニューアルを続けている理由は、私の作ったプラグインを他の誰かが引き継いでくれると思っていないからです。過去の自分のプラグインを越えるのは、あくまで未来の自分のプラグインなのです。

Vim界の環境変化と歴史について

なぜ定期的にプラグインのリニューアルが必要なのか分かりやすいように、Vim界隈でこの15年間何があったのか簡単にまとめてみましょう。

  • 2006年 Vim第1世代:Vim 7.0がリリース。Vim scriptの仕様が改善され、大規模なプラグインが作成できるようになる。プラグイン開発が活発になる。

  • 2010年 Vim第1.5世代:Vim scriptの諸問題を解決するため、外部インタフェースや外部プロセスによる非同期処理が研究される。これらはVim第2世代に進化する礎となる。

  • 2014〜2016年 Vim第2世代:Vimから分化してneovimが登場。非同期APIが追加される。この世代よりVimが本体の機能を強化し高機能路線になっていく。neovimがリモートプラグインという新たな仕組みを導入する。

  • 2020〜2021年 Vim第3世代:VimはVim scriptを強化してVim9 scriptに進化、対してneovimはVim scriptではなく、Lua APIに移行する。neovim Lua APIにより作成されたプラグインが大量に開発される。第三の選択肢としてDenoを用いたdenops.vimが登場する。

およそ5年ごとに環境が変化しているのが分かるでしょうか。15年前のプラグインは15年前の環境に合わせて作られています。それは現在の状況とは全く異なるので、作り直す必要が出てくるのです。

スキル向上をどのようにしていくか

私はただ日常的にプラグインの開発をしているだけなので、明示的なスキルアップ活動をしていません。実をいうと、毎日プラグインの開発作業が忙しすぎてそんな暇もありませんでした。そこで私が実践しているのは「毎日のプラグイン開発をスキルアップに利用する」ことです。

皆さんは意識していないかもしれませんが、テキストエディタというのはプログラミングの道具として使われているのですから、そのときの世の中の思想を反映しているものなのです。15年前のテキストエディタの世界と現代でのテキストエディタの世界は状況が全く異なります。

テキストエディタについてアンテナを張っていると、その他の技術情報も耳に入ってきます。テキストエディタ技術というのは、ある意味で応用のしがいのある技術です。テキストエディタを用いた応用というのは無限に存在しており、それを学ぶことでスキルアップにつながります。もしあなたがスキルアップに対してモチベーションが上がらないなら、「テキストエディタプラグイン開発によるスキルアップ」に挑戦してみるのはどうでしょうか。

私は日常のルーチンとしてプラグインやテキストエディタに関する情報収集を行っており、さらにプラグインの不具合対応を行っています。プラグインの不具合に対応するには、それぞれのユーザーの設定を手元で再現しなくてはならず、別のプラグインを動作確認するなど普段の仕事では必要ない知識が必要になります。これは楽な作業ではありませんが、スキルアップするためには避けては通れないことです。テキストエディタを学ぶということは簡単ではないのです。

日中の仕事(学業)とテキストエディタ活動をどう両立させるか

「仕事(学業)とテキストエディタ活動を両立するにはどうすればよいだろう」 これは今まで数多の人々を悩ませてきた問題でしょう。

私の場合、仕事のソフトウェア開発でも積極的に自分の開発したプラグインを使用しています。そこで得た経験をさらにプラグインの開発にフィードバックしていくのです。隙間時間の活用も地味に重要です。むしろ、パソコンの前に座っていないときのほうが、プラグイン開発のアイディアをよく閃きます。常日頃からテキストエディタのことを考え調査し、暇さえあれば新たなアイディアを実装する、これこそが私がこれまで地道に積み上げてきたことなのです。

皆さんは「いかに仕事でテキストエディタを活用するか、仕事の効率を上げるか」と考えているのではないでしょうか。私は逆で「テキストエディタ以外の全ての事象をいかにテキストエディタに活用するか」を考えています。

そもそも私はテキストエディタのプラグイン開発のなかで、Git、GitHub、Python、TypeScriptといった仕事でも使える技術を学びました。仕事で得た知識をプラグイン開発にフィードバックしつつ、プラグイン開発で得た知識も仕事に役立てる、このようなWin-Winの関係が理想ではないでしょうか。

信頼性のある情報を収集する方法

我々が勉強するべきものは山のようにあり、情報が大量にあふれている今、単純な知識量よりも正しい情報を得る技術のほうがはるかに重要かもしれません。スキルアップや問題解決のための情報収集で大事なのは「信頼性のある情報を手に入れること」です。

まず最優先するべきは「公式のドキュメント」です。公式の情報は常に最新であることが想定され、執筆している人も公式の人なので信頼性がかなり高いのです。とはいえ、公式のドキュメントにあるのは使い方だけなので、何かあったときの問題解決には役に立たないことが多いです。

そこで次善の策は「公式フォーラム、issues、メーリングリスト」の利用です。こちらは開発者やそれに近い人たちが答えてくれていて、即時性も高いです。ただし欠点として必ずしも回答が得られる保証はないこと、回答が間違っていることもまれにあり得ます。直接質問をする前に、予めログで似たような問題が報告されていないか確認するのは、基本的なマナーです。Web検索をして公式フォーラムの情報がヒットする場合は優先して参照するとよいでしょう。問題解決のログを見る場合にはその日付や対象バージョンにも注意しましょう。その当時では正しくとも、現在では役に立たないことがあります。

それでも問題が解決しないときには、コミュニティに聞くというのも一つの方法です。そのコミュニティの質にも左右されるのですが、開発者もしくはそれに近い人たちが集まるコミュニティというのは存在します。質問をする場所を間違えなければ、信頼性の高い情報が得られることでしょう。

Web記事を参考にする場合には「誰が記述したのか」「いつ書かれた記事なのか」を確認するようにしてください。適当に検索した情報をあてにすると、誤情報をつかまされることにつながり、間違ってはいないが正解ではない、いわゆる「よく分からないが動いた」という状態になりかねません。

情報入手は優れた知識を持った専門家から

これまで説明してきたように質問をする場所、情報を入手する場所というのは確かに重要なのですが、本質的には「誰から得られた情報なのか」が大事なのです。優れた知識のある人は特定の場所に集まっているので、その場所を選ぶことが重要です。これは忘れないようにしましょう。

情報源はなぜこれほどまでに重要なのでしょうか。それは、知識のある人でないと正しく回答するのは困難だからです。正解にたどりつくには、数多くの試行錯誤と知識が必要になります。片手間に勉強をしている一般人では、とてもたどりつけない世界があります。それが「特定の強みがあるということ」です。

テキストエディタの専門家と一般のテキストエディタユーザーの知識にどれくらいの隔たりがあるかについて説明します。一般のユーザーはテキストエディタ本体の機能とよく使用するプラグインにしか興味がないと思いますが、専門家の場合はそれだけでなく、テキストエディタ本体の実装、テキストエディタの新機能の研究、バグの調査、他のプラグインの研究に他のソフトウェアとの組み合わせといった、多種多様な知識を持っているのです。さらに時が経つとともに、これらは変化していき、その変化にも専門家は対応しています。

専門家には必ず得意分野があるので、得意分野に関して質問をするようにしましょう。専門家なら何でも知っているとは思わないようにしてください。例えば私の場合、テキストエディタVimに関する知識は豊富ですが、他のことに関しては不得手です。

英語はあくまで補助スキル

私は15年間プラグイン開発をしてきましたが、英語はほぼ勉強していません。英語というのはあくまで道具、補助スキルにすぎないと考えています。あらゆる分野で使われるので、確かに英語ができると評価が高いのは理解できます。しかし英語はメインスキルではなく「補助スキル」というのがポイントです。メインのスキルが優れているときに補助スキルがあると付加価値としてとても強力ですが、補助スキルだけではだめです。単刀直入にいうと「英語スキルだけでは何もできない」のです。

私が英語を使う場面というと、プラグインの情報収集、英語圏ユーザーとのやりとり、プラグインのドキュメント作成、バグ報告やパッチ作成などです。確かに英語を使う場面というのは少なくありません。もっと流暢に英語が使えると楽になる場面はあるでしょう。

しかし時間は有限なので、「英語に勉強時間を使うと他の勉強ができない」となると問題です。私は英語スキルがテキストエディタの時間を削るほどに勉強する価値のある技術だと思っていません。だから英語は躊躇なく捨てました。

とはいえ、私は英語が必要になった場合に翻訳ツールなど使える技術は何でも使っています。専門的に勉強をしなくても意外となんとかなるものです。私から見ると、あくまで補助スキルである英語を勉強するというのは、メインのスキルを勉強する時間を捨てていると同義だと思いますがいかがでしょうか。

もちろん英語の勉強が全て無駄ではありません。必要な分だけ勉強するのは構いませんが、深入りは禁物です。あなたはメインスキルの研鑽を諦めてしまったのでしょうか。それこそ本末転倒になってしまいます。

継続するというスキル

活動を継続していく、モチベーションを維持するというのはとても難しいことです。私がテキストエディタ活動をやってきた15年という期間はとても長いもので、テキストエディタ界隈から卒業していく人を何人も見ています。私も常にモチベーションが高いわけではないのですが、こうして長年活動を継続できているというのは幸運なことなのでしょう。

私のテキストエディタ開発のように、何かの活動を継続したいのなら、それをすることを自分の習慣にしましょう。人は習慣になったことはやり続けられるものです。毎日少しずつの作業でも地道に継続していくようにしましょう。やる気があまり出ない場合には簡単な作業だけやる、更新チェックだけするというのも一つの手です。

私は最近GitHub Sponsorsの支援を受けて活動をしています。これは、今後のプラグイン開発を安定して行いたいと考えたからです。人から金銭的な支援を受けられる、自分の活動を支援してくれる人が増えるというのは、モチベーションの維持につながると実感しています。GitHub Sponsorsの支援を受けてからは、プラグイン開発以外にテキストエディタ本体の問題にも積極的に関わろうというモチベーションが生まれています。

読者の方々に伝えたいこと

インターネット上を見ていると、自分より優秀な人がどんどん現れていて不安になるのではないでしょうか。インターネットというのは自分の世界を凝縮しており、確かに日本全体や世界で見ると優秀な人が大勢います。きりがありません。

しかし、本当に世の中は優秀な人ばかりでしょうか。本当に周囲には優秀な人しかいないのですか。あなたのフィルターで凝縮された結果、確かに特定の人物が目立っていますが、実際には普通の能力の人も大量に必要とされています。あなたにはあなたにしかない強みがあるはずです。

ただ、その世界で何かを成したいのであれば、時間は惜しむべきではないと思います。若い人に追い越されるのが不安だとしても、今までの経験は無駄にはならないはずです。あなたの時間を何に費やすべきか考えてみましょう。何かを始めるのに遅いことはありません。時計の針は戻せないし、今が一番若いのです。ベストを尽くしてみてください。

自分のキャリアについて

私はただひたすらにテキストエディタに時間を費やしてきました。もし、私がテキストエディタの代わりに他のものに時間を費していれば、別の分野で成功していた可能性があります。あなたも「このとき、こちらの選択をしていれば」と思ったことは何度もあるでしょう。

しかし別の道を選んだ場合、本当に成功できたのでしょうか。選択しなかった道はどうしても魅力的に映ります。テキストエディタに時間を費やさなかった世界線では、自分は何もできずに生涯を終えていたかもしれません。選択しなかった未来は確定していないため、バッドエンドで終わる可能性があるのです。

時間は有限です。何かを得るには他の何かを犠牲にしなければなりません。私は、たとえ自分自身に何かあったとしても、テキストエディタの経験があればなんとかなるだろうと思っています。私にとってテキストエディタはそれだけ万能な存在であるため悔いはないのです。