何らかの理由により、特定のユーザー向けに何らかの開発を行ったりデータ修正を施したりすることを、ここでは個別対応と呼ぶこととします。泥臭い話ですが、案外色々な場所で行われているらしいということ最近知りました。
そんな個別対応、思いつくものをいくつか列挙し、主観で評価してみました。
バグなどで発生した意図しない状態のデータの解消
運用的ご用心度: ★★★
保守的ご用心度: ★
例えば、何かしらのバグを含んだリリースをしてしまったとして、差戻しなり修正リリースなりでバグった状態を解消できたとします。しかしそのバグっていた間に意図しない状態のデータが生まれてしまって、ユーザーが自力で解消するのが不可能、あるいは可能ではあるが現実的でない時間がかかる、といった場合、その状態を解消してあげる必要があります。
基本的にその場その限りでの対応であるべき状態に戻すだけのため、技術負債的な意味では大きな問題はありません。
ただし、オペレーションミスには十分に注意すべきで、
- 絶対に一人でやらない
- バックアップを取る
- どういう対応をしたのか記録に残しておく
などの対策は必要でしょう。
(そもそもバグを起こすなという話もありますが、現実問題としてバグは起きるものなので)
仕様上出来ないデータの変更
運用的ご用心度: ★★
保守的ご用心度: ★★
現時点でユーザーに提供している機能の範囲内では変更・削除が出来ないデータに対して、どうしても変更したいという要望があるとします。例えば、
- データの結びつけを間違えてしまったので直したい
- プリセットをたくさん作ったがもう使わない、一覧画面に溢れて邪魔なので削除したい
など。
基本的にデータの変更はしなくて済むのであればそれに越したことはないですが、対外的理由等々でどうしてもやらないといけないということも往々にしてあると思います。やるのであれば、その対応で不整合が起きないことを入念に調査した上で、問題ないことが明らかにした上でやるべきです。
ただし、こういった対応が頻発するとリソースを圧迫するので、その場合はユーザーかサポートかに裁量を渡す方針を取れるとよいと思います。
- 変更・削除をできるようにする機能を開発・提供する
- そもそも「システム的に重要なデータなのでユーザーに迂闊に変更させたくないため、意図的に機能を提供していない」といったケースもあると思うので、よく考えてから。
- サポートに限定的な権限を付与する
機能提供
運用的ご用心度: ★
保守的ご用心度: ★★★
あるユーザー向けに専用の機能を提供、あるいは特定の機能をあるユーザー向けにカスタマイズする、といったことがあるかもしれません。
こういったものは、一度提供してしまうと主に政治的理由により廃止しづらくなります。
また大抵の場合、こういった専用機能は作られたとしてもチーム内に事細かに周知されることがないため、保守できる人が限られてきます。その上であまりに特殊なことをしていると、保守コストが非常に高くなってしまいます。特定のユーザー専用ではなく、全体向けへの提供を考えてみても良いかもしれません。
また他にも、機能の差異をどう実現するかによっても注意点があり、
- ソースコードで実現する場合
- if/switch文で書いてしまうと、1つの分岐がいずれどんどん肥大化して保守性が下がる。開放閉鎖原則に則った設計にしておくのがベター。
- データで実現している場合
- 機能の標準として「想定していないデータ」が存在すると、将来的にその機能のリファクタ・リプレイスなどをする際に、データ移行がスムーズに行いづらくなる可能性がある。
おわりに
個別対応の要望があったときに、盲目的に「アッハイやります」ではなく
- そもそもの期待がなにか考え、妥当な代案を提案する
- 運用保守まで考えて落とし所を見つける
といったことが出来るかどうかがエンジニアとしての腕の見せ所だと思うので、頑張っていきたいですね。