2012年9月5日水曜日

新入社員や未経験者のプログラミング言語の習得方法

コンピュータソフトウェアを作成するには、通常、プログラミングという作業を行う。コンピュータソフトウェアの開発には設計やテスト等もあるのだが、実際にプログラムを作る工程はプログラミングと呼ばれる。
プログラミングとはプログラムを書くことであり、そのプログラムには様々な種類がある。例えば、C++やJAVA、PHP等と呼ばれる。
プログラミングは、そうしたプログラミング言語を使える人が行うのだが、その習得方法について、勘違いをしている人がいるようだ。

昔、マトリックスという映画があった。近未来を描いたSF映画だ。
その中で、何度か登場したシーンなのだが、これはSFだなあと思えるものがある。
頭にヘッドギアのようなものをつけて、CD-ROMをセットし、スイッチポンすると、あっという間に特殊スキルが身につくのだ。
これを使うと、カンフーとかヘリコプターの操縦方法を数秒で習得できる。パソコンソフトのように、いろんな種類のスキルを収録したCD-ROMが存在する設定で、それを次々と脳にインプットしていけば、どんどんスキルが身につく。
現実は、格闘技であれば筋力トレーニングが必要であるし、スキルは経験をもとに身につくものなので、脳に何か入れて済むものではないが、映画の世界なのでなんでもありだ。

しかし、これと似たような期待をする人が現実にもいる。
資格試験もそのような性格のものの一種だ。資格試験に合格しているからといって、想定されるスキルがあるかどうかは分からない。その可能性を当然のものとして意識しておかないと、資格試験の合格者を誤って見てしまうことがある。資格試験を完全に意味のないものととらえることもないが、能力判定には限界があることは理解しておかなければならない。

プログラミング言語の習得についても、同じような勘違いをしている場合がある。
特定の手順。具体的に言うと講習を受けたり勉強をすればプログラミング能力が身につくと考える人がいる。
ある会社では、勉強会のようなものを開催して、プログラミング能力がほとんどない人にプログラミングを習得させようとしていたりしていた。私はこれは効果的な方法に思えない。
なぜなら、プログラミングは修練だからだ。別の言い方をすれば筋力トレーニングなのだ。
実際に繰り返しプログラミングを経験することで技能は定着する。失敗や間違いを繰り返して成長し、その人なりのプログラミングスタイルが確立していく。

プログラムを書いた後、コンパイルとかビルドという処理を通す必要のあるプログラミング言語があるのだが、プログラムを少し書いた後、コンパイルを行うと、コンパイラから必ずエラーとしてプログラムの記述間違いが指摘される。プログラムの記述を間違えさえしなければ、何もエラーにならないのだが、人間というものは絶対に間違いを犯すので、99.999%エラーを吐く。さらにコンパイルやビルドの処理を終えても、いざ実行してみれば、一度目は、まず思った結果にならない。何度もトライアンドエラーして、徐々にまともに動くようになる。
プログラミング作業は理屈や計算通りにいかないのだ。間違えずに書けばコンパイルエラーにならない。だけど、実際は間違える。なら、間違えずに書けと言っても、現実は絶対に間違えるのだ。間違えずに書けば、エラーはでないはずだし、書いた本人もわざと間違えては書かない。だが、現実はほぼ確実に間違えて書いている箇所がある。コンパイルエラーにならないように間違えずに書けというのは現実には無理難題だ。理想通りにはならない。そのような現実はコンパイルエラーのことだけに限らない。

プログラムを100人に書かせると、よっぼど単純なプログラムを厳密な規約で書かせないかぎりは、100通りのプログラムが作成される。
決まったやり方なんてものはなく、同じ事をあらゆる方法で記述できる。
プログラムのベターな記述方法についての議論はあるだろうが、そんなことにこだわっていてはいつまで経って製品はできあがらない。プログラムの記載方法に関する機微にいつまでもこだわっている必要はなく、よほど冗長とかということでもなければ、常識的に支障がないのであれば問題ないのだ。
コンピュータープログラミングは工業製品のように同じものを量産するものではない。創造的な作業だ。だから、定型的なプロセスで能力が身につけられるという、わかりやすい話ではない。

プログラミングの講習を行っても、すべての事を網羅することはできない。
ファイルの取り扱い方法やネットワーク、オブジェクト指向プログラミングの基礎的なことを学習することはできるが、今後必要になるだろう、あらゆるすべてのことを網羅することは不可能だ。それに使いもしないものは忘れるに決まっている。必要としていない暗号のようなものを丸暗記ではそれほど詰め込めない。
知らないことは、必要になったときに書籍やインターネットで調べたり、ソースコードを解析したり、場合によっては自分で調査、試行錯誤して理解するものだ。そのように自分で調べるから身につくし、どのみち現実のプログラミング作業はそういうものだ。

なにより一番言いたいのは、必要ないことは習得できないし、必要なことは自然に習得するということ。必要ないことを学習しても、使わなければ忘れてしまうので、無駄に終わる。
だから、私はプログラミングのもっとも最適な習得方法というのは、実際にプログラミングを行うことだと思う。
プログラミングできない人にプログラミングさせるというのは、鶏が先か、卵が先か、みたいな話で、荒療治のように聞こえるが、例えば現存するプログラムの一部を修正させるようなことからはじめて、徐々に規模の大きなものをやらせることは可能だ。
痛みやかゆみを感じずに、楽してなにかを習得することはできない。簡単に習得できるものなら、そんなものに価値はない。プログラミングはそれなりに価値の認められる技能ではあるが、それは誰でもが短時間でたやすくできることではないからだ。
長い目で見て、たくさん痛い思いをしながらでなければ、血や肉にならない。

講習や勉強会のようなものを経て、プログラミング技能者が生産されるというような発想は、マトリックスのスイッチポンと同じようなもので、ないものねだりのありえない希望だ。
講習や勉強といった眠たいことをさせるのは、本人の意欲を失わせるばかりで時間の無駄にしかならない。実際の業務などの意味あるプログラミングをさせる中で習得させたほうが、本気で取り組むため、圧倒的に学習効果が高い。
ミスされることを恐れて、現実のプログラミング業務に従事させないのもいいが、いつまでも無駄な時間を費やしているわけにもいかないわけで、結局は業務にあたらせて、たくさん失敗しながら成長してもらうよりしかたないし、そこからが本当の学習になる。

銀の弾丸はない。

0 件のコメント: