Dear Great Hackers

  1. インタビュー
  1. タイアップ

「面白い」から人が集まる。1人の思いから始まったNewsPicksアプリのリアーキについて聞いてみた

技術の進歩や開発組織の拡大とともに、既存のシステムアーキテクチャがフィットしなくなる。成長・拡大を続けるITサービスでは、必ずと言ってよいほど発生していることだと思います。だからこそ、サービスの機能を維持しながら最新のアーキテクチャへと刷新していくリアーキテクチャは、非常に重要な取り組みだと言えます。

2021年5月に開催されたイベント「Qiita × Uzabase Tech Meetup#2」では、まさにこのリアーキテクチャについて、株式会社ニューズピックスで行われているAndroidアプリのリアーキプロジェクトの内容が語られました。

参考記事:DX時代に注目される開発者体験(Developer eXperience)の重要性。「Qiita × Uzabase Tech Meetup #2」イベントレポート

今回は、より詳細な内容を伺うべく、上記イベントでも登壇された石井 幸次さんと、同じチームでiOSアプリのリアーキプロジェクトに取り組んでいる金子 雄大さんに、お話を伺いました。

プロフィール

石井 幸次(いしい こうじ)
株式会社ニューズピックス
Product Division, Business Development Team Engineer
2003年にサーバーサイドエンジニアとしてキャリアをスタート。ECサイト・パッケージソフト・基幹システムなど様々なプロジェクトでアーキテクトとして参加。その後、C向けサービスに10年従事し、その中で2010年よりスクラム開発を3社で導入実践。ベンチャー企業でiOS/Androidの開発チームを組成し、テックリードとしてIPOに貢献。2019年10月にNewsPicksにジョイン。Enterprise Productチームのエンジニアリングマネージャーを経て現在はスマフォチームのリーダーとして活動。

 

金子 雄大(かねこ たけひろ)
株式会社ニューズピックス
Product Division, Business Development Team Engineer
大手SIerに新卒で入社し、エンジニアとして主に顧客の新規事業開発支援を担当。AWSを活用したサーバレスシステムや、iOS/Androidアプリ開発を経験。2019年7月にNewsPicksに入社し、新規事業立ち上げやアドサーバ開発チームのユニットリーダーを担当。
現在はモバイルアプリ開発チームに所属し、iOSアプリのリードエンジニアとして活動中。

 

サーバーサイドからアプリ開発へ

――まずは、おふたりの現在のお仕事内容を教えてください。

石井:NewsPicksのアプリ全般を担当しており、他事業部からの依頼に対して実装を進めたり、必要な改善を進めたりしています。以前は法人契約プランに関する開発(以下、法人チーム)をやっていましたが、今はApp Unit. のチームリーダーとして、マネジメント業務の他にエンジニアリングやAndroidのアーキテクト、Androidのテックリードなどをやっています。

金子:石井さんと同じチームで、iOSメンバーのリーダー的な立ち位置で、テックリードから育成全般をやっています。アプリの実装については、ほぼ全てうちのチームで受けています。

――おふたりとも、ご経歴を拝見するとサーバーサイドからアプリ開発へと異動されているということで、その経緯も教えてください。

石井:前職では、サーバーサイドだけでなくiOSやAndroidまで何でもやっていました。ニューズピックスに入社した際には、法人チームの開発リーダーをやってほしいと打診され、それも面白いなと思ってやっていたのですが、業務の合間合間でアプリも見ていて、「アーキテクチャを変えればより良くなる」と思っていた中で、昨年7月にアプリチームへと異動した流れになります。

金子:2年半前くらいに中途入社しまして、ニューズピックスの広告事業を担っているチームにサーバーサイドエンジニアとして配属されました。アドサーバーやCMSのメンテナンス、それから広告関連の新規ビジネスの立ち上げにも関わったりしていました。

あと、当時はまだアプリチームというものはなく、一部の人が一手にアプリ部分を引き受けていたのですが、広告に関わる部分についてはロジックが複雑なので、そこだけは私の方でやっていたりしました。
そのときに、保守性に課題を感じる部分があり、様々なプロジェクトがひと段落したタイミングで、もともとiOSをやりたいという思いで転職したこともあって2021年1月に新設された「App Unit.」に異動しました。

こうやって進めていったリアーキプロジェクト[Android編]

――今回はNewsPicksアプリのリアーキテクトについて詳しく教えていただきたく、まずはAndroidの方から教えてください。そもそも、Androidのリアーキは何がきっかけだったのでしょうか?

石井:先ほどお伝えした法人チームにいた時に、たまにAndroidやiOSを触っていたのですが、「やんちゃ」なコードだったんですよね。創業からずっとビジネス優先で走り続けてきたことによって、アーキテクチャが統一されずに汚いコードになっていたわけです。純粋に技術者として「このコードをずっと触るのは嫌だな」と思っていました。

――いわゆるスパゲッティコードだったわけですね。

石井:そんな中、法人チームでちょうどいい具合の機能が追加されることになったので、その時に新しいアーキテクチャを作って開発することになりました。
ユーザベースグループでは「The 7 Values」という共通の価値観が掲げられていて、その中に「自由主義でいこう」というものがあります。この自由主義の文脈で、自分はこのリアーキをやろうと思っていたのですが、1人で思っているだけだと何も変わらないので、アプリチームのAndroidの人たちに集まってもらって「こんなことをやろうと思っている」と話をしました。実際のNewsPicksのサンプルコードを見せながら話し合って、チームの合意をとってリアーキを進めていきました。

――なるほど。具体的なビフォーアフターとして、どのように技術選定されていったのでしょうか?

石井:もともとはMVPがあったりMVVMがあったりと、様々なアーキテクチャが混在していました。また、使っているライブラリもAndroidではあまりメジャーではないものだったりして、かなりカオスな状態でした。修正するにも属人的になっており、新しく入った人がスピード感をもって対応することも難しい状況でした。

それをModel View ViewModelに一本化して、データバインディングの仕組みを使えるようにしたことで、簡単に実装できる仕組みを作っていきました。中でもバインディングアダプタをかなり使っていて、ここまで使っている会社はなかなかないんじゃないかなというくらい使いこなしているので、今ではViewModelだけでほとんど書ける、という状態になっていますね。
他にも、coroutine flowとかdagger hiltとか、今だとそこそこ新しい技術を取り入れているので、これまでと比較すると開発効率は相当高くなっていると思います。

――こちらは、既存コードに手を加えているのでしょうか?

石井:基本的にはまだ新しく追加する機能で新アーキテクチャを採用していますが、既存コードも少しずつ変えるようにしています。
本当はComposeもやりたかったのですが、iOSの方でSwiftUIにチャレンジしています。現実的にiOSとAndroidの両方が技術的チャレンジをするのもリスクが高いと思いましたし、Compose自体もまだ技術的に確立したものになっていないと感じたので、MVVMとデータバインディングをフルに使った使いやすいものを作るということで決めました。

――今後、切り替えていくことになるのでしょうか?

石井:正直、今のアーキテクチャの生産性がとても高いので、直近でComposeに切り替える予定はありません。でも、技術的チャレンジは常に行っていきたいので、もう少しCompose自体がこなれてきたら考えていきたいなと思っています。

こうやって進めていったリアーキプロジェクト[iOS編]

――次に、iOSについても教えてください。先ほど「改善したいなー」と思われていたとのことですが、具体的にどういう状況だったのでしょうか?

金子:実際にコードを見てみるといわゆるFat View Controllerの状態でした。1つのクラスに大量のロジックが入っていて、ロジックを追うのが困難だったり、どこか1つのコードをいじると壊れるようなリスクが常に付きまとうような状態だったのです。また、単体テストが全く実装されていなかったので、リファクタリングも気軽にできない感じでした。

あとは、実装のルールが明確になっていなかったことも課題だなと。リリースされてからそれなりに年数が経っているアプリなので、これまで何人もの人が開発に関わっていて、それゆえに場所によって実装方法が異なっていたりと、既存コードを読んで把握していじるというのがすごく大変な状態でした。

――石井さんがおっしゃっていた状態と同様、保守性が低い感じだったのですね。

金子:石井さんと一緒で、このままの状態でずっと開発していくのは厳しいなと思いました。
とはいえ、App Unit. ができた翌月の2021年2月に広告チームから現在の部署に異動してきたのですが、ビジネス的に新しい機能の開発が常にあるので、まとまった時間が取れずにいました。あと、僕自身アプリを長くやっていたわけではなかったので、いきなりやるという余裕もなく、ちょっとずつ既存のコードを理解しながらいじっていったという状況でした。

――最初に手をつけられたのはどこだったのでしょうか?

金子:広告チームにいた頃から特に課題だなと思っていたことは、ログ関連です。特に広告関連だと、広告がユーザに何回表示されたか、何回クリックされたかといったログが重要であり、それらが間違っているとお金の問題に発展してしまいます。
そんな大事なログが、保守性の低さによって問題が起きやすい状態になっていました。なるべく早くそれを無くしたいということで、自動テストを自分で考えて実装したのが、最初の大きな改善でした。2021年3〜4月頃の話です。

詳しくはこちらのブログをご覧ください。
https://tech.uzabase.com/entry/2021/05/21/094101

6月中頃からは、リアーキに向けた新しい技術の調査を始めて、7月に法人系機能において新しいアーキテクチャで実装を始めました。iOSについては、まだあまり既存コードには手を入れていなくて、独立した新機能を積極的に新しいアーキテクチャで作っているという段階です。なのでこれから大変になってくることになりますね。

――先ほど石井さんが「SwiftUI」とおっしゃっていましたが、やはりここが最もチャレンジングな取り組みでしょうか?

金子:そうですね。今まではUIKitでずっと実装してきたのですが、これからはSwiftUIがiOS界隈ではメジャーになっていくことはわかっていたので、このタイミングでTCA(The Composable Architecture)にチャレンジしようとなりました。

また、ドメイン駆動設計の考え方も積極的に取り入れています。古いアーキテクチャでは、先ほどお伝えしたFat View Controllerの状態で、ネットワーク処理なども全てView Controllerに書かれてしまっており、それが原因でテストができないという状態になっていました。

そこを変えるために、レイヤードアーキテクチャというDDD(Domain-Driven Design)の中で語られているアーキテクチャ設計を参考にしたレイヤー構成にしています。例えばAPI通信に関しては、インフラ層に処理を全て閉じ込めて、プレゼンテーション層にはインターフェースだけを公開するようにしています。そうすることで、API通信部分をモックにできるので、プレゼンテーション層だけでテストを実施することができるようになります。

これ自体は一般的になされていることなのですが、古いアーキテクチャだとこういうこともできなかったので、これだけでも大きな進歩だったと感じます。
レイヤー構成を分けたと言っても単にフォルダを分けただけだと全然不十分だと思っていて、しっかりとモジュールとして分けてしまおうということを並行して進めています。
依存関係がおかしなコードを書いたらコンパイルエラーが起きるようにして、開発者が間違えられない仕組みにしていきます。そこまでしてアーキテクチャは、ちゃんとしたものが維持できると思っています。

みんな「面白い」と思って手伝ってくれる

――リアーキを進めるにあたって印象的だったことを教えてください。

石井:以前の記事でも話しましたが、一般的にリアーキを進めるって、上司の説得含めて様々な調整が必要になります。でもニューズピックスの場合は、個人のWillを重視しているので、僕がやりたいと思ったらそんなに誰も止めないわけです。もちろん、その代わりに責任も伴うのですが、結構好きにやらせてもらえるのがすごいところだなと思っています。
あとは、みんな「面白い」と思って手伝ってくれるんですよね。こちらからは何か特別な発信をしていたわけではなく、ただ僕が面白いと思ったことをやっていたら、多くの人が手伝ってくれるようになったんです。ここもユーザベースグループらしいところかなと思って印象的でしたね。

――まさに、「The 7 Values」が浸透していますね。金子さんはいかがですか?

金子:先ほどお伝えしたとおり、2021年7月に法人の1機能を新しいアーキテクチャで作ったわけですが、その後9〜10月にかけて、「トピックス」という新機能の開発が始まりました。
当初、スケジュール的にはもっと早くリリースしたいという話が経営レベルからあったのですが、中長期的にみてもっと保守性の高いアーキテクチャにして作っていくべきだと、石井さんと一緒に上申しました。すると、それが思いのほかすんなりと受け入れられて、リリーススケジュールを遅らせてくれたんです。

これは結構すごいことだと思っていて、ユーザベースグループを象徴するエピソードかなと思って、すごく印象的でした。僕は採用面接を担当することもあるのですが、この話をすると皆さん「すごい!」って言いますね。

――確かに、ボードメンバーがしっかりとそのペインと必要性を理解してスケジュールに反映してくれるのは、すごいことですね。

金子:あともう1つ、先ほどもお伝えしたとおり、入社後は広告チームにいて、異動直前はリーダーという重要な立場にいました。それにもかかわらず、やりたいことを尊重して異動させてくれたのも、とてもありがたい社風だと感じました。

日々のやりとりの中で自分の希望をちょこちょこと言っていたこともありますが、個人的にアプリ開発のキャリアが長くない中でも、迷ったら挑戦するということで、それを会社としてちゃんと応援してくれるのは嬉しいですね。
ちなみに、ニューズピックスでは「PM3」という、プロダクトチーム全員が集まる場があるのですが、昨年12月に開催されたPM3で、「自由主義でいこう部門」のMVPを受賞させていただきました。サーバーサイドからアプリに異動して成果を出した、ということで、しっかりと評価もしてくれるのは、とてもありがたいです。

――おふたりとも、「The 7 Values」の「自由主義で行こう」を特に貫かれていますね。

石井:そうですね。結局は自分の意志次第で、いかようにもやりたいことができるという環境が、ニューズピックスにはありますね。

石井:今の話に関連して、僕が今までの人生を振り返って思うことは、自分の意志ってすごく大事だなということです。意志があれば、大抵のことは失敗しません。たとえ上手くいかなかったとしても、意志があれば、必死になってそれを取り戻そうとしますよね。
自分の意思を持っている人にとっては成功の確率が上がる。誰かを巻き込んででも成功させたいという気持ちが応援される。そんな職場だと思います。

リモートワーク環境だからこそオンボーディングも充実

――業務のオンボーディングという観点だと、いかがでしょうか?

石井:会社としては、コミュニケーションがなかなかできない中で「シャッフルランチ」をやっています。リモートワークが前提の中で、他チームと気軽に話す機会が強制的にあるので、全然違う職種の人と話す機会があったり、普段業務で接する機会のない技術者と話せるようになる支援制度はいいなと思っています。
あと、これはリーダー陣についてですが、チーム内での1on1を重視しているので、みんなコーチングの研修を受けて傾聴のスキルを持っていたりします。先ほども話題になった意志やWillを引き出すことが重要だなと。僕自身も、メンバーとのコミュニケーションは常に意識しています。

金子:アプリチームのメンバーとはもともと面識があったので、異動と言っても「はじめまして」ではなかったのですが、技術的なキャッチアップについては、やはりみんなすごく教えてくれますね。「The 7 Values」に「渦中の友を助ける」というものがあるのですが、まさにそれが体現されていました。

あとは、去年の10月くらいから「メンター制度」というものができて、新しく入ってきた人に対して必ず1人のメンターがつくようになりました。COVID-19の感染拡大以降はリモートで入社するメンバーが多いため、コミュニケーションを促すという観点で、入社したメンバーにメンターが3ヶ月間、隔週で1on1したり、様々な事業部の人と話す環境を整える責任をもつようになっています。僕もメンターをやっていますよ。

石井:先ほどのシャッフルランチと同じで、ユニットに閉じずに人を紹介できるから、仕事がしやすくなりますよね。

金子:そうなんです。僕はコロナ以前に入って、当時はすぐ横に全然違う部署の人がいて自然に話せたのですが、今はそういう機会がなかなかないので、ありがたい制度だと思います。やはり、Slackのようなテキストコミュニケーションだけだと伝わらないこともありますしね。

――これからジョインするメンバーとして、どんな人と一緒に働きたいですか?

石井:しつこいようですが、自分の意志がある人がいいですね。待ちの姿勢ではなく、積極的に聞いて、考えて、実装してくれる人です。

金子:石井さんと一緒ですね。あとは技術が好きな人で、何よりも「The 7 Values」を体現できる人かなと思っています。

早く「人を増やせば開発スピードが上がる状態」にしたい

――今後、どのようなことに取り組んでいくのか、言える範囲で教えてください。

金子:リアーキの目的の1つは、生産性を上げることです。特にニューズピックスではビジネスのスピードが非常に速く、新しい要件がひっきりなしに来るので、現状は全然さばき切れていないのが正直なところです。

これに対して、今進めている実装ルールをしっかりと整備すると、「人を増やせば開発スピードが上がる」という、理想的な状態になります。今はアプリチームで固まっていますが、そういうアーキテクチャができたならば、例えば事業部ごとにアプリエンジニアがいてもいいなと思っています。

――「人を増やせば開発スピードが上がる」状態、いいですね!

金子:新しい技術や開発しやすい環境は、外から見ても魅力的だと思うので、優秀な人が入りやすい環境を作るのも大事な仕事だと思っています。比較的規模の大きなアプリでSwiftUIとTCAを導入している事例は、まだそれほど多くないと思っています。これらの新しい技術にチャレンジしたい人にとってはとてもやりがいのある環境ではないでしょうか。

――石井さんはいかがでしょうか?

石井:僕は、誰もが入りたいと思えるようなモバイルユニットチームにしたいと考えています。だからこそ、Composable Architectureのような新しい技術を使っていることなどは、どんどん発信していきたいですね。まだニューズピックスは発信が少ないと思っているので、そこに積極的に取り組んで行こうかなと思います。

制度的な部分では、「20%ルール」を作りたいと思っています。それによって、みんながどんどんと勉強していって新しい技術を試していく。そういう、いい循環を作っていきたいと思っています。

――ありがとうございます!それでは最後に、Qiita読者に一言ずつお願いします。

金子:リアーキを進めているとは言え、改善できることは山ほどあるので、やりたいことや新しい技術で挑戦したい人は、いくらでもやれる余地がある環境です。これをやりたい!という意志をもっている人には、自由主義で挑戦できる場が用意されていますよ!

石井:ニューズピックスは技術的にはまだまだ全然有名ではなくて、これからの会社だと思っています。
将来、ビジネス的には確実に伸びていくし、使えるお金も増えていくので、新しい技術もどんどんと使えるようになるでしょう。だからこそ、技術者にはすごくチャンスが転がっている環境だと思います。ぜひこれから作ろうと思っている20%ルールを使って、技術者としてのプレゼンスをあげていただきたいなと思います。

iOSエンジニアの求人を見る

編集後記

「面白い」と感じたら、個人の取り組みに自然と人が集まる。とても素敵な職場環境だと感じました。The 7 Valuesが各メンバーに浸透しているからこそ、熱量が具体的なプロジェクトとなって進んでいくのでしょう。
リアーキプロジェクトとしては、これからが既存コードに手を加えていくフェーズへと進むタイミングですから、意志をもって新しい技術やアーキテクチャに取り組みたい方にとっては最高の環境だと言えるでしょう。

取材/文:長岡 武司

関連記事