Beauty & Chestnut

栗野美智子オフィシャルウェブサイト(笑)へようこそ。ツイッターもやってます。@Michiko_Kurino

プログラミング言語を学び始めた時に知っておきたかった事

入門書などで基礎的な文法、例えばif文やfor文などを理解して初級本、中級本へ進んだ時に「同じ言語のはずなのに、全く違うもののように感じる」と思うことが何度かあった。周りの人に質問をしても言っている事(表面的な事)は分かるけどしっくりと来ない事も度々あり、例の「哺乳類とヒトの例」や「型を使ってクッキーを量産する話」を何度も聞く羽目になった。そこで分かったのが、初学者と職業人の間には概念的な違いがある、ということである。例えば、入門書に「xとyを足して結果を表示するプログラム」があったとする。

public class 足し算クラス {
    public static void main(String[] args) { 
        ・xを入力する
        ・yを入力する
        ・x + yを実行する
        ・結果を表示する
    }
}

この様に、クラス名がメインメソッドの処理内容を表しており、メインメソッドで全ての処理を完結させる例が沢山ある。if文やfor文の使い方をマスターするだけなら、これでも問題ない。むしろ、話を複雑化させずに済むので、説明する側にとっては便利である。初学者の中にはこういった例文を見続けるうちに、これがスタンダードなスタイルなのである、と無意識のうちに思い込んでしまう人も出てきてしまい、これが初級以降(オブジェクト指向)を学ぶ時に大きな壁となる。特にクラス名=メインメソッドの内容、という認識を持っている時に「哺乳類がクラス、食べる、呼吸する、動く、がメソッド」といった説明は全く無意味である。が、メインメソッドで全てを片付けている説明が延々と続いた後に突如としてこの様な哺乳類の比喩が突如として出てくるケースが多い。ここで戸惑うのである。

上記の例文をもう少し初・中級風に書くと、以下の様になる。

public class 足し算クラス {
    public Hashtable 数字を入力するメソッド() {
        ・xを入力する
        ・yを入力する
        ・戻り値用のHashtableを用意する
        ・Hashtableに”xの値”(key)、x(value)をセットする
        ・Hashtableに”yの値”(key)、y(value)をセットする
        ・Hashtableを戻り値として返して処理を終了する
    }

    public int 足し算をするメソッド(Hashtable ht) {
        int x;
        int y;
        int total;
        ・引数htから”xの値”のvalueを取り出して変数xに格納
        ・引数htから”yの値”のvalueを取り出して変数yに格納
        ・x + yを実行し、結果を変数totalに格納
        ・戻り値totalを返して処理を終了
    }
}

ステーキ用の肉が細切れになったような例文が初級テキストの後半から出始める。メインメソッドは姿を潜め、「そもそも、これはどうやって実行するのだろうか」「処理内容は同じなのに、分量増えてるじゃん」「引数?戻り値?」と初学者を惑わせるのである。オブジェクト指向の萌芽であるが、この段階では「システムは多くの人が同時に開発するもの」といった視点が欠けているために分かりづらい。また、「システムは多くの人が使うもの」という視点も欠けているため、メインメソッド1つで(深く考えずに)片付けてしまう方に魅力を感じるものである。良い意味でも、悪い意味でも、その傾向は入門本を熱心に取り組んだ場合に顕著に表れる。

入門レベルの初学者と職業人の考え方の違いをまとめると、この様になる。

初学者
・クラス名=メインメソッドの内容
・メインメソッド1つで全て処理が完了する
・書いたコードは自分しか使わない

職業人
・クラスは傾向の似たメソッドの集まり
・クラス名は複数あるメソッドの内容を喚起させるもの
・システムは多くの人が同時に開発し、多くの人が使う

多くの人が同時に開発し、多くの人が使う、という前提の有無によってもたらされる差は非常に大きい。なぜなら、自分だけが使うものなら変数名なんて何でも良いし、宣言した変数にマジックナンバーを入れても構わないし、当然排他制御なんて必要ないからである。アルゴリズムなどのパズル的な要素を楽しんだり、個人レベルで電子工作を嗜む程度なら基礎的な文法だけで十分であるが、職業人としてやっていくのであれば、早い段階で「多くの人」を意識する学習へシフトするのが望ましい。私がプログラミング言語を学び始めた時に知っておきたかった事はそこに尽きる。なぜインスタンスを生成するのか。なぜ細切れのようなメソッドが沢山あるのか。なぜ一つのクラスに全てを書かずに継承するのか。なぜ抽象クラスが必要なのか。なぜわざわざゲッターやセッターを使うのか。なぜコンストラクタが必要なのか。入門本を読み終えて初級本を読み始めた時に沢山の疑問が湧いてきた。本にはインスタンスとは〜、継承とは〜、といった解説があったものの、なぜそれらを使うのかが私には分からなかったので、深い意味で説明を理解することが出来なかった。ちょっとした視点が加わることによって、全てとはいかなくても多くの疑問が瞬時に解決することがある。いつか私が人に物を教える立場になったとき、初心を思い出せるようにここに記録しておく。