Javaがわかるはずがない(注:珍しくこの項は純粋に同業者向けです。落ちもまともです)

この時期、日本中でたくさんの新人プログラマJavaを習っていると思う。そういう人たちに言いたいことがある。「あなたに絶対Javaはわからない。わかるはずがない。いや、わかってはいけない」

これでは呪いの言葉になってしまうので、もうちょっとていねいに言おう。5000行くらいのコードをひとりで書いた経験がなければ、オブジェクト指向と言うのはわからない。わからない方が正常で、わかったと思う人はまず勘違いである。

初心者がJavaを勉強していく時、if文やfor文はすぐ頭に入る。これらの命令がどういう動きをするのか理解した時に、それが何のためにあるか直感的にわかるからだ。つまり、howがわかった瞬間にwhyが理解できる。「どう使う」を教えられたら「どこで使う」のかも自然とわかってくる。

オブジェクト指向のいやらしさは、howとwhyがつながらないことだ。classやinterfaceを教えられた時、最初は、それがどういう動きをするのか悩むだろう。確かに、これはifやforよりはややこしい。単純なサンプルでも長くてなかなか追えない。だが、howに徹してじっくり読めば初心者にもわからないものではない。

問題は、ひととおり動きを追いかけて、自分で少しサンプルを動かせるようになってから「はて、いったいこの変な命令はなんで存在しているのか?」ということを疑問に感じた時だ。つまり、howが理解できてもwhyにつながらない。ここが混乱の元である。ある段階まではhowとwhyが直結して着実にステップアップしていく。それが、classが出現した所で、howとwhyが分離して宙ぶらりんになってしまうのだ。

いっそのこと単独の命令がもっともっとややこしくてhowが理解できないくらいの方が、初心者は幸せかもしれない。「今はこの命令のhowが理解できないが、もう少し修行を詰めばhowがわかる」というビジョンが持てるからだ。彼はここまでのstepで「howがわかればwhyもわかる」という幻想の中にいるので、混乱したり不安になったりはしない。いくら難しくても次にやることが見えるからだ。

しかし、classという命令をマスターしようと思うと、howはわかるがwhyがわからないという状態に追いこまれる。この状態で初心者には打つ手がない。howは理解したので、これ以上howは勉強できない。したくてもすることがない。でもwhyはわからない。しかし、彼はwhyを理解するために何をしたらよいかと言うと、とにかくhowを頭にたたきこめばwhyが自然とついてくるという手法しか持っていないのである。

whyがわからないと困るのは、書けないことではなく書けすぎてしまうことだ。classを使って何か書けと言われたら、すぐに書ける。何とおりでも書ける。継承なんて技を覚えたら、同じ処理を10とおりでも20とおりでも書ける気がする。でも、その中でどれが正解なのかわからない。評価基準が見つからないから、どれも選べない。選べないまま油汗を流して硬直している。

という状態に陥いって、しかもこれを言語化できないで悩んでいる人が多いのではないか。一種のパターンと言えるかもしれない。

オブジェクト指向が意味を持つのは、ある程度の規模のシステムで設計や保守という工程が分離してからだ。あるいは複数の関係者がからんできてからだ。新人の練習問題にはそういう概念がない。classのwhyは理解しようがない。できるはずがない。

だから、Javaを習う新人には「classのwhyで悩むな」というアドバイスが絶対必要だと思う。先輩諸氏はこの段階で悩んでいる新人がいたら「10年早いんだよ。ボケ!」という暖い言葉をかけてあげましょう。