CloudCIRCUS Meetup #3 2/2
こんにちは!
クラウドサーカス開発部です。
第3回のMeetupは当社の技術顧問であるまつもとゆきひろさんにも登壇していただき、動的型付け言語と大規模開発をテーマにお話しさせていただきました。
今回のテーマは当社のサービスであり、動的型付けと大規模開発の両方を満たすBowNowがきっかけとなりました。BowNowは動的型付け言語であるRubyで開発されております。一般的に動的型付け言語は大規模開発に向いていないとされております。ただし、それがなぜ向いていないのか?動的型付け言語だからなのか?などおそらく多くの方がなんとなく理解していることを今回の記事を通じて言語化し、今後の皆さんの開発体験のヒントになるようなことをお伝えできるような内容になればと思います。
今回は動画の後半で話されている「Rubyの大規模開発」について、述べさせていただきます。
Rubyの大規模開発について
大規模開発にも様々な定義がありますが、今回はコードベースが肥大化してきたところでのアプローチ方法をテーマに述べていきます。
ソフトウェア開発の理想形
Ruby on Railsというのは、可能であれば一人でサービスを作れることを目指すものであり、スイートポットは小規模なコードベース、つまりソフトウェアのサイズやチームのサイズが小さいものになります。
ただ、最近のWebアプリケーションは複雑化してきており、フロントエンドチームやバックエンドチームがいて、何か機能を追加するとなるとフロントエンドチームが開発して、それに合わせてバックエンドチームが新たに開発して…というように小回りが利かなくなっています。理想はフロントエンドチームやバックエンドチームが分かれることなく、一気に開発するチームでやりたいのですが、昔のようにRailsだけだと古めかしく、ダサくみえてしまうというジレンマがあります。
時代背景からも、かつて少人数かつ短い時間でアプリケーション開発ができたハッピーなアーキテクチャだったのが、現代はそれを許しにくいアーキテクチャになってきている辛さはあります。
このようにバックエンドとフロントエンドが分離してしまった動きというのがソフトウェア開発、ひいては大規模開発といわれているところも含めて問題の1つなんじゃないかと思っております。
我々は、仕様のレベルから漫然と機能を足していって、コードを複雑にしていき、あっという間に1万行、2万行、10万行へとコードを到達させるわけですが、そうではなく、1つのソフトウェアがやることを十分に絞ることによってソフトウェアの規模を小さく抑えることを目指すべきだと考えます。
モジュラモノリスとプロダクトマネジメント
プロダクト開発において、理想論を言えば、「大規模開発は避けるべきだ。」という結論に至るわけですが、現状のBowNowや既に大規模開発になっているプロダクトについては、モジュラモノリスのようにアプリケーション全体の関係性に合わせて分割していくのがベストだと思います。
例えば、ユーザーから見て1つのアプリケーションでも場所を追うごとに機能が完全に独立しているのであれば、バックエンドは違うアプリケーションにしてしまうことも十分にあり得ると思います。むしろ、そのような作り方が推奨されるのではないかと考えます。
ただ、本来はプロダクトデザインの時点でいかに複雑さを制御するかを念頭に置いて作っていかないといけないんじゃないかなと思っております。
この点に関しては、現実的な問題として、個別の技術者ができないので、辛いところではありますね。
例えば、Creeping Featurism ー機能がどんどん這い寄ってくるというようなことを意味するー を進めていった結果、「機能としてアレが欲しい・コレが欲しい・他のサービスはこれができるのに…」と要望や不満をたくさん言われるとマーケティング的には星取り表みたいなもので、様々な機能を入れよう!という話になりがちですが、それは誰のためにも良くない選択です。
開発者にとって複雑になるだけでなく、ユーザーにとっても使わない機能が増えるだけですし、経営者にとっても使いもしない機能を開発してお金が飛んでいくというようになりがちなので、誰にとっても良くないと分かります。
他にも、チームビルディングの話になるので難しいところでもありますが、そもそもプロダクトマネージャーが開発や技術的負債などについてイメージしづらいパターンが多いです。ビジネスサイドから来たプロダクトマネージャーだとソフトウェアの性質が分からないことが多いのが実情だと思います。従って、段階的にお互いに実績を作り、納得しながら、少しずつ対応を進めていくのが当面は大事になります。
このような課題感はありますが、大規模開発として進んでいる際は、比較的、他機能との相互作用が少ない機能を切り出したり、段階的に整理して、モデル間の相互連結を減らしていくなど、最終的にモジュラモノリスにしていくのがベターなアプローチだと思います。要求が常に変わり続ける中でも、変更に強いアーキテクチャにしていく必要があり、BowNowのような大規模開発になっているサービスは、アーキテクチャ的に小規模に分割をするという方針にした方が長期的には良いと考えます。
まとめ
大規模開発とか動的型付けとかそれよりも、そもそもWebサービスが安定して、正常に動作していることが最重要であり、どのようなアプローチで環境構築をしていくのかが重要になると思います。
また、ソフトウェア開発で重要になるのは速度(ベロシティ)だと考えています。折衝しなければならないなどの理由で、多くの場合は規模が大きくなるとスピードが下がります。しかし、そのベロシティを邪魔するものは可能な限り排除し、ベロシティを最大限早くするためにはどうしたらいいかを考えながら開発に取り組むというのが重要です。
ここまでお付き合いいただきありがとうございました。
なお、次回のCloudCIRCUS Meetup #4は10月26日(水)18:00~より開催します!
是非、ご参加ください!
この記事が気に入ったらサポートをしてみませんか?