見出し画像

開発組織内製化をはじめて、1年経ったので振り返る

メダップで取締役CTOをしている馬場です。
前回に続き、CTOアドベントカレンダーに乗っかって、書いていきたいと思います。(予定日より1日遅れてしまった、、すみません)

CTOアドベントカレンダーはこちら↓↓↓
https://qiita.com/advent-calendar/2021/cto

2021年1月からメダップで行ってきた開発組織内製化がちょうど1年経ちます。今回は、その開発組織がどう変化していったのかを説明しつつ、その過程でCTOとして何を行ってきたのかを書いてみます。

2020.11 ~ 2020.12 (前哨戦)

この期間、私はまだ前職で働いていました。メダップに参画することは2021年9月時点で決断していたのですが、残りの期間を全うしていた時期にあたります。

メダップへのコミットでいうと、週1の副業程度でした。
やっていたこととしては、以下です。

- 業界・事業理解
- 現状のプロダクト理解
- 2021年1月以降の開発メンバーの採用

ちなみに、当時の開発は完全外注で、プロダクトをリリースしていたのですが、内部に開発のことを把握できているメンバーがいない状態でした。
(主に代表が直接、PM担当の方とコミュニケーションを取りつつ、機能開発をリクエストしていました)

プロダクトとして実現したい仕様と実際の挙動に差異があったり、予期せぬ致命的なバグやサーバー停止などが多くあったりと、なかなか思うようには開発が進められていなかったのかなと感じています。
(病院業界というなかなかとっつきにくいドメイン、かつ内部に開発を把握している人がいない状況で、開発を進めることはかなり難しかったと思います。。)

そんな中でもプロダクトをリリースできていて、そのプロダクトを利用しているユーザー(病院)が一定数存在していたことは非常に大きなことだったかなと考えています。
その土台を作ってくれた開発者の皆さんには、めちゃくちゃ感謝しています!

そうした状況ということもあり、週1で入って開発をしていくことは微妙な判断かなと考えました。
結果として、現状理解や会社・事業としての全体像理解を行いつつ、採用活動を通じて、最速で内製化を進められるようにリソースを振り切れたことは、我ながら良い意思決定だったかなと感じています。
(開発はしていませんが、コードリーディングはやってました)

私に求められていたVisionとしては、最速で開発組織を内製化することであったため、自分が参画直後で開発に貢献することよりも内製化に向けた動きを優先することができたと思います。やはり期待値をすり合わせることは非常に重要だなと今でも感じます。

2021.01 ~ 2021.03

2021年1月となり、いよいよ正社員としてメダップに参画しました。
これまで開発をしてくれていた業務委託のメンバーで、残って一緒に開発を進めてくれた方もいたのですが、実質チームは解散となったので、全く新しいチームで開発を進めることになっていました。

この期間の私は、チーム開発を行う上で今後の基盤となるコードをフロントエンド・バックエンドともに書きまくっていました。
また、平行してチームのコアメンバーとなる正社員エンジニアの採用に全力投球でした。(これが後に効いてきます)
自分のリソースを10とすると、ディレクション:開発:採用 = 2:4:4 で進めていました。

■ 当時のチーム

正直にお伝えすると、2021年1月時点で組成したチームにいたエンジニアは、現在私を除いて1人もチームに残っていません。私以外は、業務委託メンバーで組成していたのですが、チーム作りをしていく過程で離れていってしまいました。ただ、当時0から進める過程を一緒に進めてくれたことに非常に感謝しています。

もちろん嬉しいニュースもあり、私が参画をした1ヶ月後の2021年2月に正社員として2名、エンジニアが参画してくれました!
更にその1ヶ月後にはもう1名、正社員として内定承諾(4月入社)をいただき、フルタイムでコミットしてくれるエンジニアが一気に増えました。
この3名の方々は、今でもチームの中心メンバーとしてメダップの開発組織を支えています。
振り返ってみると、初期立ち上げのエンジニア採用はかなり上手くいったのではないかと思います。

チーム全体としては、まだまだ上手くスプリントを回せているということもなく、週次スプリントで定める目標や振り返りの質は今と比べて非常に低かったと思います。

私が、開発のディレクションをすべて行っていて、日中はその調整や設計等ですべての時間が取られてしまうので、自分の開発は深夜に行っていました。

■ 当時のアーキテクチャ

この期間の技術構成としては、一般的なMVC構成のRailsアプリがGAE上で動いていました。(外注を引き取ったもの)

バックエンド側に関しては、Controller ディレクトリ配下にある concern で定義されていた module が一部の Model で呼ばれていたりとなかなか依存関係を追いにくい状態でした。

フロントエンド側に関しては、Rails の webpacker を利用して Vue で書かれていました。
私の技術力の問題かもしれませんが、コンポーネント設計の明確なルールが見当たらず、JavaScript で flow などが使われいたものでもなかったため、インターフェース定義がわかりづらく、ロジックを追うことが極めて困難な状態でした。

すべての要素を列挙することは省略しますが、上記のような要素が原因で、引き取ったものの非常にコントローラビリティの低い状態だったかなと思います。

(エンジニアとしては、すべてをフルスクラッチで書き直したくなる衝動に駆られるところですが...)
フルスクラッチをしている間、ユーザーに対する価値提供を止めることになり、まだプロダクトがPMFもしていないような状態の事業でその判断を下すことはできませんでした。

CTOとしては、プロダクトの成長を止めることなく、ソフトウェアとしてのコントローラビリティを如何に上げていくか?がテーマになっていたと思います。
当時の私が下した決断としては、バックエンドは既存の Rails 上でAPIを作りつつ、フロントエンドは完全に切り離して作り直すことでした。
機能拡張や新規機能は、Next.js 上にページを作りながら、既存の Rails アプリはAPIサーバー化させていくことにしました。
バックエンドは作り直さず、拡張させる意思決定をした背景としては、まだ私自身もドメイン知識が乏しく、正しくドメインモデリングができないと感じたことが理由としては一番大きいです。

この意思決定により、Next.js から配信するページと Rails からレンダリングするページとを(同ドメイン名で)共存させるプロキシの仕組みや、Open API Generator を利用した SPA - API 間での JSON API によるAPI通信の基盤作りに開発リソースを投資しました。

■ 当時のプロダクト

この期間、プロダクトの新規機能追加・既存機能拡張はすべて止めていました。前述の通り、アーキテクチャを変更していく土台を作っていたためです。
他部署のメンバーに何をやっているのか?を説明しつつ、次の四半期で機能リリースができるように、しゃがみ込む期間と定めていました。

こうした意思決定に理解を示してくれたメダップのメンバーに非常に感謝しています。
(実のところ、次の四半期で何かしら目に見える成果が出せなかったらヤバいとプレッシャーを感じていたのも事実ですw)

ただ、既にリリースしているプロダクトであったため、ちょいちょい不具合報告は上がってきます。その不具合に対しては、逐次必要最低限の対応をするという方針をとっていました。

2021.04 ~ 2021.06

開発組織のコアメンバーも揃いつつあり、アーキテクチャとしても土台が完成してきたのがこの期間です。

1月 ~ 3月の四半期で、システムに大きな改修を入れるためにプロダクトのアップデートを止めており、セールス・CSメンバーには耐えてもらっていました。
その我慢に応えるべく、この四半期で目に見える成果を上げることがCTOの私として絶対に果たすべき役目だと考えていました。

この当時、私のリソースは下記のような配分になっていました。

組織づくり:プロダクトディレクション:開発:採用:その他 = 2:4:1:2:1

徐々にその他のタスクが出てきたのがこの時期ですw

開発組織作り、プロダクト開発のディレクション(要求のヒアリングや要件定義。デザインの調整等など)、そして自分も開発する & 採用という項目をこなすのは現実的に不可能で、めっちゃキツかったですw

■ 当時のチーム

コアメンバーが揃ってきたこともあり、どういったチーム開発の形がマッチしているかを模索していた期間でした。

フロー効率を重視できる開発組織を目指していたこともあり、この期間で「This is Lean」輪読会も実施しました。この輪読会を通じて、メダップの開発組織として何を重視するのか?の認識を揃えることができたように感じています。

その一方で、人数が少ないにも関わらず今後のスケールを意識して2チーム体制に無理やりして大失敗に終わるなど、前述の通り「チーム開発のあり方」を模索していました。そのPDCAの中で、現在開発組織として取り組んでいる「オーナー制」の概念を生み出すことができたかなと思います。

(オーナーの概念に関しては、この辺りの記事で触れてます)

失敗を繰り返しながらも、組織としてのあるべき姿をチームメンバー全員で探すことができていた期間かなと考えています。

■ 当時のアーキテクチャ

Next.js + Rails の構成による開発の土台も整い、いよいよ開発を進められるぞ!という状態でした。
1月 ~ 3月の間に、軽めの機能をこの構成でリプレイスして練習ができたことはかなり良かったかなと思っています。

また、SPA + API 構成に切り替えたことで、それぞれが平行して開発を進めることができるようになりました。Schema駆動な開発を心がけており、Rails 側では、committee と Rspec を組み合わせたAPIのテストを実施。SPA 側では、Open API Generator を利用した TypeScript の API Client コードの自動生成。このスタイルで開発を行うことがかなり上手くハマったと感じています。

■ 当時のプロダクト

1月 ~ 3月にしゃがみ込んでいたこともあり、なんとしてもユーザーへの価値提供を実現したいと考えていました。そんな中、この期間での目玉機能となった「アクションリスト」をリリースできたことは本当に嬉しかったです。当時の社内のリアクション・ユーザーからのFB含めて、本当に嬉しかったです。(2回目w)

徐々にプロダクトの改善がされつつあり、以前と比べてプロダクト開発が進み始めているかも?と他部署のメンバーやユーザーに感じてもらえるようになったのがこの期間でした。

CSメンバーがユーザーとコミュニケーションをする中で、先行して既存機能に対する要望や新規機能となりうるアイデアの価値検証を行ってくれていたため、開発側ではその要求を言語化し、適切な形に落とし込む → デリバリーすることにフォーカスすることができました。CSがユーザー要望を拾い上げてくれるという文化は今でも強く根付いています。

2021.07 ~ 2021.09

私としては、この期間はこの1年間の中で一番楽しかったです。
毎週のように(多分本当に毎週)リリースが行われ、どんどんプロダクトが生まれ変わっていく様を組織全体で感じることができました。

当時の私のリソースは、下記のような配分でした。

組織づくり(戦略含む):プロダクトディレクション:開発:採用:その他 = 3:3:0.5:3:0.5

開発を自分でやる比重が徐々に薄まり、次の開発組織を見据えた動きが増えてきました。また8月にシリーズAの調達を実施したことも相まって、採用をより強化していた時期でもあります。(この時期に内定承諾してくれたメンバーがいまちょうど入社してくれていて、バリバリ活躍してくれています!)

体力的なキツさはだいぶマシになってきたんですが、少し先の経営・事業戦略を見据えた上での技術戦略・開発組織戦略をどう決めるか?といった具合に、よりハードな意思決定が増えてきた印象にあります。

■ 当時のチーム

コアメンバーが、それぞれ独立してバックログアイテムを担当してくれるようになり、同時に開発ができる総量が格段に増えました。
(1月時点で、開発との並行作業に泣きそうになりながらもやりきった採用活動が実を結んで本当に良かったですw)

とても信頼できる業務委託・副業メンバーも参画してくださり、開発組織としてはこのタイミングで何段階もレベルアップできたように感じています。

前述の通り 、地道な採用活動が実を結んだのと、チーム開発文化作りにこだわり、輪読会やチーム開発のあり方を模索し続けた前期間があったからこその成果だと思っています。

■ 当時のアーキテクチャ

ある程度サンプルコードやwiki、ルールが充実しつつあり、開発速度が格段に向上しました。
フロントエンドを Next.js で刷新する意思決定が最適解だったかどうかはさておき、間違った判断ではなかったのかなと思えるようになりました。

既存のコア機能を刷新する取り組みもいくつか実施する中で、ドメインの境界線やサービスの依存関係が見えてきたのもこの期間でした。やはり実際の開発を通して見えてくるものが多くあるので、いきなりバックエンドの刷新もするのではなく、最速最小工数でのドメイン理解に振り切ったのも良かった気がしています。

■ 当時のプロダクト

冒頭の通り、毎週のようにリリースがされて、プロダクトが次々とアップデートされました。
バッチサイズを細かく切った開発で、必要最低限のものを的確にユーザーに届ける開発スタイルとCSを筆頭にプロダクトに即時フィードバックをくれる文化の後押しもあり、プロダクト開発に最も勢いがついた期間だったと思います。

ユーザーからは、プロダクトに対する期待の声もいただけるようになったり、セールストークが何度もアップデートされたりと、プロダクトを通じて価値提供できている実感が少しずつ湧いてきました。本当に楽しかったです。

2021.10 ~ 2021.12

いままさに我々が取り組んでいる期間ですが、前期間の勢いとは一変して、プロダクトのアップデートはしばらく止まっています。
これは、決して悪いニュースではなく、戦略的なものだったりします。

開発組織が圧倒的に強くなったことと、アーキテクチャの基盤を整ったことで、最もコアな部分の刷新に取り組んでいる最中です。
またその刷新と平行して、この1年間で最もインパクトがありそうな新規機能開発も行っています。
いまからこれらのリリースが楽しみでなりません。。。

いまの私のリソース配分としては、下記です。

組織づくり(戦略含む):プロダクトディレクション:開発:採用:その他 = 5:3:0.5:1:0.5

より一層、中長期に対する思考の比率が増えてきました。(実際のところ比率の問題であって、まだまだバリバリに開発もしていますが...w)

■ 現在のチーム

より高度なチーム開発へと昇華させるべく、プロダクト開発のフローを整備したり、分科会という名でデリバリーチームとは別軸の技術視点でボトムアップに改善を回す仕組みを取り入れたりと、少しずつ組織に複雑性を出しつつあります。

(分科会に関しては、記事も書いているのでよければどうぞ!)

また、LeadEngineerを担当してくれる方も出てきて、少しずつではありますが私からあらゆる業務が権限移譲されつつあります。
権限移譲もその一環ですが、より大きな組織でユーザーに対して大きな価値提供ができるように、開発組織のアップデートをし続けています。

内定承諾をしてくれているエンジニアの方々も増えていて、来年以降より進化した開発組織になりそうです。

■ 現在のアーキテクチャ

現在取り組んでいる最もコアな機能を刷新すれば、外注時に引き取ったコードはすべて消えることになります。こんなにも早く、かつユーザーに価値提供を行いながら、システム刷新をやりきれたことは今後の大きなメリットになりそうです。

コントローラビリティの向上により、細かな改善サイクルをより高速に回す土台ができ、既にいくつかの改善も行えつつありますし、今後のプロダクト展望に対しても複数の選択肢を提示できるようになってきました。

こうした技術アセットを作ることができたのは、開発メンバーはもちろん、メダップ全体で技術アセットの重要性を信じ続けた賜物だと感じています。

■ 現在のプロダクト

1年前と比べると完全に別物になっていますw

Next.js に移行する過程でデザインも作り変えたため、見た目的にも機能的にも格段にアップデートできたかなと思います。
何よりもユーザーがしっかりと使ってくれていることが、本当に嬉しいです。

来年以降に向けて、既に機能拡張・新規機能がいくつか見えており、ここから益々ユーザーの課題を的確に解決できるプロダクトへと昇華できるといいなと考えてます。

Next Stage...

来年は、開発組織にとってもメダップにとってもさらなる飛躍の年になると思います。

この1年間で、メダップは、開発組織が強い!と言っていただける状態にまで内製化を進めることに成功しました。
その一方でまだまだ手を付けられていない領域や、やり遂げたいVisionが多くあります。

■ これからのチーム

開発組織としては、既にユーザーの課題を的確に解決できるプロダクトをある程度早く作り上げることができるチームにはなりつつあるかなと思います。

ただ、
- このチームを複数作り上げることができるのか?
- より強度の高いチームを作り上げることができるのか?

この辺りが来年のテーマになると思います。病院業界にはまだまだプロダクトが介入できる余地が多くあります。それぞれの領域に対して、プロダクトを通じた価値提供が行えるように、開発組織のスケールにこだわっていきたいです。

■ これからのアーキテクチャ

現在のプロダクトにあるドメインやその境界についてある程度理解をすることができました。ただ、すぐさまその知識をもとにサービスを分割するのではなく、開発組織のスケールを支えるサービス設計や基盤作りをテーマに適切なアーキテクチャ設計を行い続けていきたいと思っています。

また平行して、現在ではAPIサーバーとして動いている Rails を TypeScipt(Node.js) へリプレイスしていこうと考えています。これにはまた色々と理由があるのですが、それだけで1つのnoteがかけてしまいそうなので割愛します。(noteに投稿するぞ!w)

■ これからのプロダクト

完全系ではないのですが、ある程度の機能は出揃ってきました。
現時点で考えられている機能追加を早くリリースしきってしまうことと同時に痒いところに手が届くUXの実現をしていきたいなと考えています。

また、スピードを優先して多少見捨てていた機能間のデザイン差分があるため、機能一覧を並べた上でデザインの全体最適化を行っていきたいなと考えています。

既存のプロダクトを超えてしまいますが、いま提供しているプロダクトと関連の強いサービスのリリースなど、クロスセルにつながるような動きもしていけるといいな〜と考えています。

まとめ

これまで書いたnoteで一番大作になってしまいました。

ただただ、時系列に並べただけなので読者の方にとってどれほど意味があるnoteなのかはわかりませんが、私としては非常にエモな感じになりましたw

開発内製化を推し進めた一年間で正直めっちゃキツかったんですが、なんとかその土台は作れたかなと思っています。
内製化の土台作りを推し進められたのは、まだ何もない状態でただ私がVisionを話していただけの開発組織に飛び込んできてくれた開発コアメンバーや、開発組織が立ち上がることを信じて私や開発組織にベットしてくれた代表の柳内さん、取締役CFOの岡田さん。そして何よりも、これまでブラックボックス化されていて不信感があったにも関わらず、より良いプロダクトに向かって進んで協力してくれたメダップのメンバーの皆さんのおかげです。

皆さんに感謝する一方で、ここからが内製化をすることでできたアセットを使っていくフェーズであり、開発組織としてメダップの成長により大きな貢献が求められると考えています。
来年、プロダクトとしても技術としても面白い挑戦をどんどん仕掛けられるよう、また気合を入れ直してやっていきたいです!

私自身としては、10月から取締役に就任したこともあり、現場の執行という役割だけではなく、技術者としてのアイデンティティを武器に中長期の企業価値を最大化する絵を描くことにもチャレンジしていきたいなと思っています。

お前おもろいな〜とか、現在のメダップ開発組織が具体的にどんなVisionを持っているのか興味もったぞ!って方は、ぜひ一度お話しましょう〜!
より詳しくメダップの開発組織についてシェアできればと思っています。(Twitter DM はこちら)

(Meetyもやってます!)

(良ければ、採用ページもご覧ください)