プロが直接査定

パフォーマンスレベルの評価手順

パフォーマンスレベルの評価手順
具体的なMBOの手順を見ていきましょう。

プリンシプルオブプログラミング 個人的重要箇所

前提、原則、思想、習慣、視点、法則、などのことをプリンシプルという。 プリンシプルを身につけると、なぜその技術が必要なのか、が理解することができる。 プリンシプルとは普遍的な知識であり、様々な技術に対して当てはめることができ、エンジニアの土台としての知識になる。プリンシプルは抽象的なものであり、大きな原則になる。
ときにはプリンシプル同士の主張が相反するものになる。その場合にはより良い解になるよう、状況に応じて判断する。

1章 前提

1.1 プログラミングに銀の弾丸はない。

ソフトウェアには複雑性、同調性、可変性、不可視性の4つの困難性を示す性質がある。 ソフトウェアは概念の集積であり、製品そのものやプロセス、意思決定の経緯なども見ることはできない。図面にされていても、情報は捨象されている。

本質的、偶有的
物事には本質的なものと偶有的なものがある。本質的なものとはそれがないと対象物とは言えなくなる性質のもの、偶有的なものはそれがなくても対象物が成り立つ性質のもののこと。
偶有的なものは容易に改善がしやすい。偶有的なものは自動化などで効率化し、本質的なものに多くの時間が避けるようになると好ましい。

1つのツールや技法が全てに当てはまるということはない。地道にソフトウェアの歴史や手法、考え方を学び複雑さを軽減することが大事。

1.2 コードは設計書である

ロゼッタストーン
ロゼッタストーンは継続的なプログラミング活動において重要と思われるドキュメント、将来の保守担当者に対する簡潔な手引書。ソフトウェアの開発環境を理解するための情報と、ソフトウェアのアーキテクチャを理解するための情報を記述する。ソフトウェアの開発環境の情報はビルドとテストを実行する方法を記述する。ソフトウェアのアーキテクチャはコードからは読み取れない全体像などのコード全体を俯瞰して見た図を記述する。
コードから読み取れないWhy(コードにはHow, Whatが含まれている)、設計理由をドキュメントに残しておくと修正の判断材料として役立つ。

1.3 コードは必ず変更される

コードは無常であり、変更されるもの。変更に強いコードにするためには、コードが読みやすいということがもっとも大切。コードは書いている時間よりも読んでいる時間の方がはるかに長い。書くのにどれだけ時間がかかっても、読む時間を短縮できるなら十分にもとを取ることが可能。

2章 原則

2.1 KISS

less is more
より少ないことはより豊かなことである。余分なコードを書かないことによってコードをシンプルに保ち、様々な問題を回避することができる。もとは建築分野の言葉で、表層的要素や内的な要素を減らし、単純化すること、様々な外的要因耐えうる建築物が計画でき、より豊かな空間が生まれるという思想。

2.2 DRY(Don't repeat yourself)

コードに重複があるとコードを読む作業が難しくなる、コードを修正する作業が難しくなる、テストがない等の困難が発生する。重複のあるようなコードはたいていがレガシーコードであり、テストがない。

インピーダンスミスマッチ
オブジェクト指向とRDBでは抽象化スタイルが異なる。このような場合にコードを作成するとやむをえないDRY違反になるこのようなものをインピーダンスミスマッチという。情報は一箇所にまとめて他の情報を自動生成する仕組みを作ると情報を一元化することもできる。

WET
DRYに対して同じことを繰り返しているコードのことをWETという。

レガシーコード
レガシーコードというと昔のコードという意味になるが、テストによる品質保護の観点からテストのないコードをレガシーコードと言うようにもなった。テストのないコードは悪いコードになるという観点から、レガシーコードと相対することになったときにはエレガントでなくてもまずはテストコードを用意し、修正を行うことが品質を守る上で必須になる。

2.3 YAGNI(You aren't going to need it)

2.4 PIE(Program Intently and Expressively)

コードは書かれることよりも読まれることのほうがずっと多い。よって、書く効率よりも読む効率が優先されることになる。読みやすければ、書くときの効率が多少落ちても、それに見合うだけの価値がある。読みやすさが最優先。

2.5 SLAP(Single Level of Abstraction Principle 抽象化レベルの統一)

コードを書くときに高いレベルの抽象化概念と低いレベルの抽象化概念を分離するようにする。複雑さに応じて多階層に分離する。すると、コードに要約性閲覧性が生まれる。関数の一覧が目次のようになり要約性を持ち、分割された関数は小さなコードの塊になり閲覧性がよくなる。

複合関数
構造化された関数は自身より一段レベルの低い関数を呼び出す処理が中心となる。このような関数を複合関数という。 コードを読んでいて抽象度が急に変わると理解がしにくくなる。

SLAPは文章を書くときの手順が参考になり、内容を書くこと内容をわかりやすく伝えるための構成を考えることを別の作業にする。これをコードを書く際にも当てはめる。

  • 序盤. ファイルの先頭コメント。コードの記述内容を説明し、どのプロジェクトに属するものであるかの説明をする。
  • 目次. 関数の一覧。目次であるがゆえに、先頭に全ての関数リストを記述すべきという考え方もあるが、エディタの機能が発達しているため、遵守する必要はない。
  • セクション. ファイル内の関数を論理的にいくつかのグループに分類できる場合などは、複数の大きなセクションに分割する。セクションの区切りの防波堤コメントを区切りに使うと効果的。コードの量が多くなるときはファイル単位で分割する。
  • 章. 書籍の章は人ひとまとまりの内容に適切なタイトルをつけたもの。コードでは関数に値する。
  • 段落. コードブロックに値する。改行や、空白の区切り、インデントなどにあたる。
  • 文 コード1つ1つのステートメントにあたる。できるだけ短く簡潔に。
  • 相互参照・索引. コード上で相当するものはないので、エディタの機能が担う領域。

2.6 OCP(open-closed principle)

コードは、ソフトウェアを生き続けさせるために、コードの振る舞いを拡張できるという拡張に対して開いている という性質とコードの振る舞いを拡張してもその他コードは影響を受けないという修正に対して閉じているという2つの属性を同時に満たすように設計する。これらを満たしているコードを柔らかい設計という。変更に対して柔軟に対応できない設計を硬い設計といい、脆い設計になってしまう。

2.7 名前重要

  • 多くの情報を入れる
  • 誤解されることのないようにする
  • 手段ではなく効果と目的を説明する
  • 名前を自分自信でチェックしたい場合には処理を書く前にそのテストを書くようにする(パフォーマンスレベルの評価手順 コードの使用者側の視点で考えられるようになる)
  • 日常会話で使いやすいよう発音可能なものにする
  • 検索可能なものにする

メンタルマッピング
ある情報から記憶の中のあるべき姿のイメージに変換することをメンタルマッピングという。メンタルマッピングが発生すると読み側の負担になってしまうため、一目でわかるような命名をする。

ループバックチェック
説明→名前→説明の順番にチェックし、説明から名前、名前から説明の説明、推測ができるかをチェックする。

3章 思想

3.1 パフォーマンスレベルの評価手順 パフォーマンスレベルの評価手順 プログラミングセオリー

3.2 コミュニケーション プログラミングセオリーを支える3つの価値①

3.3 シンプル プログラミングセオリーを支える3つの価値②

3.4 柔軟性 プログラミングセオリーを支える3つの価値③

3.5 結果の局所化 プログラミングセオリーを実現する6つの原則①

3.6 繰り返しの最小化 プログラミングセオリーを実現する6つの原則②

3.7 ロジックとデータの一体化 プログラミングセオリーを実現する6つの原則③

ロジックとそのロジックが操作するデータはお互いに近くに置くようにする。
これらはコードを修正する際に同じタイミングで変更されるため、コードを読む量が減り変更コストが抑えられる。
ただし、どのロジックとデータを近づけたほうがいいのかのベストな解は最初からはわからないため、仮配置して後から適切な場所に移すのが効率的。コードを書いて動かしてから徐々にわかってくること。試行錯誤の中で明らかになる。

3.8 対称性 プログラミングセオリーを実現する6つの原則④

3.9 宣言型の表現 プログラミングセオリーを実現する6つの原則⑤

3.10 変更頻度 プログラミングセオリーを実現する6つの原則⑥

単一責任の原則
変更理由が複数あるということは責任が複数あるということ。他の箇所に影響を与える脆いものになってしまうので、そのようなモジュールは作ってはならない。

3.11 アーキテクチャ根底技法

  • 抽象化
  • パッケージ化
  • 関数の分離
  • 充足性、完全性、プリミティブ性
  • ポリシーと実装の分離
  • インターフェースと実装の分離
  • 参照の一点性
  • 分割統治

3.12 抽象 アーキテクチャ根底技法①

抽象とは概念的に線引きを行うこと。抽象は捨象一般化の観点からまとめられる。

捨象
複雑な対称からいくつかの性質を捨て去り特定の性質に目を向けること。

一般化
具体的な対称から共通の性質を抽出し、汎用的な概念に定式化すること。

3.13 パフォーマンスレベルの評価手順 パフォーマンスレベルの評価手順 カプセル化 アーキテクチャ根底技法②

  • コードが見やすい
  • 変更時の影響がモジュール内で済む
  • コードの変更が容易
  • 再利用性が高い
  • 小さい単位で分割されるので複雑な問題に対処できる

3.14 情報隠蔽 アーキテクチャ根底技法③

パルナスの規則
モジュールの利用者は、モジュールを利用するために必要な全ての情報を与え、それ以外の情報は一切見せないこと
モジュールの作成者は、そのモジュールを実装するために必要な情報を与え、それ以外の情報は一切見せないこと。

3.15 パッケージ化 アーキテクチャ根底技法④

モジュールを意味のある単位にまとめグループ化したものをパッケージと呼ぶ。ソフトウェアが大規模になってくるとモジュールが大量になりそれ自体が複雑になってしまう。そのため、パッケージ化が必要

3.16 関心の分離 アーキテクチャ根底技法⑤

アスペクト指向プログラミング
横断的関心をうまく分離する技術のこと。結合ルールによって自動的に後から組み込むことで関心の分離を実現している。

3.17 充足性、完全性、プリミティブ性 アーキテクチャ根底技法⑥

3.18 ポリシーと実装の分離 アーキテクチャ根底技法⑦

ソフトウェアの前提に依存するポリシーモジュール、ソフトウェアの全体に依存しない独立したロジック部分の実装モジュールがあり、ポリシーと実装はわけるようにする。分離が不可能である場合には明確にわかるよう表現する。

3.19 インターフェースと実装の分離 アーキテクチャ根底技法⑧

3.20 参照の一点 アーキテクチャ根底技法⑨

副作用のないプログラミングをするために、定義は一度きりにする、変数に対して再代入をしない単一代入を行う、極力定数を使い変数に対しては極力アクセスするロジックやスコープを減らす、関数は渡された引数のみに作用する等のことをする。

参照透過性

  • 呼び出しの結果が引数のみに依存すること
  • 呼び出しが他の機能の動作に影響を与えない(その後の処理の結果に影響を与える副作用をがない)

3.21 分割統治 アーキテクチャ根底技法⑩

3.22 アーキテクチャ非機能要件

非機能要件で設計
要件定義においてそれぞれの観点についてどの程度必要とされるのかを確認、アーキテクチャの設計の時点で要件を考慮に入れた構造を考え、テストで要件を満たしている確認する工程を踏みアーキテクチャ設計を非機能要件を考慮したものにする。

非機能のテスト
機能のテストではwhatに注目し、非機能のテストではHowに注目する。非機能テストは機能テストと同程度に重要。非機能テストにも合格基準を設けることが必要。

セキュリティ非機能要件 重要な非機能要件の1つにセキュリティがある。

3.23 変更容易性 アーキテクチャ非機能要件①

保守性、拡張性、再構築、移植性の側面からアーキテクチャを設計するようにすることが大事。

ソフトウェアエージング
ソフトウェアは経年劣化する、年を取るという考え方をソフトウェアエージングという。 正確なドキュメント化、変更時にアーキテクチャを壊さないこと、真摯なレビュー、変更箇所を予測した柔軟な設計などの対抗手段を駆使しソフトウェアエージングの速度を落とす。

3.24 相互作用性 アーキテクチャ非機能要件②

3.25 効率性 アーキテクチャ非機能要件③

時間効率性
時間という観点からリソースの使用効率を定義したもの。

資源効率性
コンピューター資源という観点からリソースの使用効率を定義したもの。

3.26 信頼性 アーキテクチャ非機能要件④

信頼性とはソフトウェアが例外的な場面、予期しない方法や不正な方法で使用されても機能を維持する能力のこと。信頼性にはフォールトトレランスロバストネスという2つの側面がある。

フォールトトレランス
ソフトウェアに障害が発生したときに正常な動作を保ち続ける能力。

ロバストネス
不正な使用方法や入力ミスから、ソフトウェアを保護する能力。フォールトトレランスと違い、内部的な修復は必ずしも要求しない。ソフトウェアを定義された状態に移行することを保証する。

3.27 テスト容易性 アーキテクチャ非機能要件⑤

テスト容易性とは、ソフトウェアに対して効果的かつ効率的にテストを行う能力のこと。

ソフトウェアは複雑になってくるとテストも難しくなってくるため、テストを容易にするアーキテクチャが求められてくる。
テストコードは本番コードに従属するイメージだが、テストコードが本番にあってもよい。テストをしやすくするための構造が本番コードにあってもという価値観の転換が必要。
テスト容易性のための設計ではモジュール間の依存関係の排除がポイントになる。

3.28 再利用性 アーキテクチャ非機能要件⑤

再利用性とは、全体でも一部でも別のソフトウェアの開発に再利用する能力のこと。
再利用するソフトウェア開発再利用のためのソフトウェア開発がある。

再利用するソフトウェア開発の場合はソフトウェアを既存のモジュールから組み立てるソフトウェア・コンポジションを支援するため、アーキテクチャの構成を既存の構造やモジュールのプラグインできるようにする。

再利用の3の法則

難易度3倍の法則. 再利用可能なモジュールを作るのは単一のソフトウェアで使うモジュールを開発する場合に比べ、3倍難しい。

テスト3種類の法則. 再利用可能なモジュールは共有化する前に3つの異なるソフトウェアでテストする必要がある。

3.29 7つの設計原理

3.30 単純原理 7つの設計原理①

3.31 同型原理 パフォーマンスレベルの評価手順 7つの設計原理②

3.32 対称原理 7つの設計原理③

set/get, start/end などのような命名規則も守ることにより、対称性を保つことができる。

3.33 階層原理 7つの設計原理④

3.34 線形原理 7つの設計原理⑤

3.35 明証原理 7つの設計原理⑥

3.36 パフォーマンスレベルの評価手順 安全原理 7つの設計原理⑦

3.37 UNIX思想

3.38 モジュール化の原則 UNIX思想①

3.39 明確化の原則 UNIX思想②

3.40 組み立て部品の原則 UNIX思想③

3.41 分離の原則 UNIX思想④

ポリシーメカニズムを分ける。

  • サービス系アプリケーション. フロントエンドがポリシー、バックエンドがメカニズム。
  • エディタアプリケーション. ユーザーへのインターフェースがポリシー、エディタのエンジンがメカニズム。

3.42 単純性の原則 UNIX思想⑤

コードはシンプルにする。カタログスペックが上がるように機能を増やす考え方をやめる。シンプルを美しいとする文化

3.43 倹約の原則 UNIX思想⑥

3.44 透明性の原則 UNIX思想⑦

ソフトウェアの動作を外からわかりやすくなるように設計する。
透明性. ソフトウェアに動作が一見してわかるようにすること。 パフォーマンスレベルの評価手順
開示性. ソフトウェアの内部状態を監視または表示すること。

3.45 安定性の原則 UNIX思想⑧

3.46 表現性の原則 UNIX思想⑨

3.47 驚き最小の原則 UNIX思想⑩

3.48 沈黙の原則 UNIX思想⑪

3.49 修復の原則 UNIX思想⑫

3.50 経済性の原則 UNIX思想⑬

3.51 生成の原則 UNIX思想⑭

3.52 最適化の原則 UNIX思想⑮

3.53 多様性の原則 UNIX思想⑯

3.54 拡張性の原則 UNIX思想⑰

3.55 UNIX哲学

3.56 小は美なり UNIX哲学①

3.57 1つ1仕事 UNIX哲学②

3.58 即行プロトタイプ UNIX哲学③

前提の誤りを早期に発見できる、要件不備による手戻りを減らせる、早いうちから誤りを取り除く作業を始められる等のメリットがあるため、できるだけ早くプロトタイプを作る。最初から完全なソフトウェアを書くことは不可能なため、継続的な改善作業が必要。

第3のシステム
人間は全てのシステムにおいて第1のシステム、第2のシステム、第3のシステムをリリースしていくことになる。

第1のシステム. 性能は高いが、必要な機能が欠けている。
第2のシステム. 機能は多いが、性能が犠牲になっている。
第3のシステム. 両者の最適なバランスの取れた必要な機能だけが備わっている。

3.59 効率性より移植性 UNIX哲学④

ソフトウェアの設計は選択の連続である。移植性と開発効率性という二律背反の選択に迫られたとき、優先すべきは移植性

3.60 データはテキスト UNIX哲学⑤

3.61 レバレッジ・ソフトウェア UNIX哲学⑥

よいプログラマはコードを書く。偉大なプログラマはよいコードを借りてくる
自分の仕事に他人に成果を取り込むことで、投資を少なく大きな収入を生み出す。レバレッジがかかる。

3.62 シェルスクリプト活用 UNIX哲学⑦

てこの効果
シェルスクリプトを使用して他のソフトウェアやコマンドをつなげる。

移植性 パフォーマンスレベルの評価手順
シェルスクリプトはインタプリンタなので、コンパイル言語に比べ移植性が高くなる。
シェルスクリプトはグルー言語として使用し、小さなソフトウェアをつなげて大きなものにする。

3.63 対話インターフェース回避 UNIX哲学⑧

3.64 フィルタ化 UNIX哲学⑧

90%の解(UNIX小定理)
どんなことであれ100%で物事をこなすのは困難。そのため、ユーザーが90%で満足することを目指し、残りの10%は自分でどうにかしてもらおうという考え方をするとバランスがよくなる。

4章 視点

4.1 凝集度

レベル1 暗号的強度
暗号とは偶然に物事が一致するという意味。たまたまモジュール内に重複している命令群のパターンがあったので、統合して1つのモジュールにするなどのケース。

レベル2 論理的強度
ある機能を抽象的に捉えてまとめたもの。関連したいくつかの機能を含み、そのうちの1つだけがモジュールによって識別され(論理)、実行されるモジュールのこと。内包される命令群の関連性は弱いため、モジュール強度は下がる。

レベル3 時間的強度
特定の時点に連続して実行する複数の機能を1つのモジュールにまとめたもの。代表的なものは初期処理モジュール。

レベル4手順的強度
問題を処理するために関係している複数個の機能のうちいくつかを実行。複数機能な順番(手順)に実行される。複数機能の1つだけといった使い方ができなくなる。

レベル5連絡的強度
基本的には手順的強度の特性を持つ。モジュール愛機能間でデータの受け渡し(連絡)をしたり、同じデータを参照する点が異なる。

レベル6: 情報的強度
特定のデータ構造を扱う複数の機能を1つのモジュールにまとめたもの。論理的モジュールと違い一口点が複数あり、各々が固有のパラメーターをもつためパラメーターの扱いにくさを解消できる。

レベル7: 機能的強度
モジュール内の全ての命令が1つの役割(機能)を実行するために関連しあっているモジュール。変更理由が他のモジュールとも共通の事情による変更の可能性が高くなる。

4.2 結合度

レベル1 内部結合
モジュールとモジュールが一部を共有するようなモジュール結合。

レベル2 共通結合
共通域に定義したデータをいくつかのモジュールが共同使用するような結合形式。

レベル3 外部結合
外部宣言したデータを共有したモジュール間の結合形式。public宣言された変数など。

レベル4 制御結合
呼び出し側のモジュールが呼び出されるモジュールの制御を指示するデータをパラメータとして渡す結合形式。相手をブラックボックス化しにくいので結合度が強くなる。

レベル5スタンプ結合
共通域にないデータを2つのモジュールで受け渡しする結合形態。データ構造はパラメーターを介す。受け渡すデータの一部を使用しないこともあり、不必要なデータが生まれてしまう点が結合度を強くしている。

レベル6 データ結合
モジュール感のインターフェースとしてスカラ型のデータ要素をパラメーターとして受け渡す結合形式。相手モジュールをブラックボックス化できるので結合度は一番弱くなる。

ハイブリッド結合
ハイブリッドに戻り値が変わってしまう関数などは、使用者側が意識して使用しなければならないため、結合度がやや高い

4.3 直交性

リレーションの直行性
リレーショナル・データベースで正規化と同じぐらい重要なリレーションの直交性という概念がある。複数のリレーションに間の重複に関する概念。データベース全体から重複をなくしていくこと。

部下・社員の成長を促す「評価」の仕組み・伝え方
~納得感を生み出す評価のあり方を「3つの公正感」から解説~

伊達 洋駆氏

当社では、内定を承諾した人、辞退した人への調査を行っています。そこで一貫して明らかになっているのが、評価結果やプロセスへの納得感、ちゃんと見てくれているという認識を候補者が持てたときに志望度が上がるということです。逆にいうと、納得度が低ければ志望度は上がりにくい。たとえ候補者を褒めたとしても、その内容がずれていれば「自分のことを全然分かってくれていない」と候補者に思われてしまい、志望度は上がらないのです。

候補者の評価への納得度は、その企業への志望度に影響する

「オンライン採用」の基本と実践 全4回分が1冊で読める

評価はバイアスの宝庫

部下の評価、候補者の評価は、評価をされる「被評価者」にとって重要なものです。しかし評価という営みが難しいのは、 評価する側もされる側も、評価をめぐる「バイアス」がある からです。
評価は、まさにバイアスの宝庫です。「評価」「バイアス」でネット検索をすると、気がめいるほどたくさんのバイアスがあるのですが、今回はそのなかからいくつかのバイアスを紹介します。

評価者のバイアス

1. 人柄に影響される

被評価者の「能力だけ」を純粋に見極めることは非常に難しいもの。なぜなら、評価は人柄に影響されてしまうからです。海外の論文では、友好的な人の評価は甘くなり、友好的ではない人の評価が厳しくなると指摘されています。友好的な人であれば、一度能力を発揮している状況を見れば、深く掘り下げないのに対し、友好的ではないと、本当に能力を持っているのかを慎重に検討します。

2. 第一印象に影響される

採用での面接時間は30分程度でしょうか。しかし、研究の結果では、面接開始後の数分の印象が、最終的な評価に結びつくことが分かっています。人の評価は第一印象に影響されているのです。

3. 外向性に影響される

外向性に影響される

本来高く評価したいのは、真面目にコツコツ物事を進める人であるにもかかわらず、実際には明るくて社交的な人ほど高く評価されます。このように「高い評価をすべき人」と「実際に高く評価されている人」がずれてしまうケースが見られます。

プリンシプルオブプログラミング 個人的重要箇所

前提、原則、思想、習慣、視点、法則、などのことをプリンシプルという。 プリンシプルを身につけると、なぜその技術が必要なのか、が理解することができる。 プリンシプルとは普遍的な知識であり、様々な技術に対して当てはめることができ、エンジニアの土台としての知識になる。プリンシプルは抽象的なものであり、大きな原則になる。
ときにはプリンシプル同士の主張が相反するものになる。その場合にはより良い解になるよう、状況に応じて判断する。

1章 前提

1.1 プログラミングに銀の弾丸はない。

ソフトウェアには複雑性、同調性、可変性、不可視性の4つの困難性を示す性質がある。 ソフトウェアは概念の集積であり、製品そのものやプロセス、意思決定の経緯なども見ることはできない。図面にされていても、情報は捨象されている。

本質的、偶有的
物事には本質的なものと偶有的なものがある。本質的なものとはそれがないと対象物とは言えなくなる性質のもの、偶有的なものはそれがなくても対象物が成り立つ性質のもののこと。
偶有的なものは容易に改善がしやすい。偶有的なものは自動化などで効率化し、本質的なものに多くの時間が避けるようになると好ましい。

1つのツールや技法が全てに当てはまるということはない。地道にソフトウェアの歴史や手法、考え方を学び複雑さを軽減することが大事。

1.2 コードは設計書である

ロゼッタストーン
ロゼッタストーンは継続的なプログラミング活動において重要と思われるドキュメント、将来の保守担当者に対する簡潔な手引書。ソフトウェアの開発環境を理解するための情報と、ソフトウェアのアーキテクチャを理解するための情報を記述する。ソフトウェアの開発環境の情報はビルドとテストを実行する方法を記述する。ソフトウェアのアーキテクチャはコードからは読み取れない全体像などのコード全体を俯瞰して見た図を記述する。
コードから読み取れないWhy(コードにはHow, Whatが含まれている)、設計理由をドキュメントに残しておくと修正の判断材料として役立つ。

1.3 コードは必ず変更される

コードは無常であり、変更されるもの。変更に強いコードにするためには、コードが読みやすいということがもっとも大切。コードは書いている時間よりも読んでいる時間の方がはるかに長い。書くのにどれだけ時間がかかっても、読む時間を短縮できるなら十分にもとを取ることが可能。

2章 原則

2.1 KISS

less is more
より少ないことはより豊かなことである。余分なコードを書かないことによってコードをシンプルに保ち、様々な問題を回避することができる。もとは建築分野の言葉で、表層的要素や内的な要素を減らし、単純化すること、様々な外的要因耐えうる建築物が計画でき、より豊かな空間が生まれるという思想。

2.2 DRY(Don't repeat パフォーマンスレベルの評価手順 yourself)

コードに重複があるとコードを読む作業が難しくなる、コードを修正する作業が難しくなる、テストがない等の困難が発生する。重複のあるようなコードはたいていがレガシーコードであり、テストがない。

インピーダンスミスマッチ
オブジェクト指向とRDBでは抽象化スタイルが異なる。このような場合にコードを作成するとやむをえないDRY違反になるこのようなものをインピーダンスミスマッチという。情報は一箇所にまとめて他の情報を自動生成する仕組みを作ると情報を一元化することもできる。

WET
DRYに対して同じことを繰り返しているコードのことをWETという。

レガシーコード
レガシーコードというと昔のコードという意味になるが、テストによる品質保護の観点からテストのないコードをレガシーコードと言うようにもなった。テストのないコードは悪いコードになるという観点から、レガシーコードと相対することになったときにはエレガントでなくてもまずはテストコードを用意し、修正を行うことが品質を守る上で必須になる。

2.3 YAGNI(You aren't going to need it)

2.4 パフォーマンスレベルの評価手順 PIE(Program Intently and Expressively)

コードは書かれることよりも読まれることのほうがずっと多い。よって、書く効率よりも読む効率が優先されることになる。読みやすければ、書くときの効率が多少落ちても、それに見合うだけの価値がある。読みやすさが最優先。

2.5 SLAP(パフォーマンスレベルの評価手順 Single Level of Abstraction Principle 抽象化レベルの統一)

コードを書くときに高いレベルの抽象化概念と低いレベルの抽象化概念を分離するようにする。複雑さに応じて多階層に分離する。すると、コードに要約性閲覧性が生まれる。関数の一覧が目次のようになり要約性を持ち、分割された関数は小さなコードの塊になり閲覧性がよくなる。

複合関数
構造化された関数は自身より一段レベルの低い関数を呼び出す処理が中心となる。このような関数を複合関数という。 コードを読んでいて抽象度が急に変わると理解がしにくくなる。

SLAPは文章を書くときの手順が参考になり、内容を書くこと内容をわかりやすく伝えるための構成を考えることを別の作業にする。これをコードを書く際にも当てはめる。

  • 序盤. ファイルの先頭コメント。コードの記述内容を説明し、どのプロジェクトに属するものであるかの説明をする。
  • 目次. 関数の一覧。目次であるがゆえに、先頭に全ての関数リストを記述すべきという考え方もあるが、エディタの機能が発達しているため、遵守する必要はない。
  • セクション. ファイル内の関数を論理的にいくつかのグループに分類できる場合などは、複数の大きなセクションに分割する。セクションの区切りの防波堤コメントを区切りに使うと効果的。コードの量が多くなるときはファイル単位で分割する。
  • 章. 書籍の章は人ひとまとまりの内容に適切なタイトルをつけたもの。コードでは関数に値する。
  • 段落. コードブロックに値する。改行や、空白の区切り、インデントなどにあたる。
  • 文 コード1つ1つのステートメントにあたる。できるだけ短く簡潔に。
  • 相互参照・索引. コード上で相当するものはないので、エディタの機能が担う領域。

2.6 OCP(open-closed principle)

コードは、ソフトウェアを生き続けさせるために、コードの振る舞いを拡張できるという拡張に対して開いている という性質とコードの振る舞いを拡張してもその他コードは影響を受けないという修正に対して閉じているという2つの属性を同時に満たすように設計する。これらを満たしているコードを柔らかい設計という。変更に対して柔軟に対応できない設計を硬い設計といい、脆い設計になってしまう。

2.7 名前重要

  • 多くの情報を入れる
  • 誤解されることのないようにする
  • 手段ではなく効果と目的を説明する
  • 名前を自分自信でチェックしたい場合には処理を書く前にそのテストを書くようにする(コードの使用者側の視点で考えられるようになる)
  • 日常会話で使いやすいよう発音可能なものにする
  • 検索可能なものにする

メンタルマッピング
ある情報から記憶の中のあるべき姿のイメージに変換することをメンタルマッピングという。メンタルマッピングが発生すると読み側の負担になってしまうため、一目でわかるような命名をする。

ループバックチェック
説明→名前→説明の順番にチェックし、説明から名前、名前から説明の説明、推測ができるかをチェックする。

3章 思想

3.1 プログラミングセオリー

3.2 コミュニケーション プログラミングセオリーを支える3つの価値①

3.3 シンプル プログラミングセオリーを支える3つの価値②

3.4 柔軟性 プログラミングセオリーを支える3つの価値③

3.5 結果の局所化 プログラミングセオリーを実現する6つの原則①

3.6 繰り返しの最小化 プログラミングセオリーを実現する6つの原則②

3.7 ロジックとデータの一体化 プログラミングセオリーを実現する6つの原則③

ロジックとそのロジックが操作するデータはお互いに近くに置くようにする。
これらはコードを修正する際に同じタイミングで変更されるため、コードを読む量が減り変更コストが抑えられる。
ただし、どのロジックとデータを近づけたほうがいいのかのベストな解は最初からはわからないため、仮配置して後から適切な場所に移すのが効率的。コードを書いて動かしてから徐々にわかってくること。試行錯誤の中で明らかになる。

3.8 対称性 プログラミングセオリーを実現する6つの原則④

3.9 宣言型の表現 プログラミングセオリーを実現する6つの原則⑤

3.10 変更頻度 プログラミングセオリーを実現する6つの原則⑥

単一責任の原則
変更理由が複数あるということは責任が複数あるということ。他の箇所に影響を与える脆いものになってしまうので、そのようなモジュールは作ってはならない。

3.11 アーキテクチャ根底技法

  • 抽象化
  • パッケージ化
  • 関数の分離
  • 充足性、完全性、プリミティブ性
  • ポリシーと実装の分離
  • インターフェースと実装の分離
  • 参照の一点性
  • 分割統治

3.12 抽象 アーキテクチャ根底技法①

抽象とは概念的に線引きを行うこと。抽象は捨象一般化の観点からまとめられる。

捨象
複雑な対称からいくつかの性質を捨て去り特定の性質に目を向けること。

一般化
具体的な対称から共通の性質を抽出し、汎用的な概念に定式化すること。

3.13 カプセル化 アーキテクチャ根底技法②

  • コードが見やすい
  • 変更時の影響がモジュール内で済む
  • パフォーマンスレベルの評価手順
  • コードの変更が容易
  • 再利用性が高い
  • 小さい単位で分割されるので複雑な問題に対処できる

3.14 情報隠蔽 アーキテクチャ根底技法③

パルナスの規則
モジュールの利用者は、モジュールを利用するために必要な全ての情報を与え、それ以外の情報は一切見せないこと
モジュールの作成者は、そのモジュールを実装するために必要な情報を与え、それ以外の情報は一切見せないこと。

3.15 パッケージ化 アーキテクチャ根底技法④

モジュールを意味のある単位にまとめグループ化したものをパッケージと呼ぶ。ソフトウェアが大規模になってくるとモジュールが大量になりそれ自体が複雑になってしまう。そのため、パッケージ化が必要

3.16 関心の分離 アーキテクチャ根底技法⑤

アスペクト指向プログラミング
横断的関心をうまく分離する技術のこと。結合ルールによって自動的に後から組み込むことで関心の分離を実現している。

3.17 充足性、完全性、プリミティブ性 アーキテクチャ根底技法⑥

3.18 ポリシーと実装の分離 アーキテクチャ根底技法⑦

ソフトウェアの前提に依存するポリシーモジュール、ソフトウェアの全体に依存しない独立したロジック部分の実装モジュールがあり、ポリシーと実装はわけるようにする。分離が不可能である場合には明確にわかるよう表現する。

3.19 インターフェースと実装の分離 アーキテクチャ根底技法⑧

3.20 参照の一点 アーキテクチャ根底技法⑨

副作用のないプログラミングをするために、定義は一度きりにする、変数に対して再代入をしない単一代入を行う、極力定数を使い変数に対しては極力アクセスするロジックやスコープを減らす、関数は渡された引数のみに作用する等のことをする。

参照透過性

  • 呼び出しの結果が引数のみに依存すること
  • 呼び出しが他の機能の動作に影響を与えない(その後の処理の結果に影響を与える副作用をがない)

3.21 分割統治 アーキテクチャ根底技法⑩

3.22 アーキテクチャ非機能要件

非機能要件で設計
要件定義においてそれぞれの観点についてどの程度必要とされるのかを確認、アーキテクチャの設計の時点で要件を考慮に入れた構造を考え、テストで要件を満たしている確認する工程を踏みアーキテクチャ設計を非機能要件を考慮したものにする。

非機能のテスト
機能のテストではwhatに注目し、非機能のテストではHowに注目する。非機能テストは機能テストと同程度に重要。非機能テストにも合格基準を設けることが必要。

セキュリティ非機能要件 重要な非機能要件の1つにセキュリティがある。

3.23 変更容易性 アーキテクチャ非機能要件①

保守性、拡張性、再構築、移植性の側面からアーキテクチャを設計するようにすることが大事。

ソフトウェアエージング
ソフトウェアは経年劣化する、年を取るという考え方をソフトウェアエージングという。 正確なドキュメント化、変更時にアーキテクチャを壊さないこと、真摯なレビュー、変更箇所を予測した柔軟な設計などの対抗手段を駆使しソフトウェアエージングの速度を落とす。

3.24 相互作用性 アーキテクチャ非機能要件②

3.25 効率性 アーキテクチャ非機能要件③

時間効率性
時間という観点からリソースの使用効率を定義したもの。

資源効率性
コンピューター資源という観点からリソースの使用効率を定義したもの。

3.26 信頼性 アーキテクチャ非機能要件④

信頼性とはソフトウェアが例外的な場面、予期しない方法や不正な方法で使用されても機能を維持する能力のこと。信頼性にはフォールトトレランスロバストネスという2つの側面がある。

フォールトトレランス
ソフトウェアに障害が発生したときに正常な動作を保ち続ける能力。

ロバストネス
不正な使用方法や入力ミスから、ソフトウェアを保護する能力。フォールトトレランスと違い、内部的な修復は必ずしも要求しない。ソフトウェアを定義された状態に移行することを保証する。

3.27 テスト容易性 アーキテクチャ非機能要件⑤

テスト容易性とは、ソフトウェアに対して効果的かつ効率的にテストを行う能力のこと。

ソフトウェアは複雑になってくるとテストも難しくなってくるため、テストを容易にするアーキテクチャが求められてくる。
テストコードは本番コードに従属するイメージだが、テストコードが本番にあってもよい。テストをしやすくするための構造が本番コードにあってもという価値観の転換が必要。
テスト容易性のための設計ではモジュール間の依存関係の排除がポイントになる。

3.28 再利用性 アーキテクチャ非機能要件⑤

再利用性とは、全体でも一部でも別のソフトウェアの開発に再利用する能力のこと。
再利用するソフトウェア開発再利用のためのソフトウェア開発がある。

再利用するソフトウェア開発の場合はソフトウェアを既存のモジュールから組み立てるソフトウェア・コンポジションを支援するため、アーキテクチャの構成を既存の構造やモジュールのプラグインできるようにする。

再利用の3の法則

難易度3倍の法則. 再利用可能なモジュールを作るのは単一のソフトウェアで使うモジュールを開発する場合に比べ、3倍難しい。

テスト3種類の法則. 再利用可能なモジュールは共有化する前に3つの異なるソフトウェアでテストする必要がある。

3.29 7つの設計原理

3.30 単純原理 7つの設計原理①

3.31 同型原理 7つの設計原理②

3.32 対称原理 7つの設計原理③

set/get, start/end などのような命名規則も守ることにより、対称性を保つことができる。

3.33 階層原理 7つの設計原理④

3.34 線形原理 7つの設計原理⑤

3.35 明証原理 7つの設計原理⑥

3.36 安全原理 7つの設計原理⑦

3.37 UNIX思想

3.38 モジュール化の原則 UNIX思想①

3.39 明確化の原則 UNIX思想②

3.40 組み立て部品の原則 パフォーマンスレベルの評価手順 UNIX思想③

3.41 分離の原則 UNIX思想④

ポリシーメカニズムを分ける。

  • サービス系アプリケーション. フロントエンドがポリシー、バックエンドがメカニズム。
  • エディタアプリケーション. ユーザーへのインターフェースがポリシー、エディタのエンジンがメカニズム。

3.42 単純性の原則 UNIX思想⑤

コードはシンプルにする。カタログスペックが上がるように機能を増やす考え方をやめる。シンプルを美しいとする文化

3.43 倹約の原則 UNIX思想⑥

3.44 透明性の原則 UNIX思想⑦

ソフトウェアの動作を外からわかりやすくなるように設計する。
透明性. ソフトウェアに動作が一見してわかるようにすること。
開示性. ソフトウェアの内部状態を監視または表示すること。

3.45 安定性の原則 UNIX思想⑧

3.46 表現性の原則 UNIX思想⑨

3.47 驚き最小の原則 UNIX思想⑩

3.48 沈黙の原則 UNIX思想⑪

3.49 修復の原則 UNIX思想⑫

3.50 経済性の原則 UNIX思想⑬

3.51 生成の原則 UNIX思想⑭

3.52 最適化の原則 UNIX思想⑮

3.53 多様性の原則 UNIX思想⑯

3.54 拡張性の原則 UNIX思想⑰

3.55 UNIX哲学

3.56 小は美なり UNIX哲学①

3.57 1つ1仕事 UNIX哲学②

3.58 即行プロトタイプ UNIX哲学③

前提の誤りを早期に発見できる、要件不備による手戻りを減らせる、早いうちから誤りを取り除く作業を始められる等のメリットがあるため、できるだけ早くプロトタイプを作る。最初から完全なソフトウェアを書くことは不可能なため、継続的な改善作業が必要。

第3のシステム
人間は全てのシステムにおいて第1のシステム、第2のシステム、第3のシステムをリリースしていくことになる。

第1のシステム. 性能は高いが、必要な機能が欠けている。
第2のシステム. 機能は多いが、性能が犠牲になっている。
第3のシステム. 両者の最適なバランスの取れた必要な機能だけが備わっている。

3.59 効率性より移植性 UNIX哲学④

ソフトウェアの設計は選択の連続である。移植性と開発効率性という二律背反の選択に迫られたとき、優先すべきは移植性

3.60 データはテキスト UNIX哲学⑤

3.61 レバレッジ・ソフトウェア UNIX哲学⑥

よいプログラマはコードを書く。偉大なプログラマはよいコードを借りてくる
自分の仕事に他人に成果を取り込むことで、投資を少なく大きな収入を生み出す。レバレッジがかかる。

3.62 シェルスクリプト活用 UNIX哲学⑦

てこの効果
シェルスクリプトを使用して他のソフトウェアやコマンドをつなげる。

移植性
シェルスクリプトはインタプリンタなので、コンパイル言語に比べ移植性が高くなる。
シェルスクリプトはグルー言語として使用し、小さなソフトウェアをつなげて大きなものにする。

3.63 対話インターフェース回避 UNIX哲学⑧

3.64 フィルタ化 UNIX哲学⑧

90%の解(UNIX小定理)
どんなことであれ100%で物事をこなすのは困難。そのため、ユーザーが90%で満足することを目指し、残りの10%は自分でどうにかしてもらおうという考え方をするとバランスがよくなる。

4章 視点

4.1 パフォーマンスレベルの評価手順 凝集度

レベル1 暗号的強度
暗号とは偶然に物事が一致するという意味。たまたまモジュール内に重複している命令群のパターンがあったので、統合して1つのモジュールにするなどのケース。

レベル2 論理的強度
ある機能を抽象的に捉えてまとめたもの。関連したいくつかの機能を含み、そのうちの1つだけがモジュールによって識別され(論理)、実行されるモジュールのこと。内包される命令群の関連性は弱いため、モジュール強度は下がる。

レベル3 時間的強度
特定の時点に連続して実行する複数の機能を1つのモジュールにまとめたもの。代表的なものは初期処理モジュール。

レベル4手順的強度
問題を処理するために関係している複数個の機能のうちいくつかを実行。複数機能な順番(手順)に実行される。複数機能の1つだけといった使い方ができなくなる。

レベル5連絡的強度
基本的には手順的強度の特性を持つ。モジュール愛機能間でデータの受け渡し(連絡)をしたり、同じデータを参照する点が異なる。

レベル6: 情報的強度
特定のデータ構造を扱う複数の機能を1つのモジュールにまとめたもの。論理的モジュールと違い一口点が複数あり、各々が固有のパラメーターをもつためパラメーターの扱いにくさを解消できる。

レベル7: 機能的強度
モジュール内の全ての命令が1つの役割(機能)を実行するために関連しあっているモジュール。変更理由が他のモジュールとも共通の事情による変更の可能性が高くなる。

4.2 結合度

レベル1 内部結合
モジュールとモジュールが一部を共有するようなモジュール結合。

レベル2 共通結合
共通域に定義したデータをいくつかのモジュールが共同使用するような結合形式。

レベル3 外部結合
外部宣言したデータを共有したモジュール間の結合形式。public宣言された変数など。

レベル4 制御結合
呼び出し側のモジュールが呼び出されるモジュールの制御を指示するデータをパラメータとして渡す結合形式。相手をブラックボックス化しにくいので結合度が強くなる。

レベル5スタンプ結合
共通域にないデータを2つのモジュールで受け渡しする結合形態。データ構造はパラメーターを介す。受け渡すデータの一部を使用しないこともあり、不必要なデータが生まれてしまう点が結合度を強くしている。

レベル6 データ結合
モジュール感のインターフェースとしてスカラ型のデータ要素をパラメーターとして受け渡す結合形式。相手モジュールをブラックボックス化できるので結合度は一番弱くなる。

ハイブリッド結合
ハイブリッドに戻り値が変わってしまう関数などは、使用者側が意識して使用しなければならないため、結合度がやや高い

4.3 直交性

リレーションの直行性
リレーショナル・データベースで正規化と同じぐらい重要なリレーションの直交性という概念がある。複数のリレーションに間の重複に関する概念。データベース全体から重複をなくしていくこと。

MBO(目標管理制度)とは?OKRとの違いや導入手順もわかりやすく解説

MBO(目標管理制度)とは?OKRとの違いや導入手順をわかりやすく解説

MBO 導入の手順

具体的なMBOの手順を見ていきましょう。

    組織目標に沿った個人目標を主体的に設定
    目標管理制度をうまく機能させるためには、いきなり各社員に目標を設定させるのではありません。まずは企業や部署といった組織単位の全体目標を設定し、決定した目標を全社的あるいは各所属社員に知らせましょう。 下位の各社員が設定すべき目標は組織目標につながるものでなくてはならないからです。さらに全体的な目標を共有することで、社員全体を一体化させるという目的もあります。
    各社員の目標は、上司が一方的に決めるのではなく本人が主体となって設定することが重要です。明確な目標達成基準を本人・上司ともに明確にイメージできていることが重要です。

部下・社員の成長を促す「評価」の仕組み・伝え方
~納得感を生み出す評価のあり方を「3つの公正感」から解説~

伊達 洋駆氏

当社では、内定を承諾した人、辞退した人への調査を行っています。そこで一貫して明らかになっているのが、評価結果やプロセスへの納得感、ちゃんと見てくれているという認識を候補者が持てたときに志望度が上がるということです。逆にいうと、納得度が低ければ志望度は上がりにくい。たとえ候補者を褒めたとしても、その内容がずれていれば「自分のことを全然分かってくれていない」と候補者に思われてしまい、志望度は上がらないのです。

候補者の評価への納得度は、その企業への志望度に影響する

「オンライン採用」の基本と実践 全4回分が1冊で読める

評価はバイアスの宝庫

部下の評価、候補者の評価は、評価をされる「被評価者」にとって重要なものです。しかし評価という営みが難しいのは、 評価する側もされる側も、評価をめぐる「バイアス」がある からです。
評価は、まさにバイアスの宝庫です。「評価」「バイアス」でネット検索をすると、気がめいるほどたくさんのバイアスがあるのですが、今回はそのなかからいくつかのバイアスを紹介します。

評価者のバイアス

1. 人柄に影響される

被評価者の「能力だけ」を純粋に見極めることは非常に難しいもの。なぜなら、評価は人柄に影響されてしまうからです。海外の論文では、友好的な人の評価は甘くなり、友好的ではない人の評価が厳しくなると指摘されています。友好的な人であれば、一度能力を発揮している状況を見れば、深く掘り下げないのに対し、友好的ではないと、本当に能力を持っているのかを慎重に検討します。

2. 第一印象に影響される

採用での面接時間は30分程度でしょうか。しかし、研究の結果では、面接開始後の数分の印象が、最終的な評価に結びつくことが分かっています。人の評価は第一印象に影響されているのです。

3. 外向性に影響される

外向性に影響される

本来高く評価したいのは、真面目にコツコツ物事を進める人であるにもかかわらず、実際には明るくて社交的な人ほど高く評価されます。このように「高い評価をすべき人」と「実際に高く評価されている人」がずれてしまうケースが見られます。

関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる