2016 12 25

紅葉

花水木

近所の街路樹はほとんど花水木なのだが、これは近所に限ったことじゃなくて、全国各所で花水木の街路樹が増えているのだそうだ。 その理由が、成長が遅くて管理が楽だから。 成長が遅いってのは大抵の場合は悪い評価なのだが、それが良いってこともあるんだね。

花水木は、花はまあ可も無く不可も無くってところだが、この時期の紅葉は好きだ。 陽に透ける赤の、まるで流れる溶岩を葉の形に切り取ったような感じが良い。

一人前

話は変わって、プログラミング。

このところ、仕事で主に扱うのが Java, JavaScript, SQL, PL/SQL, ExcelのVBA なのだが、だいたいどれも安定性が最優先で、採用されるバージョンはちょっと古いものばかり。

逆に人は、これらに対して新人相当なのが来ることが多かったりする。 さすがに全ジャンルで経験値0ってことは無いが、PL/SQLは経験があるけどJavaは未経験とか、その逆とかは結構多い。

そうした人たちが色々試行錯誤したりアドバイスを受けたりしながら成長していくのを見ていて、ある時 「こいつもそろそろ一人前だな」 なんて思うことになるのだが、いや勿論ずっとそう思わないままの人もいたりするのだが、まあそんなのは置いておくとして、俺がとりあえず一人前だと思うラインについて。

Java

制御を共通化しようと考えるようになったら一人前。

だいたい最初は、たくさんの処理を詰め込んだ大きなクラス、大きなメソッドを作る。 で、バグ取りに苦労したり、やっと出来上がったと思ったら仕様変更が発生したりして、自分の書いたやたら長いコードがいかに人に厳しいものかを痛感する。

そうやって苦労している過程で、コード内のあっちこっちに同じ処理があることに気付き、それらを共通化しようとし始める。 よくある Util.isNullOrEmpty みたいなメソッドを作るのだな。

で、細かな部分の共通化を進めているうちに、もうちょっと大きな単位で、扱う内容がちょっと違うけどだいたい同じ処理があることに気付く。 そしてそれらを共通化しようとするのだが、たいていは違う部分をパラメータとして渡すようにしてしまい、その結果、共通処理の内部は分岐の嵐。 まあそれでも読み難さは局所化されるので、最初に比べればずっとマシになってはいるのだが。

そんなコードを何度か書いているうちに、処理の流れそのものを共通化し、再利用できないかと考え始める。 これまでが呼び出される側の共通化だったのに対して、呼び出す側の共通化。 逆転の発想。

だいたいこの辺りで一人前。

まあ、やってることはデザインパターンの再発明でしか無いのだが、いずれそうなるのだからと先にデザインパターンの話をしても、経験が無いと響かないんだよな。

SQL

手順を副問い合わせや結合で実装できないか考えるようになったら一人前。

何かの条件でデータを抽出して加工し、その結果から更に絞り込んで別の加工をし、といった処理が何段か続くような場合、最初はだいたいこの各段を個別に順番に実装する。 まずselectし、その結果を中間テーブルに書き込んで、あるいは書き込みながら加工し、そこからまたselectし…という繰り返し。 SQL単独だとループも条件分岐も使えないと愚痴りながら、他の言語、例えばJavaとか、立ち位置は微妙だがPL/SQLとかで。

SQLの場合、先のjavaと違って、ここから先になかなか進まない。 というのも、他の言語の方で進化してしまうから。 割と小さな機能単位で処理が分解されているので、それらの整理や共通化に目が向きやすいのだ。 そしてその行き着く先はSQLの隠蔽。 SQLを扱う能力の退化の始まりだったりする。

きっかけはたいてい性能問題。

単体試験で10件ぐらいでテストした時は一瞬で終わってたのに、実際の運用規模の100万件だと5時間かかっても終わらない。 そんな事態にボトルネックの調査をし、ループの中でSQLを実行していることが問題だと気付く。

でも最初にやる対策はSQLじゃない。 コネクションプールは…もうやってる。 結果のキャッシュは…作りが複雑になるだけでヒット率は上がらない。 ヒット率が上がらないまま大量データを扱ってOutOfMemoryErrorなんてことに…。

そしてようやくSQLに目を向けるのだが、小さな機能単位への分解が進んでいる場合は特に、SQLは改善の余地がないほどシンプルだったりする。 インデックスは既に有り、しかもちゃんと使っているので、そっちでも改善の余地無し。

どうしようもなくなって全体の見直しを始め、100万件のデータを400万回のSQLで処理していたのが、副問い合わせや結合やcaseでちょっと頑張れば1回で終わることに気付き、やってみたら5時間が1分になったりする。

そんな経験をすると、他言語で実装している処理をSQL側に移行できないか、SQLの実行回数を減らせないか、とりあえず検討してみるようになる。

だいたいこの辺りで一人前。

まあ大抵の場合、頑張ったSQLは読み難いので、こうした手法を採ることの良し悪しはまた別の判断になるのだが。

あと少し

今日の残りがもう1時間弱なのだが、クリスマスだったんだね。 世の中が1ヶ月ぐらい前からクリスマス商戦なもんで、なんかもうクリスマスにすっかり麻痺してる状態なんだよな。 まあ、麻痺してなくても他人事で関心は薄いのだが。 サンタが来ることも無いし、サンタになることも無いし。

クリスマスはもうどうでもいいが、正月休みはちょっと嬉しい。 今年の仕事はあと二日。 ちょっと頑張ろう。