はじめに
今「あすけん」は大きなチャレンジをしています。
中長期的なサービスの成長を見据えて、アーキテクチャの見直しとシステムの再設計を行っています。 この再設計の一環として、PHPで構築された既存システムをKotlinを用いた新システムに置き換えるという大きな決断をしました。
さらに、より保守性の高いシステムを目指して、新しい手法も試しています。 具体的には「RDRA」「ICONIX」「ドメイン駆動設計」の考え方を取り入れて再設計を行っています。
今はまだ技術検証の段階ですが、一部の機能の分析・モデリングを行ってコードに落とし込んでいます。 課題も毎日のように見つかっています。しかし、日々解決と決断を繰り返し、少しずつ前進しています。
今回は、このような取り組みに至った経緯と言語選定についてご紹介します。
経緯
私たちの運用するサービス「あすけん」は2023年現在で10年以上の歴史があります。 嬉しいことに会員数も年々増加し、今年の7月には会員数が900万人を突破しました。 「ひとびとの明日を今日より健康に」というミッションを実現するために日々邁進しています。
しかし、長年に渡って機能の追加や修正が行われてきたソースコードは徐々に複雑さを増し、 開発速度への影響が無視できないレベルになっていました。
そこで私たちは、システムを再設計し複雑さを解消することで、開発速度の向上を目指すことにしました。
また、今まで「あすけん」のバックエンドはPHPとCakePHPで作られてきました。 より保守性の高い設計をするために、技術セットにはこだわらず、PHP以外の言語も対象として検討することにしました。
一から言語選定を行った結果、 下記の点が将来的にPHPで開発を進めていく上でのウィークポイントになりました。
- 動的型付け言語であり、静的型付け言語より保守性が下がる
- 言語仕様の制約が少なく、内部品質の維持にコストが掛かる
以上を総合的に検討した結果、 私たちが求めるシステムを実現するために、PHP以外の言語を選択する決断をしました。
技術選定
まず、複雑さを解消し保守性の高いシステムを作り上げるために、 ドメイン駆動設計とレイヤードアーキテクチャを取り入れることにしました。 以前弊社で行った増田さんとの勉強会でドメイン駆動やレイヤードアーキテクチャを用いて凝集度を高めることが保守性に大きな効果があると実感できていたためです。
それを前提に言語とフレームワークの選定を行います。
言語とフレームワーク、それぞれの要件は概ね下記のようなところです。
言語
- 静的型付け言語であること
- Web開発の実績が豊富であること
- 周辺ツールが豊富であること
- エンジニアのモチベーションアップに繋がること
フレームワーク
- レイヤードアーキテクチャを採用しやすいこと
- 実績が豊富であること
- 継続的に開発が続けられていること
結果として下記の2パターンを比較することにしました。
言語 | フレームワーク |
---|---|
Go | Echo |
Kotlin | Spring Boot |
各言語の比較
検証はあすけんのAPIを元に、各言語でPoCを作成し比較を行いました。 下記の観点で比較しています。
- 保守性
- 他社事例
- 学習容易性
- 人事
この中でも、「保守性」を最重要項目としました。 私たちの目標である、複雑さの解消に最も影響する観点であるためです。
各観点ごとの比較は下記の様な結果となりました。
最重要項目である「保守性」に関する比較は下記のような結果となっています。
GoとKotlinを比較すると、Goは「カプセル化」や「完全性」を実現する機能が弱いと感じました。 もちろん、これらをルールやレビューをつかって実現することは可能です。 しかし、言語による厳密な制約がないため保守性の高いシステムを維持するためのコストが増える可能性があります。 以上の点が保守性に大きく影響すると考えKotlinを使用していく決定をしました。
まとめと今後
私たちはKotlinとSpring Bootを採用してリアーキテクチャを進めていくという決断をしました。 少し前にポストされた弊社のブログ「僕たちはどう Flutter で価値を届けるのか?」にも書かれていますが。技術の選定はスタート地点です。 むしろこれから行う設計のほうが本丸と言えるでしょう。
現在はミライトデザインさんにお手伝いをいただき、アーキテクチャと設計の技術検証を行っています。 今後はこのtech blogでもアーキテクチャや設計についての発信をしていけたら良いなと思っています。
お知らせ
askenはエンジニアを大募集しています。 Kotlinに興味がある、設計にこだわって開発したい、ドメイン駆動で開発したい...
など興味を持っていただけたら、ぜひ採用情報をご確認ください。