状態、結合、複雑性、コード量の順に最適化する
The Wrong Abstractionに関するHacker Newsコメント
https://news.ycombinator.com/item?id=11042400
ohbarye.icon 個人blogに『状態、結合、複雑性、コード量の順に最適化する』としてまとめた
状態、結合度、複雑性、コード量の順序で減らすことを中心にコードを最適化する
コードがよりステートレスになる場合は、結合を増やしてもかまわない
結合度を減らすならば、コードをもっと複雑にする
コードの複雑さが軽減される場合は、コードをコピーする
状態、結合度、または複雑性が増さない場合にのみ、コードを重複排除する
ステートレスコードを最優先する理由
簡単に推論できるようになる
ohbarye.icon 認知負荷が下がる
ステートレスロジックは、通常のコード実行、並列処理、分散処理のいずれでも同じように機能する
セットアップコードがほとんど必要ないため、テスト容易性が高い
コピーを実行するだけなので、スケーラビリティも高い
状態が入り込むとプログラムはかなり難しくなる
初心者のプログラマがコード削減を最適化する理由は、4つのうちで最も見つけやすいから
他の3つはこれに比べてはるかに微妙で主観的であるため、発見するにはより多くの経験が必要になる
優先順位をこの順序で学習することで、非常に優れた開発者になれた
ohbarye.icon プロとアマチュアのプログラマはコードベースを成長させる際の優先順位を確認することでわかる
https://news.ycombinator.com/item?id=11041390
別のコメントに対するレス
「ステートレスかどうかと結合度は直行する概念では?」
対立するシーンはいくつもある
小さいプログラムよりもシステムアーキテクチャでよく見られる
たとえばシステムコンポーネントがジョブキューをインメモリ(状態)で管理する場合、その状態を別のキュー管理コンポーネントに任せる(結合)ほうがうまく状態を管理でき、明示的になる
「複雑性は結合度が生み出すものでは?」
複雑性にはたくさんの種類があり、結合はその一形態
循環的複雑度も1つ
有名なハッシュ関数の実装を見れば、結合度とは関係ない複数種類の複雑性を見ることができる
複数の複雑性の組み合わせこそが複雑性であり、プログラマの認知負荷を高めるものだ
ohbarye.icon 関連
クリーンアーキテクチャ本との関連
プログラミングパラダイムは制約・規律を課すものであり、何をすべきでないかを伝えている
構造化プログラミングは、直接的な制御の移行に規律を課すものである
goto文が消え、モジュール分割は構造化プログラミングの制御構造によって実現された
オブジェクト指向プログラミングは、間接的な制御の移行に規律を課すものである
ポリモーフィズムによってソースコードの依存関係を絶対的に制御できるようになった
関数型プログラミングは、代入に規律を課すものである
不変コンポーネントは可変変数を使わず純粋関数的にタスクを行う
イベントソーシングは「状態ではなくトランザクションを保存する」という戦略
SOLID
単一責任の原則により、アクターの異なるコードは分割する
複数のアクター間で状態が共有されることを避ける
インターフェイス分離の原則により、疎結合になる
Code Smells
https://medium.com/zus-health/state-coupling-complexity-code-four-liabilities-8283ef029943