2025年5月31日
今週の活動
- Apacheプロジェクトのソフトウェアを題材として取り上げる際の考慮事項
- Apacheプロジェクトの行動原則: Apache Way
- コミュニティ主導の開発プロセスでの経験を明文化したもの
- https://www.apache.org/theapacheway/
- Earned Authority
- 全ての個人に参加の機会が与えられるが、その影響力はその人がコミュニティに貢献したものに基づく
- この影響力は個人に帰属し、期限切れにならず、雇用状況や雇用主に影響されず、譲渡できない
- Community of Peers
- 組織ではなく個人がASFに参加
- ASFのフラットな構造では、役職に関係なく役割が平等で、票は同等の重みを持ち、貢献はボランティアベースで行われる
- Open Communications
- バーチャル組織として、ASFはコードと意思決定に関する全てのコミュニケーションを公にアクセス可能にすることを要求し、グローバルに分散されたコミュニティによって必要とされる非同期的な協働を保証
- Consensus Decision Making
- Apacheプロジェクトは自主的に選ばれた活発なボランティアチームによって監督される
- チームがプロジェクトを自律的に運営しており、生産性の維持のためにコンセンサスが重視される
- Responsible Oversight
- 参加者の信頼に基づいてプロジェクトが運営される
- プロジェクトを運営する際は、詳細なルールよりも原則を重視
- コミットのレビュー、セキュリティ対策、ライセンスの遵守によってApacheブランドとコミュニティを悪用から守る
- Independence
- Apacheプロジェクトで働くコミッターを雇用している組織や、Apacheプロジェクトをスポンサーとして支援している組織に特権を与えることはない
- Community Over Code
- 良いコードよりも健全なコミュニティを優先
- 健全なコミュニティは常にコードの問題を修正できるが、不健全なコミュニティは持続可能な方法でコードベースを維持するのが難しい
- Chidamber & Kemerer(CK)メトリクス
- オブジェクト指向ソフトウェアの品質評価において広く使用されている測定法
- オブジェクト指向プログラミングが主流となる中で、従来の手続き型プログラミング用メトリクスでは捉えきれないソフトウェアの特性を測定する必要性から生まれた
- Weyukerが提案した、ソフトウェア複雑性メトリクスの品質を評価するための特性(Weyukerの特性)に基づいている
- CKメトリクスが定量化するもの
- カプセル化: LCOM
- 継承: DIT, NOC
- 結合: CBO
- 複雑さ: RFC, WMC
- 6つの主要なメトリクス
- WMC(Weighted Methods per Class)
- クラス内の全メソッドの複雑さの合計
- WMCが大きいほどコードの理解や修正が難しい
- \(WMC(C) = \sum_{i=1}^{n} c_i\)
- \(c_i\)は\(i\)番目のメソッドの複雑さ、\(n\)はクラスC内のメソッドの数
- DIT(Depth of inheritance Tree)
- あるクラスから最上位のクラスまでの最大継承パス長
- DITが大きいほどクラスの挙動予測が難しい
- \(DIT(C) = \max(length(p))\)
- pはクラスCから最上位のクラスへのパス
- NOC(Number of Children)
- あるクラスの子クラスの数
- NOCが大きいほど変更の影響範囲が大きい
- CBO(Coupling Between Objects)
- あるクラスが結合している他のクラスの数
- CBOが大きいほどコードの修正が難しい
- RFC(Response For a Class)
- オブジェクトがメッセージを受信したときに実行される可能性があるメソッドの数
- RFCが大きいほどコードの理解や修正が難しい
- \(RFC(C) = |M(C)| + |\bigcup_{m \in M(C)} R(m)|\)
- \(M(C)\)はクラスCが持つ全メソッドの集合
- \(R(m)\)はメソッドmが呼び出す外部メソッドの集合
- LCOM(Lack of Cohesion of Methods)
- メソッド間で共有されるインスタンス変数の少なさ
- LCOMが大きいほどクラス内のメソッド間の凝集度が小さく、設計品質が低い
- \(LCOM(C) = \max(|P| - |Q|, 0)\)
- Pは共通のインスタンス変数を持たないメソッドペアの集合
- Qは共通のインスタンス変数を持つメソッドペアの集合
- Weyukerの特性
- https://ieeexplore.ieee.org/abstract/document/6178
- ソフトウェアの複雑さのメトリクスが満たすべき数学的性質を定義したもの
- P1: \((\exists P)(\exists Q) (|P| \neq |Q|)\)
- 全てのプログラムが同じ複雑さを持つ訳ではない
- すなわち、メトリクスが定数関数ではない
- P2: \(c\)を正の数とするとき、尺度\(c\) を持つプログラムは有限個存在し得る
- 同じメトリクス値\(c\)を持つプログラムは有限個しか存在しない
- 任意の長さのプログラムが同じ複雑さを持つという非現実的な状況を排除
- P3: \(|P| = |Q|\)になるような異なるプログラム\(P\)と\(Q\)が存在する
- 異なるプログラムでも同じメトリクス値を持つ場合がある
- P1と合わせて、メトリクスが適切な粒度を持つことを示す
- P4: \((\exists P)(\exists Q) (P \equiv Q \text{ and } |P| \neq |Q|)\)
- 機能的に等価な(同じ入出力関係を持つ)プログラムでも、実装が異なれば異なる複雑さを持つ
- 設計の詳細が複雑さに影響することを示す
- P5: \((\forall P)(\forall Q)(|P| \leq |P; Q| \text{ and } |Q| \leq |P; Q|)\)
- プログラム\(P\)にプログラム\(Q\)を統合した場合、結果の複雑さは元の各プログラムの複雑さ以上になる
- コードの追加は複雑さを増加させるという直感的な性質を表す
- P6a: \((\exists P)(\exists Q)(\exists R) (|P| = |Q| \text{ and } |P; R| \neq |Q; R|)\)
P6b: \((\exists P)(\exists Q)(\exists R) (|P| = |Q| \text{ and } |R; P| \neq |R; Q|)\)
- 同じ複雑さを持つ2つのプログラム\(P\), \(Q\)でも、第3のプログラム\(R\)と結合するとそれぞれの複雑さは異なる値になる可能性がある
- 結合の順序や文脈が複雑さに影響することを表す
- P7: \(Q\)を\(P\)のプログラムの文を入れ換えたプログラムとするとき、\(|P| \neq |Q|\)になるようなプログラム\(P\), \(Q\)が存在する
- P8: \(P\)を\(Q\)において変数名称を変えたプログラムとするとき、\(|P| = |Q|\)
- 変数名を一様に変更してもメトリクス値は変わらない
- 意味論的な変更が複雑さに影響しないことを保証
- P9: \((\exists P)(\exists Q) (|P| + |Q| < |P; Q|)\)
- 2つのプログラムを結合した際の複雑さは、個々の複雑さの単純な和を超える場合がある
- プログラム間の相互作用や結合部分での追加的な複雑さを考慮した特性
得られた成果
- Apache Wayの理解
- Apache Software Foundationの7つの原則を整理
- CKメトリクスの理解
- 6つの主要なメトリクス(WMC、DIT、NOC、CBO、RFC、LCOM)を整理
来週の計画
- メソッド・クラス単位でソフトウェアメトリクスを計算するライブラリを調査・選定
- Qualitas Corpusデータセットに代わる、メトリクスとバグの関連性が明確なデータセットを調査
- 4月から5月までの進捗をまとめる