CIは命綱 - 開発プロセスで意識・工夫していること
ストックマークの開発チームが、スキーマ駆動開発やデータドリブンな改善など、堅牢かつ高速な価値提供を実現するための具体的な開発プロセスと工夫を解説している。
キーポイント
スキーマ駆動によるコミュニケーション最適化
gRPC の proto ファイルを PRD 作成段階から共有し、フロントエンド・バックエンド間の契約を明確化することで開発効率と円滑さを最大化している。
Over Fetching を防ぐ画面特化型 API 設計
大量の情報を扱うプロダクトにおいて、各画面ごとに必要十分なデータのみを取得する設計を採用し、パフォーマンス低下を防止している。
品質ベースライン維持のためのリグレッションテスト
検索精度などのコア機能について、自動化と人間の価値判断(F 値や MRR の確認含む)を組み合わせた継続的なテストで品質を担保している。
データドリブンによるユーザー体験向上
"推測するな、計測せよ"の原則に基づき Datadog で可視化した IO 時間や処理時間を分析し、ユーザー体験に直結する部分から優先的に改善を行っている。
影響分析・編集コメントを表示
影響分析
この記事は、大規模な情報処理を扱うプロダクト開発において、パフォーマンスと品質維持を両立させるための具体的なプラクティスを示しており、テックリードやエンジニアリングマネージャにとって非常に参考になる実践知である。特に「推測するな計測せよ」というデータドリブンなアプローチは、リソースが限られる中でユーザー体験を最大化するための重要な指針となる。
編集コメント
AI 技術そのものの進展ではなく、堅牢な開発プロセスとデータドリブンな改善の重要性を説く実務記事です。テックリード層には特に示唆に富む内容となっています。
ストックマーク Co-VPoE の岩瀬です。本記事はストックマーク アドベントカレンダー 2022の初日記事です。
ストックマークの開発チームは、高速かつ堅実に価値を生み出しています。その内部で何を意識し、何を工夫しているのか、本記事でその一端をお伝えします。効果的な開発プロセスを追求するエンジニアや、テックリード、エンジニアリングマネージャーの方々の参考になれば幸いです。(なお、本記事は概要と一部の内容を公開したものです。全体像やより詳細な情報については、記事末尾のカジュアル面談をご利用ください!)
本記事で紹介するトピックは以下の6つです。
- スキーマ駆動によるコミュニケーションの最適化
- Over Fetchingを生み出さないAPI設計
- 価値のベースラインを保つリグレッションテスト
- 継続的なライブラリバージョンのメンテナンス
- CIは命綱
- 「推測するな、計測せよ」によるユーザー体験の向上
それでは、早速始めましょう。
スキーマ駆動による開発効率化
ストックマークのエンジニアは、フロントエンド、バックエンドを問わず、gRPCのスキーマを扱えるようになります。これにより、メンバー間のコミュニケーションコストを最小限に抑え、開発を円滑に進められるようにしています。
もう少し具体的な内部プロセスを紹介すると、PRD(Product Requirements Document)を作成したメンバー※や、PRDの主要な検討・実装を担当するメンバーが、まずprotoファイルを作成し、Pull Requestを出すようにしています。
※ ストックマークでは、エンジニアもPRDを書くことがあります。[記事1][記事2]
Over Fetchingを生み出さないAPI設計
ストックマークのプロダクトは大量の情報を扱うものが多いため、API設計が雑だと、Over Fetchingが発生する可能性があります。Over Fetchingが起きると、必要以上のデータをやり取りすることになり、速度低下を招いてユーザー体験が悪化してしまいます。
そこで、内部のAPI設計では、画面ごとに最適化し、必要十分なデータを返すAPIとしています。この場合、画面ごとに一部重複する可能性はありますが、実装では共通部分を共通のmessageとして括り出して使用するなど、保守性を高める工夫をしています。
価値のベースラインを保つリグレッションテスト
プロダクト開発とは、常に新しい価値を生み出し続けることだけではありません。新しい価値を生み出しながらも、狩野モデルで示される当たり前品質や一元的品質を維持する必要があります。
ストックマークのプロダクトにも、常に高い品質を保ちたい機能がいくつかあります。例えば、検索精度や検索キーワードの自動補完がそれに該当します。検索機能を例にとると、ストックマークのプロダクトのユースケースでは、検索が利用される機会が非常に多いです。そのため、検索精度が悪化すると、ユーザー体験は著しく損なわれてしまいます。
そこで、内部のアルゴリズムに変更を加えた場合でも、体験が悪化していないことを担保するため、リグレッションテストを継続的に実施しています。多くの部分は自動化されていますが、人間の価値判断が必要な部分については、人の目も活用しています。
本セクションで例として挙げている「良い検索精度、ユーザーに高い価値をもたらす検索精度とは何か?」という問いは、人の目を活用する一例です。もちろん、再現率(recall)と適合率(precision)を考慮したF値(F-score)を確認する手法や、ランキング指標を測るMRR(Mean Reciprocal Rank)などもありますが、現時点では最も顧客アウトカムに寄与する方法として、手動での対応を行っています。
継続的なライブラリバージョンのメンテナンス
皆さんは、開発・運用しているプロダクトで使用しているライブラリのバージョンがかなり古くなってしまった経験はありませんか?バージョンの差分が大きくなればなるほど、最新化は困難になりがちです。
ストックマークでは、ライブラリのバージョンが古くならないよう、開発プロセスに組み込んで対応しています。具体的には、開発の週次ミーティングで、Dependabotによる通知をレビューしています。
CIは命綱
開発を続けていると、特定の環境要因(例えばCircleCI)によって、CIが意図通りに動作しないことがあります。例えば、CircleCIのExecutor環境とローカル環境の違いや、バイナリのコンパイルオプションの違いなどが原因で、Pythonのsetuptoolsがインストールされずにテストが失敗するといった現象です。
このような場合の対応策としては、該当部分を削除してしまったり、別のワークアラウンドを試したりと、様々な案があります。ストックマークでは、稀な事象が発生したとしても、過去に様々な事象を経験してきたエンジニアが在籍しており、CIが正常に動作し続けるようメンテナンスを行っています。
実際、内部のエンジニアからは「CIは命綱。動いていなくても、少しならいいかもしれないけど、命綱がない状態で開発をしていたら僕は怖い。」という力強い発言もありました。
「推測するな、計測せよ」によるユーザー体験の向上
ストックマークの開発チームは、プロダクト内部の処理時間やI/O時間をDatadogで可視化しています。可視化されたデータから、特にユーザー体験に直結する部分を重点的に改善しています。言い換えれば、場当たり的な予測で改善を繰り返すのではなく、データドリブンで開発プロセスを進めているということです。
分かりやすい仮の例を挙げると、バックエンドで1秒かかる処理を70%高速化するよりも、10秒かかるネットワークI/Oを10%高速化(I/Oの量や回数を減らす)した方が、ユーザー体験への貢献は大きいのです。
格言「推測するな、計測せよ」を体現する開発プロセスを実践しています。
まとめ
本記事では、ストックマークの開発プロセスにおいて意識していること、工夫していることの一部を紹介しました。他にも、テスト時のモック注入や、環境に応じた依存性注入を実現するためのDI(Dependency Injection)の活用など、紹介したい内容はたくさんあります。
本記事で紹介しきれなかった詳細や他の課題について、詳しく知りたい方はぜひお話しましょう!
また、本記事はストックマーク アドベントカレンダー 2022の初日記事でした。本日を含め、これから25日間、ストックマークに関する記事が続きますので、ぜひお楽しみに!
原文を表示
ストックマーク Co-VPoE の岩瀬です。本記事はストックマーク アドベントカレンダー 2022の初日記事です。
ストックマークの開発チームは高速にかつ堅実に価値を生み出しています。その内部で何を意識しているのか、何を工夫しているのか、本記事でその一端をお届けします。効果的な開発プロセスを追求するエンジニアや、テックリード、エンジニアリングマネージャに少しでも参考になることを狙っています。(なお、概要+一部の公開ですので、全体像やより突っ込んだ詳細については、本記事最下部にあるカジュアル面談までお願いします!)
本記事で紹介するトピックは以下の6つです。
スキーマ駆動によるコミュニケーションの最適化 Over Fetching を生み出さないAPI設計 価値のベースラインを保つリグレッションテスト 継続的なライブラリバージョンのメンテナンス CIは命綱 「推測するな、計測せよ」によるユーザー体験の向上 それでは早速いってみましょう!
スキーマ駆動による開発効率化 ストックマークのエンジニアは、フロントエンドであればバックエンドであれ、gRPCのスキーマを触れるようになっていきます。これによってメンバー間のコミュニケーションコストを最小化しており、円滑に開発が進められるようになっています。
もう少し具体的に内部を紹介すると、PRDを作ったメンバー※や、PRDのメイン検討・実装を担うことになったメンバーがprotoファイルを先に作って、Pull Requestを出すようにしています。
※ ストックマークでは、エンジニアであってもPRDを書くことがあります。[記事1][記事2]
Over Fetching を生み出さないAPI設計 ストックマークのプロダクトは大量の情報を扱うものが多いため、API設計を雑にしてしまうと、Over Fetchingが発生する可能性があります。Over Fetchingすると、必要以上のデータをやりとりすることがあるため、速度の低下を招くためユーザ体験が悪化してしまいます。
そこで、内部のAPI設計として、画面ごとに最適化して必要十分なAPIとなるようにしています。この場合、画面ごとに一部重複してしまう可能性がありますが、実装として共通部分を共通のmessageとして括りだして使うなど、保守性を高めています。
価値のベースラインを保つリグレッションテスト プロダクト開発というのは、常に新しい価値を生み出し続けるものではありません。新しい価値を生み出しながらも、狩野モデルで挙げられる当たり前品質・一元的品質をキープする必要があります。
ストックマークのプロダクトにおいても、常に品質を保ち続けたい機能がいくつかあります。たとえば、検索精度や検索キーワードの自動補完がその機能に該当します。検索機能を例にとると、ストックマークのプロダクトのユースケースでは、検索が利用される機会が多くあります。そのため、検索精度が悪化してしまうと、ユーザー体験が著しく悪化してしまうのです。
そこで、内部のアルゴリズムに手を加えた場合であっても、体験が悪化していないことを担保するために、リグレッションテストを継続的に実施しています。自動化している部分も多くありますが、人間の価値判断が必要な部分については、人の目も活用しています。
本セクションの例として取り上げているような「良い検索精度、ユーザーに高い価値をもたらす検索精度ってなんだろう?」というテーマは、人の目を活用する一例です。もちろん、再現率と適合率を考慮したF値を見るような手法や、ランク指標を測るMRR(Mean Reciprocal Rank)などもありますが、現時点ではいちばん顧客アウトカムに寄与するものとしてマニュアル対応をしています。
継続的なライブラリバージョンのメンテナンス 皆様は過去に、開発・運用しているプロダクトで利用しているライブラリのバージョンがかなり古くなってしまった、という経験はありませんか?バージョンの差分が開けば開くほど、バージョンの最新化は困難になりがちです。
ストックマークではライブラリバージョンが古くならないよう、開発プロセスに組み込んで対応しています。具体的には、開発の週次ミーティングの中でdependbotによる通知をレビューしています。
CIは命綱 開発を続けていると、特定の環境要因(たとえばCircle CI)でCIが意図通りに動作しないことがあります。たとえば、CircleCI の Executor 環境とローカル環境の違いやバイナリのコンパイルオプションの違いなどが要因となって、Python のsetuptools がインストールされずにテストが落ちるといった現象などです。
このような場合の対応策としては、その部分はカットしてしまったり、別のワークアラウンドを試したり、と様々な案があります。ストックマークでは、レアな事象が起きたとしても、過去に様々な事象を踏み抜いてきたエンジニアが在籍しており、CIが正常に動き続けるようにメンテナンスをしています。
実際に内部のエンジニアの発言から「CIは命綱。動いていなくても、少しならいいかもしれないけど、命綱がない状態で開発をしていたらぼくは怖い。」という力強い発言もありました。
「推測するな、計測せよ」によるユーザー体験の向上 ストックマークの開発チームは、プロダクトの内部でかかっている処理・IO時間を、Datadogを利用して可視化しています。可視化されたデータから、特にユーザー体験につながる部分を集中して改善しています。言い換えれば、場当たり的に予測して改善を繰り返すのではなく、データドリブンで開発プロセスを進めているということです。
わかりやすい仮の例を使うとすれば、バックエンドで1秒かかる処理を70%高速化するよりも、10秒かかるようなネットワークIOを10%高速化(IOの量を減らしたり、回数を減らしたり)したほうがユーザー体験につながるのです。
格言である「推測するな、計測せよ」を地で行く開発プロセスを進めています。
まとめ 本記事では、ストックマークの開発プロセスで意識していることや、工夫していることの一部を紹介しました。他にも、テスト時におけるモック注入や、環境ごとに適した依存性注入を実現するためのDI (Dependency Injection) 利用など、たくさんご紹介したい内容があります。
本記事では紹介しきれない詳細や他の課題について、詳しく知りたい場合はぜひお話しましょう!
また、本記事はストックマーク アドベントカレンダー 2022の初日記事でした。本日含め明日からも25日間、ストックマークの記事が続きますので、ぜひお楽しみに!
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み