プログラミングに関する原理原則

2023/01/11

プログラミング

OAOOの原則

Once And Only Onceの略。 コードの重複は避けるべきという考え方。

DRYの原則

Don’t Repeat Yourself.の略。 システム開発において、情報の重複は避けるべきという考え方。

OAOOの原則とよく似た概念。

KISSの原則

Keep it simple, stupid.の略。不必要な複雑性は避けるべきという考え方。

関心の分離(SoC)

separation of concerns.の略。異なる関心事は異なる部分に分離すべきという考え方。

YAGNIの原則

You Ain't Gonna Need It.の略。余計な機能は本当に必要になるまで追加するべきでないという考え方。

PIEの原則

Program Intently and Expressively.の略。コード自体がドキュメントとしてコードの意図を表現するように記載するべきであるという考え方。

SLAPの原則

Single Level of Abstraction Principle.の略。コードは複雑さに応じて多階層に構造化し、各階層での抽象化レベルを揃えるべきであるという考え方。

SOLIDの原則

「SOLID」はオブジェクト指向プログラミングにおけるソフトウェア設計原則の頭文字をとったもの。

  • 単一責任の原則(Single Responsibility Principle)
  • オープン/クロースドの原則(Open/closed principle)
  • リスコフの置換原則(Liskov substitution principle)
  • インターフェース分離の原則(Interface segregation principle)
  • 依存性逆転の原則(Dependency inversion principle)
  • SOLIDの原則の詳細については以下を参照されたい。

    CLEAN

    「CLEAN」は以下に示す5つのコード品質評価尺度の頭文字をとったもの。多面的な観点からコードを評価することでコード品質を向上できる。

  • 凝集性(Cohesive)
  • 疎結合(Loosely Coupled)
  • カプセル化(Encapsulated)
  • 断定的(Assertive)
  • 非冗長(Nonredundant)
  • 「CLEAN」コードの詳細については以下を参照されたい。

    マーフィーの法則

    失敗する余地があるなら必ず失敗するいう法則。何かが発生するリスクがあるならば、 それは遅かれ早かれ必ず発生するため、設計上の課題が存在することを示唆する。

    ピーターの法則

    組織の中で、人は自身の能力の極限まで昇進する。昇進した人は、より高い能力あるいは異なる能力を求められる仕事に従事することで無能化していく。最終的には、組織全体の人材が無能化してしまう。

    チームにおいてもピーターの法則と同様の現象が起こりうる。優秀なチームを解体してチームメンバーを再分配することで、優秀なチームを量産しようとすると、組織全体のチームが無能化してしまう。

    ブルックスの法則

    遅延しているプロジェクトへの要員の追加は、さらにプロジェクトを遅延させるという法則。さらなる遅延につながる要因として、以下があげられる。

  • 新規メンバーの教育に時間が取られる
  • コミュニケーションパスが増加し時間が取られる
  • タスクを新たなメンバーに配分する際の分解に限界がある
  • プロジェクトが遅延している場合、安易に人員を追加するのではなく、リスケジュール、遅延原因の特定、原因に応じた適切な対処が必要である。

    コンウェイの法則

    ソフトウェアの構造(アーキテクチャ)は組織の構造を反映するという法則。組織の構造に従ってコミュニケーションが構築され、コミュニケーションに添ってアーキテクチャが構築されていく。

    良いアーキテクチャを設計するためには、まずアーキテクチャを構築して、その後そのアーキテクチャに沿った組織を構築する必要がある。

    割れ窓理論

    1枚の割れた窓でも、放置しておくと次第に街全体が荒廃してしまうという理論。ソフトウェアの設計においても、悪いコードを放置しておくと次第にソフトウェア全体が腐敗してしまう。

    参考資料

  • プリンシプル オブ プログラミング, 上田勲

  • 著者画像

    ゆうき

    2018/04からITエンジニアとして活動、2021/11から独立。主な使用言語はPython, TypeScript, SAS, etc.