燃える火消し屋

プロジェクトやってるとあるじゃないですか。どうやって解決すればいいのか分からない・・・、原因が分からず解決できない・・・、持ち合わせてる知識で解決するには莫大な工数がかかる・・・などなど、課題とか壁とかみたいなの。

そんなのオンリーで火消し屋やってきました。正直「ほんとにいいの!?こんなにおもしろそうなのばっかり!!ほんとにやっちゃっていいの!!?」って感じでした(笑)めちゃ燃えてましたね。こういう高い壁こそぶち破るなり乗り越えるなりすると染み渡る充実感に浸れるのに。

取り組んだのは文字化け、パフォーマンス、技術的課題などなど。だらだら書いたら長くなったので折りたたみ〜。
今更文字化けで悩むこたぁ無いべと思ったら悩んだ。エンコードの問題じゃない。ここまでできちゃってるアプリ全体を今更どうやって文字化け対策するのか。リクエストフィルターでは解決できないDBのエンコードの問題だったので、ResultSetでかますのがいいよなぁと思いつつも全てのクエリ結果が通過するような共通クラスや、ResultSetをラッパーしているようなクラスが無い。現実的に思いつく対策は全てのDTOのGetterでエンコードをかける事。しかし数万箇所に及ぶGetterにエンコードかますなんてのは現実的じゃない。まぁ実際解決した方法はHTMLをレンダリングする時にエンコードをかけるってもんでしたが。だけどすぐ問題は解消したし、パフォーマンスにも影響が無い。最善ではないけど現状では最適な対策だと自己満足に浸った。

パフォチューもめんどくさいもんで、300万件検索するのに3分もかかる。実行計画見ながらインデックスをはっていっても1分30秒と遅い。わけわかんない重たいビューなんか削除しちゃって直接検索へ。それでも遅い。こりゃSQLやらDBの問題じゃないなという事でアプリを見てみるとあらあらまぁまぁ、ページングの処理がしょぼい。画面に表示されないデータ分まで全件集計してたらそれは遅いわ。むしろ3分でよく集計してたねってくらい。Page-by-Page Iteratorパターン(ちょっと違うけど)でも導入しますかって事でさくっと対策。他にもチマチマと対策して5秒になった。納得いかない・・・3秒以下にしたい。がしかし、もうこれは仕様が悪い。要件も重い。在庫のリアルタイム集計で集計項目が多すぎる。というわけで5秒で我慢してねと。もっと速くしたいなら集計項目を減らすか、違う機能に分割しましょうってな事になりますよと。でも5秒で満足だったらしい。3分が5秒になっただけで大満足と。他のパフォチューも大変でどんなにがんばっても1分30秒かかる処理が10秒にしか縮まらない。この時点でも9倍の性能改善だけれども10秒もかかる画面は見れたもんじゃない。それでも限りある時間ではここまでという事でひとまず開放。これもリアルタイム集計系の画面だったから10秒で出てくるならSEとしては満足・・・だけどお客さん的にはページングがついてる画面の1ページ10秒は遅いって思うだろうなぁと。まだ性能改善の余地はあるけれど今は時間無し。とりあえず10秒の状態でチェックイン。

後は技術的課題がいろいろありましたが、どれも苦労しながら解決して時間切れ。最終退室時間になったので帰ってきました。

ここ数日分の作業を初めて対応する人は1日や2日じゃぱっと解決できない事ばかりだと思う(過去の自分がそうだったんだけど誰もがそうじゃないかも・・・)。原因を調べるのに時間を必要とし、原因の解決策を調べるのに時間を必要とし、解決するのにも時間を必要とする。この大部分を過去の経験で補いました。それでもPrepareStatementのキャッシュをクリアする方法なんかは調べて時間を食ってしまいましたが・・・。TomcatのDataSourceから取得するConnectionが生成するPrepareStatementはOraclePrepareStatementじゃなくてDelegateStatement(DBCPのクラス)だという事を初めて知った日でもありました。

だけど1度でも頭痛が痛くなる(笑)くらい悩んで自力で解決しないと底力がつかない。そんな苦労の塊だけをポンとくれちゃって、わくわく燃えながら仕事しました。逆境そこ燃えますね。さすがに時限爆弾抱えていると精神がすりきれますがそれでも乗り切った時、後の大きな糧となってくれてます。

心地よい疲れです。働いたなぁって感じです。まだ寝ないけど。