<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>リスク管理</title><link>http://blogs.wankuma.com/nagise/category/1543.aspx</link><description>リスク管理</description><managingEditor>凪瀬</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>凪瀬</dc:creator><title>ソフトウェア品質の12の属性</title><link>http://blogs.wankuma.com/nagise/archive/2009/02/03/167335.aspx</link><pubDate>Tue, 03 Feb 2009 08:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2009/02/03/167335.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/167335.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2009/02/03/167335.aspx#Feedback</comments><slash:comments>582</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/167335.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/167335.aspx</trackback:ping><description>&lt;p&gt;システム開発において「品質の向上」という標語がしばしば掲げられますが、
「品質の属性」については無頓着なケースが多いのではないでしょうか。&lt;/p&gt;

&lt;p&gt;ひとくちに品質といっても多様な属性があります。
顧客と品質の話で揉めたことはありませんか？
品質には多様な属性があり、単一の軸で良しあしを決められないという側面があります。
そのため、単に「品質」と言ってしまうと認識に齟齬が生じるのです。&lt;/p&gt;

&lt;p&gt;Karl E. Wiegers氏が著書
「&lt;a href="http://www.amazon.co.jp/dp/4891003545"&gt;ソフトウェア要求&lt;/a&gt;」
で挙げた、すべてのプロジェクトが検討すべき12の属性は以下のとおりです。&lt;/p&gt;

&lt;table border="1"&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;可用性&lt;/td&gt;&lt;td&gt;availability&lt;/td&gt;
&lt;td&gt;動作可能時間の指標。システム故障までの平均時間MTTF(Mean Time To Failure)を
平均修復時間MTTR(Mean Time To Repair)とMTTFの合計で割った値。稼働率とも呼ばれる。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;効率性&lt;/td&gt;&lt;td&gt;efficiency&lt;/td&gt;
&lt;td&gt;同じ処理性能を出すのにどのぐらいのハードウェアのスペックが必要か。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;柔軟性&lt;/td&gt;&lt;td&gt;flexibility&lt;/td&gt;
&lt;td&gt;機能拡張への柔軟性。順次拡張していくアジャイル開発を可能にするためには
ある程度の柔軟性を備えた設計にする必要がある。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;完全性&lt;/td&gt;&lt;td&gt;integrity&lt;/td&gt;
&lt;td&gt;データが正確で完全であること。改ざんなどされておらず、正しく動作すること。
情報セキュリティの目標事項のひとつとして挙げられる。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;相互接続性&lt;/td&gt;&lt;td&gt;interoperability&lt;/td&gt;
&lt;td&gt;他システムとのデータ連携の容易さ。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;保守性&lt;/td&gt;&lt;td&gt;maintainability&lt;/td&gt;
&lt;td&gt;バグの修正や仕様変更の容易性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;移植性&lt;/td&gt;&lt;td&gt;portability&lt;/td&gt;
&lt;td&gt;ある稼働環境から、別の稼働環境へ移行させるために要する工数など。
JavaなどにみられるVM方式など高レイヤでの稼働システムは移植性が高いとも言える。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;信頼性&lt;/td&gt;&lt;td&gt;reliability&lt;/td&gt;
&lt;td&gt;特定の期間、故障なしでソフトウェアを実行できる可能性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;再利用性&lt;/td&gt;&lt;td&gt;reusability&lt;/td&gt;
&lt;td&gt;プログラムコードの再利用性。オブジェクト指向などによるモジュール化によって高めることができる。
もっとも、日本だとソースコードが納品先の所有になる契約となることが多くライセンスの問題で再利用性が低い。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;堅牢性&lt;/td&gt;&lt;td&gt;robustness&lt;/td&gt;
&lt;td&gt;耐障害性。異常データなどの入力に対する耐性。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;試験性&lt;/td&gt;&lt;td&gt;testability&lt;/td&gt;
&lt;td&gt;テストのしやすさ。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td nowrap="nowrap"&gt;使用性&lt;/td&gt;&lt;td&gt;usability&lt;/td&gt;
&lt;td&gt;ユーザビリティ。使いやすさ。&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;これらは多くのプロジェクトに共通する属性ですが、もちろんこれで全てと言うわけではなく
特定ジャンルではさらに追加の品質属性を考慮する必要が出てきます。同じ本から引用すると
「組み込みシステムに重要な品質属性としてはさらに安全性、導入容易性、サービス能力があります。
スケータビリティは、インターネットアプリケーションに重要なもう一つの属性です。」
ということになるでしょう。&lt;/p&gt;

&lt;p&gt;これらの品質属性は、すべてを同時に上げることができません。トレードオフが発生するのです。&lt;/p&gt;

&lt;h3&gt;品質属性のトレードオフ&lt;/h3&gt;

&lt;p&gt;これら品質の属性は、相互に作用し合っています。
ある属性を高めれば他の属性も高まる、あるいは低くなるということがおきます。
以下の表は左側の属性を上げた場合に上側のどの属性が高く、あるいは低くなるかを表しています。
（追記：引用元「ソフトウェア要求」228ページ）&lt;/p&gt;

&lt;table border="1"&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;可&lt;br&gt;用&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;効&lt;br&gt;率&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;柔&lt;br&gt;軟&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;完&lt;br&gt;全&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;相&lt;br&gt;互&lt;br&gt;接&lt;br&gt;続&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;保&lt;br&gt;守&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;移&lt;br&gt;植&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;信&lt;br&gt;頼&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;再&lt;br&gt;利&lt;br&gt;用&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;堅&lt;br&gt;牢&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;試&lt;br&gt;験&lt;br&gt;性&lt;/th&gt;
&lt;th&gt;使&lt;br&gt;用&lt;br&gt;性&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;可用性&lt;/th&gt;    &lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;効率性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;柔軟性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;完全性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;相互接続性&lt;/th&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;保守性&lt;/th&gt;    &lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;移植性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;信頼性&lt;/th&gt;    &lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;再利用性&lt;/th&gt;  &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;堅牢性&lt;/th&gt;    &lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;試験性&lt;/th&gt;    &lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th nowrap="nowrap"&gt;使用性&lt;/th&gt;    &lt;td&gt;　&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;　&lt;/td&gt;&lt;td&gt;＋&lt;/td&gt;&lt;td&gt;－&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;まずは品質には属性があることを顧客に伝えましょう。
そして属性にトレードオフが発生することを理解してもらいましょう。&lt;/p&gt;

&lt;h3&gt;ソフトウェア工学と品質属性&lt;/h3&gt;

&lt;p&gt;ソフトウェア工学の数々の成果はこれらの品質属性にどう影響を与えたのでしょうか？&lt;/p&gt;

&lt;h4&gt;構造化プログラミング&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;試験性&lt;/strong&gt; - 適切なモジュール分割は試験性を高めます。より高めるにはステートレスな機能を意識的に分割することです。
	ステートレスな関数は引数と戻り値によって容易にテストでき、自動テストなどによる自動化も行いやすくなります。&lt;br&gt;
再利用性 - 構造化によりある程度、再利用性が高まりました。&lt;/p&gt;

&lt;h4&gt;契約に基づくプログラミング&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;完全性・堅牢性&lt;/strong&gt; - モジュール間での「契約に基づくプログラミング」のほつれに対して
	適切にエラー処理を施すことで完全性・堅牢性を高めることができます。&lt;/p&gt;

&lt;h4&gt;オブジェクト指向&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;柔軟性・保守性&lt;/strong&gt; - オブジェクト指向によって動的なフローチャートになるプログラムを容易に制御できるようになりました（ポリモフィズム）。
	これを活用することで、既存箇所に手を入れることなく追加のクラスを作成するだけでの拡張が可能になります。&lt;br&gt;
&lt;strong&gt;再利用性&lt;/strong&gt; - 構造化プログラミングよりさらに再利用性を高めることができます。
	ポリモフィズムを活用したプログラミングは再利用性の点でも優れています。&lt;/p&gt;

&lt;h4&gt;VM技術、仮想化技術&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;移植性&lt;/strong&gt; - Javaの標榜する"Write once, run anywhere"は究極の移植性と言えます。
	現在のJava開発は主にWindows機上で行われており、そのままUnix系のOSで稼働する本番機で動作させる
	ようなことが行われています。携帯電話におけるJavaMEの採用もこの点を活用してのことです。&lt;/p&gt;

&lt;h4&gt;O/Rマッピング&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;移植性&lt;/strong&gt; - O/RマッピングもDBを特定製品に縛らないという意味で移植性を高める効果があります。&lt;/p&gt;

&lt;h4&gt;DIコンテナ&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;柔軟性・保守性&lt;/strong&gt; - DIコンテナによる設計は柔軟性・保守性を高めます。&lt;br&gt;
&lt;strong&gt;試験性&lt;/strong&gt; - DIコンテナによる疎結合は試験性をより高めます。DBなどを伴うシステムですら、
	スタブによって自動テスト化することが容易になりました。&lt;/p&gt;

&lt;p&gt;ここでは目立つ特徴をピックアップしましたが、もちろん品質属性への影響はここに挙げただけにはとどまりません。
各種パラダイムを眺める際に、品質属性への影響と言う点でみつめるとまた違ったものが見えてくるかもしれません。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/167335.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>アスペクト指向の概念</title><link>http://blogs.wankuma.com/nagise/archive/2008/03/25/129472.aspx</link><pubDate>Tue, 25 Mar 2008 10:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/03/25/129472.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/129472.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/03/25/129472.aspx#Feedback</comments><slash:comments>47</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/129472.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/129472.aspx</trackback:ping><description>&lt;p&gt;アスペクト指向(AOP : Aspect-oriented programming)はオブジェクト指向(OOP : object-oriented programming)とは直行的な
概念で、相補的なものですが、2008年現在、未だ広く普及しているパラダイムではなく、その機能を取り込んだ言語もあるものの
（Javaの拡張であるAspectJ、Rubyの拡張であるAspectRなど）普及しているとは言えない状況です。&lt;/p&gt;

&lt;p&gt;近年ではDIコンテナの普及で、AOPを部分的に利用できるようになりました。
オブジェクト指向言語の普及前に、例えば言語としてのオブジェクト指向をサポートしないC言語で、
オブジェクト指向の概念を表現する工夫がなされたと聞きます。
DIコンテナによる部分的なAOPサポートは、言語機能としてAOPがサポートされた言語が普及する「夜明け」に対して、
「前夜」の趣を感じさせるものです。&lt;/p&gt;

&lt;h4&gt;アスペクト指向が解決しようとしていること&lt;/h4&gt;

&lt;p&gt;アスペクト指向の解説書でアスペクト（横断的関心事と呼ばれる。後述）の例として、よくロギングが挙げられます。
が、正直な話、私はあまりこの例でピンときませんでした。&lt;/p&gt;

&lt;p&gt;横断的関心事とはどういう事象でしょうか？&lt;/p&gt;

&lt;p&gt;オブジェクト指向では複数のクラスに跨って存在してしまう機能性ということですが、どういうものがあるのでしょうか？&lt;/p&gt;

&lt;p&gt;私がシステム設計をしてきた中で、「あぁ、これが概念としてのアスペクトなのだな」と思ったことは&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQL injection対策
&lt;li&gt;XSS対策の出力文字エスケープ
&lt;li&gt;OS command injection対策
&lt;li&gt;バッファオーバーラン防止のためのバウンダリチェック
&lt;li&gt;例外処理
&lt;/ul&gt;

&lt;p&gt;といったことです。開発でこれらの対策に頭を悩ませている方は多いのではないでしょうか？&lt;/p&gt;

&lt;p&gt;これらの事象は、「すべての該当箇所に対して、一律の対応を行う必要がある」という点です。
これこそが、概念としてのアスペクト、横断的関心事なのです。&lt;/p&gt;

&lt;p&gt;こうした、XXに全部YYをする、というのは自然言語で表現すると１文にも関わらず、
プログラム言語的には該当箇所を検索して１つずつ虱潰しにコードクローンを挿入する必要があります。
アスペクト指向が解決しようとしているのは、まさにこの部分なのです。&lt;/p&gt;

&lt;p&gt;アスペクト指向の概念で重要なのはこのアスペクトという抽象概念を捉える事。
そして、どういったターゲットにウィービング（weaving : 縫い付けるの意。アスペクトを適用させること）
させるのかということです。ウィービングできるポイントをジョインポイントと呼んだりします。
端的には、メソッドが呼ばれる前、および呼ばれた後などをジョインポイントとすることが多いですね。&lt;/p&gt;

&lt;h4&gt;どのように実装するか&lt;/h4&gt;

&lt;p&gt;DIコンテナでは部分的にAOPが利用できると述べました。
DIコンテナはオブジェクトの生成をDIコンテナが管理します。
このDIコンテナに管理されたオブジェクトに対してGoFのProxyパターンを利用してAOPを実現しています。&lt;/p&gt;

&lt;p&gt;これはOOP的な環境で疑似的にAOPを実現するためのひとつの答えです。&lt;/p&gt;

&lt;p&gt;あるクラスのインスタンス生成が制御されうるなら、その段階でProxyを挟むことで、
そのクラスの特定のメソッドの前後に処理を一律に差し挟むことができます。&lt;/p&gt;

&lt;p&gt;DIコンテナではコンテナがクラスの生成を管理するためにそれが可能でした。
そうではない場合でも、Factory Method、Abstract Factory、Builder などといった生成にまつわる
GoFデザインパターンと組み合わせることで、一律にProxyを噛ませることができます。&lt;/p&gt;

&lt;p&gt;また、ウィービング対象となるオブジェクトが特定の箇所を必ず通過するようなケースでは、
そこでトラップしてProxyを噛ませるような方法論も考えることができます。
ServletでのRequest#setAttribute()のような場所をイメージするとよいでしょう。&lt;/p&gt;

&lt;p&gt;実行時による動的なウィービングでなくとも、コンパイル時に機械的に処理を差し挟むような方法論も考えられます。&lt;/p&gt;

&lt;p&gt;Java SE 5.0からはアノテーションが使えるようになりました。
これにより、こうした機械的な処理が断然しやすくなった点も見逃せません。
コンパイル時にジョインポイントを自動生成するような仕掛けを作ることで概念としてのAOPを実装することができるわけです。&lt;/p&gt;

&lt;h4&gt;関連エントリ&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://blogs.wankuma.com/tyappi/archive/2008/03/20/128781.aspx"&gt;Injection 系の脆弱性ってなんで起こるんだろ？&lt;/a&gt;&lt;br&gt;
&lt;a href="http://d.hatena.ne.jp/ajiyoshi/20080321/p1"&gt;そのやり方はXSSの元としか思えない。&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;XX Injection と呼ばれる脆弱性に共通するのは、OOPでの解決の行えない横断的関心事であるということでした。
一律に対応するためにはどのように網を張ればよいのか、設計をする人は頭を悩ませていることでしょう。&lt;/p&gt;

&lt;p&gt;現時点では決定打に欠けるところですが、概念としてはアスペクトをどのようにして漏れなくウィービングするのかということです。
そのための適切なジョインポイントはどこかということです。&lt;/p&gt;

&lt;h4&gt;アスペクト指向の問題点&lt;/h4&gt;

&lt;p&gt;アスペクトというものが横から入り込んでくるわけですから、OOPのソースコードを見ただけでは実行時の動作がわかりません。
そう言った意味でプログラムが複雑化する危険性をはらんでいます。
また、アスペクト同士の干渉が起こることもあり、アスペクトの適応順序によって挙動が変わることもあります。&lt;/p&gt;

&lt;p&gt;また、アスペクト指向でウィービングの対象をどう管理するかも疑問が多い。「全ての」の適用範囲はどこまでなのか。
あるいは、特定の範囲だけに適用したいこともあるでしょう。
現行のDIコンテナでのAOPではメソッド名のマッチングによって特定の名称のメソッドの前後に適用、
といったことができますがこれが酷く気持ち悪い。&lt;/p&gt;

&lt;p&gt;gattaislime氏の&lt;a href="http://d.hatena.ne.jp/gattaislime/20070925/1190746881"&gt;アスペクト指向の問題点&lt;/a&gt;では
&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;
　要するに、現在の典型的なアスペクト指向では、アスペクトを織り込むオブジェクトがホワイトボックスであることを要求するか、逆にアスペクト自体がオブジェクトの実装を規定するか、ということになってしまい、結果としてアスペクトが単なる暗黙的多重TemplateMethodに成り下がっているのではないかと感じてしまうのだ。&lt;br&gt;
&lt;br&gt;
　このような暗黙のTemplateMethodは非常に厄介で、ソースコードをそのまま追っても処理の流れがつかみにくく、最悪の場合ソースコード全体をメソッド名や属性名でgrepして、関連するすべてのアスペクトを洗い出さなければならない。
&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;と指摘しています。&lt;/p&gt;

&lt;p&gt;ウィービング対象は集合論的に抽出されるわけで(つまり、SQLのWhere句のようなイメージ)Javaなどの強い型付け言語でなされる
型の安全性のような安心感がまったくない。&lt;/p&gt;

&lt;p&gt;しかし、集合論というとジェネリクスも集合論ですが、型の安全性を確保できている（
&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/08/04/88855.aspx"&gt;参考:ジェネリクスと代入と落とし穴&lt;/a&gt;
）わけで、ウィービングのための型のような
システムが必要なのではないかと思う次第。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/129472.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>はてながCAPTCHAの費用対効果で見落としていること</title><link>http://blogs.wankuma.com/nagise/archive/2008/03/10/127080.aspx</link><pubDate>Mon, 10 Mar 2008 18:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/03/10/127080.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/127080.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/03/10/127080.aspx#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/127080.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/127080.aspx</trackback:ping><description>&lt;p&gt;私の
&lt;a href="http://blogs.wankuma.com/nagise/posts/104428.aspx"&gt;はてなのCAPTCHAは簡単に破れる&lt;/a&gt;
というエントリが
&lt;a href="http://takagi-hiromitsu.jp/diary/20080308.html#p01"&gt;高木浩光氏のblog&lt;/a&gt;
で再度取り上げられた関係で、アクセスが増えているのでこれを機会に補足しておきます。&lt;/p&gt;

&lt;p&gt;私の該当エントリはCAPTCHAとは何なのかという話と、
Radium Software Developmentのエントリ
「&lt;a href="http://www.radiumsoftware.com/0611.html#061110"&gt;Breaking CAPTCHAs with NNs&lt;/a&gt;」
を紹介してCAPTCHAの強度で重要なのは文字の分割をしにくくすることだと述べました。&lt;/p&gt;

&lt;p&gt;そして、はてなのCAPTCHAは画像処理をかじった人間であれば小一時間で破るプログラムが作れる程度に弱いことを実証しました。
画像処理に重きを置いた技術記事という位置づけですね。&lt;/p&gt;

&lt;p&gt;経済的な観点での考察はしていませんでしたから、費用対効果という観点で再度見つめてみたいと思います。&lt;/p&gt;

&lt;h4&gt;費用対効果についての諸意見&lt;/h4&gt;

&lt;p&gt;さて、
&lt;a href="http://b.hatena.ne.jp/entry/http://blogs.wankuma.com/nagise/archive/2007/10/26/104428.aspx"&gt;はてなブックマーク&lt;/a&gt;
で付いていたコメントには以下のようなものがありました。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;荒らし対策目的の場合は、荒らされたときに次の改善バージョンに切り替えればいい話。
&lt;li&gt;実用レベルでは十分役に立ってる。導入後にスパムは消えた。
&lt;li&gt;CAPTCHAは実装がアレでも「ある」というだけでspammer避けになるものだと……費用対効果の問題で。
&lt;li&gt;かといってすぐにそれをやる人がいるとは限らない、というお話。
&lt;li&gt;強度の低いセキュリティでも効果がある間は改良は不要。でも将来的にはどうにかしたいよね，ってレベルかな
&lt;li&gt;たしかにここまでやる気がないのならもう素直にノイズ無しでもあまり違わない気もするよね。
&lt;li&gt;スパム対策として使っているのならある程度スパムプログラムがはじけてそこそこの効果があれば十分だと思うよ。
&lt;li&gt; OCR…というか、機械に文字を読み取らせる技術について知識がないとCAPTCHA意味無し。だがライトスパマー（？）を弾けるならそれで十分か。
&lt;li&gt;費用対効果ってこともあるから、破られてから対処するぐらいで良さそうだけどなぁ…
&lt;li&gt;この程度のCAPTCHA破りは許容してるんだと思ってた。完全じゃなくても単純なボットが実用レベルで防げれば十分と考えられるし、そういう運営側の判断もよくある。
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;費用対効果としては十分じゃないの、という意見が多数。&lt;br&gt;
また、高木浩光氏は以下のように発言しています。&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
もちろん、技術的にそうだという話をするのはいいのだが、これを見て、「これじゃ全然だめ」だの、
「はてな、なんとかしろ」だのとぬかすバカが出てきて困る。
まだ荒らされてもいないのに、わざわざイタチごっこの手を自ら先に進めることもあるまい。
やられたら次の手に進められるよう準備しておけばいいだけの話だ。
荒らし対策の話は、脆弱性対策の話とは異なる。荒らしはしょせん程度問題であるし、取り返しのつかない被害が即座に出るわけでもない
&lt;/blockquote&gt;&lt;/p&gt;

&lt;h4&gt;費用対効果を考える際のポイント&lt;/h4&gt;

&lt;p&gt;私の該当エントリでは技術的な話題に終始していたので、費用対効果といった経済的な観点での
考察は特に行っていませんでした。&lt;/p&gt;

&lt;p&gt;高木浩光氏の発言にもあるとおり、脆弱性などに比べれば緊急性は薄い。
この話題で費用対効果を考える際にポイントとなるのは、&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;現状でのスパマー避けの効果
&lt;li&gt;現状のCAPTCHAを破る労力
&lt;li&gt;CAPTCHAを修正する費用
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;といったところでしょうか。&lt;/p&gt;

&lt;p&gt;スパマー避けの効果について、はてなのjkondo氏が
&lt;a href="http://d.hatena.ne.jp/jkondo/20071031/1193845347"&gt;スパムとの闘い&lt;/a&gt;
というエントリで以下のように語っています。&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
まず、スパムコメントですが、これは特定の条件に適合したコメントをスパムとして自動判定して書き込めない措置を取ったり、
ゲストがコメントを書くときには画像認証を行うようにしました。
（この画像認証については、機械的に識別が可能だという話が先日上がっていましたが、
現時点では大きな効果を上げています。効果が無くなればまた改善をします）
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;このことからも&lt;strong&gt;スパマー避けとして、成果は上がっている&lt;/strong&gt;のでしょう。
（私の別エントリの
&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/11/03/105777.aspx"&gt;CAPTCHAとスパマー&lt;/a&gt;
も参照のこと。ほとんどのスパマーはスクリプトキディと思われる）&lt;/p&gt;

&lt;p&gt;確かに、はてな側は後出しジャンケンのようなもので、破られてから対策すればいいわけですし、
スパマー側としてはCAPTCHA破りをしたところで、対策されるまでの短い期間しか使えません。&lt;/p&gt;

&lt;p&gt;しかし、&lt;strong&gt;このCAPTCHAを破る労力と言えば、私が実証したとおり、小一時間程度&lt;/strong&gt;なわけです。
つまり、十分に「元が取れる」程度には軽微な労力なのですね。
ですから、&lt;strong&gt;いつ何時にスパマーがアタックを始めてもおかしくはないという状況で、
負の不確定要素、ネガティブリスクとなっている&lt;/strong&gt;わけです。&lt;/p&gt;

&lt;p&gt;そして、修正費用。&lt;br&gt;
これがネガティブリスクの多寡に比べて高価なのであれば、先送りするという判断は正しい。
もっとも&lt;strong&gt;あのCAPTCHAを直すのに技術者をひとり、1週間使わせれば十分でしょうから
月給100万の技術者を使ったとしても25万もかければ修正できる&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;このことから、はてなは&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;strong&gt;
「ある日突然SPAMまみれになった際に対策をする費用」 × 「その発生率」 ＜ 「修正にかかるコスト(25万以下と推定)」
&lt;/strong&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;と判断したということになります。&lt;/p&gt;

&lt;p&gt;私が指揮する立場にあれば即座に修正をしますね。
上記式だけでも修正するのに十分な理由ですが、
&lt;strong&gt;「我々はCAPTCHAのなんたるかなんて全く解っていませんよ」&lt;/strong&gt;
という張り紙をしてブランド力を貶めている状況は耐えがたい。&lt;/p&gt;

&lt;p&gt;技術力に対する評価はプライスレス。&lt;br&gt;
はてなはユーザはどうせ技術なんて分んないんだから適当でいいんだよ、という姿勢なのかもしれませんね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/127080.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>掲示板のマナーの感覚の違いはどこからくるのか</title><link>http://blogs.wankuma.com/nagise/archive/2008/02/06/121627.aspx</link><pubDate>Wed, 06 Feb 2008 16:52:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/02/06/121627.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/121627.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/02/06/121627.aspx#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/121627.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/121627.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/yaju/archive/2008/01/29/119685.aspx"&gt;質問者と回答者のマナーについて&lt;/a&gt;で
掲示板でのマナーについてまとめていますが、こちらではその意味を考えてみたいと思います。&lt;/p&gt;

&lt;p&gt;人の集まるところ、マナーは自然と生まれます。「情けは人の為ならず」とも言いますが、
マナーを守ることは自分自身の利益となります。
マナーを守らないと、結局のところ自分の望む結果を得られないことが多い。
掲示板の&lt;strong&gt;利用マナーというのは、自分を含めた掲示板を扱う人全員が利益を最大にするためにある&lt;/strong&gt;わけです。&lt;/p&gt;

&lt;h4&gt;情報の共有の場と捉えるか、否か&lt;/h4&gt;

&lt;p&gt;まず、&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/02/01/120363.aspx"&gt;掲示板を何のためのシステムと捉えるか&lt;/a&gt;
でマナーが自然と変わってきます。
これは掲示板オーナーが方針を決めるものでしょうが、&lt;strong&gt;技術系の掲示板では
「掲示板は情報共有の場」という考えが広く浸透している&lt;/strong&gt;ように思います。&lt;/p&gt;

&lt;p&gt;技術系の掲示板をあまり使ったことのない方の発言などから
&lt;strong&gt;「質問に対して誰かがボランティアで答えてくれる斡旋所」のように捉えていることが伺えます&lt;/strong&gt;。
このように捉えた場合、「情報共有の場」としての利用とはマナーが異なり、
&lt;strong&gt;その意識の違いがマナー云々のやり取りを繰り返し発生させる一因となっていると思われます&lt;/strong&gt;ね。&lt;/p&gt;

&lt;p&gt;解答者斡旋所と捉えると、質問者個人が問題解決できればそれでよいことになります。
よく引き合いに出されるマルチポストの例を考えてみると、情報の分散といったデメリットは
考慮しなくてよくなるため、問題とはならない。&lt;br&gt;
斡旋所として問題となるのは、マルチポストによって他の場所で解決したにもかかわらず、
その報告がなされなかったために、回答者が無駄な労力を費やしてしまったケースなどでしょう。&lt;br&gt;
そうなるとマルチポストそのものを避けようとまでする必要はなく、
「解決の報告を怠らないこと」をマナーとすることで十分という考えが合理的です。&lt;/p&gt;

&lt;p&gt;しかし、「情報共有の場」とした場合、マルチポストは情報の集積の妨げになる上、
共有の場を個人の問題解決という利己のために私するように見えることから、
激しく非難されることとなります。&lt;br&gt;
そのような利用者がいると&lt;strong&gt;コミュニティが崩壊するという危機感から排除しようとする&lt;/strong&gt;わけです。
これは排除する理由に相応の合理性がある。&lt;/p&gt;

&lt;p&gt;いかんせん「情報共有の場」という考え方を理解してもらうには相応の苦労があります。
新規参入者にその概念をいちいち教えるのもまた結構な労力です。&lt;/p&gt;

&lt;p&gt;マルチポストなどは「結果的に答えを得られないよ」という利害に根ざした説明で
とりあえずの納得をさせてやめさせる方法が楽ではありますが、
「情報共有」という概念を解さない限り、マルチポスト以外の形でコミュニティに
害のある行動を行いかねない。&lt;/p&gt;

&lt;p&gt;「斡旋所」と捉えているなら少なくとも無償で答えを貰えたことに礼を言うことは
自然なマナーとして受け入れられることでしょう。&lt;br&gt;
しかし、コミュニティを「答えを略奪するための狩場」と捉えていると最悪で、
答えが得られれば礼なんぞ言う必要もないと考えても不思議はありませんし、
答えを得るために形だけでもへつらって機嫌を取っておけ、という思想にもなりうる。&lt;/p&gt;

&lt;p&gt;そのコミュニティの利用者の大半は、心地よくてそのコミュニティにいるでしょうから、
コミュニティが崩壊しないように努力することでしょう。&lt;br&gt;
その際にマナーといったものが生まれ来るのでしょうが、
どのような思想でコミュニティを捉えているユーザがいるのか。
そのあたりを考えると、具体的な対処が見えてくるかもしれません。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/121627.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>アジャイル開発の見積もりとリスク</title><link>http://blogs.wankuma.com/nagise/archive/2008/02/04/120899.aspx</link><pubDate>Mon, 04 Feb 2008 18:53:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/02/04/120899.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/120899.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/02/04/120899.aspx#Feedback</comments><slash:comments>1017</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/120899.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/120899.aspx</trackback:ping><description>&lt;p&gt;ここ３年ぐらい同一案件のアジャイル的な開発をやっているのですが、
見積もりについて経験則がまとまってきたので整理してみたいと思います。&lt;/p&gt;

&lt;p&gt;まず、前提として以下のような作業を請け負っています。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;顧客の要望を聞いて要件開発を行う
&lt;li&gt;要件を元にシステムの設計を行う
&lt;li&gt;設計を元にプログラムの製造を行う
&lt;li&gt;テストを行う
&lt;li&gt;運用時に発生した障害の調査
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;開発は１期のスパンが２か月～３か月程度で、
開発した機能のリリースを行いながら順次機能拡張していくといった感じになります。&lt;/p&gt;

&lt;p&gt;作業の見積もりはその作業の種別により分類されます。
建築での比喩で表現すれば、大きく分けると設計図面を引く前と引いた後です。
これに加え、突発的な飛び込み作業があるので、以下の３つに分類しています。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;設計図面を引くまでの作業
&lt;li&gt;引いた図面をもとに開発する作業
&lt;li&gt;突発的に発生する作業
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;そして、それぞれの作業ごとに不確定要素（リスク）が存在します。&lt;/p&gt;

&lt;h4&gt;設計図面を引くまでの作業&lt;/h4&gt;

&lt;p&gt;要件開発の部分では、時間をかければ時間をかけただけ、作るべきモノの設計書(図面と比ゆしたもの)が増えます。
顧客側のいいなりに作業しているとえらく時間を取られる可能性があります。その部分がリスクと言えばリスクでしょう。&lt;/p&gt;

&lt;p&gt;しかし、どうせ図面を大量に用意したところで投入人数が決まっているなら１期の開発で消化できる量が
決まっていますから、定量に達したところで開発側主導で中断するべきです。
具体的にはシステムの設計の過程で、ある程度確度の高い見積もりができますから、
積算して定量に達したらそれ以上の設計には着手しないで次回送りにします。&lt;/p&gt;

&lt;p&gt;定量が定まっているためか、開発主導で中断できるせいなのか、この過程にかかる時間は
比較的安定していてそれほど大きなブレはありません。&lt;/p&gt;

&lt;h4&gt;引いた図面をもとに開発する作業&lt;/h4&gt;

&lt;p&gt;この過程も、それほど開発工数はブレません。
設計の際に洗い出した作業は思いのほか工数を外さないものです。
しかし、怖いのは洗い出しに失敗して、見落としていた作業があった場合。
この、作業の見落としは工数見積もりのブレの中では特に注意すべきポイントだと思います。&lt;/p&gt;

&lt;p&gt;一番大きな痛手となるのは、設計が差し戻しになったケース。とても大きな工数を消耗してしまいます。
設計者が用件だけではなくシステムの設計も把握している人材でさえあればこのリスクはかなり低減します。
また、顧客との打ち合わせの仕方次第で仕様のどんでんがえしのリスクは軽減されます。&lt;/p&gt;

&lt;p&gt;また、技術的なリスクもあります。
とくにシステムのコアとなる部分など、高度な部分の開発は、やってみてできなかったというケースがあり、
頭数を投入したからと言ってどうにかできるものでもありませんから、締め切りを後ろに伸ばすか、
後の工程を短い期間で無茶してやるかという選択になってしまいます。&lt;/p&gt;

・作業の見落としがないようにする
・技術的に不安がある部分は検証を事前に行っておくようにする

&lt;p&gt;といったところを気をつけるとよいでしょう。&lt;/p&gt;

&lt;h4&gt;突発的に発生する作業&lt;/h4&gt;

&lt;p&gt;障害対応が主なものです。
こればっかりはいつ出るのかわかったもんじゃありません。
保険の考え方を導入して予備工数を積むしかないでしょう。&lt;/p&gt;

&lt;p&gt;製造した機能ごとに算出した工数を予備として積んでおきましょう。
私の方では&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(製造にかかった時間 x 複雑さ係数) / (リリース後経過月数 * 調整係数)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;といった算出の仕方をしています。時間経過に伴い、障害の発生率は落ちていくとしています。
直前の期でリリースした機能は比較的高い発生率と想定し、古い期にリリースした機能ほど
発生率は低くなるととらえています。&lt;/p&gt;

&lt;p&gt;基準となるのは製造にかかった工数としています。
これは設計や仕様書の策定、テストケースの策定、テストの実施を抜いた、
プログラムの製造に関わる作業をてっとり早く定数化する手法です。&lt;/p&gt;

&lt;p&gt;FP(ファンクションポイント法)などの規模感を測定する指標を持っているならそれらを利用してもよいでしょう。
ただし、ステップ数は規模感の測定に用いるには誤差が大きすぎるのでそのまま使うのはやめたほうがよい。&lt;/p&gt;

&lt;p&gt;ここのリスクばかりは本当にコントロールしきれない。
一時期に集中的にバグが露呈することもあります。
ですが、金融工学に基づく保険の手法に学んで、リスクに対して備えを用意する程度にはあがきましょう。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/120899.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>数学的帰納法で完全なテストを行えるか？</title><link>http://blogs.wankuma.com/nagise/archive/2007/11/29/110906.aspx</link><pubDate>Thu, 29 Nov 2007 15:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2007/11/29/110906.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/110906.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2007/11/29/110906.aspx#Feedback</comments><slash:comments>328</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/110906.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/110906.aspx</trackback:ping><description>&lt;p&gt;以前、&lt;A href="http://blogs.wankuma.com/nagise/archive/2007/10/22/103276.aspx"&gt;完全なテストは不可能だ&lt;/a&gt;
という稿を書いたのですが、これに対して
&lt;a href="http://selfkleptomaniac.org/archives/379"&gt;反論しているページ&lt;/a&gt;
を見つけたので考察しておきます。&lt;/p&gt;

&lt;h4&gt;反論の骨子&lt;/h4&gt;

&lt;p&gt;該当ページの文章が短いので全文引用となってしまいますが、法的な引用の要件を満たせると思うので引用します。&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
&lt;p&gt;思うに、それは論理学でいうところの帰納法で解決できるのではなかろうか。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;A href="http://blogs.wankuma.com/nagise/archive/2007/10/22/103276.aspx"&gt;完全なテストは不可能だ&lt;/a&gt;:&lt;br /&gt;
さて、プログラムの話に戻ります。intの引数を2個とる場合、その組み合わせは1600京ほどに なるということを先の稿で述べました。 そして、バグが「ある」ことを証明する場合、バグの例をひとつ探し出せばよいのに対し、 バグが「ない」ことを証明するにはこの1600京のパターンすべてを網羅して検査し、 全て正常に動いたということを提示しなければなりません。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;数学でも、全ての数を計算したわけではないのに成立している定理は山ほどある。というかそうでないものの方が少ないはず。&lt;/p&gt;
&lt;p&gt;悪魔の証明、という目の付けどころは悪くないのに。まあ、ちょと前に自分でも&lt;a href="http://selfkleptomaniac.org/archives/359"&gt;取り上げた&lt;/a&gt;わけだが。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;つまり、帰納法を用いることで全てを演算することなく正しさを証明できるのではないか？という主張ですね。&lt;/p&gt;

&lt;h4&gt;帰納法とは何か？&lt;/h4&gt;

&lt;p&gt;まず帰納法とはなんでしょうか。概要を知るにはwikipediaがてっとり早いので該当項目を見て見ましょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E5%B8%B0%E7%B4%8D"&gt;http://ja.wikipedia.org/wiki/%E5%B8%B0%E7%B4%8D
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;帰納&lt;/b&gt;（&lt;b&gt;きのう&lt;/b&gt;、Induction）法とは、個別的・特殊的な事例から一般的・普遍的な規則を見出そうとする&lt;A href="http://blogs.wankuma.com/wiki/%E6%8E%A8%E8%AB%96" title="推論"&gt;推論&lt;/a&gt;方法のこと。対義語は&lt;b&gt;&lt;A href="http://blogs.wankuma.com/wiki/%E6%BC%94%E7%B9%B9" title="演繹"&gt;演繹&lt;/a&gt;&lt;/b&gt;法。演繹においては前提が&lt;A href="http://blogs.wankuma.com/wiki/%E7%9C%9F" title="真"&gt;真&lt;/a&gt;であれば結論も&lt;A href="http://blogs.wankuma.com/wiki/%E5%BF%85%E7%84%B6" title="必然"&gt;必然&lt;/a&gt;的に真であるが、帰納においては前提が真であるからといって結論が真であることは保証されない。&lt;/p&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;帰納法は真実を得られません。一部の事例から、全体を推論するのですが、論理の飛躍が含まれます。&lt;br&gt;
例えば、intを引数にとるメソッドに対し、-1,0,1の３つの値を入れた際にうまく動いたからといって、
すべての値に対して正しく動作するとは言えませんよね。&lt;/p&gt;

&lt;p&gt;帰納法とは3つうまくいったんだから、全部の値でうまくいくはずだという推論ですから、
帰納法を用いてメソッドの完全性を求めることはできません。&lt;/p&gt;

&lt;h4&gt;数学的帰納法という名の演繹法&lt;/h4&gt;

&lt;p&gt;「数学でも、全ての数を計算したわけではないのに成立している定理は山ほどある。」と述べていることから、
「帰納法」といっているのは多分、数学的帰納法のことを指しているのではないかと思われます。&lt;/p&gt;

&lt;p&gt;さて、数学的帰納法というのは帰納法という名が付いていますが、実際には演繹法（えんえきほう）です。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E7%9A%84%E5%B8%B0%E7%B4%8D%E6%B3%95"&gt;
http://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E7%9A%84%E5%B8%B0%E7%B4%8D%E6%B3%95&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;数学的帰納法&lt;/b&gt;（&lt;b&gt;すうがくてききのうほう&lt;/b&gt;）とは、有限回の議論で&lt;A href="http://blogs.wankuma.com/wiki/%E5%8F%AF%E7%AE%97%E6%BF%83%E5%BA%A6" title="可算濃度"&gt;可算&lt;/a&gt;無限個の対象に対する命題を証明するための&lt;A href="http://blogs.wankuma.com/wiki/%E6%95%B0%E5%AD%A6" title="数学"&gt;数学&lt;/a&gt;の論法である。次のような手順で&lt;A href="http://blogs.wankuma.com/wiki/%E8%87%AA%E7%84%B6%E6%95%B0" title="自然数"&gt;自然数&lt;/a&gt;全体に関する&lt;A href="http://blogs.wankuma.com/wiki/%E5%91%BD%E9%A1%8C" title="命題"&gt;命題&lt;/a&gt; P(&lt;i&gt;n&lt;/i&gt;) (&lt;i&gt;n&lt;/i&gt;∈&lt;b&gt;N&lt;/b&gt;) が&lt;A href="http://blogs.wankuma.com/wiki/%E7%9C%9F" title="真"&gt;真&lt;/a&gt;であることを&lt;A href="http://blogs.wankuma.com/wiki/%E8%A8%BC%E6%98%8E" title="証明"&gt;証明&lt;/a&gt;する論法である。&lt;/p&gt;
&lt;dl&gt;
&lt;dd&gt;
&lt;ol&gt;
&lt;li&gt;P(0) は真である。&lt;/li&gt;
&lt;li&gt;任意の自然数 &lt;i&gt;k&lt;/i&gt; に対し，P(&lt;i&gt;k&lt;/i&gt;) が真であれば，P(&lt;i&gt;k&lt;/i&gt;+1) も真である。&lt;/li&gt;
&lt;/ol&gt;
&lt;/dd&gt;
&lt;dd&gt;よって任意の自然数 &lt;i&gt;n&lt;/i&gt; について P(&lt;i&gt;n&lt;/i&gt;) は真である。&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;イメージとしては、2 により次々と次の命題の正しさが伝播されていくことになる。つまり、1 によりまず P(0) は正しく、P(0) と 2 により P(1) は正しく、P(1) と 2 により P(2) は正しく、以下これが果てしなく続いていく。このことによって任意の自然数 &lt;i&gt;n&lt;/i&gt; について P(&lt;i&gt;n&lt;/i&gt;) が正しいことが保証される。&lt;/p&gt;
&lt;p&gt;なお、数学的「&lt;A href="http://blogs.wankuma.com/wiki/%E5%B8%B0%E7%B4%8D" title="帰納"&gt;帰納&lt;/a&gt;法」という名前がつけられているが、数学的帰納法の解法プロセス自体は帰納法ではなく&lt;A href="http://blogs.wankuma.com/wiki/%E6%BC%94%E7%B9%B9" title="演繹"&gt;演繹&lt;/a&gt;法である。先に述べた、「&lt;i&gt;2 により次々と次の命題の正しさが伝播されてい&lt;/i&gt;」った結果証明されていく様子が帰納のように見えるためつけられたにすぎない。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;これは、学校で習いましたよね。&lt;br&gt;
数学的帰納法はドミノ倒しに似ています。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;あるドミノが倒れたら、次のドミノが倒れるようにしておく
&lt;li&gt;最初のドミノを倒す
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;このふたつがポイントです。ドミノを倒すことで&lt;strong&gt;全ての数を計算する&lt;/strong&gt;のです。&lt;br&gt;
ですから、「数学でも、全ての数を計算したわけではないのに成立している定理は山ほどある」というのは
多分に誤解を含んでいます。数学的帰納法に拠らない証明で成立している定理もありますが、
&lt;strong&gt;数学的帰納法で証明されている定理に関して言えば全てを計算している&lt;/strong&gt;のです。&lt;/p&gt;

&lt;p&gt;ドミノが勝手に倒れてくれるので準備を整えたら無限のかなたまで手間無く一瞬で計算できるだけのことです。&lt;/p&gt;

&lt;h4&gt;テストに数学的帰納法を適用するには&lt;/h4&gt;

&lt;p&gt;ブラックボックステストで数学的帰納法を扱う術はありません。
あるドミノが倒れたら次のドミノも倒れるという証明ができないからです。&lt;br&gt;
ブラックボックステストでは実行した結果を仕様と照らし合わせて等しいかみる必要があります。
実行せずに正しい答えを返すことを証明することは不可能です。&lt;/p&gt;

&lt;p&gt;となれば、ホワイトボックステスト的な手法をとらざるを得ません。
それはもはや、プログラムのコードが正しく機能することを数学的に証明を導くことに等しい重労働です。&lt;/p&gt;

&lt;p&gt;このようなアプローチは
&lt;a href="http://ja.wikipedia.org/wiki/%E5%BD%A2%E5%BC%8F%E7%9A%84%E6%A4%9C%E8%A8%BC"&gt;形式的検証&lt;/a&gt;
と呼ばれています。&lt;/p&gt;

&lt;p&gt;このアプローチでプログラムの完全な正しさを証明しようとするのであれば、
数学者を大量に雇いいれ、幾千もあるメソッドに対してそれぞれ独自の証明を人力で解いていかないといけません。
複雑なメソッドの正しさを数学的に証明しようとした場合、それは世紀の難問にも等しい難度を誇ることでしょう。&lt;/p&gt;

&lt;p&gt;指摘もとのblogの言葉を借りるならば「帰納法、という目の付けどころは悪くないのに。」といったところでしょうか。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/110906.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>ソフトウェアの保守性はアップサイドリスクである</title><link>http://blogs.wankuma.com/nagise/archive/2007/11/06/106319.aspx</link><pubDate>Tue, 06 Nov 2007 12:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2007/11/06/106319.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/106319.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2007/11/06/106319.aspx#Feedback</comments><slash:comments>156</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/106319.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/106319.aspx</trackback:ping><description>&lt;p&gt;ソフトウェアの品質と一口に言っても複数の属性が存在することは
&lt;A href="http://blogs.wankuma.com/nagise/archive/2007/11/04/105872.aspx"&gt;先のエントリ&lt;/a&gt;
でも触れましたが、この中の保守性に今回は焦点を当ててみたいと思います。&lt;/p&gt;

&lt;h4&gt;保守性が活きるかどうかは不確定&lt;/h4&gt;

&lt;p&gt;保守性というのは端的に言えば修正のしやすさを意味します。
仕様変更や追加の際の工数が小さい、その作業過程でのバグの出現数が少ない、といったところです。&lt;/p&gt;

&lt;p&gt;さて、この保守性の高さというのは、いざ変更を行おうとする段にならないと効力を発揮しません。&lt;br&gt;
例えば初期のデータ移行のためのバッチとか、そういった「使い捨て」のプログラムでは重要視されません。&lt;/p&gt;

&lt;p&gt;つまり、将来発生するかもしれない変更に対して、工数が少なくなるように&lt;strong&gt;保守性を高めるということは、
アップサイドリスクである&lt;/strong&gt;、つまり、発生するかどうかが不確かな利益であると言えましょう。&lt;/p&gt;

&lt;p&gt;このアップサイドリスクは仕様変更があって初めて効力を発揮するものです。
そしてその価値は、&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
修正の発生確率 &amp;#215; 省略できる工数 ＝ 保守性の高さの価値
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;という式で与えられるでしょう。&lt;/p&gt;

&lt;p&gt;近年普及したリファクタリングの概念（動きを変えずに保守性を高める手法）は、
一般には手を加えることによるバグ発生のダウンサイドリスクばかりが注目されます。&lt;br&gt;
しかし、リファクタリングによって得られるアップサイドリスクと比較して検討されるべきであり、
保守性というアップサイドリスクの価値をもっと関心を持って計測する必要があるのではないでしょうか。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/106319.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>リスクについて考える</title><link>http://blogs.wankuma.com/nagise/archive/2007/11/04/105872.aspx</link><pubDate>Sun, 04 Nov 2007 21:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2007/11/04/105872.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/105872.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2007/11/04/105872.aspx#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/105872.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/105872.aspx</trackback:ping><description>&lt;p&gt;Programming SHOT BAR へようこそ。今回はリスクというものについて考えてみたいと思います。&lt;/p&gt;

&lt;h4&gt;そもそもリスクって何？&lt;/h4&gt;

&lt;p&gt;日常でもリスクという言葉を使うと思いますが、そもそもどういう意味なのでしょうか？&lt;/p&gt;

&lt;p&gt;手ごろなところで&lt;a href="http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%AF"&gt;Wikipediaで調べる&lt;/a&gt;と
「危険に遭う可能性や損をする可能性を意味する概念」とありますね。&lt;br&gt;
基本的には&lt;/p&gt;

&lt;p&gt;&lt;code&gt;発生確率×損害の大きさ&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;といった形で表されます。ここでは「損害」と書きましたが、金融用語では不確かさ、
つまり「発生確率」の部分を意味し損得に関わらず「リスク」といいます。&lt;br&gt;
とくに不確かな利益についてはアップサイドリスク、不確かな損害についてはダウンサイドリスクといいます。&lt;/p&gt;

&lt;p&gt;行動心理学的に人間は確率を過大評価もしくは過小評価する傾向があります。
端的には信じたいものを信じるわけですが、アップサイドリスクは過大に、ダウンサイドリスクは過小にという傾向が強い。
例えば、宝くじやギャンブルなどのアップサイドリスクは過大に評価しますし、
交通事故などのダウンサイドリスクは過小に評価しがちです。&lt;/p&gt;

&lt;p&gt;しかし、このような評価の仕方をしていると取り返しの付かないミスをしてしまいます。
例えば賞味期限切れの食材を使っても大丈夫だろう、とかそういう会社の傾くような出来事を
行ってしまったりするわけです。これは、発覚する確率を過小に評価したという点と、
また、発覚した場合の損害の大きさを過小に評価したというところに愚かさがあるのです。&lt;/p&gt;

&lt;p&gt;リスク管理上はどんなに発生確率が低くとも、甚大な被害が発生する場合は避けることが求められます。&lt;/p&gt;

&lt;h4&gt;システム開発におけるリスクはなんだろう？&lt;/h4&gt;

&lt;p&gt;さて、システム開発におけるリスクというのはなんでしょうか？&lt;br&gt;
まず、最初に断っておくと、これは全て列挙しきれるような問題ではありません。&lt;/p&gt;

&lt;p&gt;こういったものがある、と挙げることはできますが、網羅することは難しいという性質を持っています。&lt;br&gt;
ですから、さまざまな議論の中で少しずつ候補を挙げていき、その評価をしていくしかないと考えています。
そういうわけで指摘などあれば遠慮なくお願いします。&lt;/p&gt;

&lt;p&gt;とりあえず、議論の叩き台となるように、私が思いついたものを挙げてみました。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;難易度によるリスク。開発過程で技術的難易度により開発が完了しない、もしくは納期が延びる可能性
&lt;li&gt;仕様の不確定さによるリスク。仕様変更が発生する、もしくは使用の矛盾が発覚して修正を迫られる可能性
&lt;li&gt;バグの発生によるリスク。バグが発覚して修正を迫られる可能性
&lt;li&gt;担当者が働けなくなるリスク。病気・怪我・その他の理由で労働力が失われる可能性
&lt;li&gt;開発環境に発生する障害。ウィルスの蔓延や、リポジトリのサーバの不具合、停電など。
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;これらのリスクは「品質」とも関連してきます。品質の向上によりリスクの発生確率を軽減できますし、
発生した場合の損害も軽減することができます。&lt;/p&gt;

&lt;p&gt;品質ってなんだろう？&lt;/p&gt;

&lt;p&gt;さきほどは一口に品質といいましたが、品質にも色々な属性があります。&lt;/p&gt;

&lt;p&gt;詳しくは&lt;a href="http://homepage3.nifty.com/kaku-chan/q_and_p/what_quality.html"&gt;参考リンク&lt;/a&gt;
でも見てもらったほうがよいでしょう。&lt;/p&gt;

&lt;p&gt;ソフトウェアの品質についてはISO 9126-1で定義されています。簡単に列挙すると&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;機能性
&lt;li&gt;信頼性
&lt;li&gt;使用性
&lt;li&gt;効率性
&lt;li&gt;保守性
&lt;li&gt;移植性
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;となります。品質の属性は、あちらを立てるとこちらが立たずというところがあり、
また、品質向上にかかる費用も青天井といったところですから、現実的にはうまくバランスを取って
どこかで妥協しなくてはなりません。&lt;/p&gt;

&lt;p&gt;というわけで、品質の向上というのも複雑なパラメータを伴う数値だけでは捕らえにくい事項なのですが、
これらの品質の良し悪しと、逸れに伴うリスクの高低が関連してくるのですからさらに厄介なのです。&lt;/p&gt;

&lt;p&gt;といったところで、具体的な事項については次回以降で検討しましょう&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/105872.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>