タグ: 技術選定

  • 勉強法(6) 効いたのは、技術そのものではなかった

    勉強法(6) 効いたのは、技術そのものではなかった

    この連載の最後に、身も蓋もない話を書きます。

    仕事につながった場面を振り返ると、効いていたのは技術そのものではありませんでした。

    この記事で扱うこと

    実際に役に立った3つ。どれも技術の名前ではなく、技術の扱い方の話です。このサイトで実際にやったことと対応させて書きます。

    1. 説明できること

    「なぜそうしたのか」を聞かれて答えられるかどうか。ここでいちばん差が出ました。

    動くものを作れる人は多い。ところが「その方法を選んだ理由」になると、急に答えが揃わなくなります。

    このサイトで言えば、同意の仕組みがそうでした。先に読み込んでおいて送信の可否だけ切り替える方法と、同意まで読み込まない方法がある。後者を選んだ理由は、前者だと自分のコードを全部読んでも「送っていない」と言い切れないからです。

    説明できる形を選ぶ、という選び方がある

    この判断は、技術的な優劣で決めていません。あとで説明を求められたときに答えられるかで決めています。

    仕事だと、この視点が要る場面のほうが多い。「動きます」で終わらせられる相手ばかりではありません。

    2. 引き継げること

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

    そのとき欲しかったのは、常に判断の理由でした。

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

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

    いま自分が書くコードには、処理の説明ではなく理由を書いています。引き継ぐ側に回った経験が、そのまま書き方に効きました。

    3. 止まらないこと

    3つめは、壊れたときにどうなるかを先に決めておくことです。

    このサイトのCMSは共用サーバーにあって、混むと応答しません。最初はそれで公開作業ごと止まっていました。

    直したのは速度ではなく、失敗する前提で書き直したことです。

    場面 決めておいたこと
    CMSが500を返す 間を置いて投げ直す。ただし要求が違う場合は投げ直さない
    記事が取れない 0件のフィードを返す。エラーにしない
    同意の記録が読めない 「同意していない」扱いにする

    どれも「うまくいく道」ではなく、うまくいかなかったときにどちらへ倒れるかの話です。

    止まらない作りは、能力ではなく事前の判断

    特別な技術は使っていません。分からないときにどちらへ倒すかを、書く時点で決めただけです。

    決めていないと、そのときの都合で倒れます。都合で倒れたものは、あとから説明できません。

    3つに共通していたこと

    並べてみると、全部「あとから来る人」への態度でした。

    誰のためか
    説明できること 判断を求める相手
    引き継げること 次に触る人
    止まらないこと 壊れたときに困る人

    3つとも、書いている自分には直接の得がありません。書いた時点では、誰も困っていないからです。

    効いてくるのは、いつも後からでした。そして後から効いたものだけが、次の仕事につながっていました。

    技術が要らない、という話ではない

    誤解のないように書いておくと、土台としての技術は要ります。読めないコードは引き継げないし、仕組みを知らなければ壊れ方も予想できません。

    ただ、そこは足りていないと何も始まらないが、足りたからといって差がつく場所ではないという感覚です。差がついていたのは、同じものを作れる人どうしの間でした。

    今回の学び

    まず、動かせる人は多いということ。差がついていたのは動くかどうかではなく、なぜそうしたかを説明できるかどうかでした。

    次に、引き継ぐ側の経験が、書き方を変えること。読めないコードに困った経験がないと、理由を残す動機が湧きません。困った側に一度回ると、書き方が変わります。

    そして、効いてくるのは全部あとからだということ。3つとも、書いた時点では誰も困っていません。得が見えないうちにやっておいたものだけが、後で効きました。

  • 勉強法(5) 手順は残らない。判断は残る

    勉強法(5) 手順は残らない。判断は残る

    このサイトの作業は、かなりの部分をAIと一緒に進めています。

    気になっていたのは、それで自分に何か残るのかということでした。60本を超えた時点で、残ったものと残らなかったものがはっきり分かれています。

    この記事で扱うこと

    何が残って何が残らなかったか。そして、残るかどうかを分けていたのが何だったかです。

    残らなかったもの

    正直に書くと、手順は覚えていません。

    やったこと いま書けるか
    DNSにTXTレコードを足す 画面を見れば分かるが、手順は覚えていない
    構造化データの書き方 項目名を覚えていない
    日付を決まった形式に直す 曜日と月名の並びは調べ直す

    ここは開き直っています。調べれば出るものを覚えておく理由が薄いからです。AIと組む前から、この手のものは毎回調べていました。

    残ったもの

    残ったのは、「なぜそれを選んだか」のほうでした。

    たとえば、同意を取る仕組みを作ったとき。先に読み込んでおいて送信の可否だけ切り替える方法と、同意まで読み込まない方法があります。後者を選びました。

    理由は、前者だと自分のコードを全部読んでも「送っていない」と言い切れないからです。判断が相手の設定に移ってしまう。

    この判断は覚えています。手順は忘れても、何を基準に選んだかは残りました。

    残っているのは、迷った場所だけ

    並べてみると、覚えているのは全部迷った場所でした。

    すんなり決まったところは覚えていません。2つの案を比べて、片方を捨てた場所だけが残っています。捨てた理由が、そのまま基準になっているからだと思います。

    分かれ目は「確かめられるかどうか」だった

    残るものと残らないものを分けていたのは、時間でも回数でもありませんでした。自分で確かめたかどうかです。

    分かりやすい失敗があります。

    読了の判定が正しく動いているかを、ブラウザを自動で動かして確かめました。記事を最後までスクロールさせても、読了として記録されない。「不具合がある」と結論を出しかけました。

    念のためスクロールのイベント回数を数えたら、0回でした。自動で動かしているタブでは、そもそもイベントが発生していません。不具合が無くても同じ結果になります。

    確かめずに直していたら、動いているものを壊していた

    ここで分かったのは「読了が記録されない」ではなく、「この方法では確かめられない」ということだけでした。

    AIと組んでいると、答えは早く出ます。早く出た答えを確かめる手段を持っていないと、間違いも同じ速さで進みます。速いぶん、戻る距離も伸びます。

    この一件は強く残りました。自分で数えて、自分で結論を取り下げたからです。

    残す作業を、意識的にやっている

    放っておくと残らないので、2つだけ決めています。

    1つめは、コードに「なぜ」を書くこと。処理の説明ではなく、その選択をした理由と、選ばなかった案を書きます。書こうとすると、自分が理由を説明できるかが分かります。書けないときは、分かっていません。

    2つめは、記事にすること。このサイトの記事は、ほぼ全部が詰まった話です。人に読める形にするには、何が起きて、なぜそうしたかを順に並べる必要があります。並べられない部分が、理解の穴です。

    やらないと やると
    コードの「なぜ」 半年後に同じ場所で悩む 判断ごと残る
    記事にする やった記憶だけ残る 説明できない部分が見つかる

    どちらも、AIには代わりにやってもらえません。説明できるかどうかを確かめているのは自分の理解なので、代わりに書いてもらった時点で意味が無くなります。

    向き不向きはある

    全部が同じようにうまくいったわけではありません。

    手を動かして覚えるもの——たとえば攻撃の手順を実際に試すような学び方は、読んだだけでは半分しか入りませんでした。体で覚える部分は、代わりにやってもらうと何も残りません。

    逆に、調べれば分かることを大量に集めてくる作業は、任せたほうが早い。分ける基準は「自分の判断が要るかどうか」でした。

    今回の学び

    まず、手順は残らないが、判断は残るということ。覚えているのは全部、2つの案を比べて片方を捨てた場所でした。捨てた理由が基準として残っています。

    次に、確かめる手段を持っていないと、間違いも同じ速さで進むこと。早く答えが出ること自体は良いのですが、確かめずに進むと戻る距離が伸びます。速さの価値は、確かめ方とセットでした。

    そして、残す作業だけは自分でやる必要があること。理由を書く、記事にする。どちらも「説明できるか」を試す作業なので、代わりにやってもらうと試すもの自体が無くなります。

  • 勉強法(4) 教える側に回ると、穴が見える

    勉強法(4) 教える側に回ると、穴が見える

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

    片方は調べれば答えが出ます。もう片方は、自分が何を根拠に答えているのか分からなくなります。

    この記事で扱うこと

    教える側に回って見えた、自分の理解の穴。答えられなかった質問の種類と、そのあと説明の仕方をどう変えたかです。

    答えられない質問は、いつも同じ形だった

    質問 答え方
    この書き方が分からない 調べれば出る。一緒に調べればいい
    エラーが出た 読めば書いてある。読み方を渡せばいい
    どっちがいいですか 答えが1つに決まらない

    3つめで詰まります。「そっちでいいと思います」とは言える。ただ、なぜそう思うのかを説明しようとすると、経験からそう思う、としか言えませんでした。

    自分が使えていることと、人に渡せることは別

    自分で書くときは迷いません。手が勝手に選んでいます。

    ところが理由を言葉にしようとすると出てこない。選べているのに、選び方を説明できない状態でした。使えてはいるが、分かってはいなかったわけです。

    教えやすいことと、実務で差が出ることがずれている

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

    ところが、仕事で差が出るのはそこではありませんでした。

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

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

    結論ではなく、後で起きることを渡す

    説明の仕方を変えました。それまでは「こう書くといい」と結論だけを渡していました。いまは「こうすると後で何が起きるか」を先に話します。

    たとえば、同じ設定値を2か所に書いた場合。その場では動きます。問題が出るのは、片方だけ変えたときです。

    「重複は避けましょう」だと、禁止として覚えて終わります。「今は動くが、変えるときに壊れる」だと、理由として残ります。次に似た場面が来たとき、自分で判断できる形になります。

    判断の材料を渡すと、質問が変わる

    この形にしてから、「どっちがいいですか」が「こっちだと後でこうなりますよね」に変わることが増えました。

    答えを渡していたときは、次も同じ質問が来ていました。材料を渡すと、途中まで自分で進んでから聞きに来ます。

    自分の側にも効いた

    説明のために言葉にしたことが、自分の作業にも戻ってきました。

    このサイトのコードには、処理の説明ではなく「なぜその選択をしたか」を書いています。1か所にまとめた理由、別のファイルに切り出した理由、選ばなかった案。

    これは人に説明するときに必要だった形と同じです。半年後の自分は、今の自分が何に困っていたかを覚えていません。困りごとごと残しておかないと、また同じ場所で悩みます。

    残す内容 あとで役に立つか
    何をしているか コードを読めば分かる
    なぜそうしたか コードからは分からない
    選ばなかった案 直すときに、戻って考えずに済む

    教える相手が、自分の穴を教えてくれる

    答えられなかった質問は、そのまま自分が言葉にできていない部分でした。

    1人で書いているかぎり、そこは表に出てきません。動いているからです。聞かれて初めて、説明できないことに気づきます。

    本を読んで穴を埋めたこともありますが、穴の場所を教えてくれたのは、いつも質問のほうでした。

    今回の学び

    まず、選べることと、選び方を説明できることは別だということ。手が勝手に選んでいるうちは、使えてはいても分かってはいませんでした。

    次に、結論より、後で起きることを渡すこと。「こう書きなさい」は覚えて終わりますが、「こうしないと何が起きるか」は判断の材料になります。渡す形を変えただけで、返ってくる質問が変わりました。

    そして、自分の穴は、自分では見つけにくいこと。1人で書いていると、動いている場所は疑いません。答えに詰まった質問の一覧が、そのまま埋めるべき場所の一覧でした。

  • 勉強法(3) 調べる場所が決まらない時間

    勉強法(3) 調べる場所が決まらない時間

    手が止まっている時間の中身を振り返ると、書き方が分からない時間はそれほど長くありませんでした。

    長かったのは、どこを調べればいいか決まらない時間のほうです。

    この記事で扱うこと

    「読めない」「分からない」を、調べられる形まで分解する話です。CMSベンダーにいたころの詰まり方と、いまも同じ構造で出てくることを書きます。

    3つのどれかは分かるのに、どれかが分からない

    製品のベースがRailsの会社にいました。仕事は管理画面やフロントの改修です。

    コードは目の前にあって、動いてもいます。それなのに読めない。理由を探していくと、こういう詰まり方でした。

    目の前の1行が、Railsが用意した仕組みなのか、Rubyの文法なのか、製品独自の実装なのかが区別できない。

    その行が何か 調べに行く先
    フレームワークの機能 そのバージョンのドキュメント
    言語の文法 言語のリファレンス
    製品独自の実装 社内のコードと、書いた人

    3つのどれかであることは分かります。どれなのかが分からない。結果として、調べ始める場所が決まりませんでした。

    検索の言葉すら決まらない

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

    見当が付いていないと、当てずっぽうで言葉を変えながら探すことになります。これが時間を食う。しかも、進んでいる実感が無いまま食います。

    「読めない」では、対処が決まらない

    この状態を「経験が足りない」で片付けていたうちは、何をすればいいか分かりませんでした。

    分解して「言語かフレームワークかの区別がつかない」まで持っていくと、読むべき本は1冊に決まります。フレームワークの本ではなく、言語そのものの本です。

    読んだあと、知識の量よりも先に変わったのは手が止まる回数でした。「ここは言語の書き方だ」と分かると、調べ先が決まるからです。

    分解の粒度は、対処が1つに決まるところまで

    「分からない」では何も決まりません。「読めない」でもまだ決まりません。

    「区別がつかない」まで下ろすと、やることが決まります。そこが止め時でした。それ以上細かくしても、やることは変わりません。

    いまも、同じ構造で出てくる

    これは過去の話ではなくて、今も形を変えて出てきます。

    最近だと、記事を投稿しようとしてサーバーに弾かれました。403が返るだけで理由は出ません。ここで手が止まる理由は、Railsのときとまったく同じです。原因がどこにあるか分からないので、調べ始める場所が決まらない。

    このときやったのは、本文を半分に割って試すことでした。知識を足したのではなく、「どこ」を絞り込んだだけです。2回割ったら、引っかかっている行が分かりました。

    Railsのとき 403のとき
    止まった理由 調べ先が決まらない 調べ先が決まらない
    やったこと 3つのどれかを見分ける 範囲を半分に割る
    必要だったもの 言語の知識 絞り込む手順

    片方は知識で解決し、もう片方は手順で解決しました。共通していたのは、詰まりを「どこ」の問題に置き換えたことです。

    教えていて気づいたこと

    プログラミングを教えていると、同じ止まり方をよく見ます。

    「動きません」と言われて画面を見ると、エラーは出ています。読めば書いてある。ただ、そのエラーが自分の書いた行の話なのか、道具の設定の話なのかが分からない状態です。

    このとき答えを教えると、その場は進みます。ただ次に同じ形で止まります。渡すべきだったのは答えではなく、「いまのは3つのうちどれだと思うか」という問いのほうでした。

    今回の学び

    まず、いちばん時間を食うのは、探す時間ではなく探す場所を決められない時間だということ。答えを見つけるのは、場所さえ決まればそれほどかかりません。

    次に、分解は「対処が1つに決まる」ところまでやること。「分からない」のままでは動けませんが、細かくしすぎても意味がありません。やることが決まった時点が止め時でした。

    そして、同じ詰まり方は、分野を変えて何度も出てくること。言語とフレームワークの区別も、403の原因の特定も、困っている形は同じでした。1回分解できると、次はそれが型として使えます。

  • 勉強法(1) 1つ作り切ると、広く当たる

    勉強法(1) 1つ作り切ると、広く当たる

    勉強法の本を読んで、思い出したことがあります。

    いま自分が手を出せる範囲は、勉強して広げたものではありませんでした。このサイトを1つ作り切る過程で、必要になって触っただけです。

    この記事で扱うこと

    ポートフォリオサイトを1つ作るのに、結果として何を触ることになったか。その一覧と、それが「順番に勉強する」やり方とどう違ったかです。

    触ることになったもの

    やりたくて始めた領域は、ほとんどありません。進めようとしたら、そこで止まったから触ったという順番です。

    領域 止まった場面
    DNS ドメインを繋いだら、wwwの有無で別のサイトとして扱われた
    TLS 証明書が発行されるまで、何が起きているのか分からなかった
    共用サーバー 混むと500が返り、公開作業ごと止まった
    WAF コードを含む本文を投稿すると、403で弾かれた
    CMSの設計 本文をコードに書くか、CMSに置くかで運用が変わった
    キャッシュ 常に最新を取る指定のせいで、初回表示が1.7秒かかっていた
    アクセス解析 入れる前に、何を数えたいのかを決める必要があった
    検索エンジン 同じ中身が複数のURLで見える状態を、56件指摘された
    アクセシビリティ 画面では分かる区別が、読み上げでは同じに見えていた
    CSS設計 角丸の値を、どこまで段階として揃えるかで迷った

    この一覧は、事前に立てた計画ではありません。詰まった順に並んでいるだけです。

    どの順で何が起きたのかは、公開するまでに、何をどの順でやったか に並べました。この表の各行が、4つの段のどこで出てきたのかが分かります。

    順番に勉強していたら、たぶん届いていない

    もし「Web開発を学ぶ」という目的で本を選んでいたら、上の表の上半分には行き着かなかったと思います。

    DNSもTLSもWAFも、作る話ではなく、公開してから出てくる話だからです。教材の多くは動くところまでを扱っていて、そこから先は自分のドメインを持たないと出てきません。

    「必要になっていない知識」は、読んでも残らない

    実は、DNSの説明は以前にも読んだことがありました。読んだ記憶はあるのに、いざ設定画面を前にすると手が止まりました。

    困っていない状態で読んだものは、知識としては入っても、使う場所と結びついていません。結びつけるのは、詰まった経験のほうでした。

    1つ作り切ると、全部が繋がって出てくる

    もうひとつ効いたのは、これらがばらばらに出てこなかったことです。

    たとえば「表示を速くする」という話。キャッシュの置き場所を変えたら、公開作業の途中でCMSへ問い合わせに行くようになり、共用サーバーが混んでいると公開ごと止まるようになりました。速度の話をしていたつもりが、失敗したときにどうなるかを一緒に変えていたわけです。

    速度とサーバーの安定性と公開の仕組みは、別々に勉強していたら別々の知識のままでした。1つのものを動かし続けていると、つながっている場所のほうから見えてきます。

    範囲が決まっているから、終わりがある

    「全部やる」ではなく「このサイトを動かし続ける」が目的なので、どこまでやるかが自然に決まります。

    やらなかったことも多い。データベースの設計も、大量のアクセスをさばく話も、チームで開発する話も出てきていません。出てこなかったのは、必要にならなかったからです。

    作り切る、の意味

    ここで大事なのは「作る」ではなく「作り切る」のほうでした。

    手元で動かすところで止めていたら、公開に関わる領域は一切出てきません。公開しても放置していたら、運用で出てくる問題に当たりません。

    実際、上の表のうち半分以上は公開したあとに出てきたものです。作り終えてからのほうが、触る範囲は広がりました。

    どこで止めるか 出てこないもの
    手元で動いた ドメイン、証明書、サーバー、公開の仕組み
    公開した 検索エンジン、解析、速度、壊れたときの対処
    使い続けている —

    証拠が残るのも、同じ理由

    この一覧は、そのまま記事の一覧でもあります。詰まった場面を1つずつ書いてきた結果、60本を超えました。

    「勉強しました」と言うより、詰まった場所と直し方が並んでいるほうが、何ができるかは伝わります。狙って作った実績ではなく、作り切る過程の副産物です。

    今回の学び

    まず、触る範囲は、目的の広さではなく深さで決まるということ。「広く学ぶ」と決めて広がったのではなく、1つを最後まで進めたら、必要な順に出てきました。

    次に、困っていないときに読んだものは、使う場所と結びつかないこと。同じ説明でも、詰まった後に読むと入り方が違いました。順番としては、詰まるほうが先でした。

    そして、「作る」と「作り切る」では、出てくるものが違うこと。手元で動いた時点で止めていたら、触ったのは表の下半分だけだったはずです。公開して、使い続けて、初めて出てくるものがありました。

  • なぜこの構成にしたのか — ヘッドレスWordPress + Next.js の技術選定

    なぜこの構成にしたのか — ヘッドレスWordPress + Next.js の技術選定

    ポートフォリオサイトを、素のHTMLで書かれた静的サイトから「ヘッドレスWordPress + Next.js」という構成に作り直しました。前回までの記事では、実際にやった作業と、そこでつまずいた内容を書いてきました。

    今回は少し引いた視点で、そもそもなぜこの構成にしたのかを書きます。技術選定の話です。

    結論から言うと、この構成は万人向けではありません。個人のポートフォリオという規模に対しては、明らかに過剰な部分があります。それでも選んだ理由と、その代わりに何を失ったのかまで含めて残しておきます。選定の記事は、良い点だけ並べても参考にならないと思うからです。

    まず全体像

    完成した構成はこうなっています。

    訪問者のブラウザ

    ↓  https://www.kisaku.site
    Vercel
    Next.js(App Router / TypeScript)
    ページの見た目を作って返す

    ↓  GraphQL(サーバー間の通信)
    お名前.com 共用サーバー
    https://cms.kisaku.site
    WordPress(管理画面 + データベース)
    WPGraphQL / ACF

    記事を書くのはWordPressの管理画面。表示するのはNext.js。両者はGraphQLというやり取りの決まりでつながっています。

    用語

    ヘッドレスとは「頭がない」という意味で、この場合の”頭”は表示部分を指します。WordPressから表示機能を切り離し、データを保管して受け渡すことに専念させる構成のことです。

    なぜヘッドレスにしたのか

    元のサイトは素のHTML・CSS・JavaScriptで書かれた静的サイトでした。表示は速く、構成もシンプル。悪くありません。

    ただ、実績を1件追加するのにHTMLを直接編集する必要がありました。文章の言い回しを直したいだけなのに、エディタでタグを探して、間違えないように書き換えて、アップロードし直す。これを何度か繰り返すうちに、更新のしやすさが欲しくなりました。

    ここで普通に考えると、選択肢は2つあります。

    案 内容 更新のしやすさ 表示の自由度
    A 普通にWordPressテーマを作る ◎ △(PHPのテーマの作法に従う)
    B ヘッドレス構成にする ◎ ◎(フロントは完全に自由)

    案Aで十分だったと思います。実際、更新のしやすさだけが目的ならそれが正解です。

    それでも案Bを選んだ理由は2つあります。

    ひとつは表示側を自由に作りたかったこと。WordPressのテーマを作る場合、PHPのテンプレート階層という作法に沿うことになります。慣れれば速いのですが、今回は「もとのサイトの見た目を保ちつつ、新しい書き方で作り直す」のが目的だったので、表示側は白紙から書きたかった。

    もうひとつが正直なところ大きいのですが、学習目的です。普段の実務ではヘッドレスCMSやGraphQL、Next.jsのApp Routerに触れる機会がありません。自分のポートフォリオという、壊れても誰も困らない題材で試してみたかった、というのが本音です。

    注意

    技術選定において「学習目的」は立派な理由になりますが、それが理由であることを自覚しておくのは大事だと思います。仕事で同じ判断をするなら、案Aのほうが妥当な場面は多いはずです。

    なぜWordPressを残したのか

    ヘッドレス構成にするなら、データを持つ側はWordPressである必要はありません。microCMSやContentfulのような最初からヘッドレス前提で作られたCMSもあります。

    それでもWordPressを選んだ理由は3つです。

    1. 管理画面の完成度

    記事を書く画面、画像をアップロードする画面、カテゴリを整理する画面——WordPressのそれらは20年かけて磨かれています。自分で書くつもりなら、この使い勝手は無視できません。

    2. ACFによる構造化

    今回のサイトには「実績」と「スキル」という、普通の記事とは形の違うデータがあります。

    実績: タイトル / 説明 / 役割 / 期間 / 使用技術 / カテゴリ / 画像
    スキル: 名前 / 習熟度(10段階) / 説明 / カテゴリ

    これを本文にベタ書きすると、あとで「使用技術だけ一覧したい」といった扱いができません。ACF(Advanced Custom Fields)というプラグインを使うと、こうした項目を管理画面に専用の入力欄として追加できます。

    入力する側から見ると「役割」「期間」という欄が並ぶだけですが、データとしてはきちんと項目に分かれているので、表示側で自由に組み替えられます。

    3. 自分が慣れている

    実務でWordPressのテーマ制作をしてきたので、管理画面の構造もカスタム投稿タイプの考え方も分かっています。新しいことを1つ試すときは、他をなるべく既知のもので固める——今回はフロントエンド側で新しいことをたくさんやるので、CMS側は慣れたもので押さえておきたかった、という判断です。

    補足

    「学習目的だから全部新しくする」は失敗しやすいやり方です。問題が起きたとき、原因の候補が多すぎて切り分けられなくなります。実際この作業でも、原因を2回外して数時間を溶かしました。既知の部分が多いほど、その切り分けは楽になります。

    なぜNext.jsなのか

    表示側にはNext.jsを選びました。ReactというUIライブラリをベースにしたフレームワークです。

    選定理由は、サーバー側でデータを取ってHTMLを組み立てられる点にあります。

    Reactだけで作ると、ブラウザ側でJavaScriptが動いてからデータを取りに行く形が基本になります。この場合こういう流れです。

    【ブラウザ側で取得する場合】
    1. ブラウザが空っぽのHTMLを受け取る
    2. JavaScriptを読み込んで実行する
    3. そこからAPIにデータを取りに行く
    4. 返ってきたデータで画面を描く
       → 4に到達するまで、画面には何も出ない
       → 検索エンジンにも中身が伝わりにくい

    Next.jsのサーバーコンポーネントを使うと、この流れが変わります。

    【サーバー側で取得する場合】
    1. サーバーがWordPressからデータを取る
    2. サーバーが中身の入ったHTMLを組み立てる
    3. ブラウザは完成したHTMLを受け取る
       → 最初から中身が見える
       → 検索エンジンにも内容が伝わる

    ポートフォリオは検索から見つけてもらうことに意味があるサイトなので、この違いは重要でした。

    ちなみにこの選択が、後の大トラブルの前提にもなっています。サーバーがサーバーを呼ぶという通信経路ができるため、ブラウザから確認しても分からない問題が起きうるのです。実際、SSL証明書の不一致でデータが一切取れないという事態に陥りました。詳細は前回の記事に書いています。

    なぜGraphQLなのか(RESTではなく)

    WordPressには標準でREST APIという仕組みが備わっています。追加のプラグインなしで使えます。それでもGraphQLを選びました。

    RESTの場合に起きること

    REST APIは「URLごとに決まった内容が返ってくる」方式です。実績一覧が欲しければ、こう叩きます。

    GET /wp-json/wp/v2/project

    返ってくるのは、その投稿タイプが持つほぼ全部の項目です。使うのがタイトルと画像とカテゴリだけでも、更新日時も編集履歴のIDもコメント設定も付いてきます。

    さらに困るのが、関連するデータが別のリクエストになることです。

    1. 実績一覧を取る          → GET /wp/v2/project
    2. 各実績のカテゴリ名を取る  → GET /wp/v2/project_category?include=...
    3. 各実績の画像URLを取る     → GET /wp/v2/media?include=...
       → 画面ひとつ描くのに3往復

    GraphQLの場合

    GraphQLは「欲しい項目を書いて送ると、その形で返ってくる」方式です。

    query GetProjects {
      projects(first: 100) {
        nodes {
          title
          uri
          featuredImage { node { sourceUrl altText } }
          projectCategories { nodes { name slug } }
          projectDetail { role period toolsused }
        }
      }
    }

    これで1回のリクエストです。画像もカテゴリもACFの項目も、まとめて必要なぶんだけ返ってきます。

    決め手は型の自動生成だった

    ただ、往復回数の削減だけならRESTでも工夫でどうにかなります。決め手になったのは別の点でした。

    GraphQLにはスキーマという「どんなデータがどんな形で存在するか」の定義があり、これを機械が読み取れます。この性質を利用したのが GraphQL Codegen というツールです。

    npm run codegen

    これを実行すると、書いたクエリを読み取ってTypeScriptの型定義を自動生成してくれます。結果として、エディタ上でこうなります。

    project.  ← ここまで打つと、使える項目が候補に出る
    project.titel  ← 打ち間違えると即座に警告が出る

    ACFで項目を追加してWordPress側の構造が変わっても、コマンド1つで型が追従します。手で型を書き直す必要がありません。

    選定の勘所

    GraphQLの利点として真っ先に挙げられるのは「必要な項目だけ取れる」ことですが、個人サイト規模ではその差は体感できません。実際に効いたのは型の自動生成でした。 よく語られる利点と、自分の状況で効く利点は違うことがあります。

    なぜVercelなのか

    Next.jsを公開する場所として、Vercelを選びました。Next.jsを作っている会社が運営しているサービスです。

    理由は3つあります。

    1. GitHubに置くだけで公開される

    GitHubにコードをpushすると、Vercelが自動で検知してビルドし、公開まで済ませます。手作業のアップロードが要りません。今回の作業でも、修正をpushするたびに自動で本番へ反映されました。

    2. 設定がほぼ不要

    Next.jsのプロジェクトだと自動で判別され、必要な設定はほぼありません。実際に指定したのは2つだけでした。

    Root Directory : frontend
    環境変数        : NEXT_PUBLIC_WORDPRESS_API_URL

    3. 個人利用なら無料

    ポートフォリオ程度のアクセス数なら無料枠に収まります。独自ドメインの接続もSSL証明書の発行・更新も無料で自動です。

    SSL証明書は通常90日で期限が切れ、更新が必要です。これを忘れるとサイト全体が「安全でない接続」と表示されて事実上使えなくなります。Vercelはこれを自動でやってくれるので、運用の手間がひとつ消えます。

    なぜCMSは共用サーバーのままなのか

    ここは技術選定というより、現実的な事情です。

    WordPressをVercelに置くことはできません。PHPとデータベースが必要だからです。置き場所は別に必要になります。

    選択肢はいくつかありましたが、もともとお名前.comの共用サーバーを契約していて、旧サイトがそこで動いていました。新しく契約すれば月額が増えます。既存の契約で足りるなら、それでいい。

    ただし、この判断には代償がありました。

    実際に起きたこと

    共用サーバーは設定の自由度が低く、次の問題に当たりました。SSL証明書がホスト名と一致せずVercelから接続できない、PHPの設定ファイルがディレクトリごとにしか効かない、WordPressが /wp/ という予期しない場所にインストールされる、クエリ文字列付きのアクセスがWAFに遮断される。安く済ませたぶん、原因調査に時間を使いました。

    とはいえ、これらは調べれば分かる範囲の問題でした。学習目的という文脈では、むしろ良い題材だったとも思っています。

    この構成で払った代償

    ここが、この記事でいちばん書きたかった部分です。

    1. 管理する場所が2つになった

    静的サイトなら、置き場所は1つでした。いまは2つです。それぞれにドメイン、SSL証明書、更新、バックアップの管理が発生します。

    【静的サイト】 1箇所
    【今の構成】   Vercel + 共用サーバー = 2箇所
                   + GitHub(コードの置き場所)= 実質3箇所

    2. CMSが落ちるとサイトが空になる

    これがいちばん大きい代償です。表示側と、データを持つ側が分かれているということは、データ側が落ちると表示側は空を返すということです。

    実際、SSL証明書の問題でWordPressに接続できなかったとき、サイトは正常に表示されるのに実績もスキルも記事も1件も出ない状態になりました。しかもHTTPステータスは200なので、普通の死活監視では検知できません。

    静的サイトなら、こんなことは起きません。HTMLに中身が書いてあるからです。

    3. 分業ゆえの複雑さ

    ヘッドレス構成では「サーバーがサーバーを呼ぶ」経路ができます。この経路はブラウザからは見えません。

    従来:ブラウザ → WordPress
    今回:ブラウザ → Next.js(Vercel) → WordPress
    ※ 後半の「Next.js → WordPress」はサーバー同士の通信なので、ブラウザの開発者ツールからは確認できない。

    今回、ブラウザからは正常にアクセスできるのにサーバーからは失敗する、という状況で数時間はまりました。確認方法そのものを間違えていたわけです。この落とし穴は、構成を分けたことの直接の帰結です。

    4. ビルドという工程が増えた

    静的サイトはファイルを置けば公開できました。いまはビルドが必要で、そこが失敗すると公開できません。実際、最初のデプロイは自動生成ファイルの不足で失敗しています。

    静的サイト 今の構成
    更新のしやすさ ×(HTML直接編集) ◎(管理画面から)
    表示側の自由度 ◎ ◎
    管理する場所 1つ 3つ
    壊れにくさ ◎ △(CMSに依存)
    公開までの手数 ファイルを置くだけ ビルドが必要
    学べること 少ない 多い

    選ばなかった選択肢

    静的サイトジェネレータ + Markdown

    AstroやHugoなどで、記事をMarkdownファイルとして書く方式です。CMSが不要になるので、構成は圧倒的にシンプルになります。管理場所も減り、CMSが落ちる心配もありません。

    選ばなかったのは、記事を書く体験を落としたくなかったからです。画像の挿入、下書きの管理、公開日の設定——このあたりはWordPressの管理画面のほうが圧倒的に楽です。文章を書くこと自体のハードルは下げておきたい、と考えました。

    ヘッドセスCMS(microCMS / Contentful など)

    最初からヘッドレス前提のCMSです。サーバーの管理が不要になるのが大きな利点で、今回はまったSSL証明書やPHP設定の問題は最初から発生しません。

    選ばなかった理由は、既にWordPressの資産(記事・画像・構造)があったこと、そして自分が慣れていることです。ゼロから始めるなら、こちらのほうが素直だと思います。

    WordPressのテーマとして普通に作る

    冒頭に書いた案Aです。この規模では、いちばん妥当な選択だったと思います。管理場所は1つ、ビルド不要、CMSが落ちればサイトも落ちるという単純明快な構造。

    選ばなかったのは学習目的が大きいのですが、正直に言えば「新しい構成を試したかった」という動機が最初にあり、理屈は後から整理した部分もあります。

    この構成が向いている人

    一通りやってみて、こう思っています。

    向いている

    フロントエンドの表示を完全に自分で制御したい人。React/Next.jsを実践的に学びたい人。すでにWordPressの資産と運用の慣れがある人。サイトが一時的に壊れても困らない立場の人。

    向いていない

    とにかく早く公開したい人。運用に手をかけられない人。止まると業務に影響が出るサイトを作る人。管理場所が増えることを許容できない人。

    最後の点が重要だと思っています。今回の構成は部品が増えたぶん、壊れる箇所も増えました。実際、公開までにSSL証明書、DNS、環境変数、ビルド設定と、それぞれ別の理由で止まっています。

    そのすべてが学びになったのは、これが止まっても誰も困らない自分のサイトだったからです。同じ構成を仕事で採用するなら、この「壊れる箇所の多さ」を運用体制で引き受けられるかどうかが判断の分かれ目になります。

    技術選定に唯一の正解はありませんが、何を得て、代わりに何を失ったのかを説明できる状態にはしておきたい——今回それを整理してみて、そう感じました。