SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

大規模レガシーサービスにおけるパフォーマンス改善の道のり

CSSを軽量化し、ページ表示速度を改善せよ! レガシーWebフロントエンドのパフォーマンスチューニング

大規模レガシーサービスにおけるパフォーマンス改善の道のり 第2回

CSSの軽量化

 洗い出した問題の中で、最も大きな問題を抱えていたのはCSSでした。タウンワークのCSSは、複数のページのスタイルが全て1つのCSSファイル内に結合された形になっており、ページごとに見ると、使っていないスタイルを大量に読み込んでしまっている状態でした。そのサイズは500KBにもなります。下の画像は、Chromeの開発者ツールで改善前のCSSのカバレッジを表示したものです。赤い部分が、使われていないスタイルのサイズを表しています。

読み込んでいるスタイルの大部分を使っていなかった
読み込んでいるスタイルの大部分を使っていなかった

 理想の形は、ページごとに必要なスタイルのみを読み込むことです。しかしこれを実現するためには、それぞれのページについて、どのような場合にどのスタイルを使っているのかを全て洗い出し、個別のCSSファイルとしてまとめ直す必要があります。ユーザーの状態や、画面上の操作によっても切り替わるスタイルまで含めると、精緻に洗い出すことは困難を極めます。まして、時間的制約の下、その作業を人力で行うことは不可能でした。

 そのため、私たちは「スタイルの自動抽出+リグレッションテストの徹底」という戦略をとりました。具体的には、ページごとに取りうるパターンのHTMLをできる限り収集し、それらの中で使用されているスタイルを自動抽出、新たなCSSファイルとして書き出します。元のCSSの代わりに新たに生成したCSSを使って、リグレッションテストを行います。もしパターン漏れがある場合、デザイン崩れが発見できるので、このパターンを新たに加えもう一度CSSファイルを書き出し、リグレッションテストを行います。この手順を、デザイン崩れが発見できなくなるまで繰り返します。これによって、リリース可能と判断できる品質を担保することができました。

デザイン崩れが見つからなくなるまで、リグレッションテストを繰り返す
デザイン崩れが見つからなくなるまで、リグレッションテストを繰り返す

 下の画像は、改善後のCSSのカバレッジを表示したものです。最終的に、もともと500KBあった未使用CSSのサイズを12KBまで減らすことができました。使っていないスタイルが若干残っているのは、画面上のイベントに応じて使われるものがあるためです。

実際にページ上で使用するスタイルのみに絞って読み込むようにした
実際にページ上で使用するスタイルのみに絞って読み込むようにした

結果

 CSSの軽量化を中心とする今回の取り組みによって、読み込み時間を40%程度削減することができました。下の画像は、改善前後のLighthouseの実行結果(Simulated Fast 3G、4x CPU Slowdown)を横並びにしたものです(2018年7月時)。

改善実施前後のLighthouse実行結果比較。重度の問題を示す赤いバーをなくすことができた。
改善実施前後のLighthouse実行結果比較。重度の問題を示す赤いバーをなくすことができた。

まとめと今後

 本稿では、タウンワークにおけるパフォーマンス改善の取り組みについてお話しました。この取り組みの大きな成果のひとつは、開発セクション以外も含む事業組織内でパフォーマンスの重要性が以前よりも広く認知されるようになり、開発における意思決定をしやすくなったことです。

 一般的に、成熟したサービスの開発現場では、リスクを回避するため意思決定に保守的なバイアスがかかりがちです。そのため、今回のようなリスクを伴う改善に踏み切れたことは、今後のパフォーマンス改善活動にとって大きな一歩であったと感じています。

 私たちは、サービス開発におけるパフォーマンス改善活動を、攻めと守りの2つの観点から捉えています。攻めの活動とは、ユーザー体験に影響するパフォーマンスの課題を発見し、それを解決しにいくことです。守りの活動とは、現状のパフォーマンスを妨げる要因を、できる限り作り込まないようにすることです。これらの両輪を回すことで、継続的なパフォーマンス改善に取り組んでいきます。

 いずれの活動においても、最も重要なことは、指標となる値を継続的に計測し、モニタリングすることです。ユーザー体験に直結するパフォーマンスの課題を浮き彫りにするためには、単純なコンバージョンレートだけでは不十分です。ユーザーの行動をより精緻に分析するため、サービスの性質に応じた中間メトリクスとログを設計する必要があります。パフォーマンスを妨げる要因を作り込まないようにするためには、リリース前後のパフォーマンスを比較して、悪化した場合には検知する仕組みが必要です。可能であれば、パフォーマンスに影響する項目について許容可能な「しきい値」を定め、リリースする前の段階でバリデーションをかけるのが理想的です。

 今後も、少しでも使いやすいサービスをユーザーのみなさんにお届けできるよう、さまざまなトライをしながら、パフォーマンス改善活動に取り組んでいきたいと思います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
大規模レガシーサービスにおけるパフォーマンス改善の道のり連載記事一覧

もっと読む

この記事の著者

加藤 慶之(株式会社リクルートテクノロジーズ)(カトウ ヨシユキ)

 リクルートテクノロジーズ ITエンジニアリング本部 プロダクトエンジニアリング部 RJBグループ ソフトウェアエンジニア 2016年に新卒でリクルートに入社。リクルートジョブズが提供するWebサービスの開発に従事。データを活用したグロースハック施策のプランニングから開発、分析まで全て1人で担当する...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11445 2019/03/29 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー