なにか話すことはないかと Hacker News をみていたら(ろくでもない)、 Youtube や Gmail など Google のサービスが一時間落ちていたというニュースで 盛り上がっていた。担当者の想像するだけで胃が痛い。
森田はクライアントサイドで仕事をしているので、この手の outage は起きない。 けれど自分のところに担当したくないイヤなバグが回ってくることはたまにある。 そういうのを精神衛生を害さない程度で思い出してみたい。
A Ship Blocker
何年か前にカメラアプリのチームに入った直後、ハカソンでカメラのビューファインダに OpenGL のシェーダで簡単なエフェクトをかけるコードを書いた。
ハカソン最終日のデモで成果を紹介すると、より洗練されたリアルタイムエフェクトを近隣のアルゴリズムチームが長いこと構想していたことがわかった。 そこで彼らが開発していたエフェクトのフレームワークを森田がカメラアプリにインテグレートすることになった。 とはいえアルゴリズムの開発は始まったばかりで出荷するのはまだ先になりそうな雰囲気。 アルゴリズムチームがアプリ内で試行錯誤できるよう、早速ハカソンのコードをベースに最低限のインテグレーションを済ませた。
その仕事のことをすっかり忘れていたある日、アルゴリズムチームの人が「そろそろ出荷に向けて準備したいのでバグなおしてくれない?」とやってきた。 改めて自分のインテグレーションを見直すと・・・バグだらけじゃん。特に電話機の向きを縦から横にかえた時に描画が壊れる。 やれやれ・・・と直そうとするも、API が期待通りに動かない。
一週間以上たってもなぜ動かないのかわからないので途方にくれ、 小さな再現ケースをつくって、 正しくうごくケースすなわちエフェクトなしのコードパスと挙動を比べてみると・・・。
これ OS のバグじゃね?という結論に至った。 一般に OS のバグを疑うときは自分が間違っているものだが、Android に限るとその限りでない。 先に書いた再現ケースを片手にバグ報告をする。
が、まったく相手にされる様子がない。 しびれを切らしたアルゴリズムチームのプログラマがやってきた。「担当者に直談判しましょう」という。 仕方ないので質問ドキュメントを事前に送付の上ミーティング。「ああわかったきがする。すぐ直すよ」と担当者。
しかしコードがチェックインされたのはそこから一ヶ月後だった。しかも直ってない!どうなってんた! アルゴリズムチームにつつかれ、ふたたびミーティング。前回は問題だけ伝えたのがよくなかっという反省から、 もう少し要求を細かく伝える。このあとようやく修正が通り、デモが動くようになった。
しかし OS のバグはトランクでのみ修正されており、気がつくとリリースブランチはとっくの昔に切られていた。 そして cherry-pick の締切も過ぎていた。この OS のバグにブロックされ、リアルタイムエフェクトの出荷は一年先送りとなった。
二年目
一年後に向けてアルゴリズムチームはエフェクト実装の改善を進めていた。 具体的には消費電力の改善に取り組んでいた。(つまり OS のバグがあろうがなかろうが出荷できなかったのだね・・・。) 試行錯誤の過程で、彼らはアプリとのインテグレーションも大きくデザインを変えていた。つまり森田がハカソンで書いたコードは姿を消していた。
その仕事のことをすっかり忘れていたある日、アルゴリズム班の人がやってきて「エフェクトが動かないのでなんとかしてほしい」という。 久しぶりに見ると見慣れないコードばかり。インテグレーションに使う OS の API も SurfaceView から ImageReader へ、ずいぶん変わっている。 そしてこれが動かないのは・・・ OS のバグなのでは? 嫌な既視感に襲われつつバグを報告するも、やはり直らないバグ。またしびれを切らして直談判。
今年もダメかな・・・と思っていたら、最近 OS のチームに入ったプログラマが颯爽とあらわれ、さっとコードを直してしまった。 あれ?なにそれ?ことしは出荷できちゃう?
2.25 年目
と喜んだのも束の間、アルゴリズムチームは再びインテグレーションを書き換えはじめた。 チームの偉い人の推薦に従い、新しい内製フレームワークの流儀にあわせることにしたのだという。 フレームワークに乗せるだけで OS とのインテグレーション方法は変わらないからそんなリスクないでしょ、ということらしい。 なぜそれを今やるんだ!
そんなことを知らない森田がいつもようにアプリをつついていると、 起動時にビューファインダーの画像がコマ落ちし、カクついていることに気づいた。 嫌な予感がしたのでエフェクトのフラグを切ると、カクつきが消える。 仕方なく調査をすると、チームの偉い人が勧めるフレームワークに性能問題があることがわかった。 リアルタイムエフェクトによって今まで使われていいなかったコードパスを通過するようになり、隠れた問題が露呈した次第。
仕方ないのでプロファイルをとりつつフレームワークを直したのは良いが・・・まったくコードがレビューされん! というのも、そのフレームワークを書いたエンジニアは出世してマネージメントとかもするようになり、 手を動かす仕事はあまりやらなくなっていたのだった。本来ならマネージされているチームメイトにレビューを頼むところ、 スレッドの使い方など繊細なコードをいじった手前、義理を立てたのが裏目に出た。
結局締切までにレビューが間に合わず、リアルアイムエフェクトの出荷は三ヶ月先送りとなった。 OS と違い三ヶ月で済んで良かったですねー・・・。
さすがに今はもう出荷されている。
初回だというのに随分長くなってしまった。けれどこの長さこそがこのバグのイヤなところなので仕方ない: つまり、自分の知らないところで起こった問題を締め切り前に押し付けられ、結果として誰かの新機能が出荷できないバグ。イヤすぎる!
他人にバグ修正を頼むのはよくないという反省から、このあと森田は OS ツリーのビルド、インストール方法を調べ 手元で OS のコードをいじれるようにしたのだった。ただしその成果を発揮する日は今の所きていない。来なくていいです
サーバサイドのかっこいいバグの話なんかないですか > 和良