過去のブログで、良い判断をするためには、良い前提が必要であるという主張をしました。

例えば以下の記事です。

演繹(えんえき)法から考える設計の本質

多くの場合、前提を明確にすればうまくいくと感じています。

しかし、場合によってはうまくいかないこともありました。

今回は、 前提 について深堀していき、

前提を明確にしてもうまくいかない場合に、どうしたらよいのかを考えた内容を共有します。

はじめに

アプリ開発では、日々多くの技術的な判断を行います。

  • どのアーキテクチャを採用するか
  • どこに責務を配置するか
  • 新しいライブラリを導入するか
  • 技術的負債を返済するか

これらの判断には、多くの場合「唯一の正解」はありません。

同じ技術者でも、状況によって異なる判断をすることがあります。

では、良い技術的判断とは何でしょうか。

この記事では、技術的な意思決定を行う上で重要な「前提」という考え方について整理します。


1. 意見の違いは、前提の違いから生まれる

例:

「APIレスポンスの加工処理をどこに書くべきか」

という議論。

Aさん:

ViewModelで十分ではないか

Bさん:

UseCaseに分離すべきではないか

表面的には、

「ViewModel派」 「UseCase派」

の対立に見える。

しかし、本質的には、

「どのような未来を想定しているか」

が違います。

Aさん:

  • この機能は小さい
  • 今後変更されない
  • シンプルさを優先したい

Bさん:

  • 今後拡張される可能性がある
  • 複数画面で利用する可能性がある
  • テスト容易性を重視したい

つまり、意見ではなく、その背景にある前提を見る必要があります。


2. さらに一つ前の前提を見る

前提は深掘りできます。つまり、さらに一つ前の前提が存在します。

例えば、

「UseCaseに分離するべき」

という判断の裏には、

「保守性を高めたい」

という前提があります。しかし、さらに上を見ると、

  • このプロダクトは長期運用されるのか
  • リリース時期は固定なのか
  • 開発リソースは十分なのか
  • 今回変更できる範囲はどこまでなのか

という、さらに上位の前提が存在します。例えば、

  • 1週間後にリリース予定
  • リリース延期はできない
  • 対応できるエンジニアが2人しかいない

という状況なら、

「理想的な設計に変更する」

よりも、

「今回は既存構造を維持してリリースを優先する」

という判断になる可能性があります。つまり、

正しい設計を選択すること

ではなく、

状況に対して最適な判断をすること

が技術的判断と言えるでしょう。


3. 何を重要視しているかを確認する

技術的な議論では、相手の結論を見るだけでは不十分です。確認すべきなのは、

  • 何を重要視しているのか
  • 何を守ろうとしているのか
  • 何をリスクとして見ているのか

ということです。例えば、

「シンプルなコードにしたい」

という意見の背景には、

  • チームメンバーが理解しやすい状態を維持したい
  • 不必要な抽象化を避けたい

という意図があるかもしれない。

「責務分離したい」

という意見の背景には、

  • 変更に強い構造にしたい
  • テストしやすくしたい

という意図があるかもしれない。

結論だけを見ると対立しているが、目的を見ると共通点が見つかることがあります。


4. 前提が一致しない場合どうするべきか

私は「前提が一致しないこと自体は悪ではない」と考えています。

ただし、プロダクト開発では、人間関係のように「別々の道を選ぶ」というわけにはいきません。

チームとして一つの判断をする必要があります。そのためには、

4-1. 価値観の違いを認識する

例:

  • 品質を優先したい
  • スピードを優先したい

これは正解不正解ではなく、何を重要視するかの違いです。

4-2. 制約によって変更できない場合を理解する

例:

「今すぐリファクタリングしたほうが良い」

しかし、

  • 会社としてリファクタリングの優先度が低い
  • 大規模変更になる
  • 対応できる人員がいない

という場合もあります。この場合は、

「改善すべきではない」

ではなく、

「改善したほうが良いが、現在はそのコストを払えない」

という判断になるでしょう。その場合は、

  • 技術的負債として記録する
  • 将来的な改善タイミングを決める

などの意思決定を行うことになるでしょう。


5. 良い技術者は正解を知っている人ではない

シニアエンジニアやテックリードなど、経験を積んだエンジニアは、

「この状況では何を優先すべきか」

を考えているはずです。

技術的判断とは、知識量だけではなく、

  • 前提を整理する力
  • 制約を理解する力
  • トレードオフを判断する力
  • チームで合意形成する力

によって決まると考えています。


まとめ

私は 技術的な議論で重要なのは、結論を合わせることではない と考えています。

まず、

  • なぜその判断をしたのか
  • どんな前提があるのか
  • 何を重要視しているのか
  • どんな制約があるのか

を理解することから始めるべきでしょう。

そして、その前提を共有した上で、プロダクトにとって最適な判断を行う。

私は、技術的判断とは正解を選ぶことではなく、

限られた条件の中で、最適な選択をすることである。

と考えています。