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
prolog っぽい感じ
code:query.clj
'[:find ?age
解決策としてのDataScript
なぜ? /icons/採用.icon
定義する Schema でデータ構造を明文化できる
ハッシュマップの代わりとして使いやすい
何か楽しそう
修正がつらい部分なのでモチベーションを高く保てるように
解決に向けたアプローチ
Schema でデータ構造を明文化
バッチの各処理では都度 DataScript からデータ取得
データの取得元を統一
クエリ=関数として、データの取得方法をエディタの補完でサポートする
脳に楽をさせる
メリット/デメリット
メリット
DataScript はイミュータブルなので、途中での変更を意識しなくていい
ハッシュマップをあっちこっちに渡すケースだと、途中で書き換えられることが防げない
やらないけど出来ることが問題
メリット/デメリット
デメリット
必要なデータをすべて DataScript から取得するようにすることでコードが多少冗長になる
ハッシュマップの中で迷子になるよりはまし
定義した Schema に合わせてデータを格納し直すのが若干手間
まとめ
いろんなデータを使う処理の一時保管領域として DataScript は良いかもしれない
脳の負荷軽減
ただ扱うデータが少ない内はハッシュマップの方が楽
まだコードを修正しつつ模索中の状態
本番運用して少し経ったくらいに改めて結果を発表したい
ご清聴
https://gyazo.com/e8a41f80bf719141ebccca7fbc872ec0