SQLer 生島勘富 のブログ

RDB・SQLの話題を中心に情報発信をしています。

バッドノウハウを受け入れるべきではない

 SQLを使わない成功事例があります。なんて書くと、SQLが苦手だと考えている層に、それがどんなにバッドノウハウでも諸手を挙げて受け入れられる。

 しかし、プロジェクトとしては成功でも、技術的に成功とも正しいとも言えない。もちろん、それだけでは間違っているとも言えない。

 技術的にはプロジェクトの成否にかかわらず、技術を評価する必要がある。

上流技術者の勘違いが固定化し文化なる

 何度か書いたことがあるんだけれど、COBOLから VB / Oracle の世界に多くの技術者がやってきた頃、コーディング規約に「配列は使用禁止!」というのは珍しくなかった。COBOLerの多くは、配列を使うと訳が分からなくなるらしい。2006年頃に、未だに禁止しているコーディング規約を見たことがあるので、根強く守っている会社(大SIer様ですが)もあるようだ。

 一般的には、「配列は使用禁止!」なんて笑い話になるぐらい淘汰されたが、一部で根強く残っているのは、なぜか?

 淘汰される理由は上流に立つ技術者が「配列を使うかどうか」まで言及する必要がないため、下流に位置するプログラマの心がけ一つで淘汰できた。一方、淘汰できなかった会社ではマネージャクラスがコードレビューを行っていたので、マネージャクラスに理解できる書き方をする必要があったため、21世紀になっても「配列は使用禁止!」というコーディング規約が残ってしまった。

 上流が絡まない技術は比較的簡単に淘汰できるが、上流は固定化したら簡単には変わらない。

 SQLで処理するか、手続き型言語で処理するかは、全体方針に関わってくる。全体に影響するため、技術が分かってない上流が関わるから、簡単には淘汰できない、非常に難しい問題の一つです。

 「データベースサーバで処理した方が、データベースサーバの負荷が下がります」というのは、単純な言葉の印象として間違ったイメージになる。ちゃんと技術を掘り下げて考えないと理解できないため、上流に立つ技術者が余程技術に明るくないと理解できない。

 理解できない人に取っては「シングルポイントのデータベースサーバの負荷を下げるためxxxは禁止」というのがまるで技術的に正しいと勘違いしたまま進んでしまう。

 プロジェクトは、予算内、納期内に終われば成功、超えれば失敗となる。営業力があって、でっかい予算と長〜い納期を取ってきたら、どんなやり方でも成功するでしょう。技術力がどんなにすばらしくても、営業力とのバランスが悪ければ失敗で、成功したプロジェクトがあれば、それは成功事例となる。

 つまり、成功事例というのは技術的にどうかは全く関係ない。

 ところが、技術的に間違いのある成功事例があると、それは間違った技術を正しいと思い込ませる、社内に根付かせる、業界に広げる可能性が高い。技術的に明らかな間違いがある手法で成功したプロジェクトというのは、営業力は強かったが技術的にはクソだった。ということです。

 さらに、実際には残念なことにクソ以下がある。

 SQLについては、失敗事例の中に「そもそも、SQLが出来ない人に書かせて失敗した」という事例が多く含まれているため、余計に「SQLを避けるべき」という論に力を持たせてしまっているのが実情。誠に情けない話。

 だからといって、巨大システムは「固定長カラムがいい」「JOINは使わない方がいい」という技術的な間違いを認めるわけにはいかない

 技術的にはクソだけど、
    ・それしか理解できない
    ・予算が取れている
    ・納期が十分にある

 という状況下で政治的に正解であるだけで、決して技術的に目指すものではない。

 技術的にクソでも、一旦、成功事例にしてしまうと、それが文化として固定されてしまうことになりかねない。私には理解しがたいことですが「SQLを避けるべき」というのも、一部の会社では、既に文化として成立したモノなのでしょう。

ウォーターフォールも成功事例から文化になった

 他にも、文化として成立しているものに、例えば、ウォーターフォールやエクセル方眼紙などがある。

 それらは、どんなに効率が悪くても多くの成功事例が存在し、固定化して文化になっているため、そう簡単にはひっくり返すことは出来ない。

 エクセル方眼紙で「今までこのフォーマットで仕様書を書いてきた。何が悪いのか?出来ないというのか?」って言われたら「出来なくないけど効率が……」って簡単には通らないでしょう。「出来る出来ない論」になると、ウォーターフォール&エクセル方眼紙での成功事例なんていくらでもあるため、勝てるわけがないのです。文化を盲信している人とは議論にならない。

 ウォーターフォールも、エクセル方眼紙も、技術的な正しさは全く関係のない成功事例から、勝利の方程式(と勘違いした)文化が形成されてきた。WEBコンシューマ向け文化圏に、ウォーターフォールやエクセル方眼紙が少ないのは、新しく出来た文化圏だからで、変わった訳ではない。

 固定化した文化を変えるのは容易ではない。

 異文化から見れば、変更が予想されるのにウォーターフォールモデルを採用するのもおかしいし、エクセルを表計算ソフトでなく、方眼紙として使うのもおかしい。分かっている人に取っては当たり前のこと。しかし、COBOLからの文化を継承している人に取っては「暴言」にしか聞こえない(らしい)。このレベルだと不毛な議論の経験者は比較的多いから、理解できる人もいると思う。

    ・配列禁止
    ・エクセル方眼紙
    ・ウォーターフォール
    ・JOIN禁止
    ・固定長カラム
    ・集計関数禁止
    ・サブクエリ禁止

 冷静に技術と政治の部分に分けて考えてみよう。技術的には全部、目を覆いたくなるほどおかしい。しかし、誰しも、どれかは政治的に受け入れたことはあるでしょう。それを技術的に正しいと勘違いしてはいけないわけ。

 技術的におかしいと思わないモノがある人は、文化として受け入れて思考停止になっている。危険な兆候です。


 RDBMSを使うのにSQLを避けるのも技術的にはどうしようもなくおかしいが、困ったことにCOBOLer文化圏も、新しいWEBコンシューマ向け文化圏も、どちらも、「SQLが嫌い(が多い)」という状況で、私にとっては四面楚歌の状態。私がいうことが暴言に聞こえる人は、既に異文化の世界にいるということで、こんなものをいくら書いても変わる訳がないということは、最近、ようやく分かったのですが(苦笑)。

上流/下流(設計/実装)という分け方をなくそうよ

 それでも、ドン・キホーテとしては変えたいという思いは尽きない。

 そのためには、いいかげん、上流/下流(設計/実装)というフェーズ、人員の分け方をやめたらどうか。スキルにも考え方にも大きな違いがあるのに、どちらかで違いを吸収するのではなく、UI側/DB側とフェーズ、人員を分ければよい。

 もちろん、更に細かく、UI側設計/UI側実装/DB側設計/DB側実装 と分けてもいいけれど、とにかく、同じ人がUI側も、DB側も同時に担当するというのは無理がありすぎる。タダでさえ、上流に行くとコーディングの機会がなくなるのに、上流に真逆のスキルを求めても理解出来るわけがない。

 全く違うスキルが必要なんだから、スキルでフェーズ、人員を分ければよい。

 そのためにDB側はストアドプロシージャを使うのです。
 具体的なやり方は、こちら
    http://d.hatena.ne.jp/Sikushima/20100831/1283221872
    http://d.hatena.ne.jp/Sikushima/20101201/1291171902

 SELECT系までストアドプロシージャにして、UI側にストアドプロシージャのスタブを提供すれば、フェーズを完全に分離して、開発、テストが可能になる。
 つまり、UI側はテーブルなしでコーディング・テストまで完了できる。

 全く違うスキルが両方必要なのに、どちらか一方でやろうとするのが間違っている。

 例えば、JOIN を書かせたら何が起きるか分からないレベルの人にデータを扱わすなんてとんでもない。そういう人はリッチでかっこいい UI を作ることに拘って、その方向に進めばいいじゃないか。大体、そっちの方が向いているし、そっちも向いてない人は他所の業界に転職した方がいい。

 スキルで担当を分けて、お互いがスキルを磨けば、より良いシステムを作ることが可能になる。もっと早く、もっと速く、もっと安くシステムを作ることが出来る。


 現状でSQLが出来る人が足りないのは分かっている。
 しかし、逃げて「成功事例」としてしまえば、「逃げること」が覆せない文化になって、次の世代に引き継がれる。例えば、エクセル方眼紙って、今となっては、誰が、何の意図を持ってやり出したかなんて分からないでしょう。使うのは理屈じゃなく「当たり前だから、みんなが使うから」でしょう。そうなると覆せないのよ。

 移行するには最初は多少の苦しみもあるだろう。しかし、UI側と、DB側に分けることで、現状の「コーディングしたことがない上流」という問題も徐々に緩和されるから、いつまで経っても「COBOLの画面をWEB化しただけ」みたいな状況もなくなっていくだろう。


 営業的・政治的な成功・失敗は、現実世界において重要でも、はてな村で「技術」を語るときには不要な概念。技術は下にも無限に広がっているので、若い技術者が下を向くな!

 私世代の年寄りは、若い世代の技術者に、得意な方を選べる環境を作ってやるべきではないか?

 間違っても、逃げる半端な技術を文化にしてはいけない。