Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

「手順」ではなく「構造」を知ろうぜ!

ホッテントリのあとのエントリは緊張するね。すぐフィードの登録数とか減ったらヤダなw


今、プログラミングにはどんどん便利なツールが出ている。
きらびやかなGUIも簡単に作れる。


僕はそこら辺にいるフツーレベルのエンジニアだけど、若い人たちに伝えたいことがある。
見た目だけにダマされるな!と。


プログラミングを社会人から始めたような若い人たちは、GUIでのデザインや動きばかりに目を奪われ、とかくエンジニアリングの基盤を無視しがちだと思う。
まるでデザインばかりで服の型を無視したファッションのように。
僕が言いたいのは、


ドラッグ&ドロップしてプロパティをカチャカチャ設定することは決してエンジニアリングじゃあない


ということ。


GUIやリッチクライアントといったものは見た目にインパクトがあり、やってみたいと思いやすい。
注意してほしいけど、僕はリッチクライアントをやるなと言っているわけじゃないよ。
たとえばFlexだってActionScriptがあるわけで、それはオブジェクト指向言語だし、Flexとサーバーとの通信はHTTPを利用してる。こういう部分は見た目の話ではない。
見た目をいじることが勉強ではなく、もっと基本的な、オブジェクト指向やHTTPをないがしろにしてはいけないということを言いたい。


便利なツールに気を取られ、用意されたものに従ってさもすごいものを作った気になるのかもしれないけど、それは「理解している」のではなく「使っている」だけなんだ。
「使う」と「理解する」の間には決して「超えられない壁」があるんだ。


システム開発で例えるけど、参画前に聞いていたスキルレベルと実際のスキルの違いに驚いたことはないかい?
面談で「StrutsやSpring、Hibernateの経験があります。」と言っていた人が、まるでプログラミングができないといったようなことはなかったかい?


それは「使ったことがある」だけだからだ。Strutsを使えばこう書くだけでシステムが作れるという手順を知っているのと、Strutsが何をしていてどういう仕組みで動いているのかを理解しているのとでは、すごくすごく大きな違いがある。
StrutsServletをどう利用しているのか?ActionFormにどのようにリクエストパラメータがセットされるのか?Action#execute()で返したActionForwardからどうやって次のページに遷移しているのか?


もっと言うとJavaをインストールしたときに環境変数PATHに設定する。設定するけど、なぜ設定するのか?設定することで何が起こるのか?
「手順」として覚えていたような基本的なことでも、理由を理解しようとすると案外難しいこともある。


.NETのVisualStudioが出たとき、みなその機能に驚愕した。
Javaとの違いに落胆し、これからもっとWeb開発は簡単になるように思われた。
VisualStudioは最高のIDEの1つだと思うけど、それでも簡単にはならなかった。システム開発ではドラッグ&ドロップとプロパティの設定だけではできない要件が必ずあるからだ。


ツールというのは構造を理解した人が煩雑な作業を省くために利用するものであって、逆はない。ツールがあれば構造や仕組みを理解しなくていい、というものではない。


どれだけ最新技術を使ったことがあったって、使う手順を覚えているだけではエンジニアとして成長してるわけじゃない。
ツールの使い方なんて、使っていれば覚える。けれど仕組みは使っていても理解できない。自分で調べない限り。


大事なことだからもう一度言うけど、僕は新しい技術、たとえばリッチクライアントとか動的言語とかを勉強するな、と言ってるわけじゃない。
ただ用意されたコンポーネントを使ってかっこいい画面を作ったり、新しい言語をインストールしてHelloWorldを出したりしただけで満足してほしくないということ。


もっと大きな理論を大切にしてほしい。目先の作業に追われずそうしたことを理解できる時間は若いうちしかない。
脳の吸収力があり、管理作業もなく、いずれできる家庭に時間を割く必要がない間に。