ぎにょろぐ

Androidアプリ開発に関する事やその他雑記など

オブジェクト指向入門 第一章を読んだのでメモ

はじめに

最近、オブジェクト指向入門という本を購入し、読み進めています。 理解を深めるために、章ごとに気になった所や分からなかった所、面白かった所をアウトプットしていく予定です。 今回は第一章に関してです。

概要

本章は「ソフトウェアの品質」とはなにかという所に立ち返って、より品質という概念を細分化し整理している。

外的品質と内的品質

ソフトウェアの品質には2種類の性質が存在する。

外的品質要因(external factor):一つはユーザーにとっての品質。使いやすさや速度だったり、そもそも要件が守られていることなど。

内的品質要因(internal factor):もう一つは開発者にとっての品質。モジュール性が高い、コードが読みやすいなど

外的品質要因を高める事が1番の目的であり。結局、内的品質要因が高くないと結局外的品質要因も高くならない。

しかし、内的品質要因の向上はあくまで外的品質要因を満たすための手段である。

外的品質の要因

  • 正確さ:アプリケーションの要件を満たすこと。仕様を満たすこと
  • 頑丈さ:入出力などで例外が起きても、システムが完全に破壊される(DBが消えるなど)といった問題を起こさず、エラーメッセージに丸めてレスポンスを返すなど適切な処理が行われる
  • 拡張性:仕様変更が入った際の適応のしやすさ。モジュールが適切に分割されていたり、シンプルなアーキテクチャが存在することで、変更の影響が極力少ないと拡張性が高いといえる。
  • 再利用性:同じようなパターンの処理を異なる開発で使いまわす事で、その分減ったリソースを他の品質の向上(頑丈さや正確さ)が出来る。
  • 互換性:他のソフトとの組み合わせやすさ。そのソフト固有のフォーマットでデータを取り扱っており、他のソフトが解釈し得ない形でしか出力できないと、互換性が低いと言える
  • 効率性:ざっくりいうとパフォーマンス。性能に注力しすぎることも、しなさすぎる事もダメ。
  • 可搬性:その名の通り、様々なプラットフォームに移植できる事
  • 使いやすさ:背景・経験が異なる人々が同じく容易にそのソフトウェアを使いこなせるか、また、応用できるか。
  • 機能性:システムが提供する機能の範囲。たくさんの機能(CSVだけではなくExcelでも出力できるなど)があるほどこの性質が高いと言える。機能性は納期や他の品質トレードオフになることも。
  • 適時性:ユーザーが必要としている時にソフトウェアをリリース出来ること。シンプルに言えば我々の嫌いな納期。

その他の外的品質要因

  • 実証性:エラーが出た際追跡しやすい
  • 統合性:セキュリティ
  • 修復性:バグ修正のしやすさ?よく分からず
  • 経済性:予算に大して費用が低いほど経済性が良い。(炎上案件で無理やり納期を合わせて赤字になりがちな適時性と相反しがち)

外的品質に関してと、特に重要なポイント

納期 vs 予算など、外的品質要因同士は明らかにトレードオフの関係にあるものもある。

特に重要なのは下記2つとされている。 - 「正確さと頑丈さ」:要件通りに動くアプリケーションで、致命的なエラーになることが無い事(シンプルに言うと、バグが無いこと)(俗に言う信頼性) - 「拡張性と再利用性」:仕様の変更を簡単に実装でき、再利用出来るコンポーネントがより多い。よりエコに変更に追従できること。(俗に言うモジュラー性)

本書で解説されるオブジェクト指向が、上記の重要な要因も含め、様々な品質要因を改善することが出来る手法と述べられている。例えば、効率性(パフォーマンス)に関しては、処理能力の高い再利用可能なコンポーネントを作成し再利用することで向上が出来る。

ソフトウェアの保守について

ソフトウェアのコストの70%以上は保守に費やされている。 ソフトウェアの 「保守」とはなにか。車や家電みたいに繰り返し使った所で疲労するものではないため、ソフトウェアを「保守(maintain)」するという表現は正確ではない。 ソフトウェア業界の「保守」は - 新しく機能を追加する、仕様の修正 - バグを直す(本書では「期限の過ぎてからのデバッグ」というある意味粋な?言い方をしている) などの意味で使われている。

感想

自分が思っていたけど言語化出来ていたかった部分がきれいに言語化されていて、喉のつかえが取れたような気分になりました。

特に、

オブジェクト思考技術を習得すれば、ソフトウェアを短い時間と少ないコストで生産出来るようになる。これはオブジェクト指向的手法によって機能の追加が用意になるばかりでなく、手法そのものが新しい機能の追加を示唆することもあるためである。

この言葉はまさに自分がオブジェクト指向に対する考え方そのものです。 オブジェクト指向やDDD的な手法を知らなかった頃に比べると、今はスピードが早く間違いのない(あってもトレーサビリティが高くすぐ修正出来る)アウトプットが出来ていると感じています。

また、「外的品質を高めるためには、コードのきれいさ・モジュール性のような内的品質が鍵になる」という主張も、自分の「ソフトウェア開発はバグなくかつ工数を少ない形でアウトプットするのが正義。しかし安定してそれを実現するためにはモデリングオブジェクト指向、各種アーキテクチャなどを用いた所謂きれいなコードを書く技術が必要になってくる」という自分のスタンスと一致していたため、安心感を得ました。

一方で、再利用性や拡張性など、一見内的品質要因に区分されそうな事も外的品質要因として取り上げられている事には違和感があります。 内的品質要因の一覧はまたそのうち出てくるのでしょうか。 この辺の話は、ISO/IEC 9126 - Wikipedia の国際規格としての品質の定義も合わせて確認して比較してみるとより勉強になりそうです。

まだオブジェクト指向に関する話は出てきてませんが、早くも次の章が楽しみです。