見出し画像

サーバーサイドKotlinという技術選択、あるいはレガシーシステムとの闘いについて

こんにちは、@ar_tamaです。
株式会社Cake.jpに入社して3ヶ月とちょっとが経ちました。現在は開発本部にて、主にマネージャー・テックリードの役割を兼任しています。
この3ヶ月、色々な決断や仕分けを行ってきましたが、今日はその中でも影響の大きかった「メインシステムをPHPからサーバーサイドKotlinへリプレイスを行う」という技術選択について取り上げたいと思います。

技術投資をし続けるのは難しい

アプリケーションを開発する上で一般に、OSSとして提供されている言語・フレームワークを選択するということは、「互換性のない変更を含む最新バージョンへの追随を行うための技術投資をし続ける」という責務を負うことと同義だと考えています。
最新バージョンの変更をキャッチアップし、対応、検証ののちリリースするというサイクルが、日頃のルーティンとしてきちんと組み込まれている組織も少なくないかと思います。

しかし、これらのサイクルがよどみなく回るのは「イレギュラーが発生しなければ」「開発ロードマップに組み込まれていれば」という但し書きがあればこそ。

たとえば、動作確認が思ったより長くかかる、繁忙期でそれどころではない、などのイレギュラー事項が発生すると、「とりあえず動いているし、対応の検討は後回しでいいのでは…」という言い訳が発生しがちです。
そして1回取りこぼすとそれが2回分、3回分と重なり、そのうちにメジャーバージョンが変わり、互換性のない変更への追随分の対応が更に上積みされ、雪だるま式に対応コストが肥大化していく…という負のスパイラルに陥ります。

開発のロードマップにこれらが組み込まれていない場合は、スタートラインにすら立てません。
問題が顕在化したころにアラートを上げても、日頃からその重要性が意思決定者に共有できていないと、「でも今動いてるんでしょ?じゃあいいじゃない」だの「新規開発を半年止めたい?またまたご冗談を」だのとあしらわれてしまうことでしょう。

しかしながら、ここまでで「技術投資分のリソースを確保できない/できなかったこと」を100%悪だと断じるのは早計であると考えています。
なぜなら、現在を形作っているのは、これまでの全ての意思決定の場において介在した人々がベストだと選択したことの連続であったであろうからです。

投資できなかった理由が何であれ、「今、ここ」にあるレガシーシステムは、スパゲッティコードは、折々で何かと何かを天秤にかけ、他方を選んできた、その結果のあらわれにすぎないのです。

ポイントだけを見て良し悪しを断ずるのは簡単ですが、積み上げられてきた経緯や資産には価値も学べることもたくさんあるはずです。ないがしろにしてしまうのはナンセンスでしょう。

まずは現状をじっくりと観察し、過去の意思決定の経緯を深堀りした上で、今、自分たちが事業とプロダクトの未来のためにできる持続的な技術投資とは何かを考えることが必要です。

Cake.jpのいま

Cake.jpがメインに展開しているのは、日本最大級のケーキ・スイーツに特化したマーケットプレイス型ECサービス「Cake.jp」です。
会員数は70万人超、1500を超える和洋菓子店の商品が買えるほか、萌え断が魅力の「まるごとメロンケーキ」など、パティシエとのコラボ商品を自社で企画・製造・販売している点が特色です。

画像1

Cake.jpは2017年に始まったサービスですが、実は前身となるサービス「バースデープレス」とはコードベースを同じくしています。
大小様々なピボットを経ながらも、事業成長を第一優先に、今日までひた走ってきた……という、足掛け10年ほどの歴史を持つご長寿システムなのです。
現段階でもさまざまな工夫をしていますが、かつてのようには開発者生産性が上がりきらず、可搬性の高い資産にはなっていないのが現状です。

過去の歴史の中でも、何度か言語・フレームワークのバージョンアップやリプレイスに挑まれてはいましたが、大別すると以下の2つの理由により頓挫してしまったようでした。

・費用対効果を打ち出せず、優先度を上げられず、頓挫
・ゴール設定なく片手間で始めてみたものの、なかなか終わらないことにモチベーションも下がり、頓挫

サーバーサイドKotlinへのリプレイスという打ち手

これらを受け、まずはなんのために"脱レガシー"を打ち出すのかを明確にし、この先の羅針盤とすべく、「開発者が楽しく早く、安全にデリバリーできること」を基本方針に据えることにしました。
経営陣を含む部外には「開発者の生産性と機動力を向上させ、プロダクトの価値向上に対する施策をボトルネックなく打てる状態を作ることをゴールに置いた」と言い換え、伝えています。

加えて、「一定の期間、機能開発を止めてリプレイスまたはバージョンアップに注力する」という選択が取りにくい事業フェーズであることから、既存機能の改修・新規機能開発を足がかりに、徐々に達成に向けて歩を進めることを決断しました。

次に、Cake.jpのメインシステムはPHP(CakePHP)によって書かれていますが、最新の言語・フレームワークへのバージョンアップには互換性のない変更が含まれることから、総対応コストはバージョンアップ・リプレイスともに大差ないと捉え、フラットに言語・フレームワークの双方を再選定することにします。
まずは独断と偏見から、以下の3択に絞りました。

・PHP + Laravel
・Go
・Java(Kotlin) + SpringBoot

Cake.jpは今も右肩上がりの成長を続けている事業ではありますが、「ケーキ・スイーツを扱うECサービス」という基本の型は既に出来上がっています。
ですので、基幹部分は固く作れ、更に拡張・改変時に機動力を最大化できるように
・静的型付けである
・パッケージングによる依存関係の整理ができる
技術の採用を選択します(ここでPHPが脱落します)。

次に、目指す組織規模や開発スタイルについて考えます。

・メインビジネスとメインシステムが今のところ1:1である
・機能ごとに独立した組織の組み合わせで運用する(=マイクロサービス)よりは、ミッションごとに独立した組織がそれぞれに運用する(=モジュラーモノリス)未来像を描きたい

ここから、マイクロサービス実現に最適であるGoが脱落します。
またPHPとJavaの書き味が似ており、Goよりはメンバーのキャッチアップが比較的容易であろうと判断できたことも、Kotlinを選択することの後押しのひとつとなりました。

……え、なんでこの流れでJavaじゃなくてKotlinなんですかって?そりゃ2021年ですし?今始めるならKotlinでしょ🥳

加えて、アクティブかつある程度整ったエコシステムがあることを理由に、KotlinとSpringBootの組み合わせを採用しました。
またフロントエンドは(専門チームが組織できるなど、分離による恩恵が受けられるようになるまでは、サーバサイドアプリケーションに同梱されたMPAとしての)Reactを採用することとします。

もちろん、何でもかんでもこのリプレイス先に載せたい、Kotlinで書きたいというわけではなく、疎結合な機能は分離という選択肢も取っていきますし、さらに独立性の高い機能(決済など)においては、可搬性を考えGoなど別言語・別アプリケーションへの切り出しも検討しています。
たとえばLP群は、これまでメインシステムにページを生やしていたのを、エイヤと切り出してJIGSAWを用いた運用へと切り替えました。

また、PHPは長く触ってきたメンバーも多く、現時点では一番機動力高く開発できるため、引き続き適当と判断される場合には活用していきます。
今も役割の異なる新しいアプリケーション(社内で利用するものなど)の開発時には、PHP + Laravelが選択されることが多いです。

Cake.jpのこれから

さて、これらの選択を経た現在地はというと、一部機能のリプレイスをAPI化という形で終え、また完全新規の機能(管理画面)の実装が進んでいるところです。

次回は
・実際にやってみてどこがよかった/大変だったか
・リプレイスによる価値を最大化させるためにどんなトライを行っているか
などを書いてみたいと思います。

せっかくなので、Meetyもいろいろとトピックをご用意してみました。
ご感想やツッコミなどぜひぶつけてもらえると喜びます!なんらかご相談にも乗れるかもしれません。
なんなら同じような課題に向き合う方々とお互い大変だよね〜というお話だけができるだけでも嬉しいです。
さらに事例なども聞けると超ハッピーです…😭ぜひ!

さいごに

完遂までの道のりは長く、課題も多々ありますが、まずは一歩を踏み出せたことにひとまずは安堵しています。
次は、この勢いを更に加速させるべく手を打とうとしているところ……なんですが…………なにしろ人が足りない!!!マジで助けてください!!!!

手前味噌ながら、いまが一番楽しいフェーズだと確信しています。未来を作るための手が今ならなんと打ち放題です!
前述の決済機能の独立化とか、なんなら分析基盤作っちゃったりとか、みんな夢だけは無限にあるんですが、手も頭も限りがありまして……

こんな人にマッチすると思います:
・アーキテクト・テックリードやりたいな〜な方
・Javaをメインにやってきたけど、そろそろKotlinでモダンなアプリケーションを作りたいな〜な方
・PHPをメインにやってきたけど、そろそろ新しい言語にチャレンジしたいな〜な方

もちろんケーキ・スイーツという業界ならではのお楽しみもあります。ワクワクする新商品(来るクリスマスシーズンに向けて続々仕込み中!)の話とか、社内のパティシエさんがお菓子作り教室を開いてくれるという噂があったりとか👀

少しでもご興味を持っていただけたら、上のMeetyから「気になる」をぜひポチッとお願いします🥳

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