esm アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

対応を先送りにするという選択

こんにちは、kasumi8pon です。

先日、仕事で調査をしているときに将来エラーが起こりそうなバグを見つけました。それに対して「今は対応しない」という選択をした話をします。

将来起こりそうなエラー

将来エラーが起こりそうなことがわかったのは、全文検索エンジンを利用している箇所でした。ある ID の集合を指定しその ID のデータを結果から除く処理をしていましたが、その除外対象の ID はサービスの成長と共に増えていくことが見込まれています。 いくつかの全文検索エンジンではクエリに含められる句の最大数を設定することができますが、除外対象の ID の数がその設定の値を超えたときにエラーが生じて検索ができなくなります。 対象のデータは今後も増えていくことが予想されますが現在は上限値より遥かに小さく、データの増加ペースから見積ると、少なくともこの先数ヶ月ではエラーは発生しそうにありませんでした。

どんな対応を取るか

データが増えてもエラーが起こらないようにする方法を検討した結果、以下の二つの方法が候補にあがりました。

  1. クエリに含められる句の最大数の設定を変更し、上限を上げる

  2. ある条件の ID の集合を除くのではなく、その ID の判断基準に使った情報も検索エンジンにインデックスし、一つ一つを句として追加するのをやめる

一つ目の方法は、変更するだけなら値を設定し直すだけなので、簡単です。 しかし、上限値が設定されているのは1クエリに含まれる句が多すぎる場合のパフォーマンス低下を防ぐためなので、その上限を上げることで、エラーの代わりにパフォーマンスの問題が生じる可能性があります。 また、このまま除外する ID の数が増え続けたとき、再度上限値を上げる必要が出てくるかもしれません。サービスの成長と共にその数は増え続けることが予想されますが、それを毎回最大値を上げることで対応するのはいたちごっことなり、有限のマシンスペックでは対応しきれません。

二つ目の方法は正攻法です。除外したい ID の条件を他から取得して ID を直接指定するのではなく、その条件も含めて検索エンジンで検索します。クエリ内の句の数が増えることがないため、今回の問題は解決できそうです。 しかし、この方法はコードベースの変更だけでは済まずすべてのデータの再インデックスが必要なため、大きな作業になります。 プロジェクト内では最近全文検索エンジンのリプレースをする案が上がっており、問題が起きる前にリプレースを行うかもしれませんでした。また、未来のことはわからないので、もしかしたらこの機能が削除される可能性もあります。すべてのデータの再インデックスの処理を実行したが結果的に不要だった、という結末になることも考えられそうでした。

すぐには対応しないという選択

これらを踏まえて、わたしたちは第三の選択肢の「どちらの対応もしない」という方法を取りました。 一つ目の方法は根本解決にならないし、二つ目の方法は今現在起こっていない問題に対してかけるエネルギーが大きい上に無駄になるかもしれないため、今はどちらの選択肢も取りなくなかったからです。 しかし、何も対応しなければいつかは実際にエラーが発生することになります。 安心して対応を先送りするために、以下の二つを準備しておくことにしました。

「いつ対応が必要になるのか」をわかるようにする

対応を先送りにしたといっても、忘れたころにバグが起こってサービスに影響が出てしまっては元も子もありません。 それを防ぐため、対象となるデータ数の増加を監視することで、対応すべきタイミングがわかるようにしました。 人の手で監視を行うのではなく、監視を自動化し、そのときが来たら通知がくるようにしました。

「その時がきたら何をすればよいのか」をわかるようにする

先送りにしても、いざその時になにも情報がなければ対処しようがありません。 どんな問題だったのか覚えていればよいですが、忘れてしまう可能性があります。人間はよく忘れますし、そのときが半年後、一年後になるかもしれません。そうなると正確に覚えていることは困難になります。そもそもその時に自分がその場にいない可能性もあります。 そのため、誰でもわかるように、起こりうる問題ととるべき対応方針また、その選択をした背景などを、後から確認できるようにします。 具体的には、上記の監視のための変更のコミットメッセージやコードコメントに情報を残しました。

まとめ

まだ起こっていない問題について、「今は対応しない」という選択をした話をしました。 バグを見つけるとすぐに直したくなってしまいます。実際わたしも二つ目の方法を取ろうとしていました。しかし、チームメンバーのアドバイスを聞いて今回は先送りにするのがよいと判断しました。 現在問題が起きていない、かつ、今後状況が変わる可能性がある場合は先送りにすることも一つの選択肢になりそうです。