DataScriptをバッチ処理に導入する試み

サイボウズスタートアップス

/uochan/uochan.icon uochan (飯塚将志)

発表の目的

現状の問題点と、DataScriptを使ってどう解決しようとしているかが共有できること

その解決策のメリット/デメリットが理解されること

あわよくば、より良い解決策を教えてもらえたらラッキー

まだ「試みてる」段階 /icons/注意.icon

ちょっと複雑なバッチ

https://gyazo.com/d5395f38cb9e37dcd5fd7f52d27cc8de

問題点

ハッシュマップが自由であるがゆえ

/icons/人物.icon 「あのデータはどのキー配下の何ていうキーに格納されてるんだ?」

/icons/人物.icon 「この関数に渡されているこのハッシュマップの構造忘れた。。」

困った

https://gyazo.com/1ec63ec495dae5d06844a4c4bc4dad52

ハッシュマップは便利だけどネストが深いと迷子になる

データの流れが追いづらい

変更時の影響範囲がわかりづらくなってきた

覚えておくこともつらい

解決したいこと

https://gyazo.com/bc1d3fa2462d4dc1cf47cc5f94fa88d6

データの流れを追いやすくしたい

とは?

データの構造が明確

あるデータの取得方法が明確

それによって 脳の負荷軽減 をしたい

DataScript

What if creating a database would be as cheap as creating a Hashmap?

インメモリでイミュータブルなDB (雑)

詳細はこの場では割愛

DataScript

データ構造をスキーマとして定義

code:schema.clj

{:idol/name {:db/unique :db.unique/identity

:db/doc "アイドルの名前"}

:idol/age {:db/cardinality :db.cardinality/one

:db/doc "アイドルの年齢"}

:idol/office {:db/valueType :db.type/ref

:db/cardinality :db.cardinality/one

:db/doc "所属事務所"}}

DataScript

Datalog をクエリエンジンとして利用

prolog っぽい感じ

code:query.clj

'[:find ?age

解決策としてのDataScript

なぜ? /icons/採用.icon

定義する Schema でデータ構造を明文化できる

ハッシュマップの代わりとして使いやすい

何か楽しそう

修正がつらい部分なのでモチベーションを高く保てるように

解決に向けたアプローチ

Schema でデータ構造を明文化

バッチの各処理では都度 DataScript からデータ取得

データの取得元を統一

クエリ=関数として、データの取得方法をエディタの補完でサポートする

脳に楽をさせる

メリット/デメリット

メリット

DataScript はイミュータブルなので、途中での変更を意識しなくていい

ハッシュマップをあっちこっちに渡すケースだと、途中で書き換えられることが防げない

やらないけど出来ることが問題

メリット/デメリット

デメリット

必要なデータをすべて DataScript から取得するようにすることでコードが多少冗長になる

ハッシュマップの中で迷子になるよりはまし

定義した Schema に合わせてデータを格納し直すのが若干手間

まとめ

いろんなデータを使う処理の一時保管領域として DataScript は良いかもしれない

脳の負荷軽減

ただ扱うデータが少ない内はハッシュマップの方が楽

まだコードを修正しつつ模索中の状態

本番運用して少し経ったくらいに改めて結果を発表したい

ご清聴

https://gyazo.com/e8a41f80bf719141ebccca7fbc872ec0