システムの目的を忘れないこと

これは30日チャレンジの17日目(2019/09/25)に書かれた文章です

あらゆるシステムにおいて、ユーザが入力可能な値が増えるほどシステムの複雑性が高まる。 こうして見るとあえて文字に起こすほどのことでもないが、新規のシステムや機能を検討している段階において本主張はしばし見過ごされることがある。 あるいは「そもそもこの値はユーザから入力してもらう必要があるのか」という問いを立て、What‐何を創るかを洗練させることができるエンジニアは少ないのではなかろうか。

筆者はいま、来春リリースを見据えた新たなアプリケーションの開発に携わっており、本日もチームメンバーと機能の検討を行った。 議論の中で、ある機能をスコープから外すと一気に設計がシンプルになるモデルが発見された。

一言で説明すれば、それは時間割を表現するモデルで、機能としてはユーザごとに自らが作成した時間割にもとづく進捗管理を行う。 では一体どうして、時間割モデルをスコープから外すと大きく設計が簡潔になるのだろうか。

抽象的で主観的な主張に聞こえるかもしれないが、筆者が思うに、その理由は時間割モデルがシステムの状態の自由度を二重に増加させるからだろう。

まずユーザが時間割モデルを作成するユースケースを考える。これは直接的な操作だ。 時間割は本システムにおいて原始的な概念と位置づけられ、ユーザが直接操作(作成・編集・削除)できる。 一方で、時間割にもとづく進捗管理は次の理由から間接的な操作だと言える。 「進捗」は「時間割」によって規定される概念であり、進捗を表現するモデルを操作したときには、暗黙的に時間割の情報を含んでいる。 たとえば規定元である時間割が変更された場合には、既存のすべての進捗が影響を受ける。 つまり、時間割の変化によって進捗が持っていた情報の意味まで変わるのである。 こうした概念間の依存関係は一般にシステムでモデリングすることが難しく、保存されたデータの管理も極めて複雑になる。

また、ユーザ入力が増えることは、ユーザに対するシステムの利用負荷を高めていることも忘れてはいけない。 システムはデータを「忘れる」こともないし、「誤った操作」を行うこともない(人間が生んだバグが意図しない挙動を引き起こすことはあるが。) 一方で、ユーザは自分が過去に入力した値を忘れるし、誤った情報を入力することも、悪いときにはデータを削除することもある。 ユーザ入力の値を増やすことは、ユーザに対して管理コストを強いていることになるのだ。

我々プロダクトの開発者がもつ目的のひとつは、間違いなく「プロダクト=システムによって人間が行う手間を減らすこと」だ。 システムを構築する主体者として、この本来の目的に矛盾してはいけない。 言葉遊びのようだが、「手間を減らすためのシステムを使うための手間を増やす」のでは意味がない。 ユーザには最低限の入力だけを要求し、「手間を減らす」という本来の提供価値に集中しなければいけない。

我々のチームは時間割モデルをスコープアウトしたことにより、サービスの複雑度を下げることができた。 それと同時に、入力を減らしたことで、これまで暗黙的にユーザに要求していた責務・手間を取り除くこともできたのである。 先日の「リファクタリング好きなエンジニア」にも通ずるところがあるが、何のためにエンジニアリングを行うのかという視点はつねに持っていたい。