オンライン外国為替取引

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

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

HP Surestore および StorageWorks - パフォーマンスのトラブルシューティングとパフォーマンス評価ツールの使用方法

このような構成を行うことによって、システムの他の部分に注目することができます。 そのためには、目標とする速度でテープ ドライブにデータを転送できる程度にまで、システム全体のデータ フローを高速化する必要があります。 HP Ultrium 460 などの高速テープ ドライブは非常に高速なので、この目標を達成することは困難になる場合があります。 バックアップ パフォーマンスが、テープ ドライブのデータ シートに記載された速度に達しない場合、システムの他の場所にボトルネックがあります。

では、どの程度の速度を目標とすればよいでしょうか。

答えは、テープ ドライブのネイティブのデータ速度と、バックアップ対象となるデータの圧縮率を掛けた数値です。 たとえば、HP Ultrium 460 (ネイティブで 30MB/秒) で圧縮率 2:1 のデータを転送する場合、速度は 60MB/秒となります。

最終的なデータ速度は、テープ ドライブ内部のパイプラインによる制限を受けることがあるので注意してください。 HP Ultrium 460 の場合、90MB/秒程度になります。 ただし、最高速のシステムを除いて、制限要素にはなりません。

また、圧縮率は大幅に異なります。 データ圧縮と、一般的なデータ型での圧縮率は、ここをクリックしてください。 一般的に圧縮率は 2:1 として考えることができ、計算上の既定値として使用できます。 または、LTT (Library and Tape Tools) を使って、テープ ドライブの圧縮ログから実際のデータ圧縮率を直接計算することもできます。 L&TT パフォーマンスレベルの評価手順 の詳細は、ここをクリックしてください。

テープ ドライブのパフォーマンス

テープ ドライブは問題の原因だと誤解されやすいコンポーネントです。 テープ ドライブに問題があるかどうかを確認するには、HPTapePerf/hptapeperf (または L&TT のデバイス パフォーマンス機能) を実行し、ディスク サブシステムやアプリケーションを除外したテープ ドライブ単体としてのアクセス速度を測定します。 測定では、事前にロードされたデータをサーバ メモリからテープ ドライブへ直接転送します。 また、さまざまな圧縮率を使用できます。

バス上には他に周辺装置を配備しないでください。高速テープ ドライブが最大限の帯域幅を達成するためには、HBA/バスへ排他的にアクセスする必要があります。 また、SCSI デバイスはバス上にある最も低速なデバイスに速度を合わせるので、バス上にレガシー デバイスがあると、他のデバイスはすべて低速になります。

メディアに破損や磨耗があると、テープの使用量が増大したり、物理コンポーネントの再試行が発生したりするので、パフォーマンスが低下する原因になります。 L&TT を使ってメディア パフォーマンスを確認するか、新しいテープを使用してください。

ヘッドが汚れている場合、「クリーニング」ライトが点灯します。 HP テープ ドライブには自動クリーニング機能が付いているので、ヘッドが汚れることはほとんどありませんが、確認のためにカートリッジをクリーニングしてください。

ディスクおよびファイル システムのパフォーマンス

ディスクの RAW データ速度と、ファイル システムからファイルを読み出す速度には、大きな相違があります。 ファイル システムを横断するには、ディスクへのランダム アクセスを複数回数実行する必要があるのに対して、継続的な読み出しでは、ディスクの最高データ速度にしか制限されません。

ファイル サイズが小さくなると、この 2 つのモードの差はさらに大きくなります。 ファイル サイズが 64KB 未満のファイル システムの場合、シーケンシャル バックアップは、高速テープ ドライブのデータ速度で実行できると考えられます。

ディスク サブシステムからのデータ転送速度を測定するには、PAT、HPReadData、L&TT の System Performance Backup Pre-Test を実行し、バックアップ方法としてファイルごとまたはシーケンシャルのいずれかを選択します (シーケンシャル バックアップのパフォーマンスを測定できるのは PAT だけです)。 このツールでは、ディスク システムの実際の読み出し転送速度を測定できるので、目標のデータ速度と比較してください。

RAID サブシステムのディスク ドライブの数 - ファイル毎のバックアップをサポートするには、ネイティブ テープ転送速度 4MB/秒ごとに 1 ドライブ以上を推奨します。 (たとえば、Ultrium 460 の場合、ネイティブ速度は 30MB/秒なので 8 台以上)。

バックアップ アプリケーションの構成

一般的なバックアップでは、HP がバックアップ アプリケーション向けに提示している推奨値を使用してください。 ネイティブ アプリケーション (UNIX の tar や cpio など) は、高性能を発揮できません。 バックアップ アプリケーション パフォーマンスレベルの評価手順 ソフトウェアの推奨値については、ここをクリックしてください。

データ圧縮 - HP のテープ ドライブは、ハードウェアで圧縮を実行するので非常に高速ですが、サーバのソフトウェアで実行する場合は格段に遅くなります。 また、データを 2 回圧縮すると、最適な圧縮率は得られません。

サーバ キャパシティ

サーバがボトルネックになっているかどうかを確認するには、バックアップの実行中に、付属のシステム監視ツールを実行してください。 使用可能なリソースが残っていることを確認します。 以下の項目をチェックしてください。

サーバ セットアップ

テープ ドライブとディスク サブシステムの両方について、HBA の IRQ 割り当てを確認してください。 いずれかが他のデバイスと IRQ (割り込み) を共有している場合、割り込み管理のためにオーバーヘッドが発生します。 これが、パフォーマンスを大幅に低下させる原因となることがあります。

IRQ の割り当て状況を確認する最適な方法は、BIOS です。 また、IRQ の割り当てを手動で変更する場合も、BIOS を使用してください。 Windows デバイス マネージャでは正しい IRQ 割り当てを確認できない場合があるので、使用しないでください。

ハードウェアの配置を変更し、別のスロットを使用します。 プラグ アンド プレイ機能があれば、試しに割り当ててみることもできます。 可能であれば、手動による方法 (BIOS 割り当て) を使用してください。

Windows 2000 と .net での注意点の 1 つに、RSM (Removable Storage Manager) があります。 このシステム サービスは、定期的にドライブのポーリングを実行し、そのたびにデータ フローが中断されるので、全体的なスループットが低下します。 この問題を解消するには、サービスを無効にする方法がありますが、USB などのストレージ デバイスを再接続すると、RSM バックアップが自動的に有効になるので注意が必要です。

ファイル毎のバックアップとイメージ/シーケンシャル バックアップ

最も大きなパフォーマンス向上効果が得られる方法の 1 つは、ファイル毎のバックアップからイメージ/シーケンシャル バックアップへの切り替えです。 どの程度パフォーマンスを向上できるかは、PAT を使って、この 2 つのモードでのデータ転送速度を比較すると確認できます。

実行するバックアップのタイプは、バックアップ アプリケーションで定義します。 モードの選択方法については、アプリケーションのユーザ ガイドを参照してください。 HP Data Protector などほとんどのアプリケーションでは「イメージ」モード、Veritas NetBackup では「FlashBackup」と呼ばれています。

復元では、アプリケーションがデータ抽出機能をサポートしている場合を除いて、パーティション (または LUN) 全体を 1 つの操作で復元する必要があります。 目的のデータだけを選択して復元する場合、かなり長い時間がかかります。

ディスク間バックアップ

バックアップと復元

テープ ドライブでは、書き込みと読み出し速度は同じですが、ディスク システムでは異なるという点に注意が必要です。 ディスクへデータを書き込む場合、ファイル構造を作成する必要があり、この操作にはヘッドの移動を伴います。 また、リードキャッシュが威力を発揮することもできません。

ディスク サブシステムのパフォーマンスは、HPCreateData/hpcreatedata または L&TT の System performance Restore Pre-Test 機能で測定できます。 このユーティリティは、ファイル サイズ、ディレクトリの深さ、ディレクトリの幅、圧縮率を元にディレクトリ構造を作成し、データ速度を測定します。

復元のパフォーマンスに問題がある場合は、まずバックアップ パフォーマンスをチェックしてください。 バックアップ パフォーマンスに問題がない場合は、ディスク サブシステムにボトルネックが発生していると考えられるので、ディスクおよびファイル システムのパフォーマンス セクションを再度チェックしてください。 解決方法には、次の 3 つのオプションがあります。

ブロック サイズを確認してください。

多くのテープ ドライブでは、SCSI ブロックの管理で内部オーバーヘッドが発生しています。 たとえば、DDS や DLT がこれに該当します。 パフォーマンスレベルの評価手順 このような場合、大きな (64KB 超) ブロック サイズを使用してください。

HP Ultrium テープ ドライブは、ハードウェアで SCSI ブロックを管理するので、ブロックごとのオーバーヘッドは発生しません。 このようなテープ ドライブでは、ブロック サイズがパフォーマンスに影響することはありません。

パフォーマンスはどの程度重要なのでしょうか。

重要度は、ユーザ ニーズによって決まります。 上記の手順に従って調整してもテープ ドライブの転送速度が向上しないとしても、特に HP Ultrium や SDLT テープ ドライブが発揮する高速転送速度に対応するのは非常に難しい場合があるので、高いパフォーマンスが求められる場合を除いて、必ずしも問題にはなりません。 重要な要件は、所定の時間枠でバックアップを完了することにあります。

サーバ、ディスク システム、ネットワーク、その他システム コンポーネントをアップグレードすると、テープ ドライブのパフォーマンスをさらに引き出すことが可能になります。 現在パフォーマンスを最大限に発揮できていない場合は、将来的なシステムに見合ったバックアップ ソリューションへの投資を検討してください。

次の表は、HP が現在サポートしているテープ ドライブのネイティブでのデータ転送速度のまとめです。 また、HP Ultrium ドライブには、テープ速度をサーバのデータ速度に一致させる ATS (Adaptive Tape Speed)パフォーマンスレベルの評価手順 パフォーマンスレベルの評価手順 パフォーマンスレベルの評価手順 と呼ばれる機能があります。 最低速度と最高速度の範囲内で完全に速度を対応させることでテープの位置変更をなくし、サーバがテープ速度に追いつかない場合でもテープの磨耗を緩和できます。

データ速度が ATS の最低速度を上回ると、ドライブはストリーミングを実行します。 たとえば、最低磨耗率で稼働します。 最後の手段として、データ圧縮を無効にしてください。 データ量あたりのテープ使用量は多くなりますが、ストリーミングが実行されます。

テープの磨耗を考えた場合、パフォーマンスはどの程度重要なのでしょうか。

ヘッド、メカニズム、テープ メディアの寿命を最適化するには、テープ ドライブは最低ストリーミング速度以上の速度で稼働する必要があります。 データ転送が高速化すると、内部バッファは空になり、ドライブは継続的にデータ ストリームを書き込めなくなります。 この時点で、ドライブではヘッドの位置変更が発生し始めます。 ヘッドの位置変更は、「シューシャイニング」と呼ばれ、テープ メディア、テープ ドライブのヘッド、テープ ドライブの機械コンポーネントの磨耗を進行させる原因になります。

テープ メディアの寿命とテープ ドライブのリード/ライト ヘッドの寿命は、ヘッドがテープを通過 (パス) する回数で測定されます。 テープ メディアがテープ パフォーマンスレベルの評価手順 ドライブのリード/ライト ヘッドを通過するたびに、磁性粉末がテープから剥がれ落ち、ヘッドも徐々に磨耗します。 時間が経過してヘッドを何回も通過すると、テープ メディアは磨耗し、エラー発生率が高くなります。 また、ドライブ ヘッドも徐々に磨耗するので、読み出しエラーが発生しやすくなり、再試行が多くなります。 これによって、バックアップが低速になり、バックアップや復元でエラーが発生する確率も高くなります。 このようなエラーや再試行が増えると、ドライブはクリーニングが必要だと判断し、本来は必要ない状況であってもテープのクリーニングを要求し始めます。 場合によっては、クリーニングでの研磨によってヘッドの磨耗が進行し、状況が悪化することもあります。

たとえば、リード/ライト ヘッドの寿命はテープ メディアがリード/ライト ヘッドを通過するテープパス回数で定められており、DLT リード/ライト ヘッドでは 1,000,000 回です。 テープ メディア自体の寿命も 1,000,000 パスですが、中程度まで磨耗が進むと信頼性が低下するので、実際の寿命は 500,000 回です。 通常、DAT ドライブの寿命は 4~5 年と長く、DLT ドライブは適切な保守を行えば 6 年以上使用できます。 ただし、多くのユーザ環境で使用されているテープやテープ ドライブは、過剰な磨耗が原因で、これよりも寿命は短くなっています。 磨耗が進むと、クリーニングを要求するメッセージが頻繁に発生したり、時々バックアップに失敗するという現象が現われます。 したがって、ドライブのストリーミングを中断しないことが非常に重要です。

テープ ドライブには、データ パスに十分な容量のバッファがあり、ヘッドの位置変更や「シューシャイニング」によってバックアップが低速になるのを防ぐことができますが、ヘッドやメディアの磨耗が原因でエラー率が増大すると、テープの使用量が増えて、再試行も増大します。 これにより、バックアップは低速になり、時間の経過とともに更に磨耗が進みます。 深刻な場合には、2 時間のバックアップが、10 時間や 12 時間かかるケースもあります。

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

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

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 直交性

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

31.4. パフォーマンステストの手順

これらのテストの目的は、アプリケーションの最適なスループットと最小のレイテンシーを生成する I/O 深度を決定することです。VDO は、従来のストレージデバイスで使用されていた従来の 512 B ではなく、4KB のセクターサイズを使用します。セクターサイズが大きいため、大容量のストレージをサポートし、パフォーマンスを向上させ、ほとんどのオペレーティングシステムで使用されるキャッシュバッファーサイズと一致させることができます。

結果は以下のようなグラフになります。重要な点は、範囲全体の動作と、I/O 深度が増えるとスループットの向上が低下することが証明される変曲点です。おそらく、シーケンシャルアクセスとランダムアクセスは異なる値でピークに達しますが、すべてのタイプのストレージ設定で異なる可能性があります。図31.1「I/O 深度分析」 で、各パフォーマンス曲線の「急な折れ曲がり」に注意してください。マーカー 1 はポイント X でのピークシーケンシャルスループットを識別し、マーカー 2 はポイント Z でのピークランダム 4KB スループットを識別します。

この特定のアプライアンスは、シーケンシャル 4 KB I/O 深度 > X の恩恵を受けません。この深度を超えると、帯域幅の利得が減少し、I/O 要求が増えるごとに平均要求レイテンシーが 1:1 に増加します。

この特定のアプライアンスは、ランダム 4KB の I/O 深度 > Z の恩恵を受けません。この深度を超えると、帯域幅の利得が減少し、追加の I/O 要求ごとに平均要求レイテンシーが 1:1 増加します。

図31.1 I/O 深度分析

I/O 深度分析

図31.2「ランダム書き込みの I/O の増加による遅延応答」 は、図31.1「I/O 深度分析」 の曲線が「急に折れ曲がった」後のランダムな書き込みレイテンシーの例を示しています。ベンチマークの実践では、この点で応答時間のペナルティーが最小となる最大スループットを検証する必要があります。このアプライアンスの例のテスト計画を進めるにつれ、I/O 深度 = Z で追加データを収集します。

経理担当者へのあいまいな評価は今すぐ変えるべき!「評価制度」に役立つツールを紹介

南山大学経営学部卒業。大手信販会社勤務後、アタックスグループにて様々な業種の経営コンサルティングに従事。2004年、中央人事総合研究所設立。2010年、株式会社中央人事総研代表取締役就任。病院、住宅販売業、食品製造販売業、運送業、メガネチェーン店など120社以上のコンサルティングの実績あり。経営理念「人財育成を通じて、日本の中小企業を元気にする」を実現のため、人事制度構築と運用、経営計画策定、社員教育などの支援を展開中。離職率が下がり、定着率が2桁以上アップの多くの成果を実現。書籍「今いる社員で成果を上げる中小企業の社員成長支援制度」2019年3月合同フォレストより発刊、他ビジネスパブリッシング、近代中小企業などの全国紙に記事掲載中。

経理の評価制度がある中小企業は、まだ 3 割程度なのが実情

――経理の方から「評価基準がよくわからない」という声が多く聞かれるのですが、中小企業における経理への評価の実態はどうなっているのでしょうか。

社員が 10 ~ 15 名規模の会社の場合、評価をしっかり行っている会社は少ないというのが現状です。経理を経営者の配偶者がやっていたり、管理職と実務担当者の 2 名体制だったりする会社が多く、そうするといかに業務をこなすかという点に主眼が置かれてしまいますから。

明確な基準がない評価制度を含めても、実施しているところは 3 割程度ではないでしょうか。評価制度がある会社では、積極性や協調性といった取り組み姿勢と、仕事の質・量を半々で見ているような感じですね。ただし基準があいまいで、評価をするほうもされるほうも苦労しているケースが目立ちます。

――評価制度の設定や見直しをする会社は増えていますか?

ポイントは 4 つだけ!「社員チャレンジ制度」を参考に評価基準を作成しよう

――経理の評価基準はどのように作ればよいですか。項目などを具体的に教えてください。

評価制度を作るにあたっては、社員が納得できる評価項目と社員個々人の成長につながる目標を設定することが必要です。私はこれを達成するために「社員チャレンジ制度」という評価制度を作りました。評価のポイントは「役割成果」「重点プロセス業務」「チャレンジ目標」「取り組み姿勢」の 4 つです。これを縦軸とし、横軸に「初級(一般職/〜入社 3 年)」「中級(中堅職/ 3 〜 10 年)」「上級(管理職/入社 10 年以上)」という階層を設定します。

役割成果」とは、その部門に求められる役割のことで、数値で表せるものが適しています。経理でいえば、資料作成時間短縮率・経費削減率・売掛金回収率などがその例です。

「重点プロセス業務」は、役割成果を挙げるための要となるプロセスを指します。例えば役割成果に資料作成時間短縮率を設定した場合、月次の試算表の提出期限を早めるために支払先に支払いを早くしてもらうとか、会計ソフトをはじめとするパソコンの操作技術を上げて経理作業をスピードアップさせるといったものです。

「チャレンジ目標」では、社員本人がチャレンジしたいことを自由に設定してもらいます。自由といっても何でもいいわけではなく、評価できる目標にすることが重要です。経理なら簿記の資格を取るとか、〇〇業務のマニュアル化、他に社内での役割に応じたものがよいでしょう。

「取り組み姿勢」は、積極性・責任性・協調性といった企業風土のベースとなる要素で、全社員共通の項目です。自発的に仕事を行えるか、時間を守れるかなど、そういった基本的なことですね。

――目標を決めるというと「頑張ります」「努力します」のように漠然とした内容になることがあります。具体的な目標を設定してもらうためのポイントは何ですか?

目標があいまいだと、評価するほうも困ってしまいます。目標を明確化するための 3 原則が「数値化」「状態化」「スケジュール化」です。

「数値化」においては、円・時間・件数のように計測できる経済単位を用います。例えば 5 時間かけていた作業を 4 時間に短縮するとか、具体的な数字で比較できる目標を設定するということですね。

「状態化」は、現状からあるべき状態へと到達させるための目標で「今はエクセルが使えないけれど、 3 か月後には覚えるようにする」「今は上司の指導下でやっている作業を、半年後には 1 人で行えるようになる」といったものです。

「スケジュール化」とは、目標に期日を設けることで、「〇年〇月末日までに業務マニュアルを作成する」などの例があたります。これら 3 つの原則に沿って目標を作成すると、おのずと内容が明確化・具体化していきますよ。

もう 1 つぜひやっていただきたいのが「業務の棚卸し」で、これは経理のように数値目標を設定しにくい部門では特におすすめです。表を使って業務の洗い出しと追加を行い、担当者を決めることで目標の作成が容易になります。やるべき業務が確定したら、初級・中級・上級の階層別に「実行責任者」「主担当」「場合によって実行」の 3 レベルで担当者を設定してください。

この棚卸し表は、評価欄を追加すればそのまま評価に使えます。つまり目標設定・人材育成・評価の一石三鳥というわけです。業務改善にも役立ちますしね。

――評価基準を作成する際の責任者は誰にすればよいですか。また、社員への周知の方法は?

15人規模の会社だと経営者がやることが多いと思います。もちろん、経理部長でもいいと思います。評価基準や変更点を周知する際は、評価基準や変更点を明らかにして書面化し、なおかつデータをきちんと残しておくようにしましょう。その書類をもとに社員を集めて説明を行うか、 パフォーマンスレベルの評価手順 1 対 1 の面談で伝えるという流れです。

――評価基準を設けることで、デメリットはありますか?

――仮に評価制度の整備を外部の専門家に依頼する場合、どこに頼めばよいですか?

作成した評価基準を使って、いざ実践!指導観察ノートの活用も

――経理担当者を評価する際の流れや、注意すべきことを教えてください。

流れとしてはまず業務の棚卸しを行い、その後は目標設定および面談、評価および再び面談という順序です。評価を行うのは半年に一度が基本となりますから、このフローを年 2 回実施することになります。

注意したいのは、担当者によって評価にクセやバラツキが出てしまうことです。 5 段階の真ん中の 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 直交性

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

関連記事

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

コメント

コメントする

目次
閉じる