このブログではデータベースに関する話題が多くなると思いますが、今回はその理由を説明します。
昨今、『日本はIT後進国だ』などと揶揄され、システムの大きなトラブルや構築失敗のニュースを頻繁に目にするようになりました。モノ作りが得意で勤勉と言われていたはずの日本で、なぜIT分野だけがこのようになるのでしょうか?。単なる手抜きやミスだけが問題ではないはずです。
私はその最も大きな原因は「データ」にあると考え、それを改善したいと思っています。
詳しくは今後の記事で解説していきたいと思いますが、今回はこの問題点について整理したいと思います。
システムを構成する要素
「システムを構成する要素は何か」について考えてみます。
OSやミドルウェア、あるいはハードウェアやシステムの利用者など様々な要素がありますが、プログラマの観点から見れば、どのようなシステムも次の要素に単純化できます。
- プログラム
システムを動かすためのソースコード・バイナリ。
プログラムはデータを受け取り、何らかの処理を行って、データを出力するものとみなすことができる。 - データ
システムが入出力するデータ。
データは以下のように様々な形式に変換されながら存在する。- 外部形式: ユーザの操作・画面表示・データファイルなど人が直接触れるデータ
- 内部形式: データベースのようにシステム内部で保持するデータ
- 中間形式: 通信電文やシステム間でやりとりされるデータ
データ中心主義
「プログラム」はプログラマにとって最終的な生産物であり、最も大きな関心事でしょう。プログラムの品質や生産性を高めることは大きなテーマであり、これまで多くの努力を払ってきたのではないかと思います。
一方で「データ」についてはどうでしょうか?
ビッグデータを扱うシステムの登場で、データの種類や量については注目されるようになりました。しかしデータそのものの設計や品質については、置き去りになっていると感じます。
具体的には次のようなことです。
- プログラムが処理しやすい形に、データを最適化しているか
- データに誤り・不足・不整合・無駄(冗長性)がないか
- データの入出力に十分な性能が出るか
これを実現するのは、何十年も前に確立された基礎的な設計技術であり、何も目新しいものはありません。しかしこの点がおろそかであると、次のような問題が起きます。
- プログラムの実装が必要以上に複雑になる
- データの問題で誤動作や想定外のエラーを引き起こす
- オンライン処理の応答が遅い・バッチ処理に時間がかかり過ぎる
例えば、想定外のNULL値に悩まされチェック処理の追加に奔走したり、定刻通りにバッチ処理が終わらず困ったといった経験は、誰にもあるかと思います。
プログラマは、ついプログラムばかりを注目しがちです。
しかし、いかなるプログラムもデータなしに動くことはなく、データとして表現できていない仕様を、プログラムが実現することはあり得ません。
また、プログラムの方式や実装は時代によって移り変わりますが、適切に設計されたデータ構造は不変と考えることができます。
したがって、プログラムとデータを比較すると、データの方がより支配的であり重要です。この考え方は「データ中心主義」と呼ばれます。
データについて正しく設計されていないシステムでは、プログラムの品質も低下せざるを得ず、これをテストや運用の努力によって解決することは困難です。そしてこの問題は、データの蓄積や複雑化に伴い、年々深刻度を増していきます。
このような状況は、物事の半分しか見えていないと言えるでしょう。
この問題を改善する方法については、様々な概念や手法を順を追って説明する必要があります。大仰に聞こえますが、先に述べた通り技術的には枯れたもので、それを適切に組み合わせるだけのことです。
今後の記事では、このテーマについて時間をかけて解説していきたいと思います。