エンジニアリング組織論への招待 Chapter1 - 読書メモ
エンジニアリング組織論への招待
目次
- Chapter1:思考のリファクタリング
- Chapter2:メンタリングの技術
- Chapter3:アジャイルなチームの原則
- Chapter4:学習する組織と不確実性マネジメント
- Chapter5:技術組織の力学とアーキテクチャ
書籍
Chapter1:思考のリファクタリング
- 思考のリファクタリング
- 頭の中で発生してしまう無駄なプロセスを削除して、考えるときの指針を持ち、問題解決に向かって明確に行動が出来るよう促すもの
- 「不確実性に向き合う」
不確実性とエンジニアリング
エンジニアリングとは
- 「曖昧さ」を減らし、「具体性・明確さ」を増やす
- 曖昧さ
- 決まっていないこと・将来どうなるかわからないこと =「不確実性」
- 曖昧さ
不確実性
- 組織構造と不確実性
- 不確実性の発生源
- 「わからないこと」から「不確実性」が発生する
情報を生み出す考え方
仕事の問題解決を行うために必要な3つ思考
- 論理的思考の盲点
- どんなときに人が論理的でなくなるかを知った上で問題解決を行う
- 経験主義と仮説思考
- 情報を得た上で問題解決を行う
- 得た情報から全体を想定し問題解決を行う
- システム思考
- 全体像を見極め問題解決を行う
仕事の問題を学力テストの問題に変換する
論理的思考の盲点
論理的思考には2つの前提が必要
- 2つの前提
- ルールと自称を正しく認知できること
- 正しく演繹できること
- 「人はどのようなときに非論理的になってしまうのかを知る」ことが重要
ベーコンのイドラ
- 「身体的機能」「自身の環境」「周囲の意見」「伝統や権威」によって錯覚や認識の間違いを起こしてしまう
認知の歪み
- ゼロイチ思考
- 白か黒か、敵か味方かのように、2分法で考えてしまう
- 一般化のしすぎ
- 1つや2つの事例で決めつけたり、早計な判断をしてしまう
- すべき思考
- 他人に対し「○○すべき」と期待し、強制してしまう
- 選択的注目
- 人は見たいものだけ見てしまう
- レッテル貼り
- ある人の特定の属性に注目して判断してしまう
- 結論の飛躍
- 相手の感情を先回りして読み取り、短絡的な判断をしてしまう
- 感情の理由付け
- 感情のみを根拠に自分の考えが正しいと判断してしまう
認知的不協和
- タバコが体に悪いと理解しているがタバコを吸う
- 知識と行動の整合性が取れていない状態
- 不整合を避けるため、正当化出来る情報を選択的に取り入れてしまう
- 「自分」や「自分が大切にしていること」に被害が及びそうだと感じる
- 恐怖を感じる
- 怒りに変わる
- 自分や大切にしていることを守るため、理屈を練り上げてしまう
- 怒りに変わる
- 恐怖を感じる
自分のアイデンティティの範囲を知る
- アイデンティティ=「自分を構成すると思っていること」
- 範囲が広い人
- 怒りを感じる範囲が広い
- 範囲が狭い人
- 怒りを感じる範囲が狭い
- 範囲が広い人
「怒り」を「悲しみ」として伝える
- 他人の大切にしていることを知ることはできない
- 「怒り」を感じたときは「○○は自分にとって大切で、○○な扱いをされると悲しい」など、「悲しみ」として伝え、相手に自分の大切にしていることを知ってもらう
問題解決より問題認知のほうが難しい
- 人は自分が間違っているかもしれないことを無意識に避けてしまう
- 正しい情報を認知できない
- 自分が間違っているかもしれないと思考のパターンを変える必要がある
経験主義と仮説思考
経験主義:わからないことは調べるしか無い
- 「理性主義」
- ある「前提」から演繹的に判断しようという考え(ウォータフォール)
- 「経験主義」
- 「経験」を行うことでしか「知識」を得られないという考え(スクラム)
- 「何がわかればわかるのか」を考え、それを「確かめる」
不確実性と夏休みの宿題
- 夏休みの宿題
- 計算ドリル
- 不確実性が「低い」
- いつ終わるのか大体わかる
- 自由研究
- 不確実性が「高い」
- いつ終わるのかわからない
- 計算ドリル
- 自由研究(不確実性の高いもの)から取り組むことで、いつぐらいに終わるのかわかる
- 不確実性が下がる
プロフェッショナルの仕事
- プロフェッショナル
- 短い時間で一定のクオリティまで上げて、残り時間で作り込む
- 不確実性の高いものから取り組む
- 短い時間で一定のクオリティまで上げて、残り時間で作り込む
- アマチュア
- 残り時間が短くなってから、急速に出来上がってくる
コントロールできるもの/できないもの
- 経験主義で重要なこと
- 「知識」=「経験」を行動によって手に入れるということ
- 「行動できることは何か?」
- 「行動の結果起きたことを観察できるか?」
- 「知識」=「経験」を行動によって手に入れるということ
- e.g. 「上司が自分の仕事を評価してくれない」
観測できるもの/できないもの
- 本来コントロールできないはずのものを、自分の行動で変化させようと試みるには
- 「観測できる」必要がある
- 「観測できない」ものは、行動しても変化がわからない
あなたができること
仮説思考:少ない情報で大胆に考える
演繹法 | 帰納法 | 仮説法 |
---|---|---|
ルール:人間は死ぬ | 事象:このカラスは黒い | 事象:2つの大陸は海岸線が似ている |
事象:Aさんは人間である | 事象:あのカラスも黒い | 仮説:大陸は移動してたのではないか |
結論:Aさんは死ぬ | 結論:全てのカラスは黒い | 結論:2つの大陸が1つである証拠を探そう |
データ駆動な意思決定の誤解
- 「データ駆動な意思決定」
- 「仮説」を推論するために、持っているデータの可視化をする
- 「仮説」が正しかったのか、統計的に検証する
「次に取るべき正しい行動」を出すためではない
リアルオプション戦略と遅延した意思決定
- リアルオプション戦略
- 仮説を作り、その仮説を早期に少ない予算で検証する
- 大きな意思決定を遅らせることが出来る
問題の解決よりも問題の明晰化のほうが難しい
- 社会で取り組む問題の多くは、情報が不完全な状態から始まる
- 問題解決よりも先に「どのような問題なのか」をはっきりさせることが重要
- 「経験主義」+「仮説思考」→「問題は何なのか」をはっきりさせる
- 「問題を解く」ことは難しいことではない
全体論とシステム思考
システムとは全体の関係性を捉えること
部分だけしか見えないことで対立が起こる
- 3次元のU
- 様々な対立が、物事を「側面から」見ることができずに発生する
バランスシートとP/Lの関係性
- 企業内部には、まだ資産や利益に還元されていない無形の投資活動が含まれている
- 全体のフィードバックサイクルで見ると、それらは「コスト」とは限らない
- P/Lだけ見ると「コストに見えてしまう」
拡張のフィードバックと抑制のフィードバック
- どの様なフィードバックサイクルが存在するのか見つけていくことが重要
全体の関係性が見えれば対立は解消する
- 1つ上の次元から問題を捉えて、システム全体を把握していく
- 対立から発展的な議論へと視野が拡大する
認知範囲とシステム思考
- 視野・視座・視点
- 問題解決のための眼
- 視野
- あるポイントからその問題を眺めたときに同時に把握できる領域の広さ
- 広い/狭いで評価
- 視座
- どこから眺めるか
- 高い/低いで評価
- 視点
- どの角度から眺めるか
- 鋭さ/凡庸さで捉える
- 視野
- 問題解決のための眼
- 個人ではなく関係性に注目する
- 様々な問題は、本当に個人の問題なのか?
- 個人同士の関係性が問題なのかもしれない
- 個人の性質
- 変えるのは難しい
- 個人同士の関係性
- 変えるのは難しくない
- ここに注目するのがシステム思考
- 個人の性質
- 個人同士の関係性が問題なのかもしれない
- 様々な問題は、本当に個人の問題なのか?
問題解決より問題発見のほうが難しい
- 世の中は複雑な相互関係を持っている
- 合理的に見える解決策が別の問題を引き起こしたり、想定していない悪化をもたらす可能性がある
- システム思考によって問題を変換する
- 対立に見える問題 → 対立にならない全体像をあぶり出す
- 個人の問題 → 関係性の問題
人間の不完全さを受け入れる
思考を前にすすめるための3つの考え方
- 論理的思考の盲点
- 「人は正しく事実を認知できない」
- いつ認知が歪むのかを知り、歪んだ認知を正すための行動を促す
- 経験主義・仮説思考
- 「いくら理屈で考えても答えが出ない問題に時間を浪費してしまう」
- 実験によって知識を獲得し、何が問題であるかを削り出すように考えるための行動を促す
- 全体論とシステム思考
- 「人は問題を個人の責任にしたり、全体像を見失った局所的な思考をしてしまう」
- それが全体像ではないかもしれない、問題は関係性にあるのでは、という視点と問題解決のための眼を提供し行動を促す
コミュニケーションの不確実性
- 人間のコミュニケーションの不確実性は3つの不確実性から来ている
- 他者理解の不確実性
- 人は他人や事象を完全には理解できない
- 伝達の不確実性
- コミュニケーションが到達するとは限らない
- 成果の不確実性
- 仮に理解されたとしても予想されたように行動するとは限らない
- 他者理解の不確実性
情報の非対称性
- 同じ目的を持った集団で、何かの情報を片方の人が知っていて、もう片方の人が知らないという状態
- 人は正確に自分の考えを他人に伝えることは不可能なので、非対称性が生まれる
限定合理性
- 人間の認知能力には限界があり、ある人にとっての正解が全体にとっての正解になるとは限らない
コミュニケーション能力と透明性
- 組織の人数が増えるにつれてスケールするはずが、徐々に悪化してしまう
- 「情報の非対称性」と「限定合理性」が存在するから
- コミュニケーション能力
- コミュニケーション能力とは、コミュニケーションの不確実性を減少させる能力
- 透明性
- 透明性とは、継続したコミュニケーションや仕組みを通じてコミュニケーションの不確実性を低く維持し、情報の非対称性が削減され限定合理性の働きを弱められている状態
不確実性を削減し秩序を作る
- 「不確実性を削減し、秩序を作る」ことこそがエンジニアリングで最も重要な出発点・性質である
書籍
Clean Architecture - まとめ
読書メモ
クリーンアーキテクチャ
ソフトウェアアーキテクチャの目的
- 求められるシステムを構築・保守するために必要な人材を最小限に抑えること
- 優れた構造(アーキテクチャ)にすることで、ソフトウェアをソフト(変更しやすい状態)にする
優れたアーキテクチャとは
- 「境界線」と「依存方向」が正しく設計されている
- 独立した開発・運用・デプロイを可能とする
クリーンアーキテクチャ
- 優れたソフトウェアアーキテクチャを具体化したもの
- 「境界線」と「依存方向」を具体化したもの
感想
- つまり、クリーンアーキテクチャとは何なのか?
- オブジェクト指向設計に基づいたソフトウェアアーキテクチャのこと
- 必ず4層に分ける必要があるのか?
書籍
Clean Architecture 達人に学ぶソフトウェアの構造と設計
- 作者:Robert C.Martin
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/07/27
- メディア: 単行本
Clean Architecture - 読書メモ 2
叫ぶアーキテクチャ
クリーンアーキテクチャ
クリーンアーキテクチャ
- フレームワーク非依存
- テスト可能
- UI非依存
- データベース非依存
- 外部エージェント非依存
依存性のルール
- ソースコードの依存性は、内側だけに向かっていかなければならない
エンティティ
- 企業全体の最重要ビジネスルール
- アプリケーション固有のビジネスルール
インターフェイスアダプター
- フォーマットを変換する
- ユースケースやエンティティ用のフォーマット
- データベースやウェブ用のフォーマット
フレームワーク・ドライバー
- フレームワークやデータベース
クリーンアーキテクチャ |
---|
プレゼンターとHumble Object
Humble Object パターン
- 「テストしにくい振る舞い」と「テストしやすい振る舞い」に分けるパターン
- テストしにくい振る舞い
- View・Database
- シンプルに保っておく
- テストしやすい振る舞い
- Presenter・UseCase
- テストしにくい振る舞い
部分的な境界
本格的なアーキテクチャの境界はコストが高い
- 多くの作業が必要であり保守も必要
- 優れたアーキテクトは、このような境界はコストが高すぎると判断する
- 同時に、後で必要になるから境界を残しておきたいとも思う
- YAGNIに違反する
- 部分的な境界を実装
- 同時に、後で必要になるから境界を残しておきたいとも思う
部分的な境界
- 最後のステップを省略
- 片方だけの境界
- Strategyパターンを使い、片方だけの境界を作る
- Facade
- Facadeパターンを使い、シンプルな境界を作る
片方だけの境界 | Facade |
---|---|
サービス:あらゆる存在
サービスアーキテクチャ
- 「サービス思考アーキテクチャ」・「マイクロサービスアーキテクチャ」
- サービスが互いに分離されているように見える → 正しくない
- サービスは共有しているデータと強く結びついていて、間接的ではあるが相互に結びついている
- サービスが開発・デプロイを独立させていように見える → 正しくない
- 誤った分離により独立して開発・運用・デプロイできない
- データや振る舞いが結びついている限り、開発・運用・デプロイには調整が必要となる
- サービスが互いに分離されているように見える → 正しくない
横断的関心事
- アーキテクチャの境界は
- 正:サービスを横断することでコンポーネントに分割する
- 誤:サービスとサービスの中間に位置する
- サービスは依存性のルールに従った内部コンポーネントのアーキテクチャと一緒に設計する必要がある
テスト境界
テスト容易性のための設計
テストAPI
- 変化しやすいものに依存しないようにするために
- テストから使用できるAPIを作り、全てのビジネスルールを剣侠できるようにする
書籍
Clean Architecture 達人に学ぶソフトウェアの構造と設計
- 作者:Robert C.Martin
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/07/27
- メディア: 単行本
Clean Architecture - 読書メモ 1
設計とアーキテクチャ
ソフトウェアアーキテクチャ
- 目的
- 求められるシステムを構築・保守するために必要な人材を最小限に抑えること
崩壊したコードを書く方がクリーンなコードを書くより常に遅い
- TDDありとTDDなしで比較
- TDDを使ったほうが速い
速く進む唯一の方法はうまく進むこと
2つの価値のお話
ソフトウェアシステムの価値
- 振る舞い
- 構造 >> こちらの方が重要
- 簡単に変更できるようにする
- ソフトであるということ
- 「形状」ではなく「スコープ」に比例して難易度が変わるべき
- 簡単に変更できるようにする
アーキテクチャとは?
- 主な目的
- システムのライフサイクルをサポートすること
- 開発
- 開発しやすくなるようなシステムにする
- デプロイ
- 単一のアクションで簡単にデプロイ出来るようにする
- 速い檀家来からデプロイ戦略を考える
- 保守
- 保守派最もコストがかかる
- アーキテクチャを考え抜きコストを下げる
- 開発
- システムのライフサイクルをサポートすること
ソフトウェアの価値
独立性
優れたアーキテクチャがサポートすること
- システムのユースケース
- システムの運用
- システムの開発
- システムのデプロイ
レイヤーの切り離し
- UI・ビジネスルール・データベース等のレイヤーで切り離す
- 変更される理由をまとめる
ユースケースの切り離し
レイヤー・ユースケースを切り離すことで
- 「独立した開発」「独立デプロイ」を可能とする
切り離し方式
- ソースレベル
- モジュールを分離する
- モジュール間で影響しない
- デプロイレベル
- デプロイ可能な単位を分離する
- ソースコードの変更が他のモジュールに影響しない
- サービスレベル
- 実行単位を完全に分離する
- ソースやバイナリの変更が影響しない
バウンダリー:境界線を引く
ソフトウェアアーキテクチャとは、境界線を引く技芸である
方針とレベル
コンピュータプログラムは、入力を出力に変換する「方針」を記述したもの
- レベル
- 入力と出力からの距離
- 依存方向はレベルと結びつける
ビジネスルール
エンティティ
- ビジネスデータを操作するビジネスルールを含んだオブジェクト
- ビジネスルール
- システムが自動化されていなくても存在するルール
- ユースケースのことは知らない
- ビジネスルール
- 自動化されたシステムを使用する方法を記述したもの
- ユーザーインターフェイスについては記述しない
- エンティティのことを知っている
書籍
Clean Architecture 達人に学ぶソフトウェアの構造と設計
- 作者:Robert C.Martin
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/07/27
- メディア: 単行本
アジャイル検定 Lv.2 - 試験レポート
アジャイル検定 Lv.2 を受験してきたので、結果を含めて簡単なレポートを残しておきたいと思います。
アジャイル検定
アジャイル検定とは
アジャイル開発のスキルを客観的な尺度で分析・判定するのが、アジャイルソフトウエア開発技術者検定試験です。 試験システムとして、CBT(Computer Based Testing)を採用しています。 いつでも、どこでも受験することができます。4肢択一スタイルの問題、平均で70%の正解率を得られるよう、難易度を調整しています。 合格基準は80%以上の正解率です。
アジャイル検定の構成
アジャイル検定 Lv2.試験
試験範囲
- モデリング
- オブジェクト指向設計:継承、インターフェース、ポリモーフィズム、疎結合、Dependency Injection
- コーディング
- コーディングルール:ツールによる確認(checkstyle)
- ペアプログラミング
- リーダビリティ(コードの読みやすさ)
- テストコード(Mock、Testing frameworkなど)
- 静的解析ツール(SonarQube)
- ドキュメンテーション
- 構成管理
- チーム開発:SCM(ソースの変更管理システム)、分散型(git)、集中型(Subversion、CVS 等)
- ブランチ戦略:ブランチとマージ、レビュー・受入(プルリクエスト)
- コンテナ技術
- テスト
- TDD:Junit(モックを使ったテスト、テスト結果レポートの見方、網羅率C0,C1,C2) 品質管理のためのテスト(パフォーマンステスト、結合テスト、総合テスト・システムテスト) ユーザー受入テスト、ブラックボックステスト、ホワイトボックステスト
- 常時結合
- 自動化の導入:何時動かして結果から何を読み取るか、自動化の導入効果、何を自動化するか(ビルド⇒テスト⇒デプロイ等)
- 何のため、誰のために、常時結合(CI)をおこなうのか
- デザインパターン
- リファクタリング
- マーティン・ファウラー「リファクタリング」(コードの不吉な匂い等)
- オブジェクト指向設計原則(Principles Of Object Oriented Design)
- チームのスキル
- スプリント計画
- 自己組織化されたチーム:メンバーの行動規範(コミュニケーション、自立と協調)
- レトロスペクティブ(振り返り)
試験時間および出題形式
- 試験時間:60分
- 出題形式:多肢選択式 (四肢択一) 40問
- 評価方法:65%以上合格
Lv2.試験結果
試験勉強
感想
- Lv2ではLv1に比べ圧倒的に複数選択可能な形式の問題が多かったので、より正確に理解していることが求められる
- 各要素の目的を意識して勉強すると良さそう
- 合格したものの、合格ラインギリギリだったので引き続き理解を深めるよう努めていきたいと思う
石井食品の攻守両輪:デザインスプリントとカイゼン - イベントメモ
DevLOVE
石井食品
守:見える化/ふりかえり/バックログ化/期待マネジメントでカイゼンした話
- 部署
- 課題解決チーム
- 直販チーム
- 通販チーム
- 課題解決チーム
- 現場の悩み
- 1.周りのメンバーは自分のことをどう思っている?
- 2.仕事量が多いプレイングマネージャーはどうする?
- 3.会議が多いのはどうすれば?
- 対策
- 実践(最初の一歩)
- 不安を共有する
攻:ISHII SPRINT
- 新商品開発をデザインスプリントする
- デザインスプリント
- Googleが提唱
- 5日で課題解決
- 理解→発散→決定→施策→検証
- 課題解決に集中させるのが目的
- 5日という制約があることで、無駄を省きつつ、アウトプットの質向上を狙う
- デザインスプリント
- なぜここにいるのか
- 食品の新商品を作りたい
- 新商品開発の型を作りたい
- デジタルと食品の差
- 問題解決という目的はどちらも同じ
- 食品ならではの前提はある
- ISHII SPRINT
- 3日で行った
- 総勢20人弱の規模で3チーム形成
- Day1
- ニーズを満たす(LeanCanvas)→どうやって検証するか?
- Day2
- 施策→フィードバック
- Day3
- 検証→お店で試食会
- 学び
- 短期集中で結果かが出ることの強さ
- 部署間の壁を越えられる
- 「良いものを作る」という1点のみに集中できる
- クリティカルメイキング
- ともに考え・ともに作る
- 役割・部署を越えた協働
パネルディスカッション
- 社風
- 社長が子供を連れて会議にも参加
本日は社長がお子様を連れて出社されましたー👶
— イシイのおべんとクン ミートボール (@ishii_official) January 24, 2020
会議もこのスタイルで出席。
お子様も行儀よく会議に参加していました🍃🍃
とってもかわいくて社員全員癒されました💗 pic.twitter.com/j2oThb0GDT
- デザインスプリント
- 池田さん→乾燥野菜のチーム
- 1分で料亭の味
- 部署の壁が心配だった
- 池田さん→乾燥野菜のチーム
- 年末催事大作成
- 半分が新メンバー
- 工場の方にもヘルプで入ってもらう
- 目的を前もって共有しておけばよかった...
- 人の取り合いになっていた...
- きっかけ
- 社長がOSTを開催→新商品開発の案が出た
ISHII SHOKUHIN 365
感想
- ソフトウェア開発に限らず、チームでゴールを目指して協力し合うことが大切だと改めて実感
- 部署・役割の壁を取っ払うことで、より良いアイデアが生まれる
- 企業のビジョンやミッションも重要になってくる印象
- ビジョンやミッションに基づいた課題解決をするためにその会社で仕事するんだよね?
- 会社・部署・チームそれぞれの単位で同じ目的を持つことで高みを目指したい
- ただただ作業のようなプロダクト開発を行う組織は絶対に作りたくないなと思う
- チームで同じ目的を持って課題解決目指す仕事のほうが楽しいよね
アジャイル検定Lv.2 勉強メモ - リファクタリング
アジャイル検定Lv.2 出題範囲
- モデリング
- オブジェクト指向設計:継承、インターフェース、ポリモーフィズム、疎結合、Dependency Injection
- コーディング
- コーディングルール:ツールによる確認(checkstyle)
- ペアプログラミング
- リーダビリティ(コードの読みやすさ)
- テストコード(Mock、Testing frameworkなど)
- 静的解析ツール(SonarQube)
- ドキュメンテーション
- 構成管理
- チーム開発:SCM(ソースの変更管理システム)、分散型(git)、集中型(Subversion、CVS 等)
- ブランチ戦略:ブランチとマージ、レビュー・受入(プルリクエスト)
- コンテナ技術
- テスト
- TDD:Junit(モックを使ったテスト、テスト結果レポートの見方、網羅率C0,C1,C2) 品質管理のためのテスト(パフォーマンステスト、結合テスト、総合テスト・システムテスト) ユーザー受入テスト、ブラックボックステスト、ホワイトボックステスト
- 常時結合
- 自動化の導入:何時動かして結果から何を読み取るか、自動化の導入効果、何を自動化するか(ビルド⇒テスト⇒デプロイ等)
- 何のため、誰のために、常時結合(CI)をおこなうのか
- デザインパターン
- リファクタリング
- マーティン・ファウラー「リファクタリング」(コードの不吉な匂い等)
- オブジェクト指向設計原則(Principles Of Object Oriented Design)
- チームのスキル
- スプリント計画
- 自己組織化されたチーム:メンバーの行動規範(コミュニケーション、自立と協調)
- レトロスペクティブ(振り返り)
リファクタリング
- リファクタリングとは
- プログラムの外部から見た動作を変えずにソースコードの内部構造を整理すること
- なぜリファクタリングを行うのか
- 機能を追加するため、こまめにリファクタリングを続けて、コードを読みやすく変更しやすい状態を保つ
- リファクタリングを行うタイミング
- コードレビュー時
- 機能追加時
- バグフィックス時
- コードリーディング時
- コードの不吉な臭いを感じたとき
- etc
コードの不吉な臭い
- 奇妙な名前
- メソッドやクラスの名前が奇妙な場合
- 不適切な命名は理解するのが難しい
- 適切な名前が思いつかない場合は、設計が良くない兆候
- メソッドやクラスの名前が奇妙な場合
- 重複したコード
- 同じコードが複数箇所にある場合
- 重複コードがあると、複数箇所に同じ修正を行う必要がある
- 重複コードを1箇所にまとめる
- 同じコードが複数箇所にある場合
- 長すぎるメソッド
- メソッド名が長い場合
- 短いメソッド名の方が理解しやすい
- 短く役割が明確なメソッドを書く
- メソッド名が長い場合
- 長すぎるパラメータリスト
- メソッドの引数が多い場合
- パラメータが多いと、1つ1つが何を意味しているのか理解しづらくなる
- 新たなデータが必要になった時にパラメータリストの変更が必要となる
- メソッドの引数が多い場合
- グローバルデータ
- 変更可能なデータ
- クラス内部のデータを変更している場合
- データを変更すると予期しないバグを生み出す
- データを書き換えるのではなく、変更後の新しいデータを持ったオブジェクトを返す
- クラス内部のデータを変更している場合
- 変更の偏り
- 1つのクラスが異なる理由で何度も変更されるような場合
- 異なる役割にも変更の影響が出てしまう
- クラスの役割が多すぎるので、役割を明確にし変更理由が1つになるようにする
- 1つのクラスが異なる理由で何度も変更されるような場合
- 変更の分散
- 1つの理由で複数のクラスが変更されるような場合
- 変更すべき箇所が分散すると、重要な変更を実装し忘れる場合が出てしまう
- 1つの理由で複数のクラスが変更されるような場合
- 機能の横恋慕
- クラスのメソッドが、別クラスのデータやメソッドとばかり処理を行っている場合
- 役割の所在が異なっているため、メソッドを別クラスに移動させる
- クラスのメソッドが、別クラスのデータやメソッドとばかり処理を行っている場合
- データの群れ
- 同じ様なデータのグループが、複数箇所で使われている場合
- 同じ役割であるため、1つのクラスにデータをまとめる
- 同じ様なデータのグループが、複数箇所で使われている場合
- 基本データ型への執着
- 基本データ型ばかりを使っている場合
- 基本データ型をクラスに置き換えることで保守性を上げる
- 基本データ型ばかりを使っている場合
- 繰り返されるSwitch文
- 同じ様なSwitch文が何度も出てくる場合
- 分岐を追加した場合に、すべてのSwitch文を変更する必要がある
- Switch文の代わりにポリモーフィズムを使う
- 同じ様なSwitch文が何度も出てくる場合
- ループ
- 怠け者
- 十分な仕事をせず、理解したり保守するコストに見合わない場合
- 不要なクラスは削除する
- 十分な仕事をせず、理解したり保守するコストに見合わない場合
- 疑わしき一般化
- 将来必要になるという理由で書いたが、実際には使われず無駄になっている場合
- 無駄に複雑になっているため、よりシンプルな方に変更する
- 将来必要になるという理由で書いたが、実際には使われず無駄になっている場合
- 一時的属性
- 特定の状況でしか使われないインスタンス変数がある場合
- コードを理解しづらくなる
- 別のクラスに切り出す
- 特定の状況でしか使われないインスタンス変数がある場合
- メッセージの連鎖
- 複数のクラスを経由するメソッドチェーンがある場合
- チェーンの途中で呼び出されるクラスに強く依存してしまう
- 委譲を利用してチェーンを隠蔽する
- 複数のクラスを経由するメソッドチェーンがある場合
- 仲介人
- クラス内のメソッドのほとんどが委譲を行っている場合
- 仲介人を除去して、委譲先のオブジェクトと直接処理を行う
- クラス内のメソッドのほとんどが委譲を行っている場合
- インサイダー取引
- クラス間で過度にデータの交換を行っている場合
- クラス間の結合が強くなってしまう
- クラス間で共通して使用するデータを持つクラスを用意する
- クラス間で過度にデータの交換を行っている場合
- 巨大なクラス
- 1つのクラスで多くの処理を行っている場合
- クラスに役割が多すぎる
- インスタンス変数を整理したり、親クラスに処理をまとめたりする
- 1つのクラスで多くの処理を行っている場合
- クラスのインターフェース不一致
- 置き換えたいクラスのインターフェースが異なっている場合
- 他のクラスへ置き換え可能にするには、インターフェースが同じである必要がある
- インターフェースが同じになるようにする
- 置き換えたいクラスのインターフェースが異なっている場合
- データクラス
- 属性・getter・setterしか持たないクラスがある場合
- 必要な処理が誤った場所に書かれている可能性が高い
- データクラスを使用しているコードを、データクラス自身に持たせられないか検討する
- 属性・getter・setterしか持たないクラスがある場合
- 相続拒否
- 子クラスが親クラスの一部しか利用していない場合
- 継承階層が間違っている
- メソッド・変数の階層を変更したり、継承を移譲に変えたりする
- 子クラスが親クラスの一部しか利用していない場合
- コメント
- 詳細なコメントが書かれている場合
- コードの分かりづらさを補うためにコメントが記述されている
- コメントを書かなくても内容が分かるようにする
- 詳細なコメントが書かれている場合