プログラミング
Show HN: Pure Effect – DBなしでラップトップ上で本番環境のバグを再現
Show HN: Pure Effect – Reproduce production bugs on your laptop without a DB (pure-effect.org)
要約
Pure Effectは、TypeScript/JavaScript向けの小さなエフェクトライブラリで、I/O操作をビジネスロジックから分離し、その説明を返すことで、本番環境のバグのデバッグとテストを劇的に改善します。これにより、ビジネスロジックは純粋な関数となり、モックなしでテストでき、完全な実行トレースを無料で提供し、AI生成コードの安全なレビューを可能にするなど、多くの利点をもたらします。わずか1KB未満、依存関係ゼロで、既存のコードに簡単に組み込めるパターンとして利用できます。
全文翻訳
Hacker Newsの皆さん、こんにちは。
I/Oがビジネスロジックに絡んだコードを書くことに、ほとんどの開発者が何の疑問も抱かないと言っても過言ではないと思います。次のようなコードはあまりにも一般的です。
```typescript
const user = findUser(email);
if (!user) await saveUser(user);
```
さて、あなたはこう尋ねるかもしれません。「何が問題なんだ?」このようなコードを書くと、二つのことが起こります。
1. 本番環境のバグのデバッグが難しくなります。まったく同じデータベースやリモートAPIサービスに接続できない限り、バグを再現できない可能性があります。
2. テストでモックやフェイクを使用するか、テストコンテナを使用する必要がありますが、これらはいくらか役立つだけで、動作が遅いです!
これらの問題を解決するために、私は小さなTypeScript/JavaScriptエフェクトライブラリであるPure Effectを構築しました。核となるアイデアはシンプルです。関数がI/Oを実行する場合、それは純粋ではありません。しかし、実行したいI/Oの「説明」を返す場合は純粋です。したがって、`await findUser(email)`の代わりに、「この関数を呼び出したい、そしてそれが完了したら次のようにする」というCommandオブジェクトを返します。あなたのビジネスロジックは純粋な関数になります。同じ入力、同じ出力、毎回。インタープリタ(`runEffect`)が実行されるまで、データベースは決して触れられません。
このライブラリを最初に作り始めたとき、その一つのアイデアがこれほどまでに広がることを予想していませんでした。パイプラインが単なるデータになると、多くの素晴らしいことが可能になります。
* モッキングライブラリは不要です。テストでツリーを辿り、その構造をアサートします。`assert.equal(flow.cmd.name, 'cmdFindUser')`。何も実行されません。
* 任意の効果を`Retry(effect, { attempts: 3, delay: 200, backoff: 2 })`でラップします。設定はプレーンなデータなので、テストでアサートできます。
* すべてのコマンドの入力と出力はインタープリタを介して流れるため、完全な実行トレースを無料で得られます。シンプルな`timeTravel()`関数を記述して、I/Oに触れることなくローカルで再生できます。複雑な本番バグのデバッグに最適です。
* `onBeforeCommand`フックは、ビジネスロジックとインタープリタの間に位置します。意図されたすべての副作用が実行される前にそれを認識するため、ランタイムのガードレールを強制するために使用できます。たとえば、破壊的な呼び出しが発生する前にそれを隔離できます。
* AIが生成したコードを実行する前にレビューできます。Pure Effectのパイプラインはプレーンなデータであるため、生成されたコードが何かに触れる前に、それが何を意図しているのかを検査できます。
プリミティブはSuccess、Failure、Command、Ask、Retry、Parallelのわずか6つで、`effectPipe`と`runEffect`があります。依存関係はゼロです。ミニファイおよびgzip圧縮で1KB未満です。
Effect-TSとの比較
Effect-TSはこの分野のフル機能オプションであり、大きなエコシステムを持っています。Pure Effectは異なるトレードオフを提供します。テスト可能なパイプライン、依存性注入、リトライ、OpenTelemetryフックなど、80%のケースをカバーし、これらすべてを1KB未満、依存関係ゼロ、そして新しい用語を学ぶ必要なしで提供します。Effect-TSは、その周りに構築するフレームワークです。一方、Pure Effectは既存のコードにドロップインするパターンです。
私は12月から本番環境でPure Effectを使用しています。まだv1.0ではなくv0.8.0ですが、安定しているので公開して皆さんの意見を聞きたいと思いました。
GitHub: https://github.com/aycangulez/pure-effect
Pure Effectがどのように進化したかを文書化した5つの投稿を書きました。詳細なストーリーを知りたい場合は、https://lackofimagination.org/tags/effect/ にタグ付けされています。