三十路エンジニアがVimとGoでそれなりに成長したという話

# tl;dr

- 気がつけば三十路に突入していました
- 中堅エンジニアとしてそれなりの経験をしたがこれといった強みがない
- これから自分のエンジニアとしてのキャリアをどのように作ればよいのかわからない
- なんとなく黒画面(Vim, ZSH)いじりをしていた
- なんとなくGoで自作コマンド作りをしていた
- それなりに成長できたのではなかろうか

## まえがき

私は今年で三十路になります。
新卒からずっとエンジニアとして働いてきましたが、気がつけば中堅エンジニアのポジションにいたわけです。
当時ある程度の設計をこなしたし、数種類のプログラミング言語で人が見やすいコードを書く自信はありましたが、
数年間をレガシーなSIerの中で過ごしていたこともあり、先端の技術トレンドに触れていない。
ベンチャーでガリガリコードを書いてきた若者には到底及ばないのではという不安がありました。

## 本題

### 黒画面いじり

技術力をもっと高めなくてはと思っていた私が現職についてからまず始めたのは、
Vimの設定ファイル(.vimrc)とzshの設定ファイル(.zshrc)いじりでした。
別に深い意味はなく、私にとってのやばいエンジニア像は黒画面触っているという漠然としたイメージを持っていたので、
黒画面を触っていればやばいエンジニアになれるのではという考えでなんとなく触っていました。

正直最初は普通にGUIで操作したほうが早かったですが、設定ファイルの書き方の勘所を押さえてからは
黒画面サイコーになっていました。設定ファイルの作成に半年近く吸われましたがそんなことは気になりませんでした。

詳しくは以下の別記事を見ていただきたい。

- [なぜ私がVimを使っているかもう一度よく考えよう](https://qiita.com/lighttiger2505/items/fe8ed310308301200e24)
- [CLIを布教するために会社でプレゼンしてきたのでそのまとめ](https://qiita.com/lighttiger2505/items/0f61b8fcd790bab0f3c9)

### すごいコマンド

VimとZSHをカスタマイズしていくなかで、いくつかのすごいコマンドに出会いました。
[peco](https://github.com/peco/peco)や[ghq](https://github.com/motemen/ghq),[platinum searcher](https://github.com/monochromegane/the_platinum_searcher)などです。

これらのコマンドの便利さに酔いしれ、
私はこういったコマンドを作成しているのはなんかやべえ海外のプログラマの方なのだろうなと、
自分には縁のない世界の出来事として捉えていました。
しかしそれからほどなくして、これらのコマンドはすべて日本人プログラマによって作成されたものだということを知りました。
自分が公開したソフトウェアが世界中の人に評価され、多くのユーザに使われているのはとても気持ちのいいものだろうな。
と彼らの心情を想像して少しワクワクしたのを覚えています。

### GitLabのCLIコマンドなくないか

弊社ではソース管理とイシュートラッカーとして[GitLab](https://about.gitlab.com/)を使っていました。
GitLabはCommunity Editionであればセルフホスティングしたサーバにインストールすることで無料で使えるのが魅力の一つです。
ですがGitLabがインストールされたサーバが貧弱で、GitLabのレスポンスの遅さに毎日辟易していました。
その頃にはもうすでに黒画面から離れたくないよとダダをこねるのが日常になっていた私は、この問題をなんとかできないかと考え、
[hub](https://github.com/github/hub)コマンドを思い出しました。

当時ghqとpecoでリポジトリを飛び回る術を覚えた私にとって、
GitLabのトップページから目的のプロジェクトに行くよりもターミナルで移動したリポジトリをベースに、該当リポジトリのページに飛ぶほうが遥かに早いと考えたのです。
hubのGitLab版があれば解決すると思って、公式ページにある[CLIアプリケーション一覧](https://about.gitlab.com/partners/#cli-clients)を見てみましたが、
私が欲しがっているものは見つかりませんでした。なんでこんなあって然るべきコマンドがないのだと憤慨しましたが、
ないものは仕方がないので自分で作ることにしました。

カレントディレクトリのGit情報を読み取って、ブラウザを開くだけなのでそんなに難しくないとは思いました。
事実hubのソースを覗いてみたら、ほぼ必要な情報はそこに揃っていました。
当時Goはちょっと触ったくらいでしたが、peco, ghq, platinum searcher, hubがGo実装であること、
Goのコーディングに最適なのはVimだ！と当時言われていたのもあって、実装に使う言語としてGo以外の選択肢はありませんでした。

そうして出来たのが[lighttiger2505/lab](https://github.com/lighttiger2505/lab)でした。ええそうです。なんのひねりもない名前です。
browseさえできればいいやと思って作り始めたのですが、いじるうちに必要そうな他のサブコマンドも思いつき、
ISSUEやMR(GitLabはPull RequestではなくMerge Requestといいます)をVimで操作できたりとか色々な機能が追加されていました。

調子にのった私は、そういえばGitLabのCLIアプリケーション一覧はMRを投げることで追加ができるぞと思い出し、
せっかくなので公式ページに乗っけてやれと一覧をのぞきに行きました。
そこで[zaquestion/lab](https://github.com/zaquestion/lab)を初めて見ました。
なんと私の作ったCLIコマンドと全くの同名、ほぼ同じコンセプトのコマンドでした。
しかもドキュメントとかわいいアイコンまでついて100個を超えるスターがついていました。

もし自分のコマンドが先に掲載されていればこのスターは我が物になっていたのではないかと嫉妬の念を抱いたりしましたが、
よく見たら向こうのlabのほうがはるかに整備され、綺麗なソースコードになっていました。
私はしくしくと自分のlabを登録するMRを出しました。

### 他のコマンドも作る

一つ作ってみたら、簡単にコマンドが作れることがわかりました。
Goは多くのコマンド用のライブラリが整備されているのもとても良かったです。
以下に私が作成したコマンドを載せておきます。

- [lab](https://github.com/lighttiger2505/lab)
    - [zaquestion/lab](https://github.com/zaquestion/lab)のほうが優れているのは知っているが、愛着あるのでちょいちょいいじっている
- [lab.vim](https://github.com/lighttiger2505/lab.vim)
    - 上記をコールするだけのVimプラグイン。地味に便利だがヘルプがないので自分しか使えない
- [liary](https://github.com/lighttiger2505/liary)
    - [memo](https://github.com/mattn/memo)の再発明。memoのほうが優れているのは知っている
- [liary.vim](https://github.com/lighttiger2505/liary.vim)
    - 上記をコールするだけのVimプラグイン。地味に便利だがヘルプがないので自分しか使えない
- [s3tf](https://github.com/lighttiger2505/s3tf)
    - CLI上で見れるAWS S3のファイラーがあったらいいなと思って作った。案外便利じゃなかった
    - コレをネタにGolangTokyoでLTできた。
        - [発表資料](https://speakerdeck.com/lighttiger2505/godezuo-ruintarakuteibunaclikomandotosofalsedezain)
- [browser-hb](https://github.com/lighttiger2505/browser-hb)
    - 略してbhb。chromeのブックマークとヒストリーをインタラクティブにフィルタリングしたいのでStdoutに出力するだけのコマンドを作った

その他あるけど真面目に作ったのは上記くらい

## やってどうだったか

やってよかった。たのしい

### GitHubに草生えた

GitHubにそこそこ草が生えたので、エンジニアしてるなーってなった。
たぶん今年は800コントリビュートくらい。

### 地味にPR送った

labで使っていたライブラリ([go-gitlab](https://github.com/xanzy/go-gitlab))に機能が足りてなかったのでPR送った。
わが心のライバル[zaquestion](https://github.com/zaquestion)さん(lab作っているひと)がメンテナやっててマージしてくれた。
英語が解らない以外は障害はない(ある)

### コミュニティに足を運ぶようになった

私はVimとGoが好きだと胸を張って言えるようになったので、
それ関係のコミュニティに顔出したりLTしたりしたらちょっと知り合い増えた。
好きなことを話せる人がいるのはいい。

### 暇なときに作るものがたくさん

CLIコマンドを作り出してから、アイディア湧いたら名前と適当な説明考えて空のリポジトリを作るようにした。
あとコントリビュートしたいリポジトリを見つけたらすぐフォークするようになった。
やりたいと思ったときには大体忘れているのでおすすめ。

### OSSのコードを読むようになった

OSSのソース読む習慣はなかったのですが、いざ自分のコマンド作り出してみたら、
解らないことはもう既に実装されているものを見るのが一番はやいことに気がついた。
仕事やってるときもドキュメントみてわからなかったらソース見るようになって捗る。