- この記事について
- ソフトウェアの状態がアウトカムに影響を与えるのか
- 品質と速度のトレードオフという観点に関して
- モジュラモノリスに向き合い始めるまでのSpirの状態
- なぜモジュラモノリスを選択することにしたのか
- モジュラモノリス化の向き合いかた
- そして現在
- We are hiring
- 諸々これまで参考にしてきた記事値など
- 他の記事
この記事について
今年半年をふりかえり、株式会社Spirのプロダクト開発で向き合い始めた、モジュラモノリス化に想いを馳せていきます。
この記事の一つ前に、プロダクトマネジメント全体に関して書かせていただきましたが、今回は記事内で触れた「Delivery」の中でとても重要になってくるソフトウェアに関して書き進めたいとおもいます。
ソフトウェアの状態がアウトカムに影響を与えるのか
モジュラモノリスの話に入る前に、そもそもアウトカムとソフトウェアの状態がどのように関係してくるのかから考えを書いていければと思います。
ここで書く「状態」は少し複雑で、現時点のソフトウェアに存在する「技術的負債」「既知・未知のバグ」や「Maintenability」「Security」などを始めとした品質に関する特性などを「状態」という言葉でまとめて意味しています。
この記事内では「状態」に関して細かく書く事は避けますが、どれだけアイデアが素晴らしくても大きすぎたり時間をかけ過ぎたりなど、顧客に届くまではまだ価値があるかないかわからない「在庫」の状態となります。更にアイデアとして素晴らしくても時間をかけた結果そのときにはハマらなかったり、顧客が求めていたものとは異なり受け入れられなかったりなど、結果アウトカムにつながらない事も起こりえると思います。そういった不確実性が高い状態だからこそ(意味ある単位で)小さく早くだして検証して育てて行くことが重要になってくると考えております。
前置きがながくなりましたが、例えばソフトウェアの状態が、Readableでは無く把握が困難だったり、Maintenabilityが低く複雑でどこに何をかけばいいかぐちゃぐちゃだったりすると、変更点を把握して、変更を実施するという1回1回のサイクルが遅くなるため、結果としてアウトカムを高めるために必要な検証サイクルを高速で回す事ができないためアウトカムを高める事に影響が大きくでてしまうと考えております。
品質と速度のトレードオフという観点に関して
ここでは少し「状態」に関しても深堀りをさせていただきます。よくSNSや様々な開発プロジェクトで見聞きする事が多い言葉として「スピードと品質のトレードオフ」があると思っています。
こちらに関しても色々書き出そうかと思いましたが、僕なんかが書くよりt_wadaさんのスライドを引用させていただくことが一番良いとおもいましたので、そちらにおまかせしようと思います。
書きたいことの殆どが、上記スライドで説明していただけておりましたので、こちらで引用とコメントだけで進めさせていただきます。
(質とスピード(2022春版): https://speakerdeck.com/twada/quality-and-speed-2022-spring-edition?slide=78 から引用)
(質とスピード(2022春版): https://speakerdeck.com/twada/quality-and-speed-2022-spring-edition?slide=39 から引用)
つまり状態をより良くしていく事が最高の品質に繋がり、最高の品質が最高のスピードを生み出し続ける。そして最高のスピードが結果として最高の品質を生み出すことにもつながると信じております。ゼロから開発する状態ではないため、時間はかかるとは思っておりますが、私達はまず短期的には品質に向き合い続ける事で、徐々に徐々にスピードを高めるサイクルを目指していく考えです。
モジュラモノリスに向き合い始めるまでのSpirの状態
- コードの責務違反、あるいは責務設計の不在
- 例に上げると「repositoryってどこから呼び出していいのか?」という悩みが発生すると実装が遅くなる
- 業務ドメインの境界がコードに現れておらず不明瞭
- 「TeamのusecaseでUserRepository呼んでいいの?」みたいな悩み
- あとは「TeamってUserとリレーションあるけど、TeamのドメインエンティティってUserのIDを持つの?実体を持つの?」など
- 組織規模が大きくなったときにマイクロサービス化という手段を取りにくい
- 技術的責任でレイヤーが分離されており異なる業務で同じコードに依存している状態
- これは技術的責任ストラクチャが原因ではないですが、前述した責務設計がうまくワークしていなかった事で課題となってきております
- そもそも設計に関しての議論が活発ではなかった
- これはSpirの組織拡大速度が一つの原因ではありますがエンジニア2名体制から半年ほどで7名に拡大した事で2名の時は無くても問題なかったことが急激に問題となって現れたということでもあります。
- テストに関しての作成コストが高い
- 技術的責任で分離されているからではないですが、依存が複雑が故に依存先の依存先までmockをつくるとかDIするとか色々書くコード量が増えていました
などなどここだけでLT登壇とかできるかもしれませんが、Spirという事業や組織が急拡大した事で、当初は問題なかったことが大きな問題として現れ始めた形です。
なぜモジュラモノリスを選択することにしたのか
そもそもSpirは表から見える業務のほか、裏側でも様々な業務が行われております。
これまではモノリスという選択でしたが、もしかしたらマイクロサービス(モノレポ・マルチレポ)という選択肢もあるかもしれません。
※厳密にはFrontend(SPA)とBackendは同じリポジトリですので、モノレポという言葉が当てはまるかもしれませんが、今回はBackendにフォーカスを当てます。
前述した課題の解決を、今のSpirの組織や文化、メンバーで向き合うには、そしてちょっと先の未来も見据えるとしたら何がいいか考えた結果、今回はモノリスのまま責務を明確にして、より業務設計に集中していける形から初めていく事から始めよう。もし(本当にもし)デプロイも分離したり分ける方が好ましい状況になったらマイクロサービス化するなど検討しましょう。今は業務を明確にしてモジュールごとに開発できる状態にする事になりました。
以下は、これらの課題に対して社内のエンジニアからモジュラモノリスの提案が上がった際の声です。
- 実装前に業務の分割が強制される
- モジュールの独立性が高まるのでそれぞれが自由に構成を変えられる(今はほぼ全部同じ構成になってるけど)
- 依存関係を可視化しやすい
- でもデプロイは一つなので楽
- モジュール境界をミスっても比較的変更しやすい
モジュラモノリス化の向き合いかた
モジュラモノリスをSpirとして考え始めたのは、2022/08/15ですので、今で4ヶ月目という所になります。
立ち上げ時期であれば最初からですので、「俺がモジュラモノリスだ」と言い切れるとおもいますが、弊社はもともとはモノリスではありますが、途中からモジュラモノリス化への移行を選択したので、まだまだ始まったばかりの状態です。
そのため弊社では以下のとおりモジュラモノリス化を進めております。
- バグやUX改善系以外の開発時(新しく向き合うMVPの機能開発時)に生み出されるコードはすべてモジュラモノリスを前提として議論・実装を行う
- 詳しくは組織編のブログで説明できればとおもいますが、モジュラモノリスを提案してくれたメンバーがプロダクト開発ではなく、Spirの開発全体がモジュラモノリス化を推進できる文化・状態を作る形でリードする役割としてコミット(社内ではDX Chapterと呼んでいます)
- 新しい開発時に業務整理やモジュール設計の議論に参加して壁打ちやリード
- 初期はドキュメントや勉強会(説明会)を通して何故モジュラモノリスなのか?などコンテキストをSyncしていく
- reactiveなイベントが無いタイミングでは、proactiveに既存のコードのモジュール化を検討して移行するなど、改善を実施
2番のDX Chapterは関しては組織としてモジュール化が当たり前になってきたタイミングで解散予定です。Chapterや現在の体制Squadに関しては改めて記事かさせていただきます。
そして現在
一つ前の向き合い方に書いたとおり、新しいところから新しく進めている事もあり、徐々にモジュールが育ち始めている状態です。また半年後などにその時点のスナップショットをお見せできればと思います。
We are hiring
Spirではこのようにプロダクトを通して顧客のアウトカムを高める続けるために、顧客課題に向き合う事はもちろんですが、より多くの顧客課題をより早く解決し続けられる土台を作ることにも積極的に投資を進めております。まだまだまだまだ本当に課題ばかりではありますが、変化を一歩一歩、時には飛躍的に起こしていければと考えておりますので、「私ならもっとこうできるよ」「私もJoinしたい」「興味はないけど話くらいはいいよ」などどんな目的でも大歓迎ですので、ぜひお話する機会をいただければと思います。Spirのプロダクトがよりアウトカムを生み続けるために力を貸してください!お待ちしております!
諸々これまで参考にしてきた記事値など
他の記事
Page | Date |
---|---|
October 28, 2023 10:22 PM (GMT+9) | |
October 28, 2023 9:47 PM (GMT+9) | |
October 28, 2023 6:23 PM (GMT+9) | |
October 28, 2023 3:17 PM (GMT+9) | |
October 27, 2023 11:15 AM (GMT+9) | |
October 27, 2023 10:44 AM (GMT+9) | |
October 26, 2023 9:48 PM (GMT+9) | |
October 26, 2023 7:11 PM (GMT+9) | |
October 26, 2023 12:50 AM (GMT+9) | |
October 25, 2023 2:05 PM (GMT+9) | |
October 24, 2023 6:46 PM (GMT+9) | |
October 24, 2023 1:26 PM (GMT+9) | |
October 24, 2023 | |
October 24, 2023 12:48 PM (GMT+9) | |
October 23, 2023 | |
October 23, 2023 | |
October 23, 2023 11:53 AM (GMT+9) | |
October 23, 2023 2:50 AM (GMT+9) | |
October 23, 2023 1:27 AM (GMT+9) | |
October 22, 2023 3:33 PM (GMT+9) | |
October 22, 2023 | |
October 22, 2023 | |
October 22, 2023 | |
October 22, 2023 | |
October 22, 2023 12:29 AM (GMT+9) | |
October 22, 2023 12:00 AM (GMT+9) | |
October 21, 2023 10:36 PM (GMT+9) | |
October 21, 2023 5:34 PM (GMT+9) | |
October 20, 2023 | |
October 20, 2023 | |
October 20, 2023 | |
October 19, 2023 | |
October 19, 2023 | |
October 19, 2023 1:29 AM (GMT+9) | |
October 19, 2023 1:29 AM (GMT+9) | |
October 19, 2023 1:28 AM (GMT+9) | |
October 16, 2023 | |
October 12, 2023 | |
October 6, 2023 1:30 AM (GMT+9) | |
October 4, 2023 | |
October 2, 2023 7:52 PM (GMT+9) | |
September 22, 2023 1:31 AM (GMT+9) | |
September 20, 2023 1:32 AM (GMT+9) | |
September 16, 2023 1:33 AM (GMT+9) | |
September 16, 2023 1:32 AM (GMT+9) | |
August 28, 2023 1:34 AM (GMT+9) | |
August 28, 2023 1:33 AM (GMT+9) | |
July 31, 2023 | |
May 25, 2023 3:27 PM (GMT+9) | |
April 30, 2023 6:35 PM (GMT+9) | |
March 23, 2023 8:13 PM (GMT+9) | |
March 13, 2023 3:04 PM (GMT+9) | |
December 21, 2022 | |
December 20, 2022 | |
December 5, 2022 | |
October 25, 2022 3:03 PM (GMT+9) | |
August 19, 2022 | |
May 18, 2022 | |
March 27, 2022 | |
January 31, 2022 | |
January 13, 2022 | |
January 9, 2022 6:31 PM (GMT+9) | |
January 4, 2022 | |
December 24, 2021 | |
December 18, 2021 | |
December 16, 2021 | |
December 6, 2021 | |
November 21, 2021 | |
November 11, 2021 | |
November 7, 2021 | |
November 4, 2021 | |
July 16, 2021 | |
May 26, 2021 | |
May 23, 2021 | |
March 3, 2021 | |
January 15, 2021 10:00 PM (GMT+9) | |
January 4, 2021 | |
December 15, 2020 12:00 PM (GMT+9) | |
December 13, 2020 | |
December 1, 2020 | |
November 18, 2020 11:00 PM (GMT+9) | |
November 11, 2020 6:00 AM (GMT+9) | |
November 10, 2020 1:00 AM (GMT+9) | |
November 9, 2020 11:00 PM (GMT+9) | |
October 22, 2020 | |
September 10, 2020 | |
April 22, 2020 | |
January 2, 2020 | |
August 22, 2019 | |
June 13, 2019 | |
March 21, 2019 | |
May 22, 2018 3:12 PM (GMT+9) | |
November 27, 2017 | |
October 23, 2011 11:20 PM (GMT+9) | |