どうも、おはようございます。マイクでーす。
時刻は朝7時を少し回ったところ、2025年12月22日、月曜日です。
この番組「zenncast」では、きょうもZennで話題になっているトレンド記事を、いっしょにゆるっとチェックしていきたいと思います。

さて今日は、お便り紹介はお休みで、そのぶんガッツリ記事を追いかけていきます。
取り上げる記事は全部で5本。技術よりの記事が多めなんですが、できるだけ噛み砕いて、ラジオで聞いても雰囲気が伝わるようにお話ししていきます。

それでは、さっそく1本目からいきましょう。

きょう最初に紹介するのは「最速最強の Markdown コンパイラ作るぞ」という記事です。
Markdownって、エンジニアの方だけじゃなく、ドキュメント書いたり、ブログ書いたり、けっこう身近な記法ですよね。この記事の著者は、そのMarkdownを超高速でパースしてくれるコンパイラを「Moonbit」という言語で作った、というお話をしています。ポイントは「インクリメンタルパース」という仕組みで、文章を全部毎回読み直すんじゃなくて、編集した周辺だけサッと解析して、前の結果とうまくマージする方式をとっています。その結果、ドキュメントがどれだけ長くなっても、編集のたびのパース時間はだいたい10マイクロ秒くらい、とんでもなく速い世界を実現していると。
おもしろいのが、「全部のMarkdown仕様にキッチリ準拠する」よりも、「エディタで気持ちよくリアルタイムプレビューが動くこと」を優先しているところです。CommonMarkのテストはまだ全部は通していないけれど、GitHub風の拡張はしっかり対応していて、実際の開発体験を重視している。さらに、MoonbitのWebAssemblyバックエンドの性能のよさや、ビルドサイズの小ささにも触れていて、「エディタ機能をWebでもネイティブでも動かしたい」みたいなクロスプラットフォームなユースケースにかなり向いてるよ、と高く評価しています。AIとも対話しながら実装を進めたプロセスにも触れていて、「AIを相棒にしながら低レイヤの高速実装をやる」みたいな、いまっぽい開発スタイルが垣間見える記事でした。

。。。。

続いて2本目。「イベントソーシングから学ぶ、削除をドメインの言葉で表現する設計」という記事です。
ここでいう「削除」って、データベースのレコードを消す、あの削除のことですね。多くのシステムだと「削除フラグ」ってありますよね。フラグが立ってたら消したことにする、みたいな。でもこの記事では、その「なんでも削除フラグで済ませる」のはアンチパターンじゃないか、と問題提起をしています。なぜかというと、ビジネス的には「退会」「一時休止」「BAN」「誤登録だったので取り消し」など、ぜんぶ意味が違うのに、技術的にはただの「deleted = true」でまとめちゃうと、あとで分析したり、仕様を理解したりするときに、何が起きたのか分からなくなってしまうからなんですね。
そこで紹介されているのがイベントソーシングとCQRSの考え方です。書き込み側では「退会した」「BANされた」といった意味ごとのイベントをしっかり記録する。型レベルでも「この状態のユーザーにはこの操作はできない」といった制約を持たせて、バグを防ぐ。一方で、読み込み専用のビューは用途ごとに自由に設計して、「全会員検索用」「退会者の分析用」「有料会員向けAPI用」といった具合に分けてしまう。その上で、削除フラグにするか、物理削除するか、別テーブルに移すかは、そのビューの用途に合わせて選ぶ、という発想です。
記事のいいところは、「イベントソーシングを採用しないプロジェクトでも、この考え方は応用できるよ」とちゃんと踏みとどまってくれているところで、「削除を状態遷移として捉える」「書き込みと読み込みで削除の扱いを分ける」「技術用語じゃなく、ドメインの言葉でモデリングする」という三つの視点は、どんなシステムでも役立つよ、とまとめています。

。。。。

3本目は「Prisma 7 がつらくて Atlas + Kysely に移行した - Turso + better-auth 環境での実践」という記事です。
これは、TypeScriptやReactあたりを触っている方には、かなりリアルに刺さる内容じゃないかなと思います。著者は、React Router v7と、TursoというSQLite互換の分散DB、それからbetter-authという認証ライブラリを組み合わせた環境でPrisma 7を使っていたんですが、これがなかなか大変だったと。SQLite系ではドライバーアダプターが必須になったり、設定が複雑化したり、Turso用のCLIサポートがなくてマイグレーションを自前で面倒見る必要があったり、生成されるコードの量も巨大になってしまったりと、だんだん開発体験が重くなっていったそうです。しかも、実測でパフォーマンスもあまりよくなかったということで、思い切って構成を変えています。
そこで選ばれたのが、スキーマ管理を担当するAtlasと、クエリを書く側を担当するKyselyという組み合わせ。Atlasは「SQLファースト」でスキーマを宣言的に管理できて、しかもTurso公式サポートあり。KyselyはTypeScriptで書ける軽量なクエリビルダーで、余計な巨大コードを生成しない。PrismaスキーマからSQL DDLを出してAtlasでマイグレーション管理し、Kyselyとkysely-codegenで型情報だけうまく取ってくる構成にすることで、生成コードは1万行以上から100行くらいまで一気に減ったそうです。依存関係や設定もだいぶスリムになって、エディタの動作も軽くなり、実行時パフォーマンスも向上したと。
おもしろいのは、「Prismaがダメ」という話ではなく、「このスタック、この要件だと、Atlas + Kyselyのほうがフィットしていた」という、けっこうフェアなまとめ方をしているところです。Prismaでつらさを感じている人も、逆にPrismaは快適だけど、SQLファーストな世界も気になっている人も、選択肢の一つとして読んでみると、判断材料が増える記事になっています。

。。。。

4本目は「Go の test における flag パッケージ活用Tips」という記事です。
Goを書いている方ならおなじみの「go test」コマンドですが、その裏でひっそり活躍しているのが標準のflagパッケージ。この記事では、そのflagをテストで便利に使うための具体的なテクニックがまとまっています。やることはシンプルで、ふだんのmainパッケージと同じように、テストコード側でグローバルなフラグ変数を定義しておけば、go testが自動的にflag.Parseを呼んでくれるので、追加の処理なしで `go test -update` みたいなオプションが使えるようになる、という話ですね。
活用例がいくつか紹介されていて、たとえばGolden Testでの利用。期待値ファイル、いわゆるゴールデンファイルやREADMEを、`-update`フラグ付きでテストを走らせたときだけ自動更新することで、「普段は厳密に比較」「仕様変更するときだけ一括更新」という運用がやりやすくなります。他にも、デバッグ用フラグで詳細ログを出したり、dryrunモードで副作用を抑えたり、重いテストの実行時間をもっと細かく制御したり、SIMDみたいな実験的機能をON/OFFするfeature flagに使ったりと、ローカル開発での検証を柔軟にする例が紹介されています。
面白いのは、「これはCIを凝るためのテクニックというより、開発者が自分の手元でサクッと確認するための道具だよ」と位置づけているところですね。`go test -calibrate`みたいな、テストだけど半分はツール的に動くコマンドを用意しておくことで、ワンライナーで便利スクリプトを呼び出せる。その発想が、Goらしいシンプルさと相性がよくて、読んだらすぐ試したくなるTips集になっています。

。。。。

そして最後、5本目の記事は「タイミーの1,200万超ユーザーを支える認証基盤を Go と Ory Hydra で作っている話」です。
タイミーといえばスキマバイトのサービスで、ワーカー向けのユーザー数が1,200万人を超えているという、かなり大規模な環境です。この記事では、そのワーカー向けの新しい認証基盤「Worker IdP」をどう設計しているかが紹介されています。OAuth2やOIDC準拠で、かつ将来の拡張も見据えた設計にするため、認可サーバーの役割はOSSのOry Hydraに任せつつ、認証ロジックやユーザー管理はGoで書かれたidm-backend、ログイン画面とBFFはReact Router v7で作ったidm-frontendが担当する、という役割分担になっています。プロトコル周りのややこしいところはHydraに任せつつ、SMS認証など「サービスとしてどう体験を作るか」の部分は自前で柔軟に設計しているのがポイントですね。
インフラ的にも工夫があって、Hydraとバックエンド、フロントエンドを同じドメイン配下、ECS上に集約することで、Cookieの扱いを安定させています。既存システムからの移行も、一気に切り替えるのではなく、Timee側のDBとIdP側のDBへの二重書き込みをしながら、段階的に進めている。その際に、共通のドメインモデルを使うデータ整合性チェッカーや、ビジネスルール検証ツールを用意して、古いDBのスキーマ差やデータ品質のばらつきを吸収しつつ、「移行中のズレ」が起きていないかを継続的に監視しているそうです。
今後はカナリアリリースでの慎重な切り替えや、パスキー対応なども見据えていて、「大規模サービスの認証をどう安全に進化させていくか」のリアルな知見が詰まった記事になっています。認証基盤に関わっている方はもちろん、マイクロサービス化や大規模リプレイスに関心のある人にも、参考になるポイントが多い内容でした。

。。。。

というわけで、きょうのzenncastは、全部で5本の記事を駆け足で紹介してきました。
おさらいすると、まずは超高速なMarkdownコンパイラをMoonbitで実装した話。続いて、「削除」という行為をちゃんとビジネスの言葉で表現しよう、というイベントソーシングとCQRSの設計の話。3本目はPrisma 7からAtlas + Kyselyへ移行して、SQLファーストで軽快な開発体験を取り戻した事例。4本目が、Goのテストでflagパッケージを活用して、ローカル検証をもっと便利にしようというTips集。最後は、タイミーの1,200万超ユーザーを支える認証基盤を、Ory HydraとGoでどう作っているかという大規模な実践例でした。

気になった記事があった方は、このあとショーノートにタイトルやキーワードをまとめておきますので、ぜひじっくり本編も読んでみてください。
そして、この番組「zenncast」への感想や、「このテーマ深掘りしてほしい!」といったリクエストも、どしどしお待ちしています。あなたの一言が、次回の内容を決めるヒントになるかもしれません。

それでは、きょうも良い一日をお過ごしください。
お相手はマイクでした。また次回のzenncastでお会いしましょう。バイバーイ。

Related episodes

内容の近いエピソードを推薦しています