合宿らしい「交流」をテーマに「開発合宿 DX (デラックス) 」を開催しました

はてなのシステムプラットフォーム部で SRE をしている id:nabeop です。はてなでは定期的に、普段の業務を離れて新しいサービスのプロトタイプを作ったり、集中して新技術を検証したりする試みとして、開発合宿を開催しています。

はてな20周年でデラックスに開催!

2021年6月の開発合宿では、はてな20周年の社内イベントという形で規模を拡大し、次の2つをテーマに掲げたデラックス (DX) 版として開催しました。

  • モノづくりを楽しむ体験を通じて、他職種・他チーム間の交流を深める
  • これからのはてなを面白くするアイディア (サービス、機能、事業など) の種を募る

テーマは「交流」で職種や業務を超える

オフィスランチやさまざまな社内イベントで職種や業務を超えた交流が活発だったはてなですが、かつてのようなオフィスならではの偶発的なコミュニケーションも在宅勤務によって減少しています。前回の開発合宿に関するアンケートで、エンジニア以外の職種のスタッフとも一緒に参加したいという声が多かったことも受けて、今回の開発合宿 DX では「交流」を大きな目的としたことが特徴です。

結果としてエンジニアのほか、デザイナー、企画、ディレクター、カスタマーサポート、営業、事業開発、編集などさまざま職種から計64名、16チームが参加しました。この合宿を通じて交流しながら、さまざまなサービスのプロトタイプなどが作られました。

チームビルディングから結果発表まで

今回は 6/16 から 6/18 の3日間を合宿当日とする以下のスケジュールで開催しました。

日付 実施内容
5/13 企画プレゼンとチームビルディング
6/16 合宿1日目
開会の挨拶のあとは、ひたすら企画を考えて実装
6/17 合宿2日目
6/18 合宿3日目
夕方から成果発表会

まず開催1ヶ月前の 5/13 に、参加したい人があらかじめ集まってチームビルディングを実施しました。合宿中に取り組みたい企画を持っている人が、合宿用の Scrapbox に概要を書いておき、チームビルディング会でプレゼンを行い、共感した人同士でチームを作る形式としました。

合宿当日としては3日間を確保していますが、実際に手を動かせる期間は2日弱しかありませんので、短い時間で効率的に開発したりゴールを設定したりする必要があります。前もってある程度を作り込んできたチームもありました。

最終日には、開発に参加したメンバーだけでなく、全スタッフが参加できる成果発表会も実施しました。各チームの成果プレゼンを聞いたスタッフによる投票で、順位が決められました1

合宿中の交流を促進する新しい取り組み

昨今の情勢により実際に集まって合宿することは難しいため、リモートでの開催となりました。これまでもリモートによる開発合宿は何回か開催しており、そこで得られた知見はこのブログでも2020年11月に掲載した次の記事にまとめています。

開発合宿をリモートで実施する工夫

ここで説明しているように、これまで Google Meets や Discord といったビデオ通話をつなぎっぱなしにすることで、チーム内での活発な同期的コミュニケーションをリモートでも促進してきました。

しかし、チーム内でこそ合宿感が出るものの、どうしてもコミュニケーションがチームごとに完結してしまい、多くのメンバーが参加する合宿ならではのコミュニケーションが生まれにくいという課題がありました。

そこで「交流」をテーマとしている今回は、さらに交流を促進させる工夫をいくつか用意しました。

チームごとに oVice 上に集合して合宿感を創出

まず、なるべくいろいろな人の様子が分かるように、バーチャル空間で距離感を保てる oVice 上に会場を作って、各チームが1つのフロアに固まってコミュニケーションを取るようにしました。

期間中は oVice 上にチームごとに固まってワイワイしていました
期間中は oVice 上にチームごとに固まってワイワイしていました

oVice ではフロアを超えて他チームにふらっと遊びに行けるため、物理的に集合することと同様の体験とまではいかなくても、気分転換に他チームの様子を見に行ってみるなど、より合宿感が出たように思えました。

また oVice 上でそのあたりにいる人を捕まえてユーザインタビューするなど、チームを超えたコミュニケーションも発生していたようです。僕は後述する「社内報チーム」としてウロウロし、議論の様子を後ろから聞いてはインタビューに突撃していました。

さらには oVice 上にプロトタイプへの導線を出現させて、アピールするチームもありました。

社内報で雰囲気を全社に共有

交流促進のもう1つの工夫として、スタッフのみが閲覧可能な「社内報」を用意し、各チームの様子をレポートするエントリを午前と午後それぞれで作成しました。

更新すると、社内のほぼ全てのスタッフが入っているチャットのチャンネルに流したため、仕事の合間に合宿の様子が分かって良かったというコメントもありました。業務などの都合で参加できなかった人にも雰囲気が伝わる取り組みとなりました。

この社内報チームには、僕も更新担当として参加しました。3日間で21エントリを公開し、開発合宿の盛り上げや会話のきっかけに一役買えたかなと思っています。

ちなみに次にスクリーンショットは id:onishi によるレポートの一部です。このように oVice では賑わっていながら、リアル (オフィス) では合宿が開催されているとは思えない静けさでした。

社内報に掲載されたレポートの1エントリ
社内報に掲載されたレポートの1エントリ

どんな技術で合宿の開発に取り組んだのか

この合宿でさまざまなプロトタイプが作成されましたが、技術的な傾向としては、大きく「普段使っている技術を深掘り」するチームと「普段は使っていない技術を試してみる」チームに分かれました。

特に後者では、チームビルディング時にはまだ開催されていなかった WWDC21 を見越して「発表された何かを使って何かを作ります!」というアグレッシブな企画を立てたチームもありました。

他にも「普段は AWS を使っているけど、この機会に Google Cloud の Cloud Run の使用感を確かめてみる」など、気になっている技術を使ってみることで、普段の業務に活かせるように考えたチームもありました。

新しい交流スタイルが見えてきた

コロナ禍でリモートワーク主体になり、普段の仕事では直接の関わりがないメンバーと交流する機会も少なくなっていました。この合宿では、チームのみならず職種を超えて1つの企画やプロダクトを作ることで、以前のような交流を持つことができました。

開催後に運営チームで取ったアンケートでも、冒頭に掲げた2つのテーマの双方で満足度が非常に高い結果となりました。

アンケート結果 (抜粋)
アンケート結果 (抜粋)

さらに開発合宿の企画として、社内の交流を促進する社内ツールを開発するチームもあり、リモートワーク環境での新しい交流スタイルも見えてきたように思えます。

サービスと技術の成果と課題も見えてきた

開発合宿の成果の中には、まさに「これからのはてなを面白くするアイディア」がたくさんありました。いくつかは形を変えて世に出るかもしれないと思うと、とても楽しみです。

また、僕が所属しているシステムプラットフォーム部はサービスで使用する基盤部分の整備もしているので、今回の開発合宿で出てきた今後のサービスで使われるであろう技術やサービスの課題には、とても興味深いものがありました。特に普段は使っていない技術やサービスを積極的に採用したプロトタイプの作成で、今後の課題などが見えてきたようにも思えます。

次の20年に挑戦する仲間を募集

今回の開発合宿は、サービス開始から20周年という節目の年にあらためて全社イベントとしてモノづくりに取り組む良い機会になりました。

はてなでは、このように職種を超えたコラボレーションで既存サービスの改善や新サービスの開発に挑戦する仲間を募集しています。どんな雰囲気なのか知りたい方は、ぜひカジュアル面談を気軽に希望してください。興味ある方の応募を待っています!

はてなでは、技術に対する向上心を持つ仲間を募集しています


  1. はてなでは同様の投票システムで、毎月の成果を「ほたて(ホットな、タスクを、手がけた)」賞として祝うイベントを実施しています。

遅れてやってきた令和バグ あるいはiOSアプリでの日付の扱い方

こんばんは、id:kouki_dan です。突然ですが、現在は2021年ですね。あるいは令和3年です。今年が有効期限の免許証には平成33年と書かれているかもしれません。また、神武天皇即位の年を元年と定めた皇紀では2681年になります。

同じ年を表しているはずなのですが、暦によって何年なのかは違います。実はiOSは複数の暦に対応していて、日本で使われている和暦にも対応しています*1。令和元年5月にリリースされたiOS 12.3のリリースノートには、令和に対応したことが示されています。

暦を選択する…

Firebase AnalyticsをBigQueryで分析したいときに役立つテクニック

こんにちは、id:kouki_danです。はてなではスマートフォンアプリエンジニアとして働いていますが、今回の記事はアプリ利用にともなうアクセス解析がテーマです。

Firebase AnalyticsやGA4を使っている方は多いと思います。無料で大量のイベントを記録できて便利な一方、以前のGoogle Analyticsであるユニバーサルアナリティクスに比べると、分析クエリの柔軟性に難があります。以前のように分析するにはBigQueryが必要になり、SQLでデータを取り出す必要があります。

Fi…

はてなの開発プロセスを改善する、すくすく開発会とプロジェクトテンプレート講義のご紹介

Webアプリケーションエンジニアの id:shimobayashi です。

はてなでは開発プロセス改善などに関心のあるスタッフが集まる「すくすく開発会」*1があります。この記事では、すくすく開発会のこれまでと今後について紹介します。

すくすく開発会とは

開発プロセス改善などについて関心のあるスタッフが集まる有志集団で、すくすく開発会の「すく」はソフトウェア開発手法のスクラムを由来としています。
元々は各チームの開発プロセス改善を行っていたスタッフの情報交換やお悩み相談をするための場だったのですが、活動を続けるにつれてはてなの開発プロセス改善も行うようになりました。

定例会の実施が活動の中心で、毎週30分希望者が集まってお互いの困りごとを相談しあってチームの外からアドバイスをもらったり、今読んでいる本について紹介しあってお互いに刺激を得たりしていました。

そうした中で生まれた開発プロセス改善事例のひとつとして、例えば「プロジェクトテンプレート講義」があります。

活動事例: プロジェクトテンプレート講義

問題

はてなの開発チームではチームやプロジェクトによって、マネージャー以外でもプロジェクトマネジメントに関わる仕事を担当するケースがあります。マネージャー陣にプロジェクトマネジメントに関するアンケートを取ったところ、いくつかのチームではプロジェクトマネジメントのスキルを持ったメンバーが不足しており課題を抱えていることが分かりました。

解決策

プロジェクトマネジメントに責任を持つマネージャーだけではなく、開発チーム全体としてプロジェクトマネジメントのスキルを底上げすることで、全社的なプロジェクトマネジメントの質を高めこの課題を解決していけるのではと考えました。
そのためにはプロジェクトマネジメントに携わるとっかかりを提供すると良いのではないかと仮説を立て、プロジェクトを開始する際のテンプレートとなるドキュメントを広めていくことにしました。

そこでまず、開発合宿*2で「プロジェクトテンプレート」というプロジェクトの進行方法をまとめた社内向けのドキュメントを作りました。これは、主にスクラムをはてな向けにカスタマイズした内容となっています。
反復的な開発プロセス、インセプションデッキやバーンアップチャートなどの紹介をし、典型的なプロジェクトであれば問題なくコントロールできることを目指してまとめました。

しかし、ドキュメントを作っただけで各チームに活用してもらうことは困難です。そこで、プロジェクトテンプレートの使い方や思想に関する講義を行うことにしました。これがプロジェクトテンプレート講義です。

結果

受講希望者を継続的に募集し、エンジニアに限らず現時点で累計38名のスタッフに受講してもらうことができました。インセプションデッキ*3が以前よりも普及したり、全社的にプロジェクトマネジメントに対する関心が高まるなど、一定の貢献ができたものと考えます。

すくすく開発会の今後

すくすく開発会としては、はてなをプロダクトとスタッフにとってより健全な組織にしていきたいと考えています。

アンケートを取った時点では「誰かプロジェクトマネジメントが得意なスタッフにやって欲しいが、得意なスタッフがいない」というチームも多かったのですが、先述のプロジェクトマネジメントに関する関心の高まりなどから「自分も開発プロセス改善をしたいが、1人では難しいのでアドバイスが欲しい」といったスタッフの参加も増え、状況を少しずつ変化させられています。

そこで新たな試みとして、すくすく開発会内で複数チームに分かれてコーチ役を中心としたメンタリングやティーチングを行うことにより、すくすく開発会を通じてそれぞれのチームの開発プロセス改善を推進していこうとしています。

また、これまであまり外部へ情報発信をしてこなかったのですが、これからはすくすく開発会や所属スタッフの成果について外部にも情報発信をしていくことで、開発プロセス改善などに関心のある方々の目に触れるようにしていきたいと考えています。そうした情報が皆さんの参考になれば幸いです。

この記事のまとめ

はてなには開発プロセス改善などを推進する「すくすく開発会」があり、その勢いが増していることを紹介しました。

はてなでは、一緒にこうした活動を推進する仲間を募集しています。

はてなでは、サービス開発の道標となるSREの仲間を募集しています

id:shimobayashi

下林明正(しもばやし・あきまさ)。2012年10月に中途入社し複数サービスのエンジニアやディレクターを経た後、現在はマンガメディア開発チームのWebアプリケーションエンジニアとして働く。

Twitter: @shimobayashi
GitHub: shimobayashi
blog: 下林明正のブログ

Amazon ECSのログストリームを見やすく階層的に整理できるawslogs設定

こんにちは。SREのid:do-su-0805です。普段はid:do_su_0805として生活しています。

この記事では、Amazon ECS(以下、ECS)でコンテナを動かすとき、ログドライバーとしてawslogsを利用してAmazon CloudWatch Logs(以下、CloudWatch Logs)にログを出力する際に、awslogs-stream-prefixというパラメータには何を設定するとよいかについて考察します。

結論から言うと、このパラメータに「コンテナのイメージタグ」を入れるようにしたところ、出力されるログストリームの/区切りの階層が見やすくなり、ログが世代別に扱いやすくなったよ、というお話です。

ECS+CloudWatch Logs構成時のロググループとログストリームについて

ECSのドキュメント「awslogs ログドライバーを使用する」に詳しく記載されていますが、awslogsログドライバーを利用してCloudWatch Logsにログを出力する際に、ロググループおよびログストリームの形式は以下のようになります。

  • ロググループ: 指定したロググループ
  • ログストリーム: ${prefix-name}/${container-name}/${ecs-task-id}

ログストリームのそれぞれは次の通りです。

  • prefix-name: awslogs-stream-prefixオプションで指定*1
  • container-name: タスク定義内で定義しているコンテナ名
  • ecs-task-id: ECS側で決定されたタスクのID
f:id:do-su-0805:20210803001752p:plain
図1. awslogsにおける各設定と実際のログストリームにおける対応

以上がつながって1つのログストリームを指し示すということは、可視性の高いログストリームを設計するには「ロググループの名前」「awslogs-stream-prefix」「コンテナ名」を決める際に、この事実を意識しておく必要があります。

なぜなら、awslogs-stream-prefix以外の2つは、ログ出力をする設定以外の場所で命名が行われるからです。

どのようなログストリームが構成されがちかを事例から考えてみる

ここで事例として、以下のような状況を想定してみます。

  • 1つのAWSアカウントで、各コンポーネントをprefixで区別することで、production環境とstaging環境を用意する
    • ただし、ECSタスクの中で動くコンテナについては、既にサービスレベルで分離されていることからprefixは付けない
  • ECSサービスでは、1種類のタスクが動作し、2タスク起動する
    • サービス単位でロググループを共有する
  • ECSタスク内では、次の2つのコンテナが動作する
    • アプリケーション
    • サイドカーとして監視用のAgent

この場合、前提として「prefixで区別する」ことを意識しながら作成していくと、以下のような構成になるかなと思います(細かい差はあると思いますが概念としてお読みください)。

項目 設定
ECSサービス Hoge-production
ロググループ Hoge-production-logs
コンテナ名 appもしくはmonitor
awslogs-stream-prefix Hoge-production

特にawslogs-stream-prefixは「結局どこに入るのか?」を意識しないと、上記のようにECSサービスの名前や、利用するコンテナの名前、あるいはecsなどと入れがちかなぁと思います。

この構成でappコンテナおよびmonitorコンテナからCloudWatch Logsに送られるログストリームは、以下のようになります。

appコンテナのとき:
Hoge-production-logs:Hoge-production/app/${ecs-task-id}
monitorコンテナのとき:
Hoge-production-logs:Hoge-production/monitor/${ecs-task-id}

いかがでしょうか? Hoge-productionが即座に2回登場し、目が滑り、かつ冗長であることがわかります。

言い換えると、awslogs-strema-prefix情報の区切りとして機能していないことが分かります。今回は、この観点から整理を進めてみます。

awslogs-stream-prefixにイメージタグを入れるとログストリームが整理できる

先ほど想定した事例では、ログストリームが次のようになりました。

Hoge-production-logs:Hoge-production/(app|monitor)/${ecs-task-id}

この全体を、それぞれの項目から得られる情報を指し示す日本語で書き換えると、次のようになります。

ロググループ名(サービス名を含む):サービス名/コンテナ名/タスクID

このように「サービス名」をawslogs-stream-prefixに入れてしまったため、情報が全く増えていません。何かもったいない気がします。それでは「何が入ると嬉しいかなぁ?」と考えてみたところ、アプリケーションの世代が分かると、情報の区分がさらに増せるなと気づきました。

そこで、当該タスクが利用するコンテナイメージのイメージタグを入れてみました(ただし、イメージ利用時にmaster stable latestなどと書いている場合は特に意味がない状況が続きます。固有のビルドタグなどが入ったユニークなものを指すタグを利用する場合のみ効果を発揮します)。

変更の前後で、先ほどの「得られる情報を指し示す日本語」を比較してみます。

before:
ロググループ名(サービス名を含む):サービス名/コンテナ名/タスクID
after:
ロググループ名(サービス名を含む):イメージタグ/コンテナ名/タスクID

いかがでしょうか? 「サービス」「イメージ」「コンテナ」「タスク」と情報の要素が階層的に整理されたように見えます。

f:id:do-su-0805:20210803000613p:plain
図2. ログストリームの階層イメージ

ECSのタスクIDはタスク自体に紐づくため、今回の場合はappmonitorそれぞれ同じタスクIDが発番されるわけですが、それでも

  • このタスクのログを調べたい
  • このイメージで起動したappもしくはmonitorのログを調べたい

という2つのケースには対応できるようになり、ログの利用や解析がしやすくなったのではないでしょうか。

このようにawslogs-stream-prefixにイメージタグを入れることで、世代別のログを見ることができるようになり、たいへん便利になったと思っています。

この記事のまとめ

この記事では次の内容を紹介しました。

  • awslogsログドライバーを利用したECS+CloudWatch Logs構成時は「ログ出力をする設定以外の場所で命名が行われる」コンポーネント名が、ログストリームに影響する
  • awslogs-stream-prefixprefix-name)にコンテナのイメージタグを入れると、情報の整理が進む

はてなでは、情報の整理を進める仲間を募集しています。

はてなでは、サービス開発の道標となるSREの仲間を募集しています

*1:EC2起動タイプの場合はオプションで、指定しないとDockerデーモンが割り振ったコンテナIDになる。Fargate起動タイプでは指定が必須

id:do-su-0805

Akira Sudo。2018年9月入社。システムプラットフォーム部でSREを務める。普段使いのはてなIDは id:do_su_0805。はてなで働くエンジニアにアンケートの「頑張らなくていいチームだからこそ自分の強みを増やしていきたい」も参照。
Twitter: @do_su_0805
GitHub: do-su-0805
blog: do_su_0805’s blog

画像の表示で画面がズレないよう変更したことで、はてなブログの何が改善されたのか

こんにちは。id:nanimono_demonaiです。はてなブログMediaのWebアプリケーションエンジニアをしています。2カ月ほど前になりますが、はてなブログで、はてなフォトライフの画像を貼り付けたときの表示方法が変わりました。

今回は、私がこの変更に加えた改善の内容を、故郷の両親にも伝えられるようにまとめてみました。

見た目は変わらないのに何が良くなったのか?

今回の変更では、はてなのWebアルバムサービスであるはてなフォトライフに保管した画像を、はてなブログに表示する方法を改善しました。と言っても、これによって画像の見た目が変わったワケではありません。目で見て変化がないのはもちろん、画像ファイルに変更を加えたワケでもありません。

しかし、大きな改善を加えました。それは画像を表示するまでに、画面のズレが起きなくなったということです。

画像が後から読み込まれて閲覧中の領域が下にずれてしまう問題を回避する
はてなフォトライフの画像を表示する際に、画面にズレが生じないよう変更しました – はてなブログ開発ブログ

画面のズレは、Webページを表示する途中で起きます。そこで最終的な見た目は変えないで、その途中の処理を改善したことが、この変更の主旨です。

さて、皆さんが普段Webページを閲覧しているブラウザーでは、Webページを最終的な見た目で表示するまでに以下の処理が行われます。

  1. リクエスト
    ブラウザーから、Webページの表示方法をサーバー(はてな)に要求する
  2. レスポンス
    1.の要求にサーバーが応答し、Webページの表示方法をブラウザーに送る
  3. レンダリング
    送られたページの表示方法をもとに、ブラウザーがページの表示を組み立てる
    このときブラウザーは、必要に応じて画像ファイルなどの情報をサーバーに追加で要求する

今回の変更ではレスポンスに手を加えて、レンダリングを改善しました。具体的には、画像を表示するための情報に、画像の縦と横の長さを加えました。

imgタグに画像の縦横長を追加した

変更したところは、Webページの表示方法を定義するHTMLコード中のimgタグです。

変更前のimgタグは、例えば次のようになっていました(分かりやすいように改行を追加しています)。

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/sample/20210101/20210101000000.jpg"
 alt="f:id:sample:20210101000000:plain" title=""
 class="hatena-fotolife" itemprop="image"
 />

これを次のように変更しました。画像の縦横長(widthheight)が追加されていることに注目してください。

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/s/sample/20210101/20210101000000.jpg"
 alt="f:id:sample:20210101000000:plain" title=""
 class="hatena-fotolife" itemprop="image"

 width="画像の幅(数字が入ります)" height="画像の高さ(数字が入ります)"

 loading="lazy"
 />

変更前のimgタグでは、画像の縦横長が指定されていません。このときブラウザーはまず画像の縦横長を仮置きして、表示するための枠を確保します。それから画像を取得して、本当の縦横長で表示します。この仮置きと本当の縦横長の差が、画像が表示されるときのズレにつながります。例えるなら、必要な情報が設計書に全て書かれていなかったので、現場のブラウザーの仕事が増えてしまったといったところです。

ブラウザーの処理を改善することは、ブラウザー利用者のメリットにつながります。画像のズレを改善すべきだった理由を、利用者の視点から説明します。

表示のズレの改善を指標で表す

Webページを閲覧するときに画像の表示によるズレがあると、利用者にはどういったことが起きるでしょうか。

よくあるのが、読んでいる途中の文章が下方向にガクッとズレてしまって少し困ることです。ズレる幅はまちまちなので、読んでいた文にすぐに目を戻せるときもあれば、画面の外に出てしまって見失うことすらあります。

画像がたくさん使われているページでは、表示される画面をスクロールしてようやく目当ての文章が読めたと思ったら、文章が逃げるように画面の表示の外にズレてしまうこともあり、私もさすがにしょんぼりしてしまいます。

また、表示のズレは文章が読みづらいだけでなく、Webページの操作を難しくする原因にもなり得ます。ボタンやリンクをクリックするときに画面の表示がズレた結果、違うボタンを押してしまうこともあります。次の画像のように、望まない商品を買ってしまうことにもつながりかねません。

表示のズレが損害になりうる例
表示のズレが損害になりうる例

このような表示のズレが少なければ、文字を追うのが楽になり、さらに操作もしやすくなるので、一般的にWebページの閲覧が快適になります。つまり、表示のズレが少ないページのほうが良いページだと言えます。

この良し悪しは、CLSというスコアで評価することができます。

なお、この後で紹介するCLSのWebページには「望まないボタン」の例を表す動画もあります。上記の画像はその動画(CC-BY 4.0)に基づいて作成しました。

CLSとは何か?

CLS(Cumulative Layout Shift)は、Googleによって策定されたWebページの視覚的安定性(Visual stability)を表す指標です。今回はかいつまんで説明しますので、詳細な挙動は次のページを参照してください。

Cumulative Layout Shift (CLS) – web.dev

CLSの計算には、閲覧者にとって意図しない表示のズレである予期しないレイアウトシフト(Unexpected layout shifts)と、それを数値化したレイアウトシフトスコアが用いられます。なお、CLSは過去に算出方法が改訂されており、今後も改訂されるかもしれません。

ここで「予期しないレイアウトシフト」とは、ユーザーの操作を起点とせずに起きる表示のズレのことです。このため、ユーザーの操作から0.5秒以内に画面のズレが起きるときは、予期しないレイアウトシフトに含まれません。また、レイアウトシフトは画像に限らず、表示の途中で文章が追加されるなどによるズレも含まれます。

f:id:nanimono_demonai:20210805102004p:plain
レイアウトシフトの例

CLSでは、ページ閲覧中に起きるレイアウトシフトを、起きた時間によりいくつかのセッションウィンドウと呼ばれる区間に分けて計測します。セッションウィンドウそれぞれのレイアウトシフトスコアの合計を計算し、そのうち最大の合計値がそのページのCLSとなります。

セッションウィンドウは、予期しないレイアウトシフトが1秒未満の間隔で連続して起きている区間です。ただし最長でも5秒です。予期しないレイアウトシフトの間隔が1秒空くか、あるいはセッションウィンドウが5秒を超えると、次の予期しないレイアウトシフトは次のセッションウィンドウに含めて計算します。

レイアウトシフトスコアは、影響の割合(impact fraction)と移動長の割合(distance fraction)から計算されます。それぞれ画面に対する「画面の書き変わった領域」と「画面の中で最も移動した要素の移動の距離」の割合を掛け合わせた値を計算に利用します。

レイアウトシフトスコア計算に用いる画面上の変化
レイアウトシフトスコア計算に用いる画面上の変化

さらに詳細な説明は前述したリンクに委ねますが、WebページのCLSを計測するだけなら、ブラウザーがGoogle ChromeであればLighthouseを使って確認できます(デベロッパーツールに統合されています)。

Lighthouse によるウェブアプリの監査 | Tools for Web Developers

CLSは低ければ低いほど良く、理想の値は0です。ただし、調査に基づく実現可能かつ良好なCLSの目標値として、Googleは0.1未満を提示しています。この数値は現状のインターネットに基づいているので、将来的に例えば0.05になるかもしれません。

一方、現状では不良なスコアとして0.25以上という数字も提示されています。改善前のはてなブログでは、画像をたくさん使っている場合には惜しくも0.25を超えることがありました。

はてなブログでCLSがどのくらい向上したか?

はてなブログでは画像の表示を変更した結果、新しく作られた記事のCLSが改善しています。単純な例として、大中小の画像を貼り付けた次のような記事を作り、変更前後のCLSをLighthouseで計測しました*1

CLS検証ブログ
ブログの様子

このように画像をたくさん使った記事のCLSをLighthouseで見てると、次のような変化が見られました。いくつか出力された指標のうち、右下にあるCumulative Layout Shiftの項目に注目してください。

CLS改善前のLighthouseでのスコア
CLS改善前

変更前のはてなブログでは上記のように0.202で、Googleが提示する「0.1未満」という目標を達成できていませんでした。

CLS改善後のLighthouseでのスコア
CLS改善後

しかし、変更後は上記のように0.004と大きく改善され、目標を達成できました。

これは、画像の読み込み前後でレイアウトシフトが発生する有無で説明できます。画像の読み込み前後におけるレイアウトシフトはユーザーの操作を伴わないため、意図しないレイアウトシフトとなり、CLSを悪化させます。

変更以前は、画像が読み込まれる前後でレイアウトシフトが生じており、さらに画像の枚数が多かったり画像が大きかったりすると、レイアウトスコアも大きくなっていました。なぜなら画面の書き変わった領域が大きくなるためです。

一方、変更後では画像の読み込み前後でレイアウトシフトが生じなくなったため、画像の枚数や大きさにらずレイアウトシフトスコアが増加しなくなりました。このためCLSが改善されたのです。

SEOにおける改善も

CLSスコアを良くすると、SEO(検索エンジン最適化)の改善も見込まれます。SEOについては他の記事に説明を譲るとして、SEOが改善されると、皆さんの記事がより見つけられやすくなることでしょう。

なぜならCLSは、CWV(Core Web Vitals)というWebページの閲覧がいかに快適にできるかを計るスコアの計算に使われており、Googleは2021年6月中旬からCWVを検索ランキングの指標に使うようになっためです。

Google Developers Japan: Web Vitals の概要: サイトの健全性を示す重要指標

遅延読み込みによって閲覧も軽快に

表示のズレを改善することで、さらに別の改善もできました。

ブラウザーの標準の挙動では、Webページにある全ての画像を一度に読み込もうとします。そのため記事の途中で読むのをやめてもブラウザーの動作が重くなっていても、ページ中の全画像を読み込んで、その分の通信量を消費してしまいます。

遅延読み込み(lazy-loading)は、画面に表示されていない画像の読み込みを低減する機能です。この機能を有効化にすると、画像がたくさんある記事を軽快に閲覧することができます。

しかし、画像による表示のズレが起きる状態で遅延読み込みを導入すると、ページをスクロールして次の画像の場所に来るたびにレイアウトシフトが起きてしまいます。

今回、imgタグに縦横長を盛り込むことで遅延読み込みしても表示のズレが生じなくなったので、軽快かつ快適にブログを閲覧できる環境を整えることができました。

おわりに

はてなブログでは、はてなフォトライフの画像を貼り付けたときの表示方法を変更することで、ブログの閲覧を軽快かつ快適にすることができました。今後も、より新しいWeb標準に追従していきたいと考えています。

はてなでは、今の技術・この先の技術に積極的な仲間を募集しています

参考文献

*1:画像はそれぞれ、大=3024×4032px(1.9MB)、中=500×667px(610KB)、小=100×133(7KB)のサイズで, いずれも私が飼っている猫を自ら撮影したものでした。

id:nanimono_demonai

中村 柾斗(なかむら・まさと)。アルバイトを経て、2020年4月新卒入社。はてなブログMediaチームでWebアプリケーションエンジニアを務める。
Twitter: @NanimonoDaemon
GitHub: NanimonoDemonai

既存の機能から設計を学び、調査力を向上させて、知見を共有しよう

はてなブックマークチームの id:itchyny です。

チームのメンバー間で知見を共有することは、とても大事なことです。
特に開発エンジニア同士のコミュニケーションを増やし、お互いに足りていない知見を共有し合うことでチームの生産性を向上することは、プロダクトの成長につながります。

プロダクトの実装や設計の知見を共有するためによく取られる方法として、詳しい人が講義形式で教えるというスタイルがあります。
特に、チームに新しいメンバーが入ったときには、プロダクトの概要やコードのアーキテクチャについて…

Xcode付属のSimulatorで複数の項目をまとめてドラッグする方法

はてなブックマークチームのid:nakiwoです。ある日、チームのメンバーから

「Simulatorで複数の項目をドラッグする方法がわからない」

という質問がありました。実デバイスでの方法は知っていたのですが、Simulatorについては私を含めチームの誰もやり方を知らなかったので調べてみました。

複数の項目をiPadでドラッグする手順

そもそもタッチデバイスで複数の項目をまとめてドラッグすることになじみのない方も多いと思います。Appleのサポートページの「iPadで&#x3…

エンジニア向けのSaaS「Mackerel」で、イライラさせないテクニカルサポートのために改善したこと

こんにちは。MackerelチームCREの id:tukaelu です。

Mackerelでは、テクニカルサポート/カスタマーサポートをCRE(Customer Reliability Engineer)が担当しており、ユーザーからのさまざまな問い合わせに対応しています。

本記事では、Mackerelのようなエンジニア向けのSaaSにおいて、サポート業務の改善をどのように進めたか、その裏側をご紹介します。

サポート業務が抱えていた4つの課題
Zendeskへの移行と体制の変更…

RenovateとGitHub Actionsを導入し「なくてはならない存在」に | はてなで働く ikesyo にアンケート [#17]

はてなで働くエンジニアにアンケートシリーズ第17回は、マンガアプリチームのiOS/Androidアプリエンジニア、id:ikesyoに話を聞きました。

本名から読みやすさ重視ではてなid化

── Q. はてなidとその由来を教えてください

本名が池田 翔(いけだ しょう)で、呼びやすく「だ」だけを抜いた「いけしょう」をあだ名化・id化しました。

ローマ字表記では「しょう」はShoになるので、本来ならikeshoにするところですが、hの字面がなんとなくしっくりこなかったのでそこだけyに変更して、ikesyoになりました。hだとのっぺりした印象なのが、yだと少しシュッとした感じになるので気に入っています。日本語で呼ぶ時は「いけしょー」と長音符で呼ばれることを想定しています。

WWDCC17に参加した時のid:ikesyo
WWDCC17に参加した時のid:ikesyo

フリーランス時代に勉強会で声を掛けられたのが入社のきっかけ

── Q. いつどんなきっかけで入社されましたか?

はてなには2016年1月に中途採用で入社しました。なので、もうすぐ入社から5年半になりますね。

入社以前は新卒採用から2社を経験した後に、4年半ほどフリーランスのiOSアプリ開発者をしていました。そのフリーランス時代の2014年中頃から「Cocoa勉強会関西」や「ReactiveCocoa勉強会関西」、「関西モバイルアプリ研究会」などの勉強会に参加したり発表したりするようになりました。それらのコミュニティに参加する中で、はてな社員のid:cockscombさんやid:yashigani_wさんらと交流するようになり、声を掛けてもらったのが入社のきっかけです。

はてなには以前から興味がありましたし、京都でiOSアプリの開発ができるということ、勉強会で楽しく有意義な議論ができるこの人たちと一緒に働けるのはきっと楽しいだろうと思い、採用選考を受けることを決め、無事入社に至りました。

iOSもAndroidも担当するが、専門性としては「iOSアプリ」「Swiftが得意な人」

── Q. 現在の仕事を教えてください

マンガアプリチームでスマートフォンアプリケーションエンジニアをしています。業務ではiOSアプリとAndroidアプリのどちらの開発も担当することがありますが、個人の専門性としては「iOSアプリ」「Swiftが得意な人」になります。

直近で担当しているアプリでは、SwiftUIを本格採用した開発に取り組んでいるところです。別タスクを担当しているチームメンバーのコードレビューや、シニアエンジニアとしてメンティーとの1on1などもしています。

自宅のデスク。ハーマンミラーのモニターアームとvertebra03という椅子がお気に入りです
自宅のデスク。ハーマンミラーのモニターアームとvertebra03という椅子がお気に入りです

チーム異動経験を生かして「架け橋的な役割」を意識

── Q. チーム内の立ち位置を教えてください

2018年11月のチーム発足からテックリードを任せてもらっていましたが、2020年8月にid:kouki_danさんへテックリードを交代しました。いろいろなメンバーにテックリード経験を積んでもらいたいのと、2020年8月〜2021年1月までレンタル移籍のような形で一時的に別チームに異動することになったためです。

2021年2月にマンガアプリチームに復帰してからは、iOSアプリもAndroidアプリもどちらもそつなくこなせる1エンジニアとして、テックリードを支えながらチーム全体の様子を気に掛けるようにしています。

シニアエンジニアとしての立場やこれまでのチーム異動経験から、他のチームの様子や技術的なトピックを紹介したり輸入したりと、架け橋的な役割も意識していますね。

── Q. 1日の仕事の流れを教えてください

午前中はミーティングが入ることが少ないので、コードレビューをしたり、前日のタスクの続きをしたりしながらエンジンを掛けていきます。

はてなでは昼休みの標準的な時間は13時〜14時なんですが、コロナ禍で自宅勤務をするようになってからは、お昼ご飯は家族とタイミングを合わせて12時過ぎには食べるようにしています。13時過ぎからチームの昼会が始まる14時半までの1時間ちょっとが、割り込みの少ない集中できる時間になっています。

昼会を含めて、なるべくお昼過ぎから夕方にミーティングを固めるようにしているので、その時間帯はコードを書くことよりも会話をしたり、調査や検討をしたりすることが多いでしょうか。そこから終業までの残りの時間はSlackの様子を伺いつつタスクを進めて1日が終わる、という感じです。

Renovate、GitHub Actionsの導入を推進し、チームに根付いてきた

── Q. 最近うまくいったことは何ですか?

うまくいったというか、うれしかった話としては、先述の一時的なチーム異動の際に開発に参加していた新サービスの『マンガノ』が無事にリリースを迎えたことです。この時はこれまでのスマートフォンアプリ開発から離れて、半年間だけWebアプリケーションの開発にチャレンジさせてもらいました。

実際のサービスリリースを迎える前に異動期間が終了してしまい、リリースまで見届けることができなかったのが心残りではあったんですが、リリース当日にはGoogle Meetでビデオ会議をしながらのリリース作業に少し顔を出させてもらい、みんなでワイワイしながら一体感を感じられたのが良かったですね。

また、最近というには少し期間が広いのですが、ここ1~2年でRenovateという依存性アップデートの自動化ツールや、GitHubが提供するCI/CD環境であるGitHub Actionsの導入を推進し、それが社内の各チームに根付いてきました。

── Q. RenovateとGitHub Actionsの話について教えてください

まずRenovateについてです。Renovateによって、使用している依存性の更新の検知・アップデートするプルリクエストの作成・プルリクエストへの変更内容の記載(CHANGELOGやリリースノートの転記)といった作業が自動化できるようになりました。

もちろん動作確認や、ビルド・テストが通らなくなった時の修正などは必要なので、手間が0になるわけではありませんし、社内で使用している言語ではPerlなど未対応のものもあります。ですがワークフロー全体としては作業がかなり簡略化され、また自動的にアップデートがやってくるようになったことで意識も高まり、チームやプロジェクトによっては滞りがちだった依存性のアップデート状況が改善されてきています。

同種のツール・サービスにはGitHubに統合されているDependabotもありますが、複数のライブラリ更新を1つのプルリクエストにまとめるグルーピング機能や、柔軟な設定項目、設定ファイルの共通化・共有などが便利なので、Renovateをメインで使用しています。設定ファイルの共有については はてなで使用しているRenovateの設定プリセットを公開しました – Hatena Developer Blog もぜひご覧ください。

次はGitHub Actionsです。以前まではリポジトリにGitHub Enterprise Server(GHES)を使っていたこともあり、CI/CDにはJenkinsを使っているチームが多かったのですが、最近はGitHub Enterprise Cloud(GHEC)への移行が進んだこともあって、GitHub Actionsを使うことが増えてきました。むしろGitHub ActionsやRenovateを簡単に使えることがGHECに移行する理由の1つにもなっているのではないでしょうか。

GitHub ActionsはCI/CDに使うだけでなく、例えば古くなったIssueを自動的に閉じたり、プルリクエストの変更内容に応じて自動的にラベルを付けたり、各種ワークフローの自動化にも利用できます。実際に自分のチームでは、サーバーサイドでGraphQL APIのスキーマが更新されたら、その変更をアプリのリポジトリに反映するプルリクエストを作成するというワークフローを定期的に実行するようにしています。

またGitHub EnterpriseのBilling APIを定期的に実行し、その結果をMackerelに投稿してGitHub ActionsやGitHub Packagesの利用状況の推移を確認できるようにするという使い方もしています。このようにMackerelと組み合わせたり、簡易的なcronやタスクランナーとして使うのも面白いと思います。

これらの導入に当たっては、

  • まずは自分のチームで使ってみる
  • 次は同じフロアの隣のチームや自分が過去に所属したチームなどご近所さんに声を掛け、導入役を買って出て事例を増やす
  • #renovate#github-actionsのSlackチャンネルを用意して、有志で情報共有やトラブルシューティングを行う

などのアクションを行い、積極的にサポートするようにしました。採用事例や経験者が増えたことで自発的に導入してくれるケースも増え、今ではどちらもなくてはならない存在になっています。この活動が社内のDX(Developer Experience)の向上に一役買ったのではないかなと思います。

── Q. 最近うまくいっていないことは何ですか?

「うまくいっていない」とは少し違うかもしれませんが、現在担当しているアプリで新しい設計に取り組んでおり、いろいろと試行錯誤しながら進めているところなので、目に見える成果や手応えがまだまだ少ないことでしょうか。「産みの苦しみ」を味わっている最中です。

大切にしているのは、意思決定の過程において納得感を醸成すること

── Q. 普段大切にしていることは何ですか?

プロダクト開発や技術選定に関する意思決定の過程において、できる限りメンバー間の目線を合わせて納得感を醸成すること、でしょうか。

多様なメンバーが集まる中でも、どうしても社歴やチーム歴が長い人、声が大きい人の意見が権威的になってしまうことがあります。逆にミーティングが静かで、参加者からあまり意見が出てこないこともあります。

こういった場で、あえて真逆の意見を出してみたり、脇が甘くてもツッコミ上等で口火を切って発言してみたり、まだしゃべっていない人にボールを渡してみたりすることで、議論を活性化させること・テーブルに材料を集めること・そこから落としどころを探ること、というアクションを取ることが多いです。

自分自身ももちろんですが、チームメンバーにも納得感を持って仕事に取り組んでもらえる環境づくりをしたいですね。

「早く小さく失敗する」ことも意識していきたい

── Q. はてなはどんな会社ですか?

これまでのアンケート記事でも同じような感想が多かったと思いますが、人が善く、誠実である・あろうとしている会社という印象が強いです。各専門職同士で誰が偉いということはなく、お互いにリスペクトし合いながら働ける環境だと感じています。ビジネス的にも「売上・利益が上がるなら手段は選ばない」というのを良しとせず、「三方よし」が大事にされているのではないかと思います。

裏を返すと、正しくあろうとし過ぎることでスピード感が損なわれている面がある気もしています。自分自身も考え込み過ぎて腰が重くなることがあるので、自戒を込めて「早く小さく失敗する」ことも意識していきたいですね。


はてなのスマートフォンアプリ開発は挑戦の連続です。誰にとっても身近なスマートフォンですが、開発環境も利用者にとっての位置付けも日々変容しています。より良いアプリの提供を目指し、今ある技術だけでなく、これから先の技術に積極的な仲間を募集しています。ご連絡をお待ちしております!

iOS、Androidアプリエンジニア職 転職・中途採用 – 採用情報
iOS、Androidアプリエンジニア職の新卒採用 – 採用情報

はてなでは、今の技術・この先の技術に積極的な仲間を募集しています