初めに
こんにちは! 「estie レジリサーチ」でQAエンジニアをやっている山本龍平(yamachan)です。
この記事はestie QAメンバー3名によるブログリレー 2日目としてお届けしています。
今回は、自分の開発ユニットがどのようにプロダクトのパフォーマンスと向き合い、改善に取り組んでいるかをご紹介します。 「非機能面の品質改善に関心がある」「パフォーマンス改善って実際に何してるの?」という方にぜひ読んでいただきたいです!
背景
「estie レジリサーチ」は、住宅領域の不動産情報を扱うプロダクトです。 この領域のデータ量は非常に膨大で、検索や集計にかかる処理は重くなりがちです。
私たちのプロダクトは、そうした複雑な情報を顧客がストレスなく扱えるようにすることをミッションにしています。 つまり、「機能が豊富」だけではなく、「操作がスムーズでサクサク動く」ことが価値そのものです。
実際にお客様との会話でも、
「他のツールより軽くて、操作にストレスがない」
「レポート出力が早いのが地味に助かってる」
といったフィードバックをいただくことがあり、性能面の品質が選定理由の一部になっている実感があります。
性能の可視化
性能を改善するために、まず何よりも大切なのは「現状を正しく把握する」ことです。 体感で「ちょっと遅いな…」という気づきはあっても、それを定量的に測定・観測できなければ改善にはつながりません。
私たちのユニットでは、以下のような仕組みで性能を定期的に可視化しています:
- ログを仕込んで性能を取得する
- ログをSnowflakeに送信して集約
- 分析基盤上のWebアプリで可視化・分析
この仕組みによって、特定機能の処理時間やパフォーマンスを時系列で追跡可能にしています。
ログの取得
バックエンドでの処理にかかった時間
多くのパフォーマンス課題はバックエンド処理に起因するため、GraphQL APIへのリクエスト時に以下のようなログを出力しています:
start
: リクエスト送信タイミングend
: レスポンス受信タイミング
さらに、GraphQLのクエリ単位ではなくoperationName単位で計測することで、ユーザーの体感に近い粒度で分析できるようにしています。
実装イメージはこんな感じです:
app.use((req, res, next) => { // GraphQLエンドポイントへのアクセスのみ対象 const isGraphQL = req.path === "/api/graphql" && req.method === "POST"; if (!isGraphQL) return next(); const start = Date.now(); // 応答完了後にログ出力 res.on("finish", () => { const duration = Date.now() - start; const status = res.statusCode; const operation = req.body?.operationName || "unknown"; const vars = req.body?.variables || {}; const log = { type: "GraphQL", timestamp: new Date().toISOString(), operationName: operation, durationMs: duration, statusCode: status, isError: status >= 400, variables: vars, // 本番環境では必要に応じてマスキング }; console.log(JSON.stringify(log)); // ここを外部ログ送信に置き換えることも可能 }); next(); });
フロントエンドを通してユーザーが実際に感じる処理時間
ユーザー体感のボトルネックを把握するため、次のような処理に対してもフロントエンドでログを仕込んでいます:
- ファイル生成処理(Excel/PDFなど)
- 複数API連携によるデータ表示
「estie レジリサーチ」ではこれらの処理が多く、細かなログを仕込むことで、改善のヒントが得られやすくなります。
ログを分析基盤に送る
こちらに関しては、プラットフォームチームがログをSnowflake上に送る仕組みを整えてくれており、そちらを利用しています。
snowflakeからSQLを叩いて、柔軟にログを取得、加工、分析を行えるので本当に助かっています。
また、ロガーに関しても会社として統一されたものがあるので、基本はそちらを利用しています。
ログを分析する
ログは統一された形式でSnowflakeに送信されています。 SnowflakeからSQLで柔軟にデータを取得・加工できるため、分析の自由度が非常に高いです。
その上で、Streamlitを使ってダッシュボードを自作しています。 グラフなどを即座に表示できるため、チームで見たい指標を可視化して、次のような簡易Webアプリとして運用しています。
次の改修の優先度の選定や、改修方針を決定する際にもさっとデータを可視化してチームでシェアできるのでとても便利です。
チームでの向き合い方
性能の可視化ができたら、次に大事なのは「チームでそれをどう運用していくか」です。
週次サマリーの共有文化
私たちのユニットでは、週に1度、パフォーマンスの変化や注目すべきポイントをSlackで共有しています。 以前はチームメンバーのSWEであるrianoさんが実施していたこの取り組みを、現在は私がQAエンジニアとして引き継ぎ、継続中です。
こうした共有により、
- 現在のパフォーマンスの良し悪しを全員が把握できる
- 問題が起きた際にいち早く異変に気づける
- チーム全体で「快適さ」を追求する雰囲気が育つ
といった効果が出ています。
チーム内でも好意的に、スタンプや反応をもらえるのでありがたいなと思っています。
改善スピードの速さと信頼感
「○○の読み込みが遅いかも」「このPDF出力かなり時間がかかっている」といったフィードバックがあれば、開発メンバーが即座に対応・改善してくれるケースが多く、チームとして改善するのが当たり前という文化が根付いています。
なかでも、rianoさんやpes-magicさんなど競技プログラミングで鍛えられた方々が多く、技術的にもスピーディに解決されていくので本当に心強いです。
QAエンジニアとして考えていること
パフォーマンス改善というとバックエンドエンジニアの仕事に思われがちですが、「誰が気づくか」「誰が見張るか」で改善スピードは大きく変わります。
また、圧倒的なスピードで開発を行うチームの中で、保守的な観点に目を向ける人員もチームには必要だと考えています。
QAエンジニアとして、非機能要件を含めたプロダクト品質に責任を持ちつつ、保守的な観点に目を向け、体感・数値・分析の3つを軸に、ユーザー視点と技術視点の橋渡しをするのは、QAならではの価値だと思っています。
特にestieでは、QAエンジニアに限らないチーム全員がテストをしていく風潮があるからこそ、自身も職域に縛られずにはみ出して活動していくことが大切だと思っています。
アプリケーションにログを仕込んだり、それを分析するためのアプリケーションを自作したりなど、一般的に開発エンジニア側のタスクに思われるような仕事にも前向きにコミットしていくようにしています。
最後に
estieではQAエンジニア募集しています!
テストだけではなく、開発に関しても自身でも手を動かしながらチームを巻き込んで品質を改善していける環境がestieにはあります。
非機能要件の改善や、利用ログの分析にも興味があるQAエンジニアの方、まずはカジュアル面談もできますので、お気軽にお申し込みください!
👇 面談希望はこちらからどうぞ!