排他を知らないエンジニア
案外多い…ということをご存じですか?
ちなみに私が解決してきたプロジェクトの中にもこの「排他」が原因でニュース沙汰になるようなトラブルを起こしているものを含め、いくつかのプロジェクトが存在していました。
大手SIerも含め、それくらいこの排他を知らないまま開発に従事してきたエンジニアというのは存在しているんです。
排他制御
ソフトウェア開発の中では決して珍しくもなく、ひょっとすると30年以上前から存在しているいアーキテクチャだと思われますが、これを明確に理解している、あるいは説明できるエンジニアは多くありません。
ファイル、メモリ、データベース、etc.…プログラムが「プログラム外の領域(外部リソース)」を操作しようした際に、そこにはある重大な観点が必要になります。それが
「同時にアクセスすることがあるか?」
です。
プログラム vs プログラム
プログラム vs 他プログラム
プログラム vs OS等
プログラム vs 人の操作
同一のものを複数の人で共有する場合、それは日常生活においてもブッキングしないように注意するはずで、これと同じことがプログラミングの世界で起こらないと思う方がおかしいわけです。
相手が何であれ、同時にアクセスし、変更や削除をされていると参照中の情報は最新ではなくなってしまいます。こうしたことによって起こる事故を防ぐために、あるいは事故が起きたことを知らせるために用いられるアーキテクチャを『排他制御』と言います。
プロセスを排他するために用いられる『mutex』。
ファイルを排他するために用いられる『semaphore』。
データベースを排他するために用いられる『lock』。
ここに挙げられたものは、一般的には悲観(的)排他と呼ばれるものですが、他にも楽観(的)排他と言うプログラムでモニタリングするような概念もあり、それぞれの用途に適した様々な排他技法が用意されています。
しかし、せっかく用意されていても利用する側…つまりこれからソフトウェアを作成しようとするエンジニア自身がただしく理解していなければ宝の持ち腐れです。
結局、重大なトラブルを起こすと言うことに変わりはありません。
メジャーなところでは、以前こんなことがありましたね。
データベースアクセスに関しては、
「排他が正しく機能しているかどうか」
「排他制御のアーキテクチャを導入するべきポイントはどこか」
あるいは、こうした問題が起きた時に
「他に排他制御の抜け漏れを起こしているアクセスは存在するか」
を即時に見極めるために有効なツールとして、個人的によく用いたのは
CRUD図
でした。というか、データベースに限らず、ファイルでもメモリでもバグを修正する際の影響調査においてもこのCRUD図を応用していました。それほどCRUD図というのは非常に便利な設計書だったりします。
けれども、昨今の開発専門のエンジニアのなかではその重要性を理解している人はごくわずかしかいないように感じます。保守・運用を経験したことのある人であれば多少は重要であることの意味を理解している人もいらっしゃるでしょうが、延々と開発ばかり繰り返している方のなかでは『率先して準備している』と言っている人を未だに見たことがありません。
私の中では、外部リソースへのアクセスが存在するソフトウェアあるいはシステムにおいて、CRUD図を作成することはほぼ必須であると認識しています。
すくなくとも『排他』が原因で起きたトラブルを解決するために参画すれば、必ずと言っていいほど全SQLを分解し、衝突タイミングを調査し、各テーブルごとどころか、各カラムごとのCRUD図を作成しました。
そこまでしないと、お客さまに対して
「他に〇ヶ所ほど問題となる可能性があるポイントを検知しました」
「本当に問題があるのはこれだけしかありません」
「他に問題はありません」
と説明し、証明し、そして保証しきって見せることができないからです。
排他が実際に問題となるようなタイミングは0.1msあるかないかの今際で起きるものです。単体テストのようにbreakpointを作れるのであればまだしも、実動テストで検証しようと思ってもなかなか再現することが難しかったりもします。
だからこそ、論理的に100%証明しきって見せることが重要なのです。
排他制御におけるトラブルにおいて、あるいは排他制御回りのトラブルが起こらないことを証明する場において
CRUD図抜きに品質保証を行うことは不可能
ですので知っておくと良いでしょう。
だからこそ、設計時の検討証明用にも必須となってくるのです。設計時に排他制御を盛り込む箇所の過不足がないかどうかは、CRUD図がなければ証明できないからです。
しかし、先ほども言いましたようにプロジェクトの現場ではまともに作られているプロジェクトをあまり見たことがありません。「必要だから作るように」と提言しても、だいたい「スケジュールに影響が出る」と難色を示されていました。本来はQAから言われることではなく計画時点で検討すべきことのはずなのですし、スケジュールに影響が出ないよう元々込みで工数見積もりをしていればスケジュールに影響が出ることもないはずのものですが…。
また、仮に存在していたとしても初期設計時から改版されておらず、最新にされることもなくただの自己満足に陥っているケースが殆どでした。
CRUD図とは、外部リソースがどの機能で
作成(Create)、参照(Read)、更新(Update)および削除(Delete)されるか
をマトリックス形式で表現したもの(設計書)のことです。
多くのプロジェクトで「存在しない」あるいは「作成しても最新管理しない」…と言うことは、そこに関わる多くの何万、何十万というエンジニアはそれだけCRUD図の作成意図や重要性を理解していないと言うことを意味します。
実際、みなさんはどれほどその重要性を理解していますでしょうか。
意味もないのに作ったって意味は生み出せません。
意味があるから作るのです。
でも、その"意味"すなわち『目的』を理解していないのでは、必要があっても作ろうという発想に辿り着きません。だから作らないし、作っても改版しないし、その結果として問題も絶えないわけです。
「なぜ必要なのか?」
と言う問題意識が理解できていれば、それがどれだけ重要な設計書なのかが自ずと自覚できるはずです。
CRUD図は
と言う目的のために作成します。
裏をかえせば他の目的には利用できません。そしてこれらの目的を達成するために最も有効な設計書はCRUD図以外にありません。他の設計書で代替できるのかもしれませんが、それでもCRUD図以上の効果を示すことはありません。
さらに、CRUD図は排他の要否や可否を検討する意味でももちろん重要な設計書ですが、それと同じくらい『それぞれのデータに対して、4機能が過不足なく存在するか確認する』ためにもとても重要な設計書な点についても、理解しておきましょう。
たとえば、あるテーブルのあるカラムに対して、
すべての機能に
①R(参照)があるのに、C(追加)も、U(更新)も存在しない
②D(削除)があるのに、C(追加)も、U(更新)も存在しない
③U(更新)があるのに、C(追加)が存在しない
④C(追加)やU(更新)があるのに、R(参照)が存在しない
設計となっていたとします。
…こんな設計に意味がありますか?
CもUもないと言うことは、そのカラムの値は一生変わらないと言うことです。初期値が null であれば一生 null であり続けると言うことです。そんなデータを参照する機能は、満足なデータが本当に得られるのでしょうか?
①②③はそれぞれ、データをインプットする機能が無いにもかかわらず、アウトプットする機能が存在するケースです。明らかに機能が不足しているか、機能要求が不足しているかのいずれかであることがわかります。
④はインプットする機能だけ存在しているにもかかわらず、アウトプットする機能が存在しないケースです。
ソフトウェア、あるいはシステムは、『データ(=情報)』を適切に取り扱ってナンボの代物です。冗長的なインプットやアウトプットは、無い方が良いのです。無駄に存在していると、
・トラフィックに多大な損害をもたらす
・ストレージ容量を圧迫する
・CPU処理に負担をかける
・メモリ消費量が増大する
といったごく当たり前の障害を生み出します。
SQL文の使いまわしや、旧システムの流用など、意味を理解しないままに正しく影響を調査することもなく、
「あるものをそのまま使えば楽だから」
「仕様さえ満たせば、多少ゴミが混ざっててもいいと思ったから」
という身勝手な判断で、最適化されないシステムができることも珍しくありません。
『排他』と言う概念については常に意識できるようにしておきましょう。
エンジニア1年生にはちょっと難しい内容かも知れませんが、2~3年生になっても知らないようではちょっとマズいかもしれません。そろそろ大きな問題を起こし始めてもおかしくない時期に差し掛かっています。
おそらくそれができないエンジニアやプロジェクトマネージャーは、日頃から排他に対する意識が疎かになっているせいで、自身のスケジュールなどにおいて適当に管理していて、当日に"予定がブッキングしていた"なんてことも簡単に起こしてしまっているかも知れませんね。
いただいたサポートは、全額本noteへの執筆…記載活動、およびそのための情報収集活動に使わせていただきます。