ジーワンシステム社長のITコラム。
   ITについて、その他もろもろ
>> HOME >> コラム >> 第19回目 「SQLについて(安い、且つ 速いシステムを作るには)」

« 第18回目 「阪神電鉄株買収問題について」 | メイン | 第20回目 「SQLについて(安い、且つ 速いシステムを作るには) 解説1」 »

第19回目 「SQLについて(安い、且つ 速いシステムを作るには)」

弊社で製造しているシステムでは、データの保存場所はリレーショナルデータベース内でSQLというプログラミング言語を使用します。
楽天や、アマゾンなどのWEBシステムも、間違いなくSQLを利用しているでしょう。

SQLは、実は、VB、Java、C++、C#、PHPなどのプログラミング言語と比べても、もっとも普及していて、ユーザ向けの初級シスアドでもSQLは試験範囲となっています。
COBOLやC言語と同様にISO・ANSI・JISで規定された標準言語です。

ユーザにまで技術を習得するように求めているのですから、SQLは、情報処理技術者としては必須の技術(言語)と言っていいでしょう。
ところが、SQLをまともに出来る技術者は大変少ないです。

ではなぜ、必須の技術がまともに出来ないか、弊社の入社試験の(一部改変)問題を使って説明したいと思います。

あなたがSQLを経験したことがあるなら、実際に依頼を請けたとき、どのような対応をするか、どのように工数を見積もるか想像しながら問題を解いてみてください。


【問題】
以下の要望、基本設計からデータ抽出する部分について、詳細設計をSQL文を含めて作りなさい。
(制限時間10分)
【使用するテーブル】
得意先マスタ
    得意先コード
    得意先名
    住所
    ・・・
受注テーブル
    受注ID
    受注日     
    得意先コード 
    ・・・
受注明細テーブル(今回は不要)
    受注ID
    受注明細ID
    商品コード
    数量
    単価
    ・・・

【要望】
マーケティングのため、1ヶ月間取引のない得意先で、それ以前の半年間に5回以上取引のある得意先の一覧を出力したい。


【基本設計(外部仕様)】
■ 目的
以前に頻繁に取引があり、最近、取引のない得意先の一覧をつくりマーケティングに利用する。

■ 処理概要
受注日が(m+n)ヶ月前からmヶ月前までの間にc件以上の取引データがあり、mヶ月前以降に取引データのない、得意先の情報を一覧表に出力する。

m、n、cはユーザから画面で入力を受付け、それぞれ1、6、5を初期表示とする。


解答例1解答例2解答例4解答例5を比べると、処理速度は10~100倍ぐらい差が出ると思います。


実際、解答例1を10分で書くのはかなり大変です。
もし、10分で書けたとしたら、あなたはスーパーSEとか、カリスマSEとか呼ばれているのではないでしょうか。
でも、35点です。


SQLを熟知している人なら解答例3を5分ぐらいで出来るでしょう。
ただし、周りから変人扱いされているかもしれません。


解答例4解答例5を5分で書けたら・・・。
凄腕ですね。 一騎当千とはあなたのことを言うと思います(笑)。
私は解答例3を書いて『もっとエレガンスに…』と思わないと、解答例4解答例5は出来ません。
解答例4・5が出来るということは、頭の中で実行計画を作れるということでしょう。
周りが理解してくれていることをお祈りいたします。


SQLというのは元の名前 SEQUEL (Structured English Query Language)にあるとおり、英語という自然言語に近い、ユーザでも理解できるように作られた言語です。
つまり、基本設計を直接翻訳すればプログラムになる様に作られた言語なのです。
事実、解答例3は、基本設計を直訳しただけの詳細設計というよりもプログラムです。
難しそうに見えても、WHERE句を除けば得意先マスタのダンププログラムに過ぎないということが分かるでしょうか?
では、あなたが最初に思い浮かんだ見積もりは、10分で書けるWHERE句が付いただけの得意先マスタのダンププログラムの見積もりになっていたでしょうか?


解答例1解答例2を想像した人とは、プログラムの処理速度だけでなく、 開発費も倍以上の差が出るでしょう。


上の例は簡単な例ですが(ただし、データ件数によっては夜間バッチで処理する必要もあるかも)、もっと大きなシステムでもまっとうなテーブル設計ができていれば、90%以上の処理は外部設計を直接翻訳するだけで実現できます。
もちろん、SQLはどうしても実現できない処理がいくつかありますが、それを避けてテーブルの設計を行う。
それがテーブル設計者の腕の見せ所なのです。
そして、基本設計を直訳した解答例3から、解答例4解答例5を作るのがプログラマの腕の見せ所です。

しかし、解答例1解答例2は、COBOLなど第3世代言語で作成する場合とほぼ同じ構造になるため、今までそうしてシステムを作ってきた技術者にとっては簡単と感じる様です。
実際、90%以上の技術者が解答例1解答例2のパターンで答えると思います。

結果、解答例1のような詳細設計が出回ることとなり、SQLのテクニックを持っているプログラマもそのとおり作るしかないということです。
そのため、出来たシステムは、ソースの量も、仕様書の量も倍以上、テスト・バグはさらに倍(私のストレスはさらに倍!)になると言っても過言ではありません。
また、新人はその作り方が正しいと信じてスキルを磨きます。
そのため、なかなか業界としての技術革新が起きません。

たとえるなら、最新のIHクッキングヒータを備えたキッチンなのに、カマドでご飯を炊くレシピが届く。
そのためキッチンの横にカマドを作ってご飯を炊いて、IHクッキングヒータはお湯を沸かすためにしか使わない。
って感じでしょうか。
そんなプログラムが出来上がるのです。

しかも、最新のIHクッキングヒータは顧客に高い金を出させて買ってもらっているのです。

・・・9対1ではどちらが正しいとされるか、私がカマドをつぶして回っても単なるデストロイヤーでしかありません。
無理してやっても、全員が理解できなかったら、手法が混在してしまい、どちらも理解できる人にしかメンテナンスできなくなります。
しかし、何とか啓蒙したいと考えています。

基本設計を書く、つまり、システムのグランドデザインをする上級SEが実際のプログラムを書くわけではないので『今更、プログラミング言語を…』ということで、SQLなど初歩しか知らない人がほとんどです。
これが、いつまでたってもSQLが本来の使われ方をしない最大の元凶です。
ユーザにまで理解を求めているのに、プロが出来ないでどうするのか…。


たとえば、問題のような要望を受けたときどう部下に指示しますか?
どれぐらいの工数を想像しましたか?
「抽出条件このとおり、あとは単なるダンプ」
と言えますか?

言えれば、あなたの部下はインターネットで調べて解答例4解答例5をひねり出してくる可能性があります。

その後、あなたの部下は、少ないステップで出来るSQLで処理する様になるでしょう。
基本設計≒プログラムという、夢のプロジェクトに一歩近づきます。

しかし、『こんなふうに処理フローを書いてね』とか『ワークの定義書は…』って指示しますよね。
そんな指示をした時点で、あなたの部下がどんなにSQLを勉強していても、解答例1のプログラムしか出来てこないのは当たり前です。

結果、勉強している部下は嫌になり、勉強していない部下は、そのまま育っていくことになります。
負のスパイラルの完成です。

私にも、上級SEが『今更』と思うことは十分理解できます。しかし、SQL≒基本設計ですから、SQLを知らずに基本設計を書くのも、基本設計(要件)を理解できずにSQLを書くのも大きな問題があるのです。


Javaのシステムの基本設計を書くのに、Javaのプログラムが書ける必要はありませんが、SQLを理解しておかないと間違った方向(効率的ではない方向)へ連れて行ってしまう可能性が高いです。

繰り返しますが、SQLはユーザでも理解できるように作られた言語なのですから、業務を理解している上級SEほど短時間に高いレベルで習得できます。
肩肘張らずに簡単と思って取り組めば、素人に出来てあなたに出来ないはずはありません。

こんな駄文は『今頃何を言ってるの?』と笑い飛ばされる時代が早く来てほしい。
そう願わずにはいられません。

<< 第18回目 「阪神電鉄株買収問題について」 | | 第20回目 「SQLについて(安い、且つ 速いシステムを作るには) 解説1」 >>

>> HOME >> コラム >> 第19回目 「SQLについて(安い、且つ 速いシステムを作るには)」

トラックバック

このエントリーのトラックバックURL:
http://www.g1sys.co.jp/cgi-bin/app/mt-tb.cgi/35

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

  • 製品案内
システム構築・運用、技術サポート・ビジネスブログ・ホームページ制作の株式会社ジーワンシステム
株式会社ジーワンシステム

〒550-0014
大阪市西区北堀江1-5-2
四ツ橋新興産ビル 11F

TEL: 06-6535-8660
FAX: 06-6535-8661

E-mail: info@g1sys.co.jp

Powered by
Movable Type 3.34