要するにプログラミングって
WEB+DB PRESS 総集編 / I told my code to sing - Backnumbers: Steps to Phantasien
相変わらず面白いエントリを書いていて素晴らしいですね。
リンク先にあるようなレベルの高い話は置いておいて僕自身にとってプログラミングの抽象というのは何だろうというのを思い出して書いてみる。なおここではJavaの話をする。
プログラミング = 手続き
Hello, Worldに代表されるようにある言語を身につけようと思ったときに書く最初のプログラムはたいていコンソールで手続き的に同期的に実行されるものだ。そしてプログラムのエントリポイントもはっきりしているケースだ。
ソースに上から書かれている順番に実行されるのでわかりやすい。メソッド分割したりクラス分割したりするにせよ手続き的、同期的なプログラムがわかりやすいことに異論は無いだろう。
僕自身が新人の最初の頃はこのレベルの抽象化しか無かったように思う。
これの発展系としてはエントリポイントがわかりにくいケースだ。
例えばServletを書く場合にmainメソッドは存在しない。doGet/doPostメソッドを実装することになる。
この辺でフレームワークの考えが入ってくるわけだ。
おまえが呼ぶな、俺が呼ぶ「ハリウッドの原則」ですね。これでフレームワークから呼ばれるメソッドを実装するという抽象化能力を獲得できました。レベル2にあがりました。パチパチ。
プログラミング = イベントドリブン
手続き的な考えに慣れてくるとイベントドリブンというのはわかりにくい。これもおまえが呼ぶな、俺が呼ぶという世界なのだが、イベントループというモデルが背後にある。
これはGUIプログラミングを経験すればわかりやすいだろう。
そしてGUIプログラミングではスレッドの話が出てくる。JavaのSwingではボタンなどのコンポーネントはイベントディスパッチスレッド上で動くシングルスレッドモデルだ。
重い処理をイベントディスパッチスレッドでやってしまうと画面が固まるので別スレッドに切り出す必要がある。さらにこの重い処理がキャンセルされた場合とかも考えることになる。
さあ非同期の世界の登場だ。ちなみにServletもマルチスレッドの世界なのでWebアプリでも非同期の世界は味わえる。というかサーバーアプリはスレッド全開だしね。
僕はこの辺を4年目ぐらいでわかるようになった。
プログラミング = 構文木
5年目から8年目の途中までJavaの静的解析ツール製品に関わっていたこともあり、構文木の世界に触れることになる。JavaCCというコンパイラコンパイラを使うので構文木を作ることはそんなに難しくないのだが、その後の意味解析系が大変だった記憶がある。
デザインパターンといえばSingletonぐらいしか知らなかった僕がVisitorパターンを知ったのもこの頃。や、デザインパターンの名前は知っていてもどこにどのように使うかっていう実戦的な話は知らなかったんだよね。JUnitはデザインパターンの宝庫だけどVisitorパターンは無かったし。
リフレクションとかバイトコード操作系の黒魔術を知るようになったのもこの頃。S2Daoはinterfaceしか書かないのに実行できるのはこの辺の仕組みがあるから。
オトナの階段を登った瞬間ですね。
プログラミング = 分散
分散処理をコードレベルで初めて意識したのはJenkinsの分散ビルドだ。当時はHudsonという名前だったけどプラグイン周りを調べていてその流れでremotingを知ったのだが新鮮で面白かった。
今まではソフトウェアのコードのどの部分を読んでもそれが実際に動くのは同じ1つのマシンだったけれど、分散処理はそうではないからね。
そして最近はHadoopだ。分散処理が全開でさらにスレッドも全開で簡単に処理が追える代物ではないがコードを読むのは面白い。読んでるときに実行はしてないけど。
あと分散だとシリアライザーションの話がある訳だがその辺はおえてない。
と、まあJavaでいくつかのプロダクトのソースを読んでいくつかのパターンを学んできたけど、まだまだ僕の知らない世界は多いだろうなあ。なんかいつまでたっても手続き思考が抜けない気がするけど。