<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>サイバーエージェント &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/サイバーエージェント/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>「最近のWebパフォーマンス改善について知っておきたいコト」についてあほむに聞いてきた</title>
		<link>/shumpei-shiraishi/24156/</link>
		<pubDate>Mon, 11 Sep 2017 01:00:23 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[サイト制作]]></category>
		<category><![CDATA[Webパフォーマンス]]></category>
		<category><![CDATA[http2]]></category>
		<category><![CDATA[サイバーエージェント]]></category>

		<guid isPermaLink="false">/?p=24156</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (3)こんにちは、編集長の白石です。 この記事は、9月24日に開催されるHTML5 Conference 2017に登壇するエキスパートに、予定しているセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (3)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催される<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇するエキスパートに、予定しているセッションのトピックを中心に、いろいろ伺ったものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、株式会社サイバーエージェントにお勤めの佐藤歩さんです（ネット上では「あほむ」「ahomu」のIDで有名）。
（プロフィールは<a href="http://events.html5j.org/conference/2017/9/speaker/index.html#ahomu" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>）</p>

<p><img src="/wp-content/uploads/2017/09/6ed2d7e1dc76c5d83a54be2cc27ba479.jpg" alt="" width="640" height="412" class="alignnone size-full wp-image-24174" srcset="/wp-content/uploads/2017/09/6ed2d7e1dc76c5d83a54be2cc27ba479.jpg 640w, /wp-content/uploads/2017/09/6ed2d7e1dc76c5d83a54be2cc27ba479-300x193.jpg 300w, /wp-content/uploads/2017/09/6ed2d7e1dc76c5d83a54be2cc27ba479-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>あほむさんのセッションは「最近のWebパフォーマンス改善について知っておきたいコト」（ホール 13:20-14:00）です。
（現在<a href="https://html5j.connpass.com/event/64992/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>は定員オーバーの状態ですが、無料イベントということもあってキャンセルも多めに出るらしいので、あきらめずにキャンセル待ちすることをお勧めします！）</p>

<h2>パフォーマンスはなぜ重要か？を違う切り口から伝える</h2>

<p><b class="speaker siraisi">白石:</b> Webパフォーマンスについて、<a href="http://events.html5j.org/conference/2017/9/session/#h2" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">「ベーシックな話を少々と、最近の動向」をお話されるということですね</a>。</p>

<p><b class="speaker ahomu">あほむ:</b> はい、そうですね。まあ、まだセッションの内容はほとんど固まっていないので、当日は全然違った話をすることになるかもしれないのですが。</p>

<p>普通パフォーマンスに関する「ベーシックな話」というと、「なぜパフォーマンス改善は重要か」ということを語られることが多いと思うんです。でも、「パフォーマンスが重要」というのは、もうエンジニアには広く認識されているんですよね。</p>

<p>足りないのは、<strong>パフォーマンス改善を「開発者の自己満足」で終わらせない</strong>ことなんじゃないかと。パフォーマンス改善が、自社のビジネスにどう寄与するのか。そこを考えないと、意味のないパフォーマンス改善を行ってしまう恐れもあるし、社内の理解も得られない。</p>

<p>「パフォーマンスは重要である」というメッセージを、そういう観点からも伝えたい気がします。それも他社の事例とか一般論から語るんじゃなくて、私自身が遭遇した実体験などを踏まえて語りたいな…と思ってます。</p>

<p><b class="speaker siraisi">白石:</b> それは面白そうですね！具体的には、どんな実体験になりますか？</p>

<p><b class="speaker ahomu">あほむ:</b> 例えば、弊社のサービスってSNSでWebページが拡散されることが、非常に大きな比重を占めているんです。つまり、TwitterやFacebookのアプリ上で、WebViewでページを表示されることがすごく多いんです。そうなると、実は<strong>ブラウザのキャッシュにすら期待できないことが多い</strong>。弊社のサービスはiOSのユーザーが多いのでなおさらです（※）。</p>

<p>とはいえ、<strong>SNSを通じてたまたま遭遇した、っていう千載一遇のチャンスは活かさなくてはならない</strong>。そういう限定された環境でも最高のUXを実現するため、最大のパフォーマンスを発揮するにはどうしたらよいかを常に試行錯誤しているんです。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。確かにそれは、パフォーマンスが非常に重要なシチュエーションと言えそうです。</p>

<p><b class="speaker ahomu">あほむ:</b> こういう例を含めていろいろ紹介できるといいかもしれません。URLさえあればどこからでもアクセス可能というのはWebの利点ですが、要はどんな環境で見られるかわからないということです。だから、Webのパフォーマンス改善には終わりがないし、少しでもその助けになるよう、常に新しいアイデアや技術が考案されています。そういう技術のうち、比較的新しくて、活用しがいのあるテクニックや仕様について、いろいろご紹介できればと思っています。</p>

<p><small>
※弊社のサービスはiOSのユーザーが多いのでなおさら…Androidであれば、Chrome Custom Tabという仕組みでメインブラウザ（Chrome）とキャッシュなどのリソースが共有されることも期待できる。iOSは、Chrome Custom Tabに近いSafari View Controllerという仕組みがあるが、あまり利用されていない。
</small></p>

<p><img src="/wp-content/uploads/2017/09/520562370d1f74af395a1fd9555160cd.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24176" srcset="/wp-content/uploads/2017/09/520562370d1f74af395a1fd9555160cd.jpg 640w, /wp-content/uploads/2017/09/520562370d1f74af395a1fd9555160cd-300x200.jpg 300w, /wp-content/uploads/2017/09/520562370d1f74af395a1fd9555160cd-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>ページロードパフォーマンスの改善テクニック</h2>

<p><b class="speaker siraisi">白石:</b> では、パフォーマンスを改善していくテクニックや仕様をいくつかご紹介いただけますか？</p>

<p><b class="speaker ahomu">あほむ:</b> Webパフォーマンスを考える際には、やはりページロード (ページの読み込み速度)と ランタイム （ページ実行中のパフォーマンス）に分けて考えるのが王道です。ページロードの改善については、<strong>最近だとHTTP/2の話が中心になる</strong>と思います。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、御社のサービスでは、HTTP/2対応はもうかなり進められている感じなのですか？</p>

<p><b class="speaker ahomu">あほむ:</b> はい。できるところからHTTP/2にしていくというアプローチで、現在は多くのサービスがHTTP/2を利用して動いています。</p>

<p><b class="speaker siraisi">白石:</b> 実際にHTTP/2に対応してみていかがですか？苦労した点とかはありましたか？</p>

<p><b class="speaker ahomu">あほむ:</b> 具体的な切り替え作業については、インフラの専門チームが実施してくれるので、あくまで開発側からの意見になりますが…<strong>ほとんど苦労していることはないですね</strong>。</p>

<p><b class="speaker siraisi">白石:</b> おお、本当ですか。それは素晴らしい。</p>

<p><b class="speaker ahomu">あほむ:</b> はい、HTTP/2に切り替えても、開発への影響はほとんどなかったという点はとても重要ですね。アプリケーションとネットワークで、レイヤーが違うから当然といえば当然なのですが、やはり実際に経験してみると、そのありがたさが実感できます。トレードオフがほとんどないにも関わらず、パフォーマンスの向上が見込めるのですから。</p>

<p><b class="speaker siraisi">白石:</b> でも、HTTP/2に切り替えたことで、本当にパフォーマンスアップするのか、懐疑的な意見も目にしたことがあります。実際のところどうなんでしょうか？</p>

<p><b class="speaker ahomu">あほむ:</b> うーん…実際のところ、それはありますね。<strong>HTTP/2にしただけだと、体感的に良くなったっていう実感があまりないのは、正直なところです(笑)。</strong></p>

<p><img src="/wp-content/uploads/2017/09/fb8e33c766398453904ac50859d6bf89.jpg" alt="" width="640" height="417" class="alignnone size-full wp-image-24177" srcset="/wp-content/uploads/2017/09/fb8e33c766398453904ac50859d6bf89.jpg 640w, /wp-content/uploads/2017/09/fb8e33c766398453904ac50859d6bf89-300x195.jpg 300w, /wp-content/uploads/2017/09/fb8e33c766398453904ac50859d6bf89-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> それも正直な意見として、貴重だと思います(笑)。</p>

<p><b class="speaker ahomu">あほむ:</b> 例えばHTTP/2でヘッダ圧縮されてデータ転送量が多少減ったとしても、アプリケーションで扱うデータが最適化されてなかったら、誤差みたいなレベルになってしまいますからね。HTTP/2によるパフォーマンス向上は、確実に効いているとは思います。ですが、実際のサービスでは、常に別のところにパフォーマンスのボトルネックが潜んでいて、効果のほどが見えにくいんですよね。</p>

<p><b class="speaker siraisi">白石:</b> 他には、ページロードの最適化で知っておいたほうがいいテクニックとかありますか？</p>

<p><b class="speaker ahomu">あほむ:</b> ほかには、コンテンツの圧縮に<a href="https://github.com/google/zopfli" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Zopfli</a>や<a href="https://github.com/google/brotli" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Brotli</a>を利用していますね。他にはResource Hintsなども使っているので、お話したいですね。</p>

<p><span style="font-size: 80%;">※参考記事：<a href="https://developers.cyberagent.co.jp/blog/archives/5975/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">FRESH! Web パフォーマンス改善 〜サーバサイド編〜</a></span></p>

<p><b class="speaker siraisi">白石:</b> Zopfli…？そんな圧縮形式があるんですか？</p>

<p><b class="speaker ahomu">あほむ:</b> はい、ZopfliもBrotliも、どちらもGoogleが開発した圧縮形式です。</p>

<p>Zopfliは、圧縮の速度は遅いですが、そのかわりに圧縮効率は非常に良い。そしてgzipとの互換性があるので、gzipに対応したブラウザであればだいたい扱えるという大きな利点があります。</p>

<p>Brotliは、gzipとの互換性はありませんが、非常に効率のよい圧縮アルゴリズムです。こちらは現在のところ、Chrome, Firefox, Edgeでのみ利用可能です。</p>

<p><b class="speaker siraisi">白石:</b> <a href="https://www.w3.org/TR/resource-hints/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Resource Hints</a>というのはどういうものですか？</p>

<p><b class="speaker ahomu">あほむ:</b> 利用するリソースを先読みするヒントをブラウザに与えるための仕様です。これを利用すると、現在のWebページに含まれていないリソースであっても、ブラウザに先読みさせることができます。dns-prefetch (名前解決を実行しておく）, preconnect （サーバ接続を行っておく）, prefetch （リソースのフェッチを実行しておく）, prerender （ページのレンダリングをバックグラウンドで実行しておく）といったタイプの先読みが可能です。
<small>
（筆者注: <a href="https://blog.jxck.io/entries/2016-02-11/resource-hints.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Jxck</a>さんのブログで詳しく解説されています）。
</small></p>

<h2>ランタイムパフォーマンスの改善テクニック</h2>

<p><b class="speaker siraisi">白石:</b> ランタイム （アプリケーション実行時）のパフォーマンスを向上させるために使用している技術にはどんなものがありますか？</p>

<p><b class="speaker ahomu">あほむ:</b> <a href="https://github.com/w3c/IntersectionObserver" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Intersection Observer</a>や<a href="https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Passive Event Listeners</a>は利用しがいがあると思います。</p>

<p><strong>Intersection Observer</strong>というのは、要素同士の領域が交差したり、もしくはビューポート（ユーザーに見えている範囲）に要素が入ったかどうかなどを検出できるAPIです（筆者注: Intersectionとは「交差」の意味）。これを利用すると、ビューポート外で行われる処理を抑制したり、遅延させたりすることが可能になるので、パフォーマンス向上には非常に効果的です。わかりやすいのは、img要素がビューポート内に現れるまで画像の読み込みを遅延させる…などですね。</p>

<p><strong>Passive Event Listeners</strong>というのは、UIイベントが <code>preventDefault()</code> （デフォルトの動作をキャンセルする）されないことを保証するための仕組みです。</p>

<p>スクロールイベントなどは、 <code>preventDefault()</code> を行うことでブラウザのスクロール処理そのものをキャンセルすることができます。逆に言うと、ブラウザはスクロールがキャンセルされる可能性を考えると、イベントハンドラを実行してから実際のスクロールを行わなくてはならない。だから、イベントハンドラの実行に時間がかかったりすると、スクロール処理が詰まってしまうんです。これが<strong>スクロールジャンク</strong>と呼ばれる現象です。</p>

<p>ただ、実際に <code>preventDefault()</code> でスクロール処理を止めたいというケースは多くはありません。なので、「このイベントハンドラはpreventDefault()を呼ばないよ」ということをブラウザに伝える手段として用意されたのがPassive Event Listenersです。</p>

<p><small>
（筆者注: これらも、Jxckさんのブログに詳しい解説がある。<a href="https://blog.jxck.io/entries/2016-06-25/intersection-observer.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Intersection Observer</a> <a href="https://blog.jxck.io/entries/2016-06-09/passive-event-listeners.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Passive Event Listeners</a>）
</small></p>

<p><img src="/wp-content/uploads/2017/09/8934352103f7dcdc633ff237e8d88b63.jpg" alt="" width="640" height="411" class="alignnone size-full wp-image-24178" srcset="/wp-content/uploads/2017/09/8934352103f7dcdc633ff237e8d88b63.jpg 640w, /wp-content/uploads/2017/09/8934352103f7dcdc633ff237e8d88b63-300x193.jpg 300w, /wp-content/uploads/2017/09/8934352103f7dcdc633ff237e8d88b63-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> 今おっしゃったIntersection ObserverやPassive Event Listenersは、全てのブラウザで動くわけではありませんよね？</p>

<p><b class="speaker ahomu">あほむ:</b> はい。なので、動作しないブラウザ用にFeature Detectionで分岐を設けたり、Polyfillも活用しています。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。ただ、最初にお聞きした例だと「SNSで拡散されたページの最適化に注力している」というお話でした。<strong>こういうランタイム系のパフォーマンス改善って、SPA (Single Page Application) ではない通常のランディングページやメディアのサイトなどでも重要なのでしょうか？</strong></p>

<p><b class="speaker ahomu">あほむ:</b> そう思います。先程も申し上げたように、SNSを通じてサイトにアクセスしてくれるのって、ユーザーと接触できる千載一遇のチャンスなわけです。そこからモバイルアプリへの誘導を行うこともできる。なので、そういう千載一遇のチャンスで少しでも機会損失を起こさないように、入念にパフォーマンスをチューニングするのは非常に重要です。</p>

<p>個人的には、jQueryを使った普通のWebサイトこそ、ランタイムのパフォーマンスにもっと気を使うべきだし、できるとも思います。jQueryのプラグインが最新の仕様に追従すれば、プラグインをアップデートするだけで恩恵を得られるわけですから。</p>

<p>ただ逆に、プラグイン側が対応してくれなかったりすると、プラグインの中に手を入れるわけにもいかず、対応が進まないということの裏返しでもありますけどね…悩ましい問題です。</p>

<h2>パフォーマンス改善を「開発者の自己満足」で終わらせないために</h2>

<p><b class="speaker siraisi">白石:</b> これまでご紹介いただいた様々なテクニックですが、これらを活用してパフォーマンスを実際に改善していくのは、実際には骨の折れる作業だと思います。そうした、パフォーマンス改善作業に投下するコストと、それによって得られるリターンについては、どのようにお考えでしょうか？</p>

<p><b class="speaker ahomu">あほむ:</b> はい、おっしゃるとおり、これらのテクニックをただ使って、目に見えない部分でパフォーマンスを改善しても、単なる開発者の自己満足に終わってしまいます。それを避けるためには、<strong>まずは正しく計測することと、それがビジネス上のKPIとどう関連付けているかを検証していくこと</strong>が必要です。</p>

<p>まず計測についてですが、クライアントサイドのパフォーマンスを計測する指標は、現在も様々なものが考案され、利用可能です。</p>

<p>例えば<strong>First Paint</strong>。Webページの描画が開始されたタイミングを表す指標で、ChromeやEdgeでは非標準のAPIから値を得ることができます。</p>

<p>ただ、First Paintだけでは、コンテンツの表示が完了するまでの速度などについてはわかりません。最も重要なのは、ユーザーに見える範囲、つまりビューポートの描画がいつ完了するかです。</p>

<p><img src="/wp-content/uploads/2017/09/d49206c651f16b4bd779417fc8ee95c3.jpg" alt="" width="640" height="419" class="alignnone size-full wp-image-24180" srcset="/wp-content/uploads/2017/09/d49206c651f16b4bd779417fc8ee95c3.jpg 640w, /wp-content/uploads/2017/09/d49206c651f16b4bd779417fc8ee95c3-300x196.jpg 300w, /wp-content/uploads/2017/09/d49206c651f16b4bd779417fc8ee95c3-207x136.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>そういう観点での指標としては<strong>Speed Index</strong>があります。Speed Indexを計測する基本的な方法としては、描画中の画面をキャプチャして、最終的な表示結果が得られるまでにどれくらいかかるかを測るというものです。弊社のサービスでは、ページビューや直帰率といったKPIとSpeed Indexの間に相関関係が認められたため、Speed Indexを中心にパフォーマンス改善を行いました。</p>

<p>さらにこうした指標は実際のユーザーの環境で得られた値を一定量集めることも大事なので、集計結果をGoogle Analyticsに送信しています。そうすることで、GAを使いなれたプロに分析をお任せすることもできますからね。</p>

<p>そうした経緯は<a href="https://developers.cyberagent.co.jp/blog/archives/9540/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">弊社技術ブログの記事</a>に詳しく書かれています。</p>

<p><b class="speaker siraisi">白石:</b> なるほど…パフォーマンス改善がビジネスに寄与するという道筋を立てることで、パフォーマンス改善が業務として意味にあるものになるわけですね。</p>

<p><b class="speaker ahomu">あほむ:</b> そうですね。パフォーマンス改善とビジネスが両輪としてうまく回るためにも、やはり様々なパフォーマンス指標や計測が大事になってきます。</p>

<p>指標は他にも<strong>First Contentful Paint</strong> （コンテンツが表示され始めた時）や <strong>First Meaningful Paint</strong> （ユーザーに意味のある表示になったとき）など様々なものが考案され、実装も行われています。よければそういう話をまとめた<a href="https://havelog.ayumusato.com/develop/performance/e744-performance_metrics.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">私のブログ記事</a>も見てみてください。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、今日は貴重なお話をお聞かせいただきありがとうございました！HTML5 Conferenceでのセッションも楽しみにしています。</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
	</channel>
</rss>
