ブログ

  • ソース解説(1) 全体の地図と、境目の引き方

    ソース解説(1) 全体の地図と、境目の引き方

    このサイトの作りについては何度か書きましたが、中のコードそのものには触れていませんでした。

    ここから何本かに分けて、実際のファイルを開きながら説明していきます。まずは全体の地図と、読むために知っておいたほうがいい前提からです。

    この記事で扱うこと

    フォルダの分け方、依存しているものの数、そして「サーバーで動く部品」と「ブラウザで動く部品」がどこで分かれているかです。次回以降、個別のファイルを1つずつ読んでいきます。

    本番で必要な依存は5つしかない

    package.json を開くと、公開後に動かすために必要なものはこれだけでした。

    名前 役割
    next ページを組み立てて配る本体
    react / react-dom 画面を書く仕組み
    graphql-request WordPressへ問い合わせる
    graphql その問い合わせ文を解釈する

    この他に、開発中だけ使うもの(型検査、書式の検査、CSSの生成、型の自動生成)があります。本番の動作に関わるのは上の5つだけです。

    少ないほうが、後で困らない

    部品を足すたびに、その部品の脆弱性を見張る相手が1つ増えます。入れていないものは、更新も監視も要りません。

    目次も検索も日付の整形も、自分で書いてあります。どれも数十行で、外から持ってくるほどの分量ではありませんでした。

    フォルダは3つに分かれている

    コードは src/ の下にあり、大きく3つです。

    場所 入っているもの
    src/app/ URLと1対1で対応するページ
    src/components/ 画面に出る部品
    src/lib/ 画面に出ない処理とデータ

    app/ は特別で、ファイルの置き場所がそのままURLになります。app/blog/page.tsx が /blog に、app/blog/[slug]/page.tsx が /blog/記事名 になります。角かっこは「ここは可変」という意味です。

    ルーティングの設定ファイルはありません。フォルダを作ればURLが増えます。

    境目は「ブラウザが要るかどうか」で引く

    ここがいちばん説明の要るところです。

    いま作っているのは、ほとんどのコードがサーバー側で動く形です。ページはあらかじめ組み立てられ、訪問者にはHTMLとして届きます。ブラウザで動くコードは、必要な部品にだけ付けます。

    その指定が、ファイルの1行目に書く "use client" です。

    書いていない 書いてある
    どこで動くか サーバー サーバーとブラウザ両方
    できること CMSへの問い合わせ、秘密の値の利用 クリック、スクロール、保存
    訪問者に届くJS 増えない そのぶん増える

    このサイトの部品を数えると、ちょうど半々でした。16個ずつです。

    これとは別に、スクロールの位置や保存した設定を読むための小さな処理が3つ、src/lib/ にブラウザ用として置いてあります。部品ではないので上の数には入れていません。

    書いてある側はどれも、ブラウザでしか手に入らないものを触っています。スクロールの位置、クリック、保存した設定、画面の幅。逆に言えば、それらが要らない部品には付けていません。

    「とりあえず付ける」と、全部が重くなる

    "use client" は、そのファイルから読み込んでいるものにも連鎖します。上のほうの部品に付けると、その下にぶら下がる部品まで一緒にブラウザへ送られます。

    迷ったときに付けておくと動きはしますが、動く代わりに、送るものが静かに増えます。境目はできるだけ末端に置くほうがよく、このサイトでも「ボタン1つだけを別部品にして、そこにだけ付ける」という形がいくつかあります。

    型は、CMSの都合に追いつくために使っている

    TypeScriptを使っている理由は、書き間違いを見つけるためだけではありません。

    記事のデータはWordPressから届きます。項目の名前も、値が空になり得るかどうかも、決めているのはCMS側です。手で型を書き写すと、CMS側で項目を足した日から、少しずつずれていきます。

    そこで、CMSが公開している仕様を読み取って型を自動生成しています。コマンドを1つ走らせると、実際に書いた問い合わせ文に合わせた型ができます。

    「空かもしれない」を、こちらの都合で消せない

    自動生成された型は、title や slug を「無いかもしれない」ものとして扱います。実際に下書きや移行中のデータでは空になり得るからです。

    手書きなら、面倒なので「必ずある」と書いてしまうところです。生成された型は、こちらの願望ではなく相手の仕様を写しているので、そこで手が止まって「無かったらどうするか」を考えることになります。

    この先で読んでいくもの

    次回以降、次の順で中身に入ります。

    回 読むもの 話の中心
    2 目次を作る処理 HTMLを文字列として扱う
    3 同意を取る仕組み 保存する形と、読み込まない実装
    4 CMSから取ってくる処理 キャッシュと、失敗する前提
    5 RSSとサイトマップ 文字列を自分で組み立てる場所

    今回の学び

    まず、依存の数は、後から効いてくるということ。今のところ5つで足りていて、そのぶん更新の通知も脆弱性の報告も少なく済んでいます。数十行で書けるものを外から持ってこない、という判断が積み重なった結果でした。

    次に、境目は機能ではなく「何が必要か」で引くこと。ブラウザでしか手に入らないものを使う部品だけを、ブラウザ側に置いています。見た目の複雑さや行数とは関係がありません。

    そして、相手が決めていることは、相手から写すこと。CMSのデータの形はこちらで決められません。手で書き写すとずれていくので、生成させています。ずれないことより、ずれようがない形にしてあることのほうが大事でした。

  • 同じ「丸み」でも、比べる相手が違えば別の表に置く

    同じ「丸み」でも、比べる相手が違えば別の表に置く

    フッターの上の角を丸めています。ページの下に別の面が敷かれている、という見え方を作るためです。

    ところが、実機で見返すと「もう少し丸くていい、50pxでもいいくらい」と感じました。当時は14pxでした。

    この記事で扱うこと

    丸みを1つの表で持っている構成に、表へ入れられない値が出てきたときの扱いです。1か所だけ大きくするか、表そのものを直すか、という話ではありませんでした。

    丸みは1つの表で持っている

    このサイトでは、角の丸さを6段階の表で持っています。既定値より意識的に小さくしてあります。

    名前 この表の値 もとの既定値
    DEFAULT 3px 4px
    md 4px 6px
    lg 6px 8px
    xl 8px 12px
    2xl 10px 16px
    3xl 14px 24px

    表で持っている理由は、調整を1か所で終わらせるためです。「全体的にもう少し角を立てたい」と思ったとき、この表の数字を書き換えれば、丸みを指定しているすべての場所が同じ方向へ動きます。個別に書いていたら、直し漏れた場所だけが取り残されます。

    一番大きい値を50pxにすればいい、ではなかった

    最初に考えたのは、表の一番大きい値を50pxにすることでした。フッターはその値を使っているので、これで目的は果たせます。

    しかもこの値は、調べたらサイト全体でフッター1か所しか使っていませんでした。他に影響が出ないので、書き換えても壊れません。

    それでもやめました。

    「いまは1か所しか使っていない」は、変えてよい理由にならない

    壊れないことと、正しいことは別です。表の一番大きい値を50pxにすると、この表の意味そのものが変わります。

    いまは1か所でも、次に誰かがカードの角を「一番大きく」したくなったとき、受け取る値は50pxになります。そのときには「なぜ一番大きい丸みだけ極端なのか」を説明できる人がいません。壊れるのは今日ではなく、次にこの表を使うときです。

    比べる相手が違うものは、同じ表に置けない

    考え直して分かったのは、この表が何のためにあるかでした。

    DEFAULTから一番大きい値までは、1本の段階になっています。小さいものから大きいものへ並んでいて、ボタン、入力欄、タグ、カードのように本文の中に置かれる部品のためにあります。

    これらの部品には共通点があります。画面の中で隣り合って並ぶので、互いの丸みを見比べられるということです。ボタンよりカードのほうが少し丸い、という関係が意味を持ちます。だから同じ段階の上に居る必要があります。

    フッターは違います。幅が画面いっぱいあり、隣に並ぶものがありません。比べる相手は画面の縁だけです。

    部品の丸み 面の丸み
    対象 ボタン・入力欄・カード フッターのような大きな面
    置かれる場所 本文の中 ページの下に敷かれる
    比べる相手 隣り合う他の部品 画面の縁
    決め方 段階の中での前後関係 その面だけで見て伝わるか
    段階から出して、名前を付けた

    表の6段階はそのままにして、panel という名前で50pxを別に足しました。段階の外です。

    こうすると、表を書き換えたときに動くのは部品だけになります。面の丸みは別の判断で決まるので、一緒に動かないほうが正しい。同じ「丸み」という言葉で呼んでいても、決め方が違うものは別の場所に置くということです。

    なぜ14pxでは足りなかったのか

    数字の話も書いておきます。

    同じ半径でも、対象が横に広いほど、角の丸みは相対的に小さく見えます。幅300pxのカードの14pxと、幅1200pxのフッターの14pxでは、目に入る割合が違います。

    フッターの角を丸めているのは、そこに背景がわずかに覗いて「下に別の面が重なっている」と伝えるためです。角が丸いことに気づけない大きさでは、その役割を果たしません。14pxは、部品としては十分でも、面としては足りませんでした。

    今回の学び

    まず、壊れないことは、変えてよい理由にはならないこと。使っている場所が1か所しかなければ、書き換えても何も起きません。ただし表の意味は変わっていて、次にその表を使う人が想定外の値を受け取ります。影響が出るのが今日でないだけです。

    次に、同じ言葉で呼んでいるものが、同じ決め方とは限らないこと。部品の丸みは隣と比べて決まり、面の丸みはそれ単体で伝わるかで決まります。決め方が違うものを1本の段階に押し込むと、どちらかが無理をすることになります。

    そして、例外は、例外だと分かる場所に置くこと。段階の中に極端な値を混ぜると、段階のほうが読めなくなります。外へ出して名前を付ければ、なぜそこにあるのかを書き残せます。書き残せる形にすること自体が、判断を残す手段になります。

  • フロントエンドエンジニア養成読本 — 知らないものは、検索できない

    フロントエンドエンジニア養成読本 — 知らないものは、検索できない

    フロントエンドの知識が、断片のまま溜まっていました。

    必要になるたびに調べて、動いたら次へ進む。それを繰り返していたので、個々のやり方は知っているのに、全体のどこに位置する話なのかが分かっていない状態でした。

    この記事で扱うこと

    調べながら覚えると何が抜けるのか、地図として1冊読むことに何の意味があるか、そして発行から時間が経った本をどう読むかです。

    調べて覚えると、地図が作られない

    検索して覚えるやり方は速いです。目的がはっきりしているので、無駄がありません。

    ただ、この覚え方には抜けるものがあります。自分が今どのあたりの話をしているのかが分からない。

    調べて覚えたこと 分かっていなかったこと
    この書き方で動く 他にどんなやり方があるのか
    この道具の使い方 そもそも何を解決する道具なのか
    この設定で直った なぜその設定が要るのか

    右の列が空いていると、選べません。目の前の記事に書いてあるやり方を、そのまま採用するしかなくなります。合っているかどうかも判断できません。

    知らないものは、検索できない

    いちばん困ったのは、存在を知らない選択肢は検索に出てこないことでした。

    調べるという行為は、探すものの見当が付いていて初めて成立します。見当が付いていない領域は、調べても素通りします。

    並んでいることに意味がある

    そこで、範囲を区切って1冊読むことにしました。この本を選んだのは、フロントエンドの守備範囲を一通り並べている構成だったからです。

    1つ1つの解説の深さは、専門書には及びません。ただ、目的が違います。深く知るためではなく、何があるかを知るために読みました。

    読み終えて変わったのは、知識の量ではなく、調べ始めるときの精度でした。何の話をしているかの見当が付くので、検索の言葉が決まります。出てきた記事が自分の状況に合っているかも判断できます。

    地図は、細かくなくていい

    地図に求めるのは正確な描写ではありません。どこに何があるか、その間がどうつながっているかだけです。

    細部は必要になったときに調べれば足ります。ただし「そこに何かがある」ことを知らないと、調べに行くこと自体が起きません。

    発行から時間が経っている

    この本の注意点は、そこに尽きます。フロントエンドは入れ替わりの早い領域で、当時の道具立てと今のものは同じではありません。

    実際、自分が今このサイトで使っている作り方とは、前提からして違います。当時の具体的な手順をそのまま真似すると、古い書き方を覚えることになります。

    それでも読む価値があると感じたのは、道具は変わっても、その道具が解こうとしている問題は残っているからでした。何を自動化したいのか、なぜ分けるのか、どこで速さが落ちるのか。その部分は入れ替わっていません。

    読み方を分けておく

    古い本を読むときは、「何を解こうとしているか」と「どう解いているか」を分けて読む必要があります。

    前者は持ち帰れます。後者は今の手段に置き換えて考えることになります。混ぜて読むと、解決済みの問題のために古い手順を覚えることになります。

    今から同じことをするなら

    全体像をつかむ目的なら、この本でなければならない理由はありません。今のフロントエンドを一通り並べた本であれば、同じ役目を果たします。

    大事なのは本の新しさよりも、断片を集める読み方と、地図を作る読み方を分けていることのほうだと考えています。前者は検索で足りますが、後者は検索では作れませんでした。

    今回の学び

    まず、検索は見当が付いている範囲にしか効かないということ。知らないものは検索語にできないので、調べ続けているかぎり空白は空白のまま残ります。

    次に、浅く広い1冊には、深い1冊とは別の役目があること。深さを求めて読むと物足りませんが、地図として読むなら浅さは欠点になりません。求めているものが違います。

    そして、古い本は、問題と手段を分けて読むこと。手段は入れ替わりますが、その手段が何を解こうとしていたかは残ります。分けて読めば、古い本からでも持ち帰るものがあります。

  • 進捗バーが0から始まらないのは、測る場所を1つ間違えていたからだった

    進捗バーが0から始まらないのは、測る場所を1つ間違えていたからだった

    記事を開いた瞬間、読み進み具合のバーが9.5%を指していました。まだ何もしていません。

    「あと90%」と出ているのを見て、手が止まりました。進み具合を名乗るものが0から始まらないのは、やはり変です。

    この記事で扱うこと

    なぜ0から始まらなかったのか、どこを基準に測るかで何が変わるのか。そして、終わりの位置を動かさずに始まりだけ直す方法です。

    分母を本文の高さに変えたところまでは合っていた

    このバーは一度直しています。

    最初はページ全体の高さを分母にしていました。ところがページの下には、前後の記事へのリンク、一覧へ戻るリンク、フッターが続きます。実測するとその部分だけで1205pxありました。

    つまり本文を読み終えても90%前後にしかならず、100%にするには読むもののないフッターまでスクロールする必要がありました。勢いよく動かす人は慣性で最下端まで行くので満たせてしまい、文章を追って読む人ほど100%にならない。そこで分母を本文の高さに変えました。

    ここまでは正しい判断でした。それでも、始まりの値は0になりませんでした。

    下端で測ると、開いた時点ですでに進んでいる

    計算はこうなっていました。

    画面の下端が、本文の上端からどれだけ入ったか。それを本文の高さで割る。

    この式だと、ページを開いた時点で本文の一部がすでに画面に映っています。実測した記事では、本文の上端がページの297px地点にあり、画面の高さが745pxでした。開いた瞬間に本文の448pxぶんが映っていることになります。本文の高さが4731pxなので、9.5%です。

    式は正しく、意味だけが合っていなかった

    「画面に映った本文の割合」としては、9.5%は正確な値です。計算間違いではありません。

    ただし、この数字が名乗っていたのは「読み進み具合」でした。読み進み具合なら、読み始める前は0です。式が答えていた問いと、表示が名乗っていた問いが、別のものでした。

    上端で測り、分母を移動量に合わせる

    基準を画面の下端から上端に変えました。

    あわせて分母も変えています。上端で測ると、本文の末尾まで読み切ったときの移動量は「本文の高さ − 画面の高さ」になります。本文の高さのままだと、最後まで読んでも100%に届きません。

    スクロール位置 旧(下端で測る) 新(上端で測る)
    0(先頭) 9.5% 0.0%
    297(本文の上端) 15.7% 0.0%
    2000 51.7% 42.7%
    4283(本文の末尾) 100.0% 100.0%
    100%になる位置は動いていない

    直したのは始まりの側だけに見えますが、実際には分子と分母を同時に取り替えています。それでも100%になる位置は同じ4283pxのままでした。

    分子から画面1つぶんを引いたなら、分母からも画面1つぶんを引く。両方に同じ量を効かせているので、終点は動きません。片方だけ直していたら、今度は末尾で100%に届かなくなっていました。

    割り算の正しさは、分子だけを見ても分母だけを見ても判断できません。

    そしてこの4283pxは、読了として記録される位置でもあります。バーが満杯になるのと「読了済み」に変わるのが同じ瞬間になりました。

    本文が画面に収まる記事はどうなるか

    短い記事では「本文の高さ − 画面の高さ」が0以下になります。割り算が壊れる形です。

    この場合は100%を返しています。動かす余地が無く、開いた時点で最後まで見えているからです。読了の判定も同じ扱いになっていて、開いた時点で全区画が埋まります。2つの表示が同じ答えを出すので、ここでも食い違いません。

    今回の学び

    まず、0から始まらない指標は、測る対象と名乗りがずれている合図だということ。9.5%という値そのものは正確でした。式が答えていたのは「画面に映った割合」で、表示が名乗っていたのは「読み進み具合」です。数字が合っているかより先に、何を名乗っているかを確かめる必要がありました。

    次に、割り算は分子と分母を組で見ること。基準を1つずらすと、分子と分母の両方に同じ量が効きます。片方だけ直すと、始まりが直って終わりが壊れます。今回は両方に効かせたので、終点を動かさずに始点だけ直せました。

    そして、同じことを指す表示は、同じ場所で切り替わるべきだということ。バーの100%と読了の記録は、以前は別の位置にありました。いまは同じ4283pxで揃っています。揃っていれば、片方を見て他方を推測できます。ずれていると、どちらが本当なのかを毎回確かめることになります。

  • 達人プログラマー 第2版 — 教えにくいことほど、差が出る

    達人プログラマー 第2版 — 教えにくいことほど、差が出る

    プログラミングを教えていると、質問の種類が2つに分かれることに気づきます。

    ひとつは「この書き方が分からない」。これは調べれば答えが出ます。もうひとつは「どっちがいいですか」。こちらは答えが1つに決まりません。

    後者に答えるとき、自分が何を根拠に喋っているのかが曖昧でした。経験からそう思う、としか言えない。教える側としては、そこが一番あやしい部分でした。

    この記事で扱うこと

    「書き方」ではなく「進め方」を教えるときに何が足りなかったか、この本がそこにどう効いたか、そして教材として使うときの注意点です。

    教えやすいことと、伝えたいことがずれている

    教材にしやすいのは、正解のあるものです。文法、関数の使い方、エラーの読み方。手順が決まっていて、できたかどうかも判定できます。

    ところが、実務で差が出るのはそこではありません。

    教えやすいこと 実際に差が出ること
    書き方を覚える どこまで作り込むかを決める
    エラーを直す 同じエラーが起きない形にする
    言われたとおりに作る 言われていない前提を確認する

    右の列は、教科書の形になりにくい。正解が状況によって変わるので、「こうしなさい」と言えないからです。

    この本は、右の列について書かれている

    この本が扱っているのは、ほぼ全部が右の列です。原題は The Pragmatic Programmer で、日本語版は第2版が出ています。

    言語の解説はほとんどありません。代わりに、仕事の進め方そのものが並んでいます。同じことを2か所に書かない。壊れたまま放置しない。自分の道具を選んで使い込む。見積もりをどう扱うか。

    ひとつひとつは短く、独立しています。順番に読まなくても成立する構成なので、必要なところだけ拾えます。

    名前が付いていると、指し示せる

    助かったのは、それぞれの考え方に名前が付いていることでした。

    「同じ情報を2か所に置かない」という話は、経験があれば誰でも何となく分かっています。ただ、名前が無いと会話のたびに一から説明することになります。名前があると、一言で指して、その先の話ができます。

    教える側として、いちばん効いたところ

    この本を読んで、自分の説明の仕方が変わった部分があります。

    それまでは「こう書くといい」と結論だけを渡していました。読んだあとは、「こうすると後で何が起きるか」を先に話すようにしています。

    たとえば、同じ設定値を2か所に書いた場合。その場では動きます。問題が出るのは、片方だけ変えたときです。「今は動くが、変えるときに壊れる」という形で伝えると、納得の仕方が変わりました。禁止として覚えるのではなく、理由として残ります。

    経験の無い人には、まだ早い話もある

    ただし、この本の内容は失敗した経験があって初めて刺さるものが多いです。

    「壊れたまま放置しない」と書かれていても、放置して痛い目を見たことが無ければ、当たり前の標語として素通りします。初学者にそのまま渡すと、たぶん響きません。

    このサイトを作るときにも使った

    教える側の話だけではなく、自分の作業にも効きました。

    このサイトでは、ドメイン名やRSSの場所といった値が、いつの間にか複数のファイルに散っていました。どれも画面に出ない値で、書き換え漏れがあっても見た目では分かりません。

    気づいたときに1か所へまとめたのですが、その判断の速さは、この本で読んだ考え方が下敷きになっています。「今は動いている」を理由に放置しない、という部分です。

    教材として使うときの注意

    そのまま課題図書にするのは向いていないと考えています。読ませるなら、ある程度の期間、自分で作って詰まった経験があってからのほうが効きます。

    自分の場合は、必要な項目だけを取り出して、目の前の作業と結びつけて話す使い方をしています。本そのものを渡すのではなく、本から取った言葉を渡す形です。

    今回の学び

    まず、教えにくいことほど、実務では差が出るということ。正解のあるものは教材にしやすいのですが、そこは調べれば済む部分でもあります。時間をかけて伝える価値があるのは、判定しにくいほうでした。

    次に、考え方に名前が付くと、会話が短くなること。感覚として持っているだけだと、毎回説明が必要です。名前があれば指し示せて、その先の議論に進めます。

    そして、結論ではなく、後で起きることを渡すこと。「こう書きなさい」は覚えるだけで終わりますが、「こうしないと何が起きるか」は判断の材料になります。次に似た場面が来たとき、自分で決められる形になっていました。

  • 「画面に入った」で数えたら、17%残して読了になった

    「画面に入った」で数えたら、17%残して読了になった

    記事を最後まで読んだかどうかを、サイト側で判定しています。その作りを一度入れ替えたあとで、まだ食い違っていることに気づきました。

    調べたら、本文をまだ17%残している位置で読了が成立していました。

    この記事で扱うこと

    「画面に入った」で数えると何が起きるか、それを「通り過ぎた」に変えると何が揃うか。そして、速く動かしたときに何を数えていいのかです。

    本文を区画に分けて、通った跡を見ている

    判定の仕組みはこうです。本文の高さを6つの区画に分け、画面に映った区画に印を付けます。全部に印が付いたら読了とします。

    時間では測っていません。開いて放置しても時間は進むので、読まずに読了になってしまうからです。通った経路そのものを見れば、連続して読んだ人は必ず全部を通り、途中を飛ばした人には穴が残ります。

    ここまでは意図どおりに動いていました。問題は「映った」をどう数えるかのほうにありました。

    最後の区画は、画面に入った瞬間に埋まる

    最初の数え方は「画面と少しでも重なった区画に印を付ける」でした。素直な書き方に見えます。

    この数え方だと、最後の区画は画面の下から顔を出した瞬間に埋まります。まだ読んでいない部分が画面の下に残っていても、区画としては「映った」ことになります。

    実際の記事で測りました。本文の高さが4731px、画面の高さが745px、1区画は788pxです。最後の区画が画面に入るのは、本文の83%まで進んだところでした。

    数え方 最後の区画が埋まる位置 そのとき画面の下に残っている量
    画面に入ったら 本文の83% 17%
    下端まで通り過ぎたら 本文の100% 0%

    読み終わりを指す数字が、2つとも違う場所にあった

    同じページには、読み進み具合を出す細いバーもあります。こちらは「本文の末尾が画面の下端に来たら100%」で計算していました。

    つまり同じ「読み終わり」を指しているはずの2つが、17%ずれた場所を指していました。バーはまだ「あと17%」と言っているのに、記録のほうはもう読了になっている。どちらも動いていて、どちらも例外を出しません。

    同じ言葉で呼んでいたので、違うものだと気づけなかった

    どちらも「読み終わり」と呼んでいました。呼び名が同じだと、中身も同じだと思ってしまいます。

    実際には片方は「画面に入ったか」、もう片方は「画面を通り過ぎたか」を見ていました。言葉のほうが先に一致してしまうと、数字がずれていても照らし合わせる動機が生まれません。

    「通り過ぎた」に変えると、位置が揃う

    区画に印を付ける条件を、下端まで通り過ぎたかどうかに変えました。

    最後の区画の下端は、本文の末尾と同じ位置です。そこを画面の下端が越えるのは、本文を読み切ったときになります。バーが100%になるのと、読了が成立するのが、同じ瞬間になりました。

    直したのは条件式の不等号ひとつぶんですが、意味はかなり変わっています。「見えた」を「見終えた」にしたので、読む側の実感と一致するようになりました。

    速く動かしたときに、何を数えていいのか

    もうひとつ直したところがあります。

    目次から飛んだときに、途中を読んだことにしてはいけません。かといって、速くスクロールしただけの人を弾いてもいけません。この2つを分けるのに、以前は移動量のしきい値を置くことを考えていました。

    置かずに済む書き方がありました。前回の画面の下端と、いまの画面の上端の、大きいほうを下限にします。

    「表示された範囲」は、1本の式で書ける

    ふつうにスクロールしているあいだは、前回の下端のほうが大きくなります。1回の移動が画面の高さに収まるので、通り過ぎた範囲は全部目に入っています。

    大きく飛んだときは、いまの画面の上端のほうが大きくなります。飛んだ距離のうち画面の高さを超えた部分は一度も表示されていないので、そこは数えません。いま映っている1画面ぶんだけが残ります。

    場合分けが要らないだけでなく、処理が詰まって移動が飛び飛びに見えたときも、表示された範囲だけが自然に残ります。しきい値を決めていたら、その値の妥当性を考え続けることになっていました。

    実際のジオメトリで確かめました。連続して100px、300px、700px、744pxずつ動かした場合とPageDownでは、いずれも読了になります。一気に最下部へ飛んだ場合は成立しません。目次から中ほどへ飛んで最後まで読んだ場合は、手前に穴が残って成立しません。飛んだあとに戻って全部読めば成立します。

    今回の学び

    まず、同じ名前で呼んでいるものが、同じものだとは限らないこと。「読み終わり」を2か所で判定していて、どちらもそう呼んでいました。呼び名が一致していると、中身を照らし合わせる機会が来ません。ずれていたのは実装ではなく、言葉のほうが先に揃ってしまったことでした。

    次に、「見えた」と「見終えた」は別の状態だということ。画面に入った時点で数えると、まだ読んでいない部分が残ります。人が読み終えたと感じるのは通り過ぎたときなので、そちらに合わせるほうが実感と一致します。

    そして、しきい値を置く前に、置かずに書ける形を探すこと。今回は下限の取り方を変えるだけで場合分けが消えました。しきい値は、決めた瞬間から「その値でよいのか」を考え続ける対象になります。要らないなら、無いほうが軽い。

  • 一瞬だけ、白くなる

    一瞬だけ、白くなる

    ダークモードを入れました。色を反転させるだけの作業だと思っていたのですが、最後に厄介なものが残りました。

    ページを開いた瞬間、一瞬だけ白くなる。そのあと黒に切り替わる。暗い部屋で見ると、はっきり目に刺さります。

    この記事で扱うこと

    切り替えを3状態にした理由、開いた瞬間に白くなる現象の正体、そして24か所に散らばった色を1つずつ直さずに済ませた方法です。

    まず、切り替えを何状態にするか

    最初は「ライト/ダーク」の2つで作りかけました。書いている途中で手が止まりました。

    OSにも同じ設定があります。夜になると自動で暗くなる設定を使っている人は、サイト側で固定されると、その設定が効かなくなります。

    そこで3状態にしました。

    状態 何が起きるか
    システムに合わせる(初期値) OSの設定に追従する。夜に自動で暗くなる
    ライト OSが暗くても明るいまま
    ダーク OSが明るくても暗いまま

    初期値を「システムに合わせる」にしたのは、何も選んでいない人の意思表示は、すでにOS側にあるからです。サイトが勝手に上書きするものではありません。

    一瞬だけ白くなる、の正体

    ここが今回の本題です。

    このサイトのページは、あらかじめ組み立てたHTMLを配っています。速いのですが、組み立てた時点では、見る人がどちらを選んでいるか分かりません。

    選択はブラウザに保存されています。サーバーはそれを読めません。だから最初に届くHTMLは、必ずどちらかの配色で塗られた状態で届きます。

    そのあとJavaScriptが動いて、保存された選択を読み、色を切り替える。この「そのあと」が見えてしまうのが、白い一瞬の正体でした。

    速いページほど、目立つ

    表示が遅いページでは、白い一瞬は読み込み中の一部として紛れます。

    表示が速いページでは、完成した画面が出たあとに色だけが変わるので、はっきり分かります。速くしたことが、この問題を見えやすくしていました。

    解決は、順番を変えること

    JavaScriptを速くしても解決しません。画面が描かれる前に決めるしかありません。

    やったのは、HTMLの先頭に小さなスクリプトを1つ置くことです。ページの本体が描かれる前にブラウザがそこを読み、保存された選択(無ければOSの設定)を見て、いちばん外側の要素に印を付けます。

    そのあとにCSSが適用されるので、最初から正しい色で描かれます。切り替わる瞬間そのものが無くなります。

    「読み込みを止めるスクリプト」を、あえて置く

    ふだんは、描画を止めるスクリプトは避けるべきものです。表示が遅くなるからです。

    ここは例外にしました。処理は数行で一瞬ですし、止めないと画面がちらつく。原則より、原則が守ろうとしているもの(見え方)を優先しました。

    ついでに、スクロールバーも合わせた

    色を切り替えたあとも、スクロールバーやフォームの部品が明るいままでした。これらはブラウザが描いていて、サイトのCSSでは届きません。

    ブラウザに「このページは暗い配色です」と伝える指定が別にあります。それを一緒に切り替えることで、部品の側も揃いました。

    色を1つずつ直すのは、やめた

    ここも判断が要りました。

    画面の色は「白い背景」「濃いグレーの文字」のように、部品ごとに書いてあります。素直にやるなら、その1つずつに「暗いときはこの色」を書き足していきます。

    数えてみると、色の指定は24個のファイルに散らばっていました。

    1つずつ足すと、足し漏れが残る

    24か所すべてに正しく書き足せたかどうかは、全部の画面を暗くして見て回るまで分かりません。漏れた場所だけ明るいまま残ります。

    しかも次に色を調整したくなったとき、また24か所を探し直すことになります。

    色に名前を付けて、名前のほうを差し替えた

    やり方を変えました。「白」や「濃いグレー」という色そのものではなく、その名前が指す中身を入れ替えることにしました。

    部品側の書き方は一文字も変えていません。「白い背景」と書いてある場所はそのままで、「白」が何色を指すかを、明るいときと暗いときで切り替えます。

    結果として、直した場所は色の定義1か所だけになりました。次に微調整したくなったときも、探すのはそこだけです。

    記事の本文も、同じ仕組みで済んだ

    記事の本文はCMSから来ます。見出しも段落も表も、こちらで書いたHTMLではありません。記事を書くたびに手で色を入れる運用は続きません。

    ここは幸い、作ったときから色に名前を付けてありました。「本文の文字色」「罫線の色」「引用の背景」といった名前で書いてあったので、中身を差し替えるだけで済みました。当時そうしておいた理由は「あとで調整しやすいから」程度でしたが、今回はそれがそのまま効きました。

    ただし、例外が2か所あった

    この方法には穴があります。もともと背景が濃い場所です。

    フッターとトップの見出し部分は、明るいときでも背景が濃紺です。そこに置いてある白い文字まで一緒に反転させると、濃紺の上に濃い色の文字になって読めなくなります。

    この2か所だけは、名前を使わずに色を直接書きました。仕組みで揃えられる範囲と、そうでない範囲を分けた形です。

    例外は、例外だと書いておく

    あとから見た人が「ここだけ書き方が違う」と気づいたとき、理由が書いていないと統一しようとして壊します。

    直す判断のほうが自然に見えるので、なぜそうなっているかを同じ場所に残しました。

    色を反転させただけでは、読めなかった

    中身を入れ替えるとき、白と黒をそのまま逆にするとまぶしすぎます。

    暗い背景に純白の文字を置くと、文字のふちがにじんで見えます。背景も純黒だとコントラストが強すぎて長く読めません。実際に暗い部屋で読んでみて、背景を少し明るく、文字を少し暗い白に寄せました。

    逆に、薄いグレーの文字はダークモードで読めなくなります。明るいときに「補足だから薄く」としていた箇所が、暗い背景では沈んで消えます。補足の文字は、暗いとき用に明るさを上げ直しました。

    反転は、変換ではない

    明るい配色で成立していた濃淡は、暗い配色ではそのまま成立しません。

    薄い=控えめ、という関係が逆になるためです。片方で作ってからもう片方を作るのではなく、両方を見ながら決める必要がありました。

    やらなかったこと

    画像を暗くすること。ダークモードで画像の明るさを落とす手はありますが、記事のアイキャッチはもともと暗い配色で作ってあるので、これ以上落とすと沈みます。

    切り替えにアニメーションを付けること。色がなめらかに変わるのは気持ちよさそうですが、切り替えは一瞬で終わるべきものです。演出を挟むと、ちらつきを消すためにやった作業と矛盾します。

    今回の学び

    まず、設定は上書きより追従を初期値にすること。OSに同じ設定がある以上、何も選んでいない状態はすでに意思表示です。サイトが先に決めてしまうと、その意思が消えます。

    次に、ちらつきは速さの問題ではなく順番の問題だということ。処理を速くしても、順番が後ろにある限り見えてしまいます。速くする前に、どの順で決まるかを見る必要がありました。

    そして、原則には、それが守ろうとしているものがあること。「描画を止めるスクリプトを置かない」は、見え方を良くするための原則です。その原則を守ることで見え方が悪くなるなら、優先すべきは原則のほうではありません。

    あわせて、散らばったものを1つずつ直さないこと。24か所に手を入れる作業は、終わったかどうかを自分で確かめられません。名前を1つ挟んで、そこだけを差し替える形に持っていけるなら、その手間のほうが安く済みます。

    最後に、反転は変換ではないこと。明るい配色で作った濃淡は、暗い配色では意味が変わります。片方から機械的に作れるものだと思っていたのが、今回いちばんの見込み違いでした。

  • 一覧が長くなると、探せなくなる

    一覧が長くなると、探せなくなる

    記事の一覧ページに検索欄を付けました。作りながら決めたことを書いておきます。

    結論から書くと、サーバーには問い合わせていません。検索という言葉から想像される仕組みより、だいぶ簡単なものを選びました。なぜそれで足りると判断したかが、この記事の中身です。

    この記事で扱うこと

    検索をサーバー側でやらないと決めた理由、検索の対象に本文を入れなかった理由、そして表記ゆれの吸収です。

    そもそも、なぜ必要になったのか

    記事が20本を超えたあたりで、自分でも過去記事を探せなくなりました。

    「DNSの話、どの記事に書いたっけ」と思って一覧を開き、上から順に見出しを読んでいく。これは読者にやらせる作業ではありません。

    用語集には先に検索を付けていました。116語を目で追うのは無理だと分かっていたからです。記事も同じ状態になりつつありました。

    サーバーに聞かない、と決めた

    検索の作り方は大きく2つあります。

    やり方 仕組み
    サーバー側 入力のたびにCMSへ問い合わせ、絞り込んだ結果を返してもらう
    ブラウザ側 すでに読み込んである一覧を、その場で絞り込む

    WordPressには検索の仕組みが最初から入っていて、GraphQLからも呼べます。素直に考えればそちらです。

    それでもブラウザ側にしたのは、一覧ページがすでに全記事を持っていたからです。

    このサイトの一覧ページは、あらかじめ組み立てたHTMLを配っています。ページを開いた時点で、全記事のタイトル・抜粋・タグはもうブラウザの中にあります。そこにあるものを、わざわざもう一度サーバーに聞きに行く理由がありません。

    聞きに行くと、壊れやすくなる

    入力のたびにCMSへ問い合わせると、CMSが落ちている間は検索も落ちます。

    いまの構成は、CMSが止まっていても閲覧は続けられるようにしてあります。検索のためにその性質を手放すのは、割に合いませんでした。

    もちろん、これは記事数に依存する判断です。数百本になれば一覧ページ自体が重くなるので、そのときは作り直します。いま正しいことと、ずっと正しいことは違います。

    本文は、検索の対象にしなかった

    次に迷ったのが、どこまでを検索の対象にするかです。

    本文まで探せたほうが便利なのは間違いありません。ただ、一覧ページは本文を読み込んでいません。タイトルと抜粋とタグだけです。

    本文まで含めると、一覧ページが運ぶデータは数十倍になります。検索できるようにするために、一覧ページの表示が遅くなる。これは順序が逆だと思いました。

    検索欄を使う人より、一覧をそのまま眺める人のほうが多いはずです。多いほうを遅くして、少ないほうを便利にする交換はしたくありませんでした。

    「便利」は、どこかの負担と交換されている

    機能を足すとき、増えるのは画面の要素だけではありません。読み込む量、壊れる箇所、直す手間も一緒に増えます。

    足す前に「何と引き換えか」を書き出すと、要らない機能はだいたいそこで消えます。

    表記ゆれを、どこまで吸収するか

    日本語の検索でいちばん厄介なのは、同じものを指す書き方が複数あることです。

    同じ記事にたどり着いてほしい入力
    Next.js
    next.js
    nextjs
    NEXT
    ネクスト

    全部を完璧に扱うのは無理なので、機械的に処理できる範囲だけ揃えました。

    やっているのは4つです。全角と半角を揃える、大文字と小文字を揃える、カタカナをひらがなに寄せる、記号と空白を落とす。入力側と、記事側の両方に同じ処理をかけてから比べます。

    これで「WordPress」も「wordpress」も「ワードプレス」も同じ扱いになります。「ネクスト」で Next.js が出るところまでは面倒を見ていません。そこまでやるなら辞書が必要で、辞書は誰かが更新し続けないと古びます。

    用語集と同じ関数を使った

    この処理は、用語集の検索ですでに書いてありました。

    そのままコピーすることもできましたが、コピーした側は直されません。片方の揺れを直したときに、もう片方は古いままになります。共通の場所に出して、両方から呼ぶようにしました。

    関数を1つ切り出すだけの作業ですが、2箇所目が現れた時点でやっておかないと、3箇所目が現れたときにはもう誰も揃えません。

    0件のときに、何を出すか

    最後まで残ったのがこれでした。

    「見つかりませんでした」とだけ出すのは、行き止まりです。探しに来た人を、何も持たせずに帰らせることになります。

    このサイトには用語集があります。記事名では見つからなくても、語の説明としては存在していることが十分あり得ます。0件のときは、その語で用語集を引く導線を出すようにしました。

    行き止まりを作らない

    0件は失敗ではなく、「その言葉では記事が無い」と分かった状態です。次に行ける場所を1つ添えるだけで、意味が変わります。

    今回の学び

    まず、すでに手元にあるものを数えること。検索と聞くと問い合わせる仕組みを想像しますが、一覧ページはもう全記事を持っていました。持っているものを使えば、増える部品はゼロです。

    次に、機能を足すときは何と引き換えかを書くこと。本文まで検索できるようにすると、一覧の表示が遅くなります。多いほうを犠牲にして少ないほうを便利にしていないか、毎回確かめる価値があります。

    そして、同じ処理が2箇所目に現れたら、その時点で1つにすること。コピーした側は直されません。3箇所目が現れてからでは遅すぎます。

    最後に、0件にも行き先を用意すること。見つからなかったという事実は、それ自体が次の手がかりになります。

  • リーダブルコード — 引き継ぐ側に回って分かったこと

    リーダブルコード — 引き継ぐ側に回って分かったこと

    自分で書いていないコードを直す仕事が続いた時期がありました。書いた人はもういません。仕様書もありません。あるのは動いているコードだけです。

    読んでいて思ったのは、これを書いた人を責めても何も進まないということでした。同時に、自分が書いたものも、いずれ誰かにこう読まれるということでもあります。

    この記事で扱うこと

    引き継ぐ側に回って何に困ったか、この本がその困りごとにどう答えているか、そして読んだあとに自分の書き方の何が変わったかです。

    読めないコードは、読みにくいコードとは限らない

    最初に困ったのは、きれいに整っているのに何をしたいのか分からないコードでした。

    字下げは揃っています。短い関数に分かれています。それでも読めない。理由を探していくと、名前でした。

    const data = getData();
    const result = process(data);
    if (flag) {
      doIt(result);
    }

    形としては悪くありません。ただ、この4行を読んでも、何の処理なのかが1つも分かりません。名前が全部「何かの入れ物」で止まっています。

    読む側は、名前を手がかりに当たりを付けている

    コードを追うとき、全部を順番に読んでいるわけではありません。名前を見て「ここは関係なさそうだ」と飛ばし、関係ありそうな場所だけ中に入ります。

    名前が中身を表していないと、この飛ばし読みが効かなくなります。結果として全部を読むことになり、1か所直すのに何時間もかかります。

    この本が答えていること

    この本は、そういう「読む側の負担」を軸に書かれています。副題が「より良いコードを書くためのシンプルで実践的なテクニック」で、扱っているのは設計論ではなく、もっと手前の話です。

    名前の付け方、コメントに何を書くか、条件分岐の並べ方、1つの関数にどこまで詰めるか。どれも今日書く1行に効く内容で、大きな作り替えを必要としません。

    いちばん残ったのは、コメントには「何をしているか」ではなく「なぜそうしたか」を書くという指摘でした。

    // ユーザーを取得する
    const user = fetchUser(id);

    これはコードを日本語に訳しただけで、読む側は何も得ていません。知りたいのは、なぜここで取りに行くのか、なぜこの方法なのかのほうです。

    引き継ぐ側にとって、いちばん欲しかったもの

    実際に困った場面を思い返すと、欲しかったのは常に判断の理由でした。

    コードから分かること コードから分からないこと
    何をしているか なぜその方法を選んだか
    どういう順番で動くか なぜこの順番でなければならないか
    この値を除外していること 除外しないと何が起きるのか

    右の列が分からないと、触っていいのかどうかが判断できません。一見無駄に見える処理が、実は過去の不具合への対処だった、ということは珍しくありません。理由が書いていないと、消して初めて分かります。

    読みやすさは、書く人への要求ではない

    読みやすく書くのは、丁寧さや性格の問題として語られがちです。この本の立て方は違っていて、「読む人が理解するまでの時間を短くする」という目的に対する手段として扱っています。

    目的が決まっているので、迷ったときの判断基準になります。短く書くか説明的に書くかで悩んだら、読む人が早く分かるほうを選ぶ。それだけです。

    読んだあとに変えたこと

    このサイトのコードでは、コメントの書き方を変えました。処理の説明ではなく、なぜその選択をしたのかを残すようにしています。

    たとえば「この値を1か所にまとめた理由」や「この設定を別のファイルに切り出した理由」を、選ばなかった案と一緒に書いています。半年後の自分は、今の自分が何に困っていたかを覚えていません。困りごとごと残しておかないと、また同じ場所で悩みます。

    合わないかもしれない場合

    扱っているのは小さな単位の話なので、設計全体をどう組むかという話は出てきません。そこを求めて読むと物足りなく感じます。

    あと、例に使われているコードはC++やJavaScriptなどが中心です。普段そのあたりを書いていなくても読めますが、言語固有の書き方を学ぶ本ではありません。考え方を持ち帰って、自分の言語に翻訳する読み方になります。

    今回の学び

    まず、コードは書く時間より読まれる時間のほうが長いということ。引き継ぐ側に回って初めて実感しました。書いているときは自分しか読者がいませんが、動き続けるコードには読者が増えていきます。

    次に、名前は飛ばし読みのための道具だということ。読む人は全部を読みません。名前で当たりを付けて、必要な場所だけ開きます。名前が中身を表していないと、この省略が使えなくなります。

    そして、残すべきは処理ではなく判断だということ。何をしているかはコードを読めば分かります。分からないのは、なぜそうしたかのほうでした。そこが書いていないと、後から来た人は消すことも直すこともできません。

  • 見つけてもらうために、書き方は変えない

    見つけてもらうために、書き方は変えない

    このサイトで検索まわりにやってきたことを、順番に並べてみます。

    先に立場を書いておくと、順位を上げる方法は扱いません。やってきたのは「存在を知らせる」「探している人の言葉に近づける」の2つだけで、どちらも順位を操作する話ではありません。

    この記事で扱うこと

    何を先にやったかという順番、記事の見出しと検索結果の文字を分けた判断、そして「やらないと決めたこと」です。

    最初にやったのは、存在を知らせること

    公開したばかりのサイトには、外部からのリンクがありません。検索エンジンはリンクをたどってページを見つけるので、誰からもリンクされていないサイトは、そもそも見つけてもらえません。

    そこで最初に用意したのは3つです。

    用意したもの 役割
    sitemap.xml ページの一覧を直接渡す
    robots.txt 見に来てよい範囲を伝える
    構造化データ ページの意味を機械が読める形で示す

    あわせてSearch Consoleに登録しました。ここでつまずいた話は別記事にしていますが、要点はドメインを買った会社の管理画面と、実際にDNSを答えているサーバーが別だったことです。設定は保存できるのに、誰も参照しない。エラーも出ない。丸一日かかりました。

    順位ではなく、到達

    これらは順位を上げるものではありません。見つかるまでの時間を短くするものです。

    存在を知られていない状態で書き方の工夫をしても、読む相手がいません。順番として、先にこちらでした。

    次にやったのは、記事どうしをつなぐこと

    記事が20本を超えたあたりで、1本読んだ人が次に何を読むかという導線が無いことに気づきました。

    やったことは3つです。

    ひとつめは用語集です。116語をまとめ、記事の末尾から「この記事に出てくる用語」として繋ぎました。これは検索対策として始めたものではなく、初学者にも読めるようにするためのものです。ただ結果として、記事どうしが用語を介してつながりました。

    ふたつめは関連記事です。以前は「1つ新しい記事」と「1つ古い記事」しか出していませんでしたが、公開日が近いことと内容が近いことには関係がありません。タグの重なりで選ぶように変えました。

    みっつめはページの統合です。実績とスキルの個別ページは、トップページの同名セクションとほぼ同じ内容でした。同じ内容が2つのURLにあると、検索エンジンにどちらを出すか選ばせることになります。統合して、旧URLは転送しました。

    そして、タイトルを2つに分けた

    ここが今回いちばん考えた部分です。

    このサイトの記事の見出しは、内容を説明するのではなく、含みを持たせて付けています。

    これまでの見出し
    速くしたら、壊れた
    所有権をどう証明するか
    「読み終えた」をどう数えるか
    ゆっくり読む人ほど、読了にならなかった

    読んだあとに何かが残るように、と思って付けています。

    ところが検索する人は、この言葉では探しません。「所有権をどう証明するか」で検索する人はいませんが、「Search Console 所有権確認 DNS」で困っている人はいます。中身はまさにそれなのに、言葉が噛み合っていませんでした。

    見出しを書き換える案は、やめた

    検索語を入れた説明的な見出しに直せば、噛み合います。しかしそれをすると、読み物としての性格が変わります。

    このサイトは、作業の記録であると同時に、判断の記録として書いています。見出しはその入口なので、そこを検索エンジンに合わせて書き換えるのは、目的と手段が入れ替わっている気がしました。

    場所によって、見られ方が違う

    検索結果のリンクは「探している言葉と一致するか」で開かれます。SNSで共有されたリンクは「面白そうか」で開かれます。

    見られ方が違うなら、出す文字も違っていい。そう整理したら、答えが出ました。

    見出しはそのままにして、検索結果に出す文字だけを別に持つことにしました。SNSで共有されたときは見出しのほうを出します。

    出る場所 出す文字
    検索結果 Search Consoleの所有権確認をDNSのTXTレコードで行う
    ページの見出し・SNS 所有権をどう証明するか

    文字数も測った

    あわせて、検索結果に出る幅も測りました。目安は全角30文字ほどです。

    サイト名の接尾辞「| KiSAKU Portfolio」が全角9.5文字ぶんを毎回占めていて、公開中21本のうち14本がこの幅を超えていました。接尾辞を記事ページから外すだけで、超えるのは7本に減りました。

    サイト名は検索結果のURL表示にも出ています。タイトルの中で場所を取ってまで繰り返す必要は、薄いと判断しました。

    やらないと決めたこと

    逆に、やらないことも決めました。

    検索語を狙って記事を量産すること。書いていないことは書けません。このサイトの記事は、実際に自分がつまずいて調べたことだけで成り立っています。検索語から逆算して書き始めると、その前提が崩れます。

    用語を1語1ページにすること。個別ページのほうが検索に有利、という一般論はあります。しかし1語400字のページを100枚作ると、中身の薄いページが多いサイトと見なされる可能性がありました。この規模では逆効果と判断して、分野ごとにまとめています。

    広告を置ける場所すべてに置くこと。内容と無関係な記事に広告を挟むと、読んだ人の信頼を削ります。掲載できる場所の数と、掲載すべき場所の数は違います。

    一般論が、自分の規模で成立するとは限らない

    「個別ページのほうが強い」「記事数が多いほうが有利」——どれも間違いではありませんが、条件付きの正解です。

    条件を確かめずに無条件の正解として受け取ると、規模が合わないまま実行して逆効果になります。

    まだ測っていない

    正直に書くと、ここまでの効果はまだ数字で確かめていません。

    Search Consoleに登録したのが最近で、記事の公開も始めたばかりです。いま順位やクリック数を見ても、変化なのか誤差なのか区別がつきません。

    やったことを記録しておいて、数字が溜まってから振り返るつもりです。効果を確かめる前に「効果があった」と書かないことも、この記録の一部だと思っています。

    今回の学び

    まず、順番があること。存在を知られていない段階で書き方を工夫しても、読む相手がいません。まず見つかる状態を作り、それから中身の噛み合わせを直す。逆にすると、労力の割に何も起きません。

    次に、探している人の言葉と、書いた人の言葉は違うこと。良い見出しを付けたつもりでも、それが検索で使われる言葉とは限りません。両立しないなら、場所ごとに出す文字を変える手があります。

    そして、一般論は条件付きの正解だということ。規模や状況が違えば逆に働きます。自分の数字に当てはめてから採用するべきです。

    最後に、確かめる前に成果を語らないこと。やったことと、効いたことは別です。記録として残す価値があるのは、前者を正確に書いておくことのほうだと思います。