SQLer 生島勘富 のブログ

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

無意識を意識する。

 そもそも、私はプログラムを習ったことがないから、一般的な専門学校などでやっている様な講義は知らないしやりようがない。私が講師をやると厳しすぎるので、新人教育を担当することはないのですけれど……。

 新人を相手するときに、私が最初に説明するのは「無意識を意識しなさい」ということです。

朝のトイレをプログラムする。

 新人に言語の文法を教えても、大概使い物になりません(苦笑)。

 で、私が最も重要と考える、無意識を意識するという感覚を掴むために、トイレ(う●ち)をするのをプログラムを書くとこうなる。というのをやります。

 1.ドアを開けてトイレに入る。

 2.便器のふたを開ける。

 3.パンツをおろして座る。

 4.LOOP{
   4.1.気張る。
   4.2.IF 時間がもうないとき。{
     4.2.1.IF 我慢できるとき。{
       4.2.1.1.LOOPを抜ける。
     }
   }
   4.3.ELSE(時間があるとき){
     4.3.1.IF もう出ない気がするとき。{
       4.3.1.1.LOOPを抜ける。
     }
   }
 }

 5.LOOP{
   5.1.おしりを拭く。
   5.2.IF きれいに拭き取れたとき。{
     5.2.1.LOOPを抜ける。
   }
 }

 6.便器のふたを閉める。

 7.ドアを開けてトイレを出る。

 判断(分岐)と繰り返しがあるプログラムになります。(意識するために、LOOP、IFを書いて貰う)

 さて、一回プログラムを実行したら分かるバグを正常系のバグと言います。上のプログラムにも2(3)つの正常系バグがあります。

 パンツを上げてない。
 流してない。 => ボットン便所ならセーフ(笑)
 手を洗ってない。

 特定の状況で起きるバグを異常系のバグと呼びます。

 鍵をしてない。 ← 誰かが開けたときにエラー発生。
 紙があるか確認してない。 ← 紙がなかったときエラーが発生。

 異常系は前提条件をどう考えるかで「バグ」と呼ぶか「『それは仕様です!』を繰り出すか」が決まります。例えば、「一人暮らしでトイレの鍵は必要ない」という前提条件があれば、鍵をしてなくってエラーになっても『それは仕様です!』っていえば良い。

 それにしても、こんな単純なものでも、性格(生活か)が出るもので、これを書いた人は排便よりも時間を重視する生活をしてますね。健康によくないな〜。4.2.と4.3.1.を逆にした方が良いよ(笑)。

 ってな、お話を最初にします。

プログラムができない人は無意識を意識できない。

 トイレのプログラムを説明した後に、「では、家を出てから会社に来るまでを書いてください」など、まあ、テーマは決めてないけれどその場で考えた適当な課題を出して私は休憩に入る(笑)。それはともかく、新人君達の多くは、自分の行動でも「抜け」がたくさん起きる。それは無意識を意識できてないからで、自分の行動をプログラムに書けなければプログラムは書けないです。

 では、無意識を意識する訓練をして、ある程度、言語の文法を教えた後の新人君に(SQLでなくて)今、覚えた言語で、以下の要望、データを渡してプログラムを作らせてみましょう。

 ■要望

 ■納品書明細(テーブル)
   納品書番号
   行
   商品ID
   単価
   数量
   消費税率

 というテーブル構造にで、消費税率は一律5%が入っています。
 消費税は、納品書単位に金額を合計したものに消費税率を掛け、四捨五入して請求しています。
 しかし、経理上、明細毎の消費税額が必要になり、明細単位に四捨五入すると、請求した消費税との誤差が発生します。
 その誤差を明細合計金額の多い順に1円ずつ増減して消費税額を計算してください。

 ■データ

 これだけでプログラムを完成できる新人君は2〜3割(金の卵やな)じゃないかと思う。そういう子は課題だけ渡して放置した方が伸びるだろうから、私はいじらない。

 そうではなくって、できない新人君達にどうやって指導するかというと、私はこんな風に


拡大する

 導出項目を抜いたエクセルシートを渡して「手作業で埋めてみなさい」と指導します。(もちろん、SQLじゃなく手続き型の何かの言語の指導ですよ。)

 大抵はエクセルなら書けます。それすらできなかったら当たり前ですがプログラムには絶対になりませんから、もう少し別の指導が必要になりますね……。そのエクセルを埋める作業をしている横から「今、1を引いたのはなんで?」って訊くわけです。これが答えられるまでしつこく訊きます。

 結果的に『絶対値』が出て来ない人がいるなど、手作業でできても、それを表現できない人が大勢いますが、それを言葉にできるまでやる。

 答えられたら、その通り文字にしてみなさい。→ プログラムにしてみなさい。

 となるわけです。

 無意識を意識するというのは、講師に「今、1を引いたのはなんで?」って訊いて貰わなくても、自分で意識しして自分に問うことです。

思考の順序。

 なにが言いたいかというと、思考の順序は
    ■ イメージ(手作業)
          ↓
    ■ アルゴリズム
          ↓
    ■ プログラム(実装)

 当たり前ですよね。ですから、工程というのは

    ■ 要望(要件定義)
          ↓
    ■ イメージ(基本設計)
          ↓
    ■ アルゴリズム(詳細設計)
          ↓
    ■ プログラム(実装)

 と進んでいきます。フェーズを切って大多数でやればウォーターフォール。フェーズを切らずに小さい範囲で行えばアジャイルなどと呼ばれますが、一人でどんなに小さいモノを作っても「何がしたい」から、「どう作るか」が決まり、「実際に作る」という工程に繋がります。

 慣れてくると、ほとんどの人がイメージをショートカット、つまり、無意識下に落としてしてアルゴリズムに行こうとする。しかし、ほとんどの人が、イメージは無意識にできているはずです。

 その無意識で作っているイメージを意識できれば SQL はできます。しかし、アルゴリズムまで行くと、路を外してしまって、できなくなってしまいます。SQLアルゴリズムが分からない人でもできるように作られたのですから、当たり前の話なのですが……。

 本当は、私はチューニングしながら書くので、アルゴリズムまで行ってからイメージに戻って書いているのですけどね。