ユーザー定義データのあるシステムとメタプログラミング
前回、ユーザーがテーブルを自由に定義できるシステム開発で経験したリスクについて、書いた。
「AIを多用すれば速度重視で押し続けられる」という考えの組織が、見逃しがちなリスクがある。それは、特に基礎理論を忘れていると見つけられない。
今回はそのテーマから発展させて、AIに代替されない人間になるために有利と私が考えるメタプログラミングについて書いてみる。
EAVパターン
まず前回の振り返り。
そのテーブル定義で露見したリスクというのは、RDBの利点を無批判に捨てていることだった。最近は、RDBを採用しつつもRDB的な設計から離れるやり方をするシーンは多い(JSON型カラムに一度に色々入れるなど)。とはいっても、そこはRDBの強みを捨てるのか残すのか取捨選択すべきであって、何となくで進めて行けばプロジェクトがカオス化する。
前回のテーブル初期設計を再掲する。

「テーブルのテーブル」がある設計
この設計を最初にしたとき、パッといくつかのリスクに気が付きたい。性能・型安全・コード記述の容易性などなど。
この設計は、SQLアンチパターンにあるEAV(Entity Attribute Value)に該当する。現実にこの設計を取った既存製品は多く、確かWordPressのメタデータテーブルもEAV設計だった記憶。ユースケースによっては問題にならないんだけれど、最初にトレードオフを考慮して方針を決めるべきだ。
ユースケースに複雑な業務ロジックがあると、かなり厳しくなるはず。保険とか会計などですね。複雑な業務ロジックを直接SQLに落とし込めないので、アプリサイドで力技で書こうとして地獄を見ることになります。いまはそもそも、この設計をAIに入れればリスクを話してくれると思うけれど。そもそもリスクの有無を判断するには、基礎が必要ということです。
代替案
ChatGPTと壁打ちすると、現代ではEAVをどれだけ避けるかが設計テーマになっているというお言葉が聞かれた。
代替案は結構多いようで、いくつか抜粋する。
JSON/JSONBカラム
カラムと値をJSON/JSONB型のカラムに、Key/Value形式で格納する。当該プロジェクトでも検討には上がった。結局データを複雑なクエリにかけようとすると、困難は残る。
都度DDL
ユーザーがテーブルを定義するたびに CREATE TABLE を発行する。運用・管理が大変そうだ。ユーザーがテーブル定義を変えようとするとALTER TABLEという重めのDDLが走ることになり、レコード数の多いテーブルを持つユーザーに取ってはUXがかなり悪くなるだろう。
Hybrid Storage
現代でいちばんイケてるらしい。私も興味があるので調べてみよう。
要点は、メタデータだけRDBに入れて実データは他方式のデータストアに入れる方式らしい。こう聞いただけで可能性を感じる。実データを入れるのはオブジェクトストレージとか列指向ストレージとか、またはKVストアなど。
従業員テーブルならこんな感じか。
メタデータ:RDBへ
氏名カラム
給与カラム
実データ:KVSなどへ
山田太郎
30万円
メタ思考とメタプログラミング
メタプログラミングという言葉を聞いたことがあるだろうか?特に若い人。ざっといって「プログラムがプログラムするプログラムを作ること」だ。理論上はこれを何層も重ねることができる。実は、この分野のセンスがあるとAIに代替できない人材になれると思っている。
ユーザー定義テーブルがあるようなシステムもメタプログラミングのかかわる分野で、ここに対する知識や経験の深さで成果に天と地の差が出る。そのシステムが大規模なら、この知識なしでは完成はおぼつかないだろう。Salesforceやいま皆がこぞって使っているNotionなども、メタプログラミングの成果といえる。
メタというのは、辞書的には「高次の」「超越した」という意味ですが、まあ視点がいくつか上のレイヤーにある状態ですね。
先ほど出てきた都度DDLなんかは、わかりやすいメタプログラミングの例。プログラムにSQLを発行させている。
人間がCREATE TABLEを発行している
↓
人間 → プログラムがCREATE TABLEを発行している
下側の「プログラム」を「AI」と置き換えてみれば、AIに指示している(代替されていない)人間の立ち位置を表しているともいえる。これだけでは例え話の域を出ないけれど。
大昔、コンパイラがアセンブラを代替したでしょう。あれもいってみればメタプログラミングといえる。コンパイラができたら、人間はアセンブラではなくC言語なんかでプログラミングするようになったのだ。今回の生き残り方も同様になるはずだ。アセンブラでチマチマチマチマやるのがプロの仕事じゃあ!とやらなければいい(笑)
プログラム開発におけるメタ化の歴史は次の通り。
機械語 → CPU
↓
アセンブラ → 機械語 → CPU
↓
コンパイラ → アセンブラ → 機械語 → CPU
メタプログラミングは有名どころのテック企業も盛んにやってるはずで、技術的にとても興味深い。
前回と今回題材にしたシステムでいえば、
ユーザー定義データを動くシステムにコンパイルするコンパイラの開発者
になるということ。どうだろう?難しそうだろうか。
気が向いたら何か簡単な実例をやってみることにする。
Discussion