【TsKaigi】「複雑なビジネスルールに挑む:正確性と効率性を両立するfp-tsのチーム活用術」を聞きました

複雑なビジネスルールに挑む:正確性と効率性を両立するfp-tsのチーム活用術

tskaigi.org

kosui さん

株式会社カケハシ / テックリード

@kosui_me

内容メモ

発表の狙い

複雑なビジネスロジックでも、正確性と効率性を両立するために、どのようにfp-tsを活用したか、チームで運用するためにどんな工夫をしたのか。

SaaSエンタープライズ対応と、Excel一括入稿の重要性の背景

今までDXが進んでいなかった分野でも、デジタル化が進んでいる。

大企業や行政でもバーティカルSaaS業界も採用されてきて、要求される機能や品質も変化していった。

個人、抽象企業向けだと、データは少量で構造もシンプル。なのでGUIからデータ入力できればよかった。

しかし、大企業や行政向けだと、GUIから入力するのが現実的ではなくなる

これをExcel一括入稿したいと考える。

しかし、これが辛い

なぜ辛いか

入稿してみる→エラーが出てくる→修正して入稿する→エラーが出てくる

の繰り返しになってしまう。

しかもエラーが「不正なデータです」になりがち

表形式データの検証にて、正確、効率的にエラーをフィードバックするか

表形式データ検証の3ステップ

  • セルをパース:不正な日付、絵文字の混入
  • 行を検証:行の重複関係を検証(IDの重複チェック
  • 表を検証:他のテーブルとの依存関係をチェック(外部キーなどにならないといけないものが存在するかのチェックなど)

理想的には、それぞれのステップすべてを並行で行なって、エクセルファイルの中のすべての不正な部分を出すようにしたいが、一般的には一つのステップずつやるので、何度も顧客に入れてもらわなければならなくなる。

→ そこでfp-tsを用いる

fp-tsによるエラー合成

TypeScriptのエラー処理

  • ユーザー定義エラーを投げる(エラーオブジェクトを拡張して作る)
  • Either型を返す

ユーザー定義エラーを投げる場合

複数のエラーを同時に伝播しずらい。

「IDも名前も誕生日もすべてダメだった」というときに面倒。try-catchでarrayに詰め込んで...ってやればできなくもないが面倒

Either型(Result型)を用いる場合

Either型は判別可能なユニオン型

しかし、これを導入しても、欲しい情報を取得するのが大変でifが大量に出てきてしまう。

→ 外部ライブラリに頼りたい → fp-tsを用いる!

実際に合成すると

表形式のエラーもfp-tsを用いることによって、すべての行についてバリデーションを一括で行い、それのエラーハンドリングがやりやすくなる。

表形式データの依存関係の解決

表形式データ内にあるデータ不整合も型で防ぐことができる。

newtype-ts(公称型)を用いることで検査可能になる。

「検査を通ったものですよ」ということを表す型?で、検査前のデータを入れるとエラーになるようなものを導入することで問題をクリアできる。

難しさ

あまり事例がない。関数型プログラミングの知見が一般的ではないので、チームで運用するのに難しさを感じた。

そこでオンボーディングコストを減らすような体制を整備した。

ポイントとして

  • スコープを制限する
  • 短期集中でペアプロ・モブプロ
  • 社内向けレシピ集とプレイグラウンド

(WebContainerというのを初めて聞いた)

質問

  • fp-tsはバンドルサイズが大きすぎたりしないか
    • フロントなどで利用しているものではないのと、あまり頻繁に行われる機能でもないので、パフォーマンスについてはスコープアウトしている
  • スイッチングコスト
    • それぞれの機能ごとにベストを探っている。社内標準のようなものがあるわけではない
  • fp-ts以外のライブラリで検討したものがあったか

感想

Excel入稿機能に携わった経験はあるが、確かに「一つエラーを見つけ次第エラーを返す」みたいな実装になっていた。顧客の便利さを考えた時には、シートのどこにどんなエラーがあったかの情報を全て返してあげることで、顧客の利便性が明らかに向上すると実感することができた。

また、その解決に対して、関数型プログラミングのノウハウが活きるのは目から鱗だった。