このブログについて、2年間考えていました。
「欲しい」と言うのは実は正確ではなく、むしろ執念に近い。最初はフロントエンドやバックエンド、組み込みコードさえ書けなかった頃に芽生えた。まだ電子工作をしていて、たまたま@ushioのBilibili動画とサイトを見つけ、面白そうだと思って自分もやってみたくなった。その後、半年ほどかけてゼロからC言語と少しのJS/CSSを書けるようになり、Hexetで静的ブログを作ってGitHub Pagesにデプロイした。これで自分だけの小さな世界ができた。


再后来,看到了 @Innei 的小站,设计很精致、功能也很全,当时的我看了一眼我就想要,甚至还赞助支持了,虽然后面没用上但是这钱也花的不怨 因为我摸到了 React 源码,就和我最初看到 C 一样,不过就是代码嘛,有什么大不了的,总有一天我要自己写一个。

その後、@Innei の小さなサイトを見つけました。デザインはとても精巧で、機能も充実しています。その瞬間、ひと目見ただけで欲しくなり、実際にスポンサーとして支援しました。後に使うことはなかったものの、支払ったお金を後悔はしていません。React のソースコードに触れたことで、最初に C を見たときと同じ感覚になりました。コードはコードですから、大したことではありません。いつか自分で書く日が来ると信じています。
静かな森
それは2024年でした、そして24、25、26年が現在まで
それ以来、止まらなくなった。
制御不能
最初は、@colmugx の Hexo テーマ Nlvi にライト/ダーク切り替えを追加したかっただけです。Dark Reader の JavaScript を適当に貼り付けましたが、見た目が悪く、満足できませんでした。その後 CSS @media を学び、次に JS SPA の切り替え、TailwindCSS の .dark クラス、さらに SSR の next-theme、最後に Cookie と Head Sync Inline スクリプトを手作業で組み合わせて FOUC のちらつきを解消しました。結局、4、5通りの案を試しました。

しかし、これは氷山の一角に過ぎません。React を見た後、石器時代の Hexo と Vanilla JS から Next.js 13 Page Router まで一直線に進み、そこから Vue に手を伸ばし、SPA ルーティングを研究し、index.html のフォールバックを理解し、無数のプロジェクトを新規作成しました。サーバーを購入し、Docker、Nginx、NAS をいじり、1Panel が見苦しいと感じて Canopy パネルを手書きし、NAS のストレージアレイを調査して RFS を書きました。SSL の設定では国内環境に悩まされ、acme.sh が手に負えなくなったため、Rust でリバースプロキシ(Vane & Lazyacme)を書きました。元々は一晩で三時間書いた800行ほどのゴミコードでしたが、友人に誘われて四か月かけて HTTP/3、Zero‑Copy、Layer モデル、Flow エンジンをすべて詰め込みました。その後、Seam という全スタックフレームワークもありますが、これもまた厄介なものです。続きはまた今度。
過度エンジニアリング
そして AI 時代がやって来て、不安は倍増した。
最も皮肉なことは、これらのことはブログを始めた後に、記録しながら実行すべきだったということです。しかし、ブログは何度も放棄され、アイデアはどんどん増えていくのに、記録できる場所がありませんでした。一方では自分の内面が非難しています;Vane を完成させると約束したのにできず、止めました。もう一方では、遠ざかるにつれて無力感が増すのを感じます。やりたいことは常に覚えているのに、実現できません。よく考えると、かなり長い間、何かを書き下ろすために座っていなかったことに気づきます。今振り返ると、すべては同じもの――過剰なエンジニアリングに指し示しています。
その時、実際には自分が逸れているとは全く思っていなかった。Vane?とにかく、ブログは将来デプロイしなければならないので、リバースプロキシは必須だろう。Seam?結局フルスタックを書かなければならない時が来るので、理想とするフレームワークを先に整えておこう。すべてのステップには理由があり、すべてが「後で使える」ことになる。でも問題は、「後で」は決して来ないということだ。なぜなら、私は一度も実際に始めていないから…
失敗
ブログを書くこと自体はリバースプロキシも自作フレームワークも必要ありませんでした。当時の私はそれらを前提条件とみなし、永遠にブロックされる合理的な理由として挙げていましたが、実際にはそうではありませんでした。実際の唯一の前提条件はただ一つです:座って最初の記事を書き上げることです。
実はブログは手をつけていないわけではなく、むしろ3回やっています。

最初はまだ Next.js 13 Page Router の頃でした。その頃は SPA が何かほとんど分からず、SSR、SSG、ISR といった概念も全く理解できていませんでしたが、他の人が SSR が良いと言うので私も使ってみたくなりました。書き進めていくうちに、これらのアーキテクチャがどんな問題を解決しようとしているのか全く理解できていないことに気づき、続けることができなくなりました。その後、Vue 2 の純粋な SPA に切り替えましたが、なぜ Vue を選んだかと言うと、正直に言うと名前がかっこよくて、新しかったので試してみたからです。長くは続きませんでした。三度目は React に戻り、シンプルな JSX から始め、TypeScript を学び、TSX も使えるようになり、CJS と ESM の違いを理解し、リアクティブプログラミングに恋をし、Lucide、Framer Motion、Radix UI など、今や手放せないライブラリを使い始めました――今回ようやく形が見えてきた感覚です。しかし結局失敗しました。根本的に私はただ模倣していただけで、他人が使うものをそのまま取り入れ、見た目はそれっぽくても、なぜそうするのか全く理解していなかったからです。さらに AI の幻覚に加えて、多くのものを MVP として動かすことはできましたが、スケールアップするとすべてが落とし穴だらけでした。

後にReact(Remix)Router LoaderやNext.js 15 App Router、RSCも学びましたが、その頃は日常がとても忙しく、コードを書く時間がほとんどなく、4回目の失敗する機会すらありませんでした。今振り返ると、私のサイトはNext.js 13からNext.js 15へと移行し、移行が終わったばかりでまだ公開していないうちに、Next.js 16 beta‑1が出てしまいました。
手放す
「想开了」と言うのは実際には正確ではなく、私が疲れているからだ。

AI時代のリズムは速すぎる。モデルは次々にイテレーションされ、新技術が次々と出てくる。止まってしまうと追い抜かれるようで、ますます不安になる。最も狂っていたときは、一日に16個の小さなコードを書き、Tokenは一日で約1.9千米ドルを燃やすことができ((大体2月頃だと考えられる))、人はほぼ疲れ果てていた。しかし、すべてを止めさせたのは何かの悟りではなく、単なる疲労だった。ますます速くなるペースの中で、最後の一本の藁が落ち、逆に解放感を得て、心が開き、諦めた;こうして、結局はかなり良いことだ。
私は手放し始めた。かつて執着していたものを手放し、ほどほどに止めることを学び、明日のことは明日やる。Vane がまだ終わっていない?まずは放っておく。Seam はまだ遠い?後でやる。ブログは完璧でなくても?まずは公開する。完全に Vibe Coding を始め、問題がなければ放置し、問題があれば後で対処する。
不思議なことに、手放した後でも品質は低下しなかった。これはおそらく、以前の「古法」プログラミングの日々が無駄ではなかったからだと思う。GPT‑2 の時代からすでに AI を使い始めていたが、その頃はまだ一行一行を書き、すべての概念を理解しようとしていた。その経験が基盤となり、後の Vibe Coding と呼ぶよりむしろ Context Coding と呼んだ方が適切で、必要な判断力は依然として残っており、手放したからといって低レベルのミスや事故が起きたわけではない。
これまでのすべての苦労が、今、手放すための資本を与えてくれた。
原点
最終的なソリューションはむしろとてもシンプルです:All in Cloudflare。R2 オブジェクトストレージ、D1 Edge データベース、KV をキャッシュに使用し、Worker が SSR を実行、すべてサーバーレスで、サーバーはありません。

この答えは皮肉ですか? とても皮肉です。なぜなら、この「シンプル」な終点に到達する前に、一周回って遠回りをしたからです。かつて自前で構築しようと計画したので、サーバーの管理や Docker のいじり、コンテナの管理が必要になり、そこで管理パネルとして Canopy を、証明書管理のために Lazycert を、リバースプロキシとして Vane を、リソース監視のフックとして Twig を書きました。一揃いのプロジェクトは、結局ジャンクサーバーを世話するためだけのものでした。
ストレージも同様です。オブジェクトストレージが高いのが嫌で、自分のサーバーのハードディスクを使いたくなり、RFSというVFSを書きました。単一ファイルの原子的な重複排除と統合のためのもので、80〜90年代のレジストリ概念さえ復活させ、最終的にFUSEでマウントしました。その結果、あまり良くないホイールを作るのにさらに時間を費やし、サーバーは一年間ほぼ稼働せず、完全に赤字のビジネスになってしまいました。

結局、いろいろ回りくねって最終的に Serverless に戻ってきました。Vercel のコンセプトは良いですが、Next.js は好きではありません。さらに、Vercel の「魔法」が多すぎて、Edge で実行するために事前にコンパイルするミドルウェア設計は結局分断され、いくつかの CVE さえ発生しました。すべてをオリジンにまとめた方が良いでしょう。一方、Cloudflare Workers は非常に優れており、10 MB 未満の成果物を WASM にコンパイルして Edge 上で実際のビジネスロジックを実行できるという別の極端なアプローチを実現しています。これこそが私が望むものです。費用以外に欠点はほとんどありませんが、時間を節約すればそれはすなわちお金になるので、実質的な欠点とは言えません。
少ないほど多い
この言葉は何度も聞いたことがありますが、実際に意味を理解するのに二年かかりました。
エンジニアリングの本質は「Make it function, make it correct, then make it exceptional.」ということです。やっと正しい軌道に乗り、functional にしました。今のブログは質素ですか? 質素です。不完全ですか? 確かに不完全です。でも、何もないよりはマシです。もしリリースすらできずに「もしかしたら必要かもしれない」ものを作り続け、見えない完璧を追い求めていたら、最終的に何も提示できません。これは妥協ではなく、エンジニアリング上の取捨です。とにかく、私は納得しました。だから、もう細部にこだわらず、外に出ました。スマホのアルバムにはしばらくアウトドアの写真がなく、路肩をさっと撮ったら――ずいぶん長い間外出してませんでした。

振り返って、以前通った遠回りを後悔しますか?後悔しません。自分で試さなければ、一生理解できないこともあります。さらに、AI 時代において、昔私が歩んだ道をたどろうとしても、ほとんど機会がなくなっています。多くのワークフローがすでに変わってしまいました。また、このプロジェクトは Taki で、100% AI コーディングですが、長期的にメンテナンスできないというわけでもなく、人味がないというわけでもありません。実際、AI があるかないかは重要ではなく、むしろ私が好きなのはコードを書くことそのものではなく、何かを作り上げることです…