2025/07/29 14:26 Structuring large Clojure codebases with Biff

ロボ子、Yakreadのリライトが進んでいるみたいじゃな。Biffの新機能も試されているらしいぞ。

Yakreadのリライトですか。以前のコードベースは1万行もあったそうですね。かなり肥大化していたと。

そうなんじゃ。で、新しいYakreadのアーキテクチャはBiffにも導入される予定らしいぞ。これは楽しみじゃ。

オープンソースで公開されているのも良いですね。ところで、古いYakreadには遅いクエリが多かったとのことですが、具体的にはどのような問題があったのでしょうか?

例えば、購読ページの読み込みに10秒以上かかっていたらしいぞ。これはユーザー体験を損なうから、改善は必須じゃ。

従来の解決策としてはデータモデルの非正規化が考えられますが、それだと手に負えなくなる可能性がある、と。

そうなんじゃ。そこで、XTDB用のマテリアライズドビューを実装して、RocksDBに保存することで解決したらしいぞ。賢い!

BiffがRocksDBのセットアップやデノーマライザー関数の実行を処理してくれるんですね。XTDBのスナップショットと一貫性のあるクエリも提供してくれるとは。

Materializeも試したみたいじゃが、メモリオーバーヘッドが大きすぎたらしいぞ。やはり、適材適所じゃな。

Fugatoというツールも使われているんですね。データベーススキーマからテストデータを生成してくれるとは、テストが楽になりそうです。

新しいYakreadのアプリケーションコードは100%純粋らしいぞ。ユニットテストでモックの設定や副作用のチェックが不要とは、素晴らしい!

各関数がステートマシンに変換され、状態が純粋な計算またはエフェクトハンドラーになる、と。副作用はエフェクトとして記述するんですね。

そうなんじゃ。エフェクトフルな状態はエフェクトを実行して、純粋なアプリケーションロジックに戻る。この構造は美しいのじゃ!

Chris Badahdah氏のアドバイスで、開発中にユニットテストを作成するようになったんですね。良い習慣ですね。

状態マシンの実行コードは、トレースと例外処理コードを配置するのに便利らしいぞ。なるほど。

Pathomリゾルバーに分割されているんですね。XTDBエンティティのリゾルバーを自動生成するヘルパー関数もあるとは。

Pathomを使うと、ドメイン内の各フィールドのリゾルバーを定義できるんじゃ。データベースからデータをフェッチしたり、派生データを返したり。

最初にクエリを送信して結果を取得し、そのデータをアプリケーションコードに渡すんですね。モデルコードとビューコードの分離に役立つ、と。

各GETリクエストハンドラーはPathomクエリを定義し、ミドルウェアがクエリを実行して結果をハンドラー関数に渡す。UIフラグメントも返すらしいぞ。

Fulcroと同様に、各UIコンポーネントは独自のクエリを宣言するんですね。Yakreadはhtmxでサーバーサイドレンダリングされるから、バックエンドPathomリゾルバーを使用する、と。

Yakreadのリライトはまだ完了していないみたいじゃが、実験段階はほぼ終了したらしいぞ。フレームワークの機能はすべて実装済みで、残りのアプリを完成させるだけじゃ。

完了後、Yakreadからさまざまな部分を抽出して、Biffの一部としてリリースする予定なんですね。楽しみです。

そうじゃな!しかし、これだけ色々やっていると、まるでソフトウェア開発版の錬金術じゃな。賢者の石はまだかの?

博士、錬金術はちょっと違う気がします… でも、バグを金に変える錬金術なら、エンジニアはみんなやっているかもしれませんね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
