爆速開発を目指して NewsDigest を Flutter にリプレイスします

f:id:jazzsasori:20211128104040p:plain
爆速開発を目指して NewsDigest を Flutter にリプレイスします

JX通信社 Engineering Manager の @jazzsasori です。
最近アークナイツというソシャゲに課金してしまいましたが妻には内緒にしています。

弊社は NewsDigest という無料ニュースアプリを運営しています。
NewsDigest は記者が業務で愛用するほど、その圧倒的スピードに強みがある速報アプリです。また、一般的なニュース分野での速報に加えて、報道はされにくいが個人にとって価値の高い情報も to B 向けのリスク情報SaaS である FASTALERT と連携して即時に伝える、社会派ニュースアプリです。
現在 (2021/11) 500万ダウンロードを突破しており、今後もさらにユーザーを伸ばそうとしています。

なぜリプレイスを行うのか

サービスとしては 2015年 にストアで公開されたので今日現在 (2021年12月) アプリとしてはもうすぐ8年目となります (すごい)。
iOS でいくと Swift 1 → 2 → 3 → 4 という移行も乗り越えてきました。

技術的負債という課題

7年以上運用していると、どれだけ気をつけていてもいわゆる「技術的負債」が溜まってしまいました。
時が経つにつれて技術的負債の課題は深刻なものになっていきました。
例えばある機能を改修する際、

  • 技術的負債となっている部分が解決すれば1日で終わるタスクに2日かかる
  • 簡単に終わると思っていた改修箇所が実は同じ変更内容を2箇所に適用しなければならなかった

など、よくある技術的負債による工数の肥大化が発生していました。

※ NewsDigest はさまざまな立場で多くのエンジニアの方に改修していただいた歴史があります。
技術的負債に関して否定的なことも記述はしておりますが、関わっていただいたメンバーの方に最大限の尊敬と感謝の念を込めて書いています。

爆速開発できるコードベースをつくりたい

技術的負債の側面に加え、我々が描く未来をより速く実現したいと考えています。
例えば弊社の提供する最新感染状況マップ・感染者数情報 は多くの方に価値を感じていただき、テレビ番組などでは多く特集いただきました。
このようなユーザーにとって価値の高い情報をお届けしつつ、多くの方にご利用いただくことにより、たくさんのフィードバックをいただき、さらにサービスを改善していきたいと考えています。

我々は技術的負債の解消・今後の開発速度の向上という二つの観点から Flutter によるフルリプレイスを行う という選択をしました。

Flutter を選択した背景

NewsDigest という大規模でかつユーザーの多いニュースアプリをリプレイスする技術選定としてはさまざまな可能性を模索しました。

  • 継続してSwift / Kotlin で開発
  • React Native
  • Kotlin Multi Platform
  • ...

特に React Native に関しては弊社の Frontend では React を多く使うこともあり、相性がよいのではないか、という議論もありました。

会社としても大きな投資となるため、経営層・マネージャー層で議論を進めていたところ、弊社のエンジニアから「NewsDigest をもし Flutter で書き直すならこんな感じかなと思って書いてみました」という連絡がありました。リポジトリを覗いてみるとけっこう書き進めてくれていて...というストーリーがあり、 チームメンバーからのボトムアップで Flutter という技術選択をしました。

Flutter でどうリプレイスを進めているのか

今回のテーマとしては「技術的負債の解消」という大きなテーマがあります。
今後の開発速度を爆速にするため、なるべく技術的負債が溜まりにくくするため、アーキテクチャにはこだわっています。

具体的には、まず大きな考え方として Clean Architecture の考え方を参考にしつつ Onion Architecture をベースとしたアーキテクチャを選択しています。例えば社内のドキュメントには SOLID 原則 にのっとってコードを書くように案内するようなものもあります。

また、FAT な Widget を作らないようにすることも重要です。
(私も iOS で 2000行を超える FatViewController を書いたこともあります...)
こちらは Atomic Design の考え方にのっとって Widget を設計しています。
何をもって molecules か、何をもって organisms か、というのは難しい問題ですが、考え方をすり合わせながら・ドキュメント化しながらコーディングルールを明確化していっているのが現状です。

ステート管理については Riverpod を採用しています。

今後どう進めていくのか

NewsDigest の規模のアプリをフルリプレイスするのには工数がかかります。
数ヶ月の工数をかけて出来るだけ正しい形、今後の開発速度が爆速になるよう + 負債が溜まりにくくなるような形でリプレイスを完遂しようとしています。
エンジニアだけではなく、セールスメンバーにも理解いただきつつチーム一丸となってリリース目標を立てて進めています。

正直なところ忙しいプロジェクトではあります。
一方で多くのユーザーの方にご利用いただいているニュースアプリを根本から改善する、という挑戦的な面白いプロジェクトでもあり、メンバーにはモチベーション高く挑んでいただいています。  

読んでいただいている Flutter エンジニアの方、ぜひ一度弊社のお話を聞いていただけないでしょうか?
フリーランス、正社員問わず募集しています。
こちらからご応募可能なのでぜひお気軽にご連絡ください 🙇

open.talentio.com


NewsDigest を使ってみたいという方は下記よりダウンロードください 🙇‍♂️
iPhone 版 :
app.adjust.com

Android 版: app.adjust.com