Tech & Design LAB

開発者のオンボーディング時間を10x短縮する方法

author icon
Posted on
tech

ついにWFHからオフィスに戻ってきました😌オフィスはやっぱりいいですね、ウキウキのHiCustomerの小田です。どうでもいいですが先週の日曜に、オーケストラを聴いてきました。一定時間何も考えずに音の波に揉まれて人生を振り返る。いやー、なかなかいい体験をさせてもらいました。なんか、初めてクラブやライブに行ったときの感覚を思い出しちゃいました。調子にのって次はN響を聴きにいきます。

開発スピードを10xに

さて本題です。弊社ではお客様のためにやりたいこと・試したい施策が山程あり、なんとか開発のスピードを10xできないかと常々考えてきました。10xさえすれば全ての問題は勝手に解決していくと信じています。個人的になんとしてでも達成すると誓っております。

そうした中で、半年前から問題を切り分け具体的な施策に手をつけ始めました。今日は数々の施策の中で特にオンボーディングで効果があった、「開発者のオンボーディング時間を10x短縮する方法」をご紹介します。ちなみに次回は、施策の中から「Monorepoの導入と効果」や「組織全体で使用するcliの導入と効果」についてのポストをいくつかにわけて書く予定です。そちらについても乞うご期待ください。

セットアップにかかる無駄な時間

DevOpsなんて言葉にも表現されていますが、昨今のソフトウェアエンジニアはDevとOpsの2つ種類のコードを書く必要がでてきました。しかもDevもOpsもさらに細分化され、例えばDevはフロントエンド・バックエンド・データサイエンスに分かれていたりします。

各社のエンジニアはそれぞれの特性に併せて2・3の領域を担当していると思われます。このとき単に扱うコードの種類が増えるだけなら問題はないですが、場合によってはセットアップのツールが異なりオンボーディングに不要な時間がかかったりしないでしょうか?弊社の場合は、例えばフロンエンドと監視も触るバックエンドエンジニアの方は以下のような状況になっています。

種類 セットアップに必要なツール 備考
Dev - フロントエンド npm-merge-driver,commitlint gitのpre-commitがcommitlintに依存
Dev - バックエンド direnv,hub,ShellCheck deployがhubに依存
Ops - 監視 direnv,pip

この状況の問題点は以下になります。明らかに人数やコードの種類が増えるとスケールしないですね。

弊社ではまず以下のようなドキュメントをつくって対応していました。弊社の場合はMonorepoで全ての種類のソースコードが1つのrepoで管理されているので、このドキュメントをMonorepoのトップに配置して全てのチームが参照できるようにしていました。

## 全体のセットアップ

以下のコマンドを以下の順序でインストールしてください。「インストール後
の確認」に指定したコマンドを実行して、インストールされていることを確認
してください。

name | インストール後の確認 | インストール方法
--   | --                   | --
brew | `brew doctor`        | macOSのみで必要。 https://brew.sh/
pip  | `pip --version`      | https://pip.pypa.io/en/stable/installing/#installing-with-get-pip-py
npm  | `npm config list`    | https://nodejs.org/en/download/package-manager/

次に以下のコマンドを以下の順序でインストールしてください。

name             | インストール後の確認       | インストール方法
--               | --                         | --
jq               | `jq --version`             | https://stedolan.github.io/jq/download/
hub              | `hub --version`            | https://github.com/github/hub#installation
direnv           | `direnv version`           | https://github.com/direnv/direnv/blob/master/docs/installation.md
pre-commit       | `pre-commit --version`     | https://pre-commit.com/#install
ShellCheck       | `shellcheck -V`            | https://github.com/koalaman/shellcheck#installing
coreutils        | `brew info coreutils`      | macOSのみで必要。 `brew install coreutils`
commitlint       | `commitlint --version`     | `npm i -g @commitlint/config-conventional @commitlint/cli`
npm-merge-driver | `cat .git/info/attributes` | `npm i -g npm-merge-driver && npx npm-merge-driver install`

このアプローチはコスパがよく悪くないですが以下のような問題点がありました。自動化されていない点が問題の根本にあるのが自明で、自動化にかかるコスト次第では改善したいと考えていました。

hc-cli setup を開発し、効果は100x

もともと組織全体で使用するcliのコマンド hc-cli を開発していたこともあって、自動化のコストは高くないと判断し、最終的に全てのインストールを自動化するアプローチを取りました。要件は 1コマンドでセットアップが完了すること のただ1つです。

最終的に出来上がったものが以下になります。実装はシンプルで既存のcliのコマンド hc-clisetup というサブコマンドを追加しました。開発者は git clone をしたあとに以下のコマンドを打つだけでセットアップが完了します。

$ ./cli/install.sh   # hc-cliのinstall
$ hc-cli setup
 INFO : Starting mitamae...
 INFO : Recipe: /home/katsuya/.local/share/hc-cli/mitamae/setup.rb
 INFO :   local_ruby_block[print notes] executed will change from 'false' to 'true'
 INFO :   local_ruby_block[run hc-cli doctor] executed will change from 'false' to 'true'
 INFO :     Required commands
 INFO :      o commitlint       /home/katsuya/.nodenv/shims/commitlint (9.1.2)
 INFO :      o curl             /usr/bin/curl (7.68.0)
 INFO :      o direnv           /usr/bin/direnv (2.21.2)
 INFO :      o hub              /usr/local/bin/hub (2.14.2-52)
 INFO :      o jq               /usr/bin/jq (1.6)
 INFO :      o mitamae          /home/katsuya/.local/bin/mitamae (1.11.7)
 INFO :      o npm              /home/katsuya/.nodenv/shims/npm (6.14.4)
 INFO :      o npm-merge-driver /home/katsuya/.nodenv/shims/npm-merge-driver (2.3.6)
 INFO :      o pip              /home/katsuya/.local/bin/pip (20.0.2)
 INFO :      o pre-commit       /home/katsuya/.local/bin/pre-commit (2.7.1)
 INFO :      o ShellCheck       /home/katsuya/bin/shellcheck (0.6.0)
 INFO :      o textlint         /home/katsuya/.nodenv/shims/textlint (11.7.6)
 INFO :      o                      @textlint-ja/textlint-rule-no-insert-dropping-sa (1.0.1)
 INFO :      o                      @textlint-ja/textlint-rule-no-synonyms (1.1.0)
 INFO :      o                      sudachi-synonyms-dictionary (6.0.0)
 INFO :      o                      textlint-filter-rule-comments (1.2.2)
 INFO :      o                      textlint-rule-ja-hiragana-fukushi (1.2.0)
 INFO :      o                      textlint-rule-ja-hiragana-hojodoushi (1.0.4)
 INFO :      o                      textlint-rule-ja-hiragana-keishikimeishi (1.0.2)
 INFO :      o                      textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet (1.0.1)
 INFO :      o                      textlint-rule-preset-ja-technical-writing (4.0.1)
 INFO :
 INFO :     Optional commands
 INFO :      o AWS CLI          /home/katsuya/.local/bin/aws (2.0.53)
 INFO :      o awslogs          /home/katsuya/.local/bin/awslogs (0.14.0)
 INFO :      o Docker           /usr/bin/docker (19.03.13)
 INFO :      o Docker Compose   /home/katsuya/.local/bin/docker-compose (1.25.5)

興味のあるかた向けの追加情報ですが、hc-cliの技術スタックは以下です。実装は前職のつてをいかし、CRubyのURIライブラリなどを実装したやまだあきらさんにお願いしました。

さらに作りながらわかったのですが、オンボーディングコストを削減する以外に以下の副次的な効果があることがわかりました。この辺は結構嬉しかったりします。

以上になりますが、ここからがほんとの本題です。弊社では試行錯誤しながら開発組織を10xしたい方を募集しております。DevOpsの目的は色々ありますがその1つに開発組織をサクセスさせることがあります。その思いが強い方はきっと弊社の事業ドメインのカスタマーサクセスにも共感いただけると思います。フルリモートもOKなので、ご興味のある方は採用サイトをご覧いただけたら幸いです。

author icon
シニアエンジニア

最近はAWS CDKとAWSのdata lake周りのソリューションが好きです🙋‍♀️よく、lwn.netとCrypto-Gram Newsletterを結構みています。djbと及川さんを尊敬しています。