seri::diary

プログラミングのこととかポエムとか

余裕はあるけど今やらなくても良さそうだけどいつかやった方がいいタスク問題

こういうタスクは大体「溜まる」傾向にある。 github issueでいえば いつかやる とか NiceToHave なんていう、何とも第三者から見ると全くプライオリティが想像できないタグが付けられて、そして1か月もたつとissueの存在すら忘れる。*1

自分の場合、こういうのを貯めておくと気持ち悪いので、それほど余裕がなくてもスキを見てさっさと片付けてしまう傾向にある。今日も例外発生時の調査用のログフォーマットを調整するだけのPRを出した。*2

余裕ができると自分はリファクタリングのPRを週に10個近く出していることがある。流石にレビューを依頼される同僚からはドン引きされたのではなかろうかと思うが、プロジェクトの谷間とかで急ぎの仕事がなければそういうことをせざるを得ない時もあるのである。

そのため、自分がアサインされているissueは遅くても1か月にはcloseされている傾向にあるようだ。ようだ、というのは正確に計測した訳ではなく肌感覚だからなのだが、少なくとも3か月以上closeされていないissueに関して言えば自分は1つしか持ってない。これはやらないのではなく色々な事情でcloseできておらず目の下継続中のタスクなのだ。

さて、こういうタスクに関してだが、他のメンバーを見ると結構古いissueをずっと抱えているのをよく見かける。openなissue絶対closeするマンの自分は、時間ができると他の人のissueを見て回って「進捗どうですか?」的質問をして状況を確認し、わざわざその時のステータスをコメントに書いてみたり、アサインされていないものは適当にやれそうな人をアサインしておくことがある。あるいは自分で勝手に巻き取ってやってしまうこともある。自分がやれるタイミングなら自分がやるのが一番早いからだ。

自分の場合、積み残した仕事というのがそもそも自分として許せない存在であり、改めて検討した結果やる必要がないと判断できるならすぐcloseしてしまうし、イシューになっている(githubのissueではなく本来の意味のissue)時点でそれは自分のチームの責務なので、なるはやでcloseに向けて動くのが仕事だと思っている。

こういう積みタスクというのは、クライアントにも同僚にも喜ばれる華々しい機能追加ではなく、大抵はちょっとしたtypoを直すとか、社内用の画面のちょっとしたバグだとか、急いでいたので黙認したrubocopの警告を直すとか、ライブラリのバージョンを上げるとか、拡張性の悪いクラスを細かく分割してspecを書き直す、とか、めったに起きないエラーを調査して直すとか、使ってないクラスを既存コードに影響しないように取り外すとか、使ってないのになぜかDBに残ってるテーブルをdropするとか、not null制約がないとどう考えてもおかしいのに付いてないカラムに付けるとか、そういうやつである。

そのため、会社の売上にも貢献できず、その上誰からも感謝もされず、評価もされにくい貢献だと思われがちなせいか、多くの人は避けたがる。だがその思い込みは恐らく間違いだ。そうこうしているといつか大きな負債を生んで自らを苦しめる(もしくは苦しめられた)例を自分は沢山知っているし、逆に自分が時間がある時に仕込んだ詳細なログのおかげで命拾いしたことが何度もある。これはれっきとした技術的負債の返済であり、将来の自分たちを救うための重要なタスクなのだ、と思ってもらいたい(のだが、一度そういうマインドが染みついた人の思想を変えるのは実際難しい)。

こういうタスクは実際会社の売上には1円も影響しないかもしれないが、将来発生し得る100万円の損害を1万円に抑えられるかもしれない可能性を秘めている。いざ大障害が起きてから「ログが少なくて状況が分かりません」だとか「コードが汚くて修正するのに時間がかかります」などと言ってられるだろうか。そういう目にあってから初めて目を覚ますのでは遅すぎる。

こういう負債をまとめて返済すべく派手にリファクタリングするのはデグレのリスクが大きくなる。そのため、5行とか10行とかの小さなPRを普段から出し続けて地道に改善するしかないのである。GoogleUeyama Ruiさんのブログにも同じような話が書かれている。

blog.sigbus.info

自分はオープンソースに何度かPRを出してマージされたことがあるが、基本的に仕事でコードを書くのとオープンソースのコードをいじるのとは全く同じスタンスで考えている。つまり、変更の意図が分かりやすく、必要な量のコメントが書いてあって、自分以外の誰かが次にいじる時に困らないようにするということを常に守っている。実際、オープンソースにPRを出す練習のつもりで、これまでつらつら述べてきた「誰もやりたがらないタスク」を片付けている部分もある。そう考えればそこまで退屈なタスクでもないし、タイムアタックだといわんばかりに1日に何個片付けられるか挑戦してみたりすることで自分はそれなりに退屈しないでいられるのだが、もしかしたら自分が変わってるだけなのかもなぁという気持ちにもなっている昨今である。

*1:こういうタスクどうやって管理するのがいいのかいまだによく分からないがどうやっても発生してしまう。定期的に棚卸すればいいのだろうか。誰か教えてくれ。

*2:今の会社に入ってからBugsnag入れたりログを増やしたりログを検索できるようにしたり、エラーを可視化する仕事ばかりしている気すらする。この手の運用に強いコードにするためのリファクタリングのコンサル業だけで飯が食えそうな勢いである。