ゆとり日記

心にゆとりを持って生きたいプログラマーの雑記です。気が向いたら書きます。

WEB+DB PRESS Vol.116「はじめてのトラブルシューティング」特集に寄稿しました #wdpress

04/24(金)発売のWEB+DB PRESSの「はじめてのトラブルシューティング」特集に寄稿しました!

WEB+DB PRESS Vol.116の表紙
WEB+DB PRESS Vol.116

@soudai1025さん、@yutailang0119さん、@maeponさんとの共著で、僕は@maeponとフロントエンドのトラブルシューティングを担当しました。フロントエンドの基礎知識から、パフォーマンス、アクセシビリティにも触れた内容になっています。

4/16頃から大型書店ではテスト販売があるそうなので、見かけたら手にとって頂けると嬉しいです。

書いた経緯

昨年末、@soudai1025に誘ってもらったのがきっかけです。一人でやり切れるかどうかの不安が少しあったので、執筆経験のある同僚の@maeponに共著という形式でサポートしてもらう形で受けることにしました。

初めての原稿を書いてみてどうだったか

僕の担当は4ページ弱でしたが、正直とても大変でした。

初めての原稿に張り切りすぎて、文章のボリュームが膨らんでしまったのが最初の失敗です。 書いている途中に書きたいことが新たに出てきてしまい、結果的に規定ページの1.5倍近いボリュームになってしまいました。

膨らんだ文章を削っていくのもなかなかに大変でした。 どこを削るかも悩みました。また、削る過程で文章の構成がおかしくなってしまい、結果的に大部分を書き直したこともありました。 編集の稲尾さんや、レビューをしてくれた共著メンバーには負担をかけてしまったなと反省しています。

謝辞

重ねてになりますが、編集の稲尾さんをはじめ、原稿のレビューや校正をしてくれた共著メンバーにはとても感謝しています。 フロントエンドの章を分担していた@maeponには執筆の過程で大きなサポートをしてもらいました。

お疲れ様でした!

まとめ

修正の大変さに心が折れそうになる時期もありましたが、挑戦してみて本当によかったなと今では思っています! 2020/04/24 (金) 発売予定のWEB+DB PRESS Vol.116をよろしくお願いします!!

リモートワークをしばらくやったので振り返る

タイトルのままです。リモートワークで働くようになって、今週で三週目に入ったので振り返りをしてみようと思います。

  • 良かったこと
  • 改善したいこと
  • 抱えているモヤモヤ

この辺りを触れていきます。

リモートワークの良かったこと

まずは良かったことから挙げてみます。

可処分時間が増えた

通勤時間が無くなったので、浮いた時間を使う選択肢が増えました。

電車通勤していた時は基本的に読書に時間を使っていましたが、電車が混雑して読書に時間を使えない場合もあります。また、通勤に使っている電車が事故で止まることもしばしばあったので、それが地味にストレスになっていました。

在宅であれば電車の運行状況や混雑状況は関係なくなるので、合間の勉強時間を安定して確保できるのはメリットだと感じます。

集中の時間が増えた

自分のタスクに没頭する時間は増えた気がします。

オフィスだと同僚とちょいちょい雑談をしたくなってしまうので、これをやらなくなったのが主な要因だと思っています。 雑談自体は数分で終わりますが、その後に集中状態に戻るまでにある程度の時間が必要です。これらの積み重ねでロスしていた時間が大きかったのでしょう。

しかし、雑談自体は良いことなので、雑談しすぎないようにするコントロールが重要だと考えています。「雑談は時間の無駄」と極端に考えず、適度にやっていけるのが最良でしょう。

現状共有を頻繁にするようになった

リモートワークだと個々の状況が見えづらくなりがちなので、自分の作業状況は意識的に共有するようにしました。

弊社には分報の文化があります。従業員は個々のチャンネルを作っていて、そこで勤怠報告をしたり、面白かった記事をカジュアルに共有したりしています。

僕の場合はタスクが順調に進んだ時は「秒で終わった」と言ってみたり、行き詰まった時は「完全に詰んだ」と言ってみたりして、自分の状況が他の人から見えやすいように意識するようになりました。

改善したいこと

良いこともありますが、もちろん上手くいってないこともあります。

早起きをするようにはならない

「通勤していた頃と同じ時間に起きて、早く仕事を始めて早く終わろう!」

リモートワークする前はこう考えていたんですが、実際は通勤時間の分だけ余分に寝るようになっただけに終わりました。 「遅く寝て遅く起きる生活」に脳がシフトしつつあり、早めの改善が必要なことをようやく自覚し始めました。

リモートワークになったからといって生活リズムを崩してしまうと、その影響がメンタルにも来るので一層の注意が必要です。

運動不足になった

これはリモートワークにしたことが原因ではなく、コロナが原因です。

2年近く日常的に通っていたジムに行けなくなってしまったので、運動や筋トレの時間を新規に作る必要が出てきました。 運動は外をランニングすれば済む話ですが、筋トレはそうもいきません。自宅でジムと同じトレーニングマシンを用意するのはスペース的に不可能なので、筋肉を落とさないためのトレーニングをしなければいけません。

現状では良い感じの習慣は作れていないので、今後数週間の課題として残しています。

抱えているモヤモヤ

ここからは改善すべき課題に近い、なんとなく思っていることです。

距離の遠い人がより遠く感じる

オフラインでコミュニケーション取れてなかった人達をより遠くに感じるようになった感覚を最近感じます。

仕事で関わることが少ない人と話す機会が少なくなりがちという課題は自分の中であったのですが、それを解決できないまま全社リモートワークに突入してしまったのが悩みになっています。また、4月に新たなに入社した人とも全然会話が出来てないのも良くないポイントだなと思っています。

組織の体制や方針の変更、新たに会社に入ってくる人とのコミュニケーション不足、リモートワークに慣れきれていない自分の精神状態。こういった起因による漠然とした不安の膨らみとどう向き合うかを考える毎日です。

余談

リモート飲み会は終電やトイレを気にする必要がなって便利な半面、延々と深酒出来てしまうリスクもあることがわかりました。 手の届くところにウイスキーのボトルとか置かないようにしましょう・・。

来年の抱負

「DEATH STRANDING」やってたら大晦日になってました。

以前書いた入社1年ブログで2019年の振り返りは大体やっているので、2020年の目標とか抱負を中心に考えていきます。

rukiadia.hatenablog.jp

来年の目標

大きく分けて2つです。

  • コンピューターサイエンスの学士を取得するためにUniversity of the Peopleに入学する。
  • アウトプットの機会を増やす。

University of the Peopleに入学する

ちょうど今日、記事にされている方がいました。Twitterで話題になっていますね。

tmkk.hatenablog.com

僕は今年の秋頃にこのオンライン大学の存在を知り、入学資格に足りうるTOEFLでの得点を取るために勉強を継続しています。年明けに初めての試験を受ける予定です。

コンピューターサイエンス(CS)の学士を取ろうと思った理由

  • 海外で働きたくなった時に学歴が足枷にならないようにしたい。
  • ソフトウェアの世界で戦っていくための土台を作りたい。

この辺りが主だった理由です。

僕は専門の大学も行かずに独学でこれまでプログラマーを続けてきました。それなりの勉強はやってきたつもりではありますが、足りない部分はまだまだ多いとも感じています。感覚的な物言いになってしまうのですが・・「実戦で必要になったから勉強した知識」の積み重ねをした結果、基礎により近い土台が盤石になっていないイメージを自分の中で抱えています。

「このままじゃ不味いでしょ」ということで、夏頃に通信で通える大学を調べ始めました。

通信にこだわる理由

仕事を辞めてフルタイムで通える程の余裕はないし、仕事を辞めたくもなかった。理由は至って単純です。

英語圏の大学にした理由

英語を使わざるをえない環境に身を置かないと、日常的に使えるレベルの英語は身につかないと考えたためです。

CSと英語の勉強を一緒に進めるのはそれなりに大変だと自覚してはいますが、やらずに後悔したくはないので頑張っていきます。

アウトプットの機会を増やす

2019年はアウトプットをあまりせずにサボってました。

登壇でいうと、フロントエンドカンファレンス福岡の前夜祭と、会社で開催している高円寺devで話したくらいです。ブログに至っては、今年の前半は一行も書いてません。

アウトプットの目標

闇雲に頑張るだけでは意味がないので、一応目標を定めておきます。

  • ブログは月一で書く。
  • 1Q(三ヶ月毎)に一回は登壇をする。

「ノルマ軽くない??」と思われるかもしれません。

人類は年末年始になると無茶な目標を立てがちな生き物です、しかし、僕はそこまで無謀な事はしません。少し頑張れば達成可能な目標を達成し、次の目標を少しだけハードにすることで、徐々に体を慣らしていく作戦でいきます。

PHPカンファレンスやBuildersconのような規模のイベントでCFPを通すことがもう一つの目標でもあるので、そこを目指して地道にやっていこうと思います。

まとめ

ということで、2020年は2019年の1.05倍くらいの頑張りでやっていこうと思います。

では皆さん、良いお年を。

ガラホから学ぶフォームのアクセシビリティ

Webアクセシビリティのアドベントカレンダー 5日目の記事です。

概要

突然ですが、皆さんはガラホを使ったことはありますか?

https://k-tai.sharp.co.jp/support/changeguide/guide5/p01.html

ガラケーのハードウェアの中身をスマートフォンのOSにした端末のことで「進化型ケータイ」と呼ばれることもあるそうです。 今回、こういった端末に向けての開発をやる機会があったので、そのまとめも兼ねて振り返ってみることにします。

ガラホの操作感について

ガラホは通常のスマートフォンと比べて操作感が大きく違います。基本的な操作はボタンでおこない、ボタン部分についているセンサーでポインターを操作してのブラウジングも出来たりします。固有名詞も多いので、興味のある方はSoftbankの紹介ページを見てみるのがお薦めです。

普段から慣れ親しんでいるスマートフォンのタッチ操作を比較すると勝手が色々と違うので、僕はここで画面操作のアクセシビリティを考え直すきっかけを得ました。

開発中にハマったこと

モダンブラウザ前提のデザインが崩れる、というような話もありました。ですが、何よりも苦戦したのはラジオボタンチェックボックスといったフォーム要素がボタンで操作できなかったことでした。

ここでやらかしてしまっていたのは、アクセシビリティ的によろしくない見た目のカスタマイズでした。ガラホ操作だけでなく、キーボード操作も出来ない箇所もありました。

キーボード操作でもガラホでもきちんと使える状態になったサンプルを先に挙げておき、その後に良くなかったポイントに触れていきます。きちんと動いてるサンプルはこちらです。

良くなかったポイント

幾つかあったので、1つ1ついきます。

1. input要素をdisplay:noneにしてしまうパターン

Webアクセシビリティを学んでいる方にとっては当たり前の話かもしれませんが、今回はこれを踏み抜いてしまいました。

実装サンプルを用意したので、キーボードで操作が出来るかどうか見てみてください。見た目は先程のサンプルと変わりませんが、キーボードでinput要素にフォーカスをあてることが出来ない筈です。

見た目は問題なさそうで、マウスやタッチパネル操作だと問題なく使えてしまうのが落とし穴ですね。

2. input要素をz-indexで隠してしまうパターン

元々のinput要素が見えないようにするため、カスタムした要素の後ろに隠して見た目を担保するアプローチですね。

これまで同様、実装サンプルを用意しました。この実装であればキーボード操作は出来るのでOKかと思っていたのですが、冒頭で触れたガラホのボタンではフォーカスが当たらず、操作が出来ませんでした。

解決のアプローチ

結論から言うと、position: absoluteで位置取りして、opacity: 0で見えなくするのが今回はベストでした。キーボード操作、ガラホ操作共に問題ない実装ではその方法をとっています。

ついでに意識しておくと良いこと

見た目をカスタマイズしたチェックボックスラジオボタンの見た目についてです。:checked時の見た目を気にしない人はいないと思いますが、:focus時の見た目を見落とすことはありがちかもしれません。僕自身も、つい最近まで意識出来ていませんでした。

「見た目は変わってないけど、実はフォーカスが当たってる」という状態にならないよう、outlineなどで装飾することを忘れないようにしておきましょう。

まとめ

今回、普段使っているスマートフォンとは違うガラホという環境を知ったことで、アクセシビリティについて様々な気づきを得ました。マウスであれば楽にスクロール出来るのに、地道にボタン押下でスクロールしていかなければいけなかったり。スマートフォンなら指で画面を押せばいいだけなのに、ボタン操作でフォーカスを当ててから押さなければいけなかったり。

普段のマウス操作やタッチパネル操作がいかに楽かを実感しました。

アクセシビリティを全く意識してこなかったわけではないですが、色のコントラスト比やタイポグラフィにしか目が向いていなかったのは事実です。今回の反省を活かし、使いやすいWebページを作ることをこれからも頑張ってやっていこうと思います。

オミカレに入社して1年が経ったので振り返ります

概要

去年の12月にオミカレに入社し、そろそろ1年経ちます。社員が400人近くいる中規模会社から社員10人〜20人規模のベンチャーに転職し、試行錯誤やってきました。

  • フルリニューアルの振り返り
  • 日常的な仕事のやり方に対する振り返り
  • 自分のキャリアマップの振り返り

そういうわけで、この辺をテーマに振り返りをつらつらと書いていきたいと思います。

フルリニューアルの振り返り

中規模、小規模プロジェクトは色々やってきましたが、一番大きかったタスクは春から夏にかけてやっていたサイトリニューアルのプロジェクトでした。

同僚の@ikkitangも振り返りブログで触れていますが、デザインを変えるだけでなく、バックエンドも刷新する完全なリニューアルでした。

当時、古くからあるMySQLPostgreSQLに移行するための取り組みが裏で進む中、僕ともう1人のフロントエンドエンジニアの@maeponは表側の画面をゼロから設計して作りあげていました。おっさんピンクと揶揄されていたピンクベースの画面配色、Bootstrapと混ざりあったカオスなCSS、scriptタグの中に書き捨てられているJavaScriptからの脱却を目的とした戦いです。

この辺りを基本方針としつつ進めていきました。

上手くいったこと

1つ目はCSSについて。

大規模なCSS設計をするのは人生で初めてだったので不安要素が大きかったのですが、当時設計したCSS設計は数ヶ月経った今も大きな問題はなく運用できています。プロジェクトに合わせたちょっとした拡張はしつつも、FLOCSSの基本思想はそのまま活かしたのが良かったのかもしれません。また、当時は雰囲気で使っていたBEMに対する理解が深まるという副次的な効果もありました。

クラスの命名をする時は今でもここを見返すようにしています。

2つ目はTypeScriptについて。

jQueryも使わず、いきなりTypeScript運用出来るのかな?」

サイトリニューアルの計画を練っている当初はこういう懸念も上がっていました。

Java畑で育った僕は型付きプログラミングに対する抵抗は無かったですが、PHPPythonをメインにしている層からするとそうではなかったのかもしれません。そういう背景もあったので、出だしの頃は意識的に周りの手助けをするようにしていました。

更に、周りのメンバーの「とりあえずやってみる」チャレンジ精神が活きたこともあり、今では当たり前にTypeScriptを書く文化ができつつあります。将来的にReact + TypeScriptのような仕組みを入れることになったとしても、大きな足がかりにできそうな感覚があります。

上手くいかなかったこと

このサイトリニューアルは3月後半に始まり、6月末にリリースという流れで進めました。フルリニューアルを進めるにしてはなかなかの強行軍と言えるスケジュールで、その過程では色々なことがありました。

  • 初めに作っていた画面のプロトタイプと、開発が進んでいく画面のズレ
  • ページの洗い出し漏れによる仕様の膨らみ
  • フロントエンド側のリソース逼迫

大なり小なり・・全部を挙げていったらキリがないですが、一部の例を挙げるとこんなところです。僕自身の立ち回りと進め方が上手くいってなかったと感じるところだけ触れていきます。

3月末頃、外部の協力会社さんに作って頂いたデザインを元に僕が画面の静的なプロトタイプを作りました。ページ全体のレイアウトの枠組み、ヘッダーやフッターといった多くの画面に共通して存在するパーツ、Button要素やテキストボックスといった汎用的な要素を順次作っていきました。このタイミングで作ったものを元に画面を量産していく想定でいました。

しかし、実際はそう上手く進まない場面が多かったです。開発が進む中で新たに必要になったパーツを都度作る必要があり、そこにそれなりの時間をかけました。同じようなパーツだけど微妙に見た目が違うパーツが量産されてしまい、後追いの調節や統一に時間をかけました。そうしている内にバックエンド側の開発が先行していき、フロントエンド側で止まってしまうタスクが増えていく結果になってしまった・・という次第です。

また、開発途中にブランドのテーマをどうするかで揺れていた時期があり、その前後の配色が入り混じった画面が出来上がってしまい、そこの調整がなかなかに大変だった記憶もあります。

精神的に追い詰められてしまい、「夏にリリースするのは無理なんじゃないか?」と発言するところまでいった時期もあった程です。 結果から言うと、6月末に無事にリリースは出来ましたが、6月はなかなかハードに働いていた気がします。完璧に仕上がらなかったところや、IE11でデザインが崩れている箇所はリリース後に急いで直したりしていました。

見積もりを甘く見積もりがちな僕の悪い癖が出た結果だなと、今でも強く思います。見積もりについての話は後でまた触れます。

日常的な仕事のやり方の振り返り

日常的な仕事を進める中で常に意識するようになったことを触れます。

コードレビューについて

前職にいる頃。特定の人にレビュー負荷が集中してしまうことが多かったこともあり、転職後はコードレビューのやり方を再考しました。コードレビューのやり方、レビューをする頻度など、色々と悩んだ気がします。

https://testing.googleblog.com/2019/11/code-health-respectful-reviews-useful.html 上の記事で言及されている方針や、以下のことを意識しながら日常的にPullRequestを眺めています。

  • 語気の強い言葉は使わない。
  • 相手の方針に異議を言う時は、きちんと根拠も言う。
  • 相手の実装に対する代替案がある時は、簡潔なサンプルコードも載せる。
  • 「動いてるから良いか」ではなく、設計方針やパフォーマンスも意識してコードリーディング

レビューをする頻度ですが、基本的に午前中に見ることが多いです。出社直後や、お昼ごはんに行く前に見ている感じです。 後は、自分のタスクが一段落した直後などの隙間時間に見るようにしています。

ですが、タスクが溢れていたり単純に疲れていたりするとレビューを雑に見がちなので、その場合はレビューをあえてせずに周りに任せてしまうこともあるのが課題ではありそうです。

スケジュールに対する意識

ここ最近、ようやく出来てきたことです。

僕の悪い癖が1つあり、完璧に作ることに固執して時間を使いすぎてしまってスケジュールを送らせてしまうことがありました。社内では「普通の船で十分のに豪華客船を作ろうとしがち」と表現されています。

いくら完璧に作っても、世の中に出さなければ意味がありません。しかも、後の続いているタスクのスケジュールにも影響が出てしまうので、このままでは良くありません。周りの助言を得つつ、以下のことを意識するようになりました。

  • ザッカーバーグの「Done is better than perfect.」を意識する。
  • タスクを日単位で考えず、週単位で捉える。

1つめについては僕が今更言及することでもないですね。僕の中の感覚では「70%くらいの段階で早く世の中に出して、後からのブラッシュアップで100%に近づけていく」という感じです。

2つめは一週間の仕事の進め方を週単位で考えるというものです。具体的に言うと、以下のようなことをやっています。

  • 金曜日にその週で終わらなかったタスクがあれば。何故終わらなかったのかを振り返る。
  • 終わっていないタスクがあれば、それらも考慮しつつ翌週のタスク予定を決める。
  • 日曜の夜、もしくは月曜の朝に決めた予定を確認し、曜日ごとに工数の分量を見積もる。

このサイクルを回していき、自分の中で想定している工数と実際にかかった工数のズレを縮めていくのが狙いです。

自分のキャリアマップの振り返り

僕は32歳なので、今後のキャリアをどう積み重ねていくべきかを計画し、実行していかなければなりません。ということで、この数ヶ月は分野を越境していくことを意識していました。

近い領域への越境

僕はフロントエンド領域が好きですし、この領域を武器に戦っていくつもりでいます。しかし、自分もご多分に漏れず凡人の一人でしかなく、1つの分野に特化して戦っていくのは現実的ではないとも思っています。

そこで考えたのが、フロントエンドと近い領域にある分野への越境でした。ここで言う「近い領域」とはサーバーサイドとデザインの2つのことを指しています。このような方針を立てた理由は、t-wadaさんの資料で触れられている話を参考にした結果です。

https://speakerdeck.com/rtechkouhou/enziniatositekofalsexian-sheng-kifalsekorutameni

複数の柱を持つ、という話ですね。

サーバーサイドと向き合う

弊社はPHPPythonでバックエンドを構築している会社で、簡単に言うと以下のような形になっています。

  • CodeIgniterでフロントエンドとサーバーサイドの実装
  • DjangoAPIの実装

APIDjangoで分けられているのは、Webだけでなくスマートフォンアプリからも使えるようにするためです。

必要に迫られて書くようになったのもありますが、「フロントエンドだから見た目の調整に集中すればいいか」という姿勢は勿体無いという思いもあったので、今では積極的に書くようにしています。メンバーのコードレビューに積極的に首をつっこんでもいます。

とはいえ、CSSJavaScriptとは気にすべき箇所が大きく違うこともあり、最初はまともなコードが書けているか大きな不安を感じてもいました。そこで僕が大事だと感じたのは設計力やアーキテクチャへの理解でした。これまで適当気味にやっていた領域を深堀りするため、色んな本を読んで実践してきたつもりです。

主にこの辺りの本を読みました。

本を読んだ内容と知人のエンジニアと話しあったり、弊社の技術顧問をやっていただいている@kawasimaに壁打ち相手になってもらったりしつつ、少しずつ知識を定着を図っています。

この1年はPHPをきちんとやるだけに留まりましたが、来年はDjangoにも手を広げていくつもりでいます。

デザインと向き合う

フロントエンド領域と一番近いようでいて、実は最も遠い領域な気もしています。しかし、良いUIを作るためにはデザインのことをきちんと理解しておく必要があると前々から感じてはいました。

そう感じ始めたのは、前職で同じチームで働いていたデザイナーさんがきっかけでした。当時の僕はデザインに対して「やっぱりセンスがないから無理だなー」くらいの気持ちでいました。しかし、そうではないことに気付かされたのです。

Webページを構成する要素は数多く存在します。要素同士の間隔、配色、タイポグラフィというように挙げたらキリがありません。それら一つ一つに対して、根拠となるロジックがあることをその人に教えてもらいました。全てがセンスで成り立っているわけではなかったのです。

僕がデザインのことを理解していこうと思い始めたのはそれからです。サーバーサイドの節と同様に、ここでも基本を固めるために色々な本を読みました。

  • 「なるほどデザイン」
    • http://naruhodo-design.com/
    • 個人的にとても好きな本です。
    • DesignShipで著者の方が登壇されていた時はびっくりして飛び上がりたいくらいの気持ちでした。
  • 「けっきょく、よはく。 余白を活かしたデザインレイアウトの本」
  • 【新版】UI GRAPHICS
    • http://www.bnn.co.jp/books/9522/
    • トレンドと歴史くらいは知っておいた方がいいか・・くらいの気持ちで買いました。
    • iPhoneのデザインが辿ってきた軌跡を説明したコラムが良かったです。
  • 「簡単だけど、すごく良くなる77のルール デザイン力の基本」
  • 続・インタフェースデザインの心理学――ウェブやアプリに新たな視点をもたらす+100の指針

他にも彩色手本の本を読んだりしたのですが、すぐに思い浮かんだのはこの辺りの本です。本を読んだくらいでデザインが出来るようになるとは勿論思っていませんが、「言語化出来ないけどダサい」みたいな状態を抜ける足がかりにはなっています。

まとめ

長くなりましたが、僕の振り返りはこんなところです。自分の専門領域の深堀りや越境は出来つつありますが、仕事の進め方は一層の改 善が必要になってくるなと感じました。とはいえ、何をやるべきかは見えているので、向こう半年は意味のある時間が過ごせるのではないかと思っています。

僕の方からは以上です。

遅延読み込みの落とし穴を色々踏んだ話

フロントエンドカンファレンス福岡のCFPに残念ながら漏れてしまったので、発表しようと思っていた話を簡単にブログに纏めました。

と思っていたら前夜祭で話せることになったので、ここに書いた話をベースに話す予定です。

fec-fukuoka.connpass.com

概要

  • 「ユーザの体感速度を上げるために遅延読み込みを実装したが、実はユーザー体験を損なっていた。」
  • 「一見早くなったように見えて安心していたら、SEOにネガティブな要因を引き起こしていた。」

試行錯誤して実装した遅延読み込みが実はクローラーやユーザに優しくなかった。簡潔に言うとそんな話です。

今回は僕が実際にやってしまった体験談を踏まえつつ、反省点や対策を述べていきたいと思います。

前置き

自分が普段開発しているサービスがSingle Page Application(SPA)ではないので、SPAに関わる話はほとんど出てきません。また、クローラーに関する話には不確実な部分があります。100%失敗するパターンから50%失敗するパターンまで持ってこれた、くらいの話だと思って読んでください。

なお、遅延読み込みの実装にはIntersection Observerを用いており、ここでいう遅延読み込みでは画像だけに留まらず、他の要素を動的に生成しています。

遅延読み込みがユーザ体験を悪くするケース

よかれと思ってやったことがユーザ体験にネガティブな影響を与えることがあるという話です。

実際に実装が反映されていたページの一例がこちらです。初期表示時のカードUIパーツの表示数を少なくし、初期表示を少しでも早めるのが目的でした。

1ページに表示されるパーツ数は20個ですが、ブラウザのファーストビューに収まるのはPCでも2個だったので、初期表示には2個だけ表示する。減らした分(残りの18個)をページ表示後にAPIから取得し、JavaScriptでHTMLを生成して差し込む。このようなフローを踏んでいました。

という流れを踏んでいました。

やらかしたこと

ページ内要素を遅延読み込みしたことで、ブラウザバックで戻ってきた時にページの表示位置がズレるというケースです。

  • 上で例に挙げたページから、次のページに遷移する。
  • 遷移先からブラウザバックで戻る。
  • 戻った先のページで要素の遅延読み込みが始まる。
  • 読みこみが終わると、ページの構造が変化するのでスクロール位置がズレてしまう。

こういった事が起きていました。

このケースへの対策案

対策としては2つ考えられました。

1つめはブラウザバック時は遅延読み込みをしないこと。以前SPAを開発していた時はこのアプローチで対策を打ちましたが、今回はあSPAではないので同じ対策が使えず、別の対策を考えることにしました。

そこで考えた2つめは遅延読み込みを行う箇所にダミーのカードUIを配置しておき、スクロール位置のズレを防ぐというものです。

  • ダミーのカードUIを予め配置しておく。
  • 遅延読み込みが完了したら、ダミー要素の後ろに本来表示したい要素を差し込む。
  • ダミーUIを消す。

という流れです。このアプローチは概ね上手くいったのですが、この対策も完璧ではありませんでした。APIのレスポンスを見るまでは表示できる要素の個数が分からないので、予め配置しておくダミー要素の個数を必要に応じて変えることが出来ないのです。

また、DOMの構造を変えるタイミングが増えるので、ブラウザのリフローを誘発してしまう側面もあります。

SEOにネガティブな要因を引き起こすケース

遅延読み込みしたHTML要素がクローラーに認識されてなかった、という話です。体験談を交えつつ説明していきたいと思います。

やらかしたこと

遅延読み込みに時間がかかりすぎると、要素の表示が完了する前にクローラーが帰ってしまい、ページが正常にインデックスされない場合があります。ある程度の時間は待ってくれるようですが、待ってくれる時間がどの程度なのかは明言されていません。そのため、実際にやってみないと上手くいくかどうかは判断出来ないのです。

今回、僕がプロダクトで試した際も上手くいっているページといっていないページが存在していました。

ちなみに、実装した処理が正しく機能するかどうかは事前にpupperterでテストが可能です。 参照リンク: https://developers.google.com/search/docs/guides/lazy-loading

これが理由で遅延読み込みはひとまず止める方針に倒しました。

反省と振り返り

今回はプロダクト全体に実装してしまったのですが、今思うとチャレンジし過ぎだったなと思っています。テスト実装を試すページを絞っておけば、悪影響を最小限に留めておけました。

一部のページに絞って実装を試していたので、影響を大きくすることを抑えられたのは不幸中の幸いでした。元に戻すことを想定して戻しやすい実装にしていたことも手伝って、止める時に素早く戻せたのも良かったです。

まとめ

ページの一部分を遅延読み込みするというだけの話ではありますが、考慮しなければいけないことが案外多いことがわかりました。良かれと思ってやった事が良い結果に結びつくとは限らないという教訓ですね。今後も素早く実装して素早く検証するサイクルを繰り返し、問題解決につなげたいと思います。

僕と同じ轍を踏む人が出ないことを祈ります。