📝

技術書読書ログ「ソフトウェア設計のトレードオフと誤り」

2024/04/26に公開

概要

トレードオフはどこにでもある。本書に書いてある内容以外にもたくさんある。

ベストプラックティスと言われるようなものにもトレードオフがある。

型にはまった答えを求めるのではなく、自分の状況にもっとも適したものをその都度選ぶ。

そして、その意思決定を記録・発信していく。

個人的な学び・気付きポイント3点

エラーハンドリング

  • 公開API(メソッド)はエラーを明示する
    • 呼び出し元がどのように扱うか決められるようにする
    • 呼び出し元にエラーハンドリングを強制させるかどうかを状況に応じて決める
  • サードパーティライブラリの例外は、自分たちのコードでラップしたほうが良いケースが多い
    • 新しい例外がもたらすメリットとメンテナンスコストのトレードオフ
    • エラーの情報を増やすことに加えて、利用者側がサードパーティライブラリと密結合になるのを防ぐためにも、ラップしたほうがいい
    • 非公開のコンポーネント内であれば、ラップしなくてもいい
  • Tryモナドを使った関数型アプローチ
    • Javaのような例外を使ったオブジェクト指向言語で、Tryモナドを使う際は注意が必要
    • コードベース全体で一貫させないと可読性が悪くなる
    • メソッドのシグネチャで宣言されていない非検査例外を投げるAPIまでTryモナドで対応するのも、それはそれで読みづらく冗長でもある

日付と時間のデータ

  • 日付と時間の取り扱いは注意深く学ぶ必要がある
    • どのアプリケーションでも取り扱うもの
    • 重大な問題が発生する可能性がある
    • 複雑になりやすく、バグも見落とされやすい
  • スコープを制限 (今、必要なものだけ)
    • 日時に関するプロダクトの要件は曖昧になりがち
    • 事前に日時の要件を定義できれば、多くの作業を節約できる
  • テクニック
    • システムタイムゾーンやシステムの文化(暦法など)への暗黙的な依存は避けて、明示的に利用するか、依存として注入する
    • コメントの活用 (日時に関するコードは理由の解読が難しく、コードだけだと意図が明確に伝わりにくい)

データライフサイクルとトレードオフ

  • 変更頻度が低いマスターやリソースなどのデータが対象
  • これらのデータの表現方法にもいくつもの方針があり、それぞれトレードオフがある
    • 実装の複雑さ、変更頻度、誰が変更するのか、どのタイミングでアプリケーションに読み込ませるかなど
    • アプリケーションの種類や、状況、開発スタイルにも影響する
  • 手戻りがないように予め分かっていることは考慮に入れつつ、オーバースペックにならないようにも気を遣う

感想

トレードオフに対して、どのように意思決定していったか記録して、発信していくこと。
これが自分の状況に適した選択の、その精度を上げるために必要なこと。
たくさんトレードオフに関するTIPSはありましたが、これが一番大事だなと感じました。

Discussion