<?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>経済とIT</title><link>http://blogs.wankuma.com/nagise/category/1398.aspx</link><description>経済とIT</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/09/28/157667.aspx</link><pubDate>Sun, 28 Sep 2008 14:15:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/09/28/157667.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/157667.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/09/28/157667.aspx#Feedback</comments><slash:comments>1040</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/157667.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/157667.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/09/25/157505.aspx"&gt;アーキテクチャ選定ではメリットとデメリットを考える&lt;/a&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;a href="http://d.hatena.ne.jp/Nagise/20080915/1221462208"&gt;ネズミかゾウかではなくて、肥満か筋肉質かだろう&lt;/a&gt;が言っているのは
この骨格の大きさと、プログラミングのまずさからくる贅肉を混同するな、ということですね。&lt;/p&gt;

&lt;h4&gt;体の大きさ ＝ 実装の大きさ&lt;/h4&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;h4&gt;成人後の成長 ＝ アジャイル性&lt;/h4&gt;

&lt;p&gt;アジャイルなシステムというのは成人が早い。割と未熟なうちにリリースしてしまう。
リリース後の成長も大きく、成人してからも代謝が高いのですね。&lt;/p&gt;

&lt;p&gt;対してウォーターフォール式のシステム開発などは、成人後にほとんど成長は止まってしまう。
下手をすると成長などまるでなくて、「老後の介護」にばかり手間がかかるということもありえるのです。&lt;/p&gt;

&lt;p&gt;代謝を高めるための設計手法と言うのもあります。こうした後の変更がある場合にそれは活きてくる。
でも、いざそのときが来ない限りはそうした設計の良さというのは日の目を見ない。
&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/11/06/106319.aspx"&gt;ソフトウェアの保守性はアップサイドリスクである&lt;/a&gt;
で言ったのはそういう事情のことなのですね。&lt;/p&gt;

&lt;h4&gt;寿命 ＝ システムの寿命&lt;/h4&gt;

&lt;p&gt;システムは改修をしつつ、使われるわけですが、やがて寿命を迎えます。死因はさまざまですが、&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;土台となるOSやミドルウェアが死んだ
&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;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;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;p&gt;こうした、明らかな贅肉はそぎ落とすことでコードが数分の一になることがありますが、経験則からして1/10を超えない。
どんだけ贅肉で太らせようとても骨格が支えられないほどには大きくなる前にシステムが破たんするのではないかと思います。
人間の体重も世界記録では700kgぐらいらしく、限界までいっても10倍そこそこのようですね。&lt;/p&gt;

&lt;h4&gt;体脂肪を落とす効率&lt;/h4&gt;

&lt;p&gt;システムの贅肉を落とし、体脂肪率を10%にするためのコストと、体脂肪率10%から1%に落とすコスト、1%から0.1%に落とすコストが概ね等しいと思います。(&lt;a href="http://d.hatena.ne.jp/katzchang/20080925"&gt;無責任な社会、限定責任な社会&lt;/a&gt;から着想)&lt;/p&gt;

&lt;p&gt;まぁこれは概念的な話なので数字が正確かというと怪しいのだけども、指数関数的だよね、というのは理解いただきたい。
過度なダイエットは費用ばかりが嵩むので、ほどほどの贅肉は許容せざるをえないというわけです。&lt;/p&gt;

&lt;p&gt;とはいえ、このほどほどの贅肉はコードが数分の一に縮むほどの贅肉じゃない。人間だって体脂肪率が0%になることはないでしょう？多少の脂肪に病的に神経質になっても仕方がない。&lt;/p&gt;

&lt;h4&gt;合目的なアーキテクチャ選定&lt;/h4&gt;

&lt;p&gt;フレームワークやアーキテクチャの選定は合目的でなくてはならない。そこで取り上げられる評価軸は「小規模 - 大規模」なんて単純な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;「時間、品質、料金」のうちから、2つを選択できる、なんてジョークがあるのですが、示唆深いと思いませんか？&lt;/p&gt;

&lt;p&gt;これらのうち、何を活かして何に目をつぶるのか、その比率はどの程度にするのかというのが、アーキテクチャ選定で悩む部分です。
小さなシステムは、使い捨てにすることもできる。リリースまでの期間が短くコストも小さいなら、定期的に使い捨てにするという方法論もアリでしょう。
過去のリソースを使いたいからCOBOLで開発というのもコスト・リスクが見合うならあるいはアリでしょう。&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/157667.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>サニタイズとハンガリアンとヒューマンエラーとアスペクト指向</title><link>http://blogs.wankuma.com/nagise/archive/2008/07/06/147607.aspx</link><pubDate>Sun, 06 Jul 2008 18:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/07/06/147607.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/147607.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/07/06/147607.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/147607.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/147607.aspx</trackback:ping><description>&lt;p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/gallu/20080702/p2"&gt;なぜこうもレビューされてないコードを記事に書く？&lt;/a&gt;
&lt;li&gt;&lt;a href="http://blogs.wankuma.com/jitta/archive/2008/07/06/147596.aspx"&gt;「サニタイズいうな」と「ハンガリアン」&lt;/a&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;このあたりの話題は、個々のプログラマに対して「気をつけろ」と注意喚起してもなくならない話題なのですが、
その背景的な部分をば少し。&lt;/p&gt;

&lt;h4&gt;サニタイズは消毒足り得ない&lt;/h4&gt;

&lt;p&gt;sanitize = 「無害にする」、という英単語ですが、≒ sanitate 「消毒する」と紹介されることが多いですね。
でも、この消毒という比喩は&lt;strong&gt;文学的ではあるけども、技術的には問題のある比喩&lt;/strong&gt;に思います。
XSS(Cross Site Scripting、クロスサイトスクリプティング)への対処として言われることが多いですね。&lt;/p&gt;

&lt;p&gt;現実の消毒というのは、&lt;strong&gt;過剰に繰り返しても問題はなく&lt;/strong&gt;、
消毒済みのものをそのままもう一度消毒しても構わない。
なので、食品衛生的な現場では過剰なぐらいに「とりあえず消毒」というスタンスでやるわけです。&lt;/p&gt;

&lt;p&gt;これに対しプログラム上やりたいことというのは
「その場の文脈でメタ文字となる文字をエスケープすること」
(&lt;a href="http://takagi-hiromitsu.jp/diary/20060115.html"&gt;
続・「サニタイズ言うなキャンペーン」とは&lt;/a&gt;より)なわけで、
例えば対HTMLでのエスケープ処理として"&amp;"といった記号を"&amp;amp;amp;"と置き換えたりするような処理です。
これは何度でも行える「消毒」ではなく、
&lt;strong&gt;正しい場所で一度きりしか実行してはいけない「変換処理」&lt;/strong&gt;なんですよね。&lt;/p&gt;

&lt;p&gt;しかし、プログラムにおけるエスケープは消毒とは違ってあくまで「変換処理」ですから、
&lt;strong&gt;正しい場所で一度だけ、しかも漏れなく行う必要&lt;/strong&gt;がある。
そして、その場所というのが、「HTMLを出力する場所全て」という
どうやって網羅するんだよ、と言いたくなる広範な個所なのですね。&lt;/p&gt;

&lt;h4&gt;ハンガリアン記法&lt;/h4&gt;

&lt;p&gt;話は変わってハンガリアン記法。
Jittaさんの言う「型によるハンガリアン（システム ハンガリアン）使うな」の話です。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95"&gt;
Wikipedia&lt;/a&gt;でも見てもらうと掴めると思うのですが、"iWindowHeight"みたいに、変数名の頭に型を表現する情報を
付加すると言う記法です。&lt;/p&gt;

&lt;p&gt;この記法、Javaなどの強い型付けの言語の場合、プログラム上の「型」と変数名での「型」と冗長になるんですね。
そしてプログラムでの「型」はコンパイル動作で機械的にチェックされるので型の相違などは
検出・修正できるわけでバグとなっていつまでも残るようなことはないわけです。
そして、この冗長を常に保つことの難しさというのが欠点として挙げられていて、
メリットがないということが言われている。&lt;/p&gt;

&lt;p&gt;ハンガリアン記法を保つためには、「全ての変数を宣言する箇所で」網羅的に命名を確認する必要があります。
そしてソースコードを修正する際に「型を変更する全てのケース」で網羅的に変数の命名も直さなくてはならない。&lt;/p&gt;

&lt;h4&gt;ヒューマンエラー&lt;/h4&gt;

&lt;p&gt;例えば、小学生低学年向けの、算数のドリルをやるとしましょう。算数の足し算を延々とやるわけです。
算数の足し算ぐらいは誰でもできますね。では、&lt;strong&gt;1万問のドリルで全問正解してください&lt;/strong&gt;、と言われたら
「そんなの簡単だよ」と言えるでしょうか？&lt;/p&gt;

&lt;p&gt;これは単純で簡単な作業であっても、&lt;strong&gt;人間はなんらかの間違いを犯す&lt;/strong&gt;と言うことです。
「うっかりして」の「うっかり」なのです。&lt;/p&gt;

&lt;p&gt;あなたがチームリーダーだとしましょう。10人のメンバー全員に1万問のドリルで全問正解させるにはどうしたらいいでしょうか？
この「うっかり」に対して「気合いを入れて」とか「集中して」とか&lt;strong&gt;精神論を掲げても、
確実性が上がるわけではありません&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;俗にサニタイズと呼ばれる処理も、ハンガリアン記法も、原理を理解して対処することは難しくはない。
(いや、サニタイズ言うなキャンペーンはその原理の理解がされていないことを憂いてのキャンペーンだったか…)
算数ドリルのような話題です。ただし、その数がべらぼうで、「うっかり」間違えることもあるというものです。&lt;/p&gt;

&lt;p&gt;10人分の計算ドリルをあなたが検算することで全問正解を目指すとしましょう。
あなたは検算を間違えないでやりとおせるでしょうか？
「うっかり」検算を間違えたりしないでしょうか？
XSSの話題というのはこの&lt;strong&gt;個々は簡単な作業なのだけども、
漏れなく実施しそれを保証するのが難しい&lt;/strong&gt;というところが本題です。
そして一か所でも漏れがあるとそれでセキュリティホールになる可能性があるって言うんだから嫌になる。&lt;/p&gt;

&lt;p&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;a href="http://blogs.wankuma.com/nagise/archive/2008/03/25/129472.aspx"&gt;アスペクト指向の概念&lt;/a&gt;
でおおむね解説しているわけですが、アスペクト指向では&lt;strong&gt;「全てのXXに全部YYをする」&lt;/strong&gt;という事象を扱います。
これをアスペクト、「横断的関心事」と呼ぶわけです。
上記、挙げてきた件を解決しようという試みなわけですね。&lt;/p&gt;

&lt;p&gt;このアスペクト指向というのはOOP(オブジェクト指向プログラミング)の
概念とぶつかるものではなく、相補的なものと言えます。&lt;/p&gt;

&lt;p&gt;AOP(アスペクト指向プログラミング)に対応した言語では、関数のようなものを作って、
この処理を「全てのXX」に差し挟む、ということが記述できます。
この「全てのXX」という部分にOOPでのオブジェクトなどが用いられたりするわけです。&lt;/p&gt;

&lt;p&gt;また、AOP対応言語でなくとも、設計のパラダイムとしてのアスペクト指向というのはあって、
OOPでのデザインパターンでProxyパターンというものがありますが、これは、
Proxyするオブジェクトで前後に処理を一律に差し挟むことを可能とする。
アスペクト指向的な概念に対してOOPの枠内でできる対処法のひとつなんですね。&lt;/p&gt;

&lt;p&gt;XSSに代表されるように、横断的関心事というのは人間の手作業では
ヒューマンエラーとも密接に関わって非常に対処しにくい。
AOPはプログラミングのパラダイムとしてだけではなく、開発体制をいかに構築するか
(私はこれをシステムを構築するプログラミングの仕事と類似する事項と思っています)
という部分にも応用することができる。&lt;/p&gt;

&lt;p&gt;日常の開発の中で、こうしたアスペクトを捉えて、それを一網打尽にするジョインポイントはどこか、
そう考えると見えてくるものがいろいろあるのです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/147607.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>人件費の1%の投資で効率を20%UPする方法</title><link>http://blogs.wankuma.com/nagise/archive/2008/07/03/146921.aspx</link><pubDate>Thu, 03 Jul 2008 00:51:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/07/03/146921.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/146921.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/07/03/146921.aspx#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/146921.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/146921.aspx</trackback:ping><description>&lt;p&gt;もし、あなたがこれから10年間、土砂を運搬する仕事をするとしたならば、次のどの道具に投資しますか？&lt;/p&gt;

&lt;p&gt;&lt;ol&gt;
&lt;li&gt;手押し車 (10,000円～)
&lt;li&gt;軽トラック (500,000円～。最大積載量は350kg以下)
&lt;li&gt;中型トラック (ダンプで1,500,000円～。最大積載量は6.5トン未満)
&lt;li&gt;大型トラック (10tダンプで10,000,000円～。)
&lt;/ol&gt;&lt;/p&gt;

&lt;p&gt;多くの人は4を選ぶのではないでしょうか。あるいは大型免許を保持していない人は3を検討するかもしれません。&lt;/p&gt;

&lt;p&gt;道具というのは仕事の効率に直結します。土木建設業などでは機械による効率化が目に見えてわかるため、
機械への投資とそのリターンが想像しやすいですね。&lt;/p&gt;

&lt;h4&gt;開発マシンを変えたなら&lt;/h4&gt;

&lt;p&gt;以前のプロジェクトで契約先会社から支給されたマシンで開発していたのですが、
Tomcat(JavaEEの実行環境であるWebサーバ)の起動に&lt;strong&gt;300秒以上&lt;/strong&gt;かかっていました。
プログラムを修正し、コンパイルしてテストを再開するたびに&lt;strong&gt;5分&lt;/strong&gt;待たされるわけです。
10箇所修正するとそれだけで&lt;strong&gt;50分&lt;/strong&gt;、1日の業務の&lt;strong&gt;10%がこの待ち時間&lt;/strong&gt;で費やされていたわけです。&lt;/p&gt;

&lt;p&gt;そこで、DELLでCore2Duo搭載でメモリが2Gのマシンを&lt;strong&gt;12万程度&lt;/strong&gt;で購入し、持ち込むことにしました。
これによって、Tomcatの起動時間は&lt;strong&gt;20秒程度にまで短縮&lt;/strong&gt;されました。&lt;/p&gt;

&lt;p&gt;システム開発において、Webサーバの疑似環境の起動や、DBの起動、コンパイルといった処理には
かなりのマシンパワーが求められます。&lt;/p&gt;

&lt;p&gt;また、Eclipseといった最近の高度なIDEはそれ自体が相当にマシンパワーを要求します。
もっとも、クラス名・メソッド名などの自動補完や、構文解析を伴う高度なシンタックスハイライト、
コード記述中の動的コンパイルやバグパターンの検出機能、リファクタリング機能や命名規約のチェックなど、
生産性向上のための多様な高度な機能が盛り込まれているため、
「テキストエディタで開発すれば？」というわけにはいきません。生産性が違いすぎます。&lt;/p&gt;

&lt;p&gt;さて、先に挙げたように土砂運搬の例だと&lt;strong&gt;投資額が1000万円&lt;/strong&gt;とかになるわけですね。
耐用年数が10年だとしても&lt;strong&gt;年間100万円&lt;/strong&gt;、これに重量税や車検といった費用がかかります。
人件費側を保険等の諸経費も込みでひとりあたり&lt;strong&gt;50万円/月&lt;/strong&gt;と仮定した場合、&lt;strong&gt;年間600万円&lt;/strong&gt;で
その&lt;strong&gt;20%ぐらいの比率で機械への投資が必要&lt;/strong&gt;だと言うことになります。
しかし、それで4tから10tに切り替えたら一度に運べる量は&lt;strong&gt;+150%&lt;/strong&gt;になるわけで、
仕事のためにこの金額を投資しようと考えるのが一般的です。&lt;/p&gt;

&lt;p&gt;開発に使うマシンの場合はどうでしょうか。先に挙げたとおり、私が今開発で使っているマシンは&lt;strong&gt;12万円&lt;/strong&gt;です。
この12万円にはWindowsVistaとMSOfficeのライセンス料も含まれています。
&lt;strong&gt;耐用年数を2年&lt;/strong&gt;としても、&lt;strong&gt;年間6万円です&lt;/strong&gt;。わずかに&lt;strong&gt;人件費の1%&lt;/strong&gt;です。
そして、こまごまとしたマシンフリーズや起動待ちから解放されて&lt;strong&gt;+20%程度の作業効率アップ&lt;/strong&gt;ができるわけです。&lt;/p&gt;

&lt;h4&gt;開発マシンに投資しよう&lt;/h4&gt;

&lt;p&gt;マシンが古いと正に「仕事にならない」という事態が発生します。しかし、その仕事上での&lt;strong&gt;困り具合というのが
どうにも見えにくいというのもIT業界の特徴&lt;/strong&gt;です。&lt;/p&gt;

&lt;p&gt;Webでもそうですが、通信を行うシステムではマシンが物理的に複数台あるほうが効率が良いこともあります。
1台のマシンに仮想環境を作って疑似的に2台にするとかいうこともできますが、その手間とかマシンパワーの
負担による待ち時間の発生とか考えたらマシンへの投資をケチってトータルで得をするでしょうか？
IT業界は&lt;strong&gt;人件費の比率が突出して高い業界&lt;/strong&gt;です。
人を活かすためのマシンへの1%程度の投資額なんざ、あっというまに回収できるわけです。&lt;/p&gt;

&lt;p&gt;しかし、積載量が倍になれば運搬効率二倍だね、なんてイメージのしやすさに比べ、
IT業界での仕事効率は見えにくい。ですから、経営者や、経理の人には
&lt;strong&gt;「マシンを2年じゃなくて4年使えば経費を50%カット♪」&lt;/strong&gt;
ぐらいに思われている可能性があります。その&lt;strong&gt;代償としてどれだけの人件費が無駄になっているか&lt;/strong&gt;、
どれだけ技術者のモチベーションを下げているかをちゃんと伝えなければなりません。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/146921.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>【ニュース】アルファギークと学生の討論会が開催される見込み</title><link>http://blogs.wankuma.com/nagise/archive/2008/06/23/145142.aspx</link><pubDate>Mon, 23 Jun 2008 16:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/06/23/145142.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/145142.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/06/23/145142.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/145142.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/145142.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/higayasuo/"&gt;ひがやすを&lt;/a&gt;氏が
&lt;a href="http://d.hatena.ne.jp/higayasuo/20080623/1214197466"&gt;アルファギークと学生の討論会&lt;/a&gt;をセッティングしてしまったらしい。「9月上旬の土日(たぶん9/6以外)」だそうです。私も極力調整して参加するつもり。&lt;/p&gt;

&lt;p&gt;ことの発端はITメディアが&lt;a href="http://www.atmarkit.co.jp/news/200805/28/ipa.html"&gt;
「10年は泥のように働け」「無理です」――今年も学生と経営者が討論&lt;/a&gt;と報じた記事。
これはIT Pro側の&lt;a href="http://itpro.nikkeibp.co.jp/article/NEWS/20080528/304458/"&gt;
「IT技術者はやりがいがある仕事か」---学生とIT産業のトップが公開対談&lt;/a&gt;と読み比べるとわかりますが、
ITメディア側は偏向報道が強い。「10年は泥のように働け」という言葉が独り歩きして炎えあがりました。&lt;/p&gt;

&lt;p&gt;その際、ひがやすを氏は&lt;a href="http://d.hatena.ne.jp/higayasuo/20080529/1212036046"&gt;
IT業界の重鎮に期待せず、アルファギークと学生の討論会はいかが&lt;/a&gt;というエントリを立てて&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
とはいえ、重鎮たちと学生を討論させても、学生がIT(SI)業界に夢を持ってくれるとは思えないので、ここで1つ提案をしたい。&lt;br&gt;
小飼弾のアルファギークに逢ってきたのメンバーと学生会の討論会を開くのだ。&lt;br&gt;
もちろん、司会は、ダンコーガイ。いいよね、弾さん。
&lt;/blockquote&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/145142.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>Webシステムの次は</title><link>http://blogs.wankuma.com/nagise/archive/2008/05/21/138721.aspx</link><pubDate>Wed, 21 May 2008 01:07:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/05/21/138721.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/138721.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/05/21/138721.aspx#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/138721.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/138721.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/scinfaxi/20080517/1210970917"&gt;
プログラミングのジャンルと難易度(および Web プログラミング批判)&lt;/a&gt;というエントリが人気のようですね。
ざっくりした概要は「Web プログラミングの世界ってのは、全体的に程度が低いからだ。」の一文で表現されてしまいます。&lt;/p&gt;

&lt;p&gt;JavaのServlet技術を用いた業務システムをさんざんやってきた私ですが、この感覚というのはよくわかる。
Webシステムのサーバサイドの仕事の8割は経験3ヵ月の新人でやれてしまう。&lt;/p&gt;

&lt;p&gt;ただ、Webシステムは技術がまるでいらないかというと、そういうわけではなくて、物凄く幅広い知識が必要とされる側面があります。
しかし、そうした技能を持ったアーキテクトがチームにひとりいれば、大抵の問題は解決できるぐらいに、
大半は専門的な技術を必要としない。&lt;/p&gt;

&lt;p&gt;こうしたWebシステムの側面は、経済的な面で非常に有利であり、あんなにも使いにくいUIになるにも関わらず、
多くのLAN内部で使われる社内の業務システムがWebサービスとして作られることになりました。
(アプリケーションの配布の手間がないという側面も大きく評価されたのだと思いますけども)&lt;/p&gt;

&lt;h4&gt;HTMLによるGUI作成&lt;/h4&gt;

&lt;p&gt;Webの、というよりHTMLによるGUIの作成は、VisualBasicよりもある意味では易しい。
というのは、画面サイズ固定であればVBによる画面作成は煩雑ではないものの、HTMLのような自動レイアウトが容易ではないからです。
ウィンドウサイズを可変にして、サイズの変更に際してスペースを割り付けするとか考えたらやってられなくなる。
固定レイアウトであればVBが楽、可変のレイアウトであればHTMLが楽だと思います。&lt;/p&gt;

&lt;p&gt;そしてこのレイアウト、および出力データが一体となって、HTMLという文字列で扱うことができます。
古典的にperlのCGIを作る場合はこの出力HTMLを動的に書きだす文字列操作に終始しますし、
JavaだとJSPなどのテンプレートエンジンの類、つまるところ、HTMLの可変データ部分だけ虫食い状態にしたものを用意して、
そこにデータを埋め込むという方式を用いることになります。（実際には表を出力したりする場合の繰り返し処理などもある）&lt;/p&gt;

&lt;p&gt;これらの処理は、複雑な論理演算を伴わないので、アルゴリズムを考えるという技能があまりなくとも一応形になるものを作れる。
この&lt;strong&gt;敷居の低さ&lt;/strong&gt;は確かで、経験3ヵ月の新人でもできるというのは本当です。&lt;/p&gt;

&lt;p&gt;Webシステムはことさら初級者に仕事をさせてシステムを作ると言うことがされているように思います。
&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/05/10/137150.aspx"&gt;
静的オブジェクト指向は設計者が苦労を背負込むシステム&lt;/a&gt;で挙げた
「Javaの静的オブジェクト指向というのは将軍の力でもって、初心者の大隊を常勝させるための技術」というのは
特にこうしたWebシステムの開発現場では身に染みて思うところです。
まともなGUIプログラミングとかだと初級者にやらせられる仕事なんて本当に少ない。&lt;/p&gt;

&lt;h4&gt;熟練するには幅広い知識が必要とされる&lt;/h4&gt;

&lt;p&gt;大規模なWebシステムというのは、とりあえず仕事をさせるとした場合のボーダーとなる技能は低いのですが、
熟練するためには非常に幅広い知識が要求されます。&lt;/p&gt;

&lt;p&gt;&lt;ul&gt;
&lt;li&gt;HTMLの構造
&lt;li&gt;CSSの知識
&lt;li&gt;UIデザイン論
&lt;li&gt;JSPなどのテンプレートエンジンの動作原理
&lt;li&gt;タグライブラリ・EL式の知識
&lt;li&gt;JavaScriptの技能
&lt;li&gt;AJAXの動作原理
&lt;li&gt;HTTPのプロトコルについての知識
&lt;li&gt;Cookieを用いたセッション管理の仕組み
&lt;li&gt;SSLによる暗号化通信の仕組み
&lt;li&gt;Strutsなどのフレームワークを用いる場合はその動作原理
&lt;li&gt;O/Rマッピング
&lt;li&gt;DIコンテナ
&lt;li&gt;RDBMSの知識
&lt;li&gt;バックアップなど運用についての考慮
&lt;li&gt;ロードバランサなどの理解
&lt;li&gt;システムの多重化についての知識
&lt;li&gt;セキュリティに対する知識(XSSやSQLインジェクションなどのアタックへの対処など)
&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;h4&gt;ポストWebシステム&lt;/h4&gt;

&lt;p&gt;Webシステムの開発をしていれば、こんなやり方はいつまでも使えるもんじゃないというのは感じていることでしょう。
ブラウザ戦争の頃の不発弾のようなデファクトスタンダードなHTMLの仕様といい、
文字コードなんぞ考慮されていないHTTPの古めかしい仕様といい、
Webシステムに精通すればするほど、不安定な土台に乗せられた危ういシステムということが見えてくる。&lt;/p&gt;

&lt;p&gt;世紀が変わった頃にはリッチクライアントと言うことが盛んに言われ始めて、
Webシステムのプアなユーザビリティはどうにかしないといけないという問題意識が高まっていきました。&lt;/p&gt;

&lt;p&gt;しかし、そもそもがブラウザというものはPCへの標準搭載がほぼ100%という土壌があります。
新しいプラットホームを作るにあたって、この壁は大きな壁となります。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://enterprise.watch.impress.co.jp/cda/infostand/2008/05/19/12944.html"&gt;
SunがJavaFXロードマップ発表&lt;/a&gt;というニュースが出ていましたが、ここにきてリッチクライアントの
プラットホームはAIR、Silverlight、JavaFXという3者に絞られてきた感があります。&lt;/p&gt;

&lt;p&gt;AdobeのAIRはFlushなどの技術がベースにあります。Flushの普及率は高く、
当blogのGoogle Analyticsでの解析を見ると97%ほどになります。&lt;/p&gt;

&lt;p&gt;Silverlightのサポート環境は調べる手立てが思いつかないのですが、当blogのGoogle Analyticsでの解析では&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;OS&lt;/th&gt;&lt;th&gt;ブラウザ&lt;/th&gt;&lt;th&gt;%&lt;/th&gt;&lt;th&gt;Silverlight&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Windows&lt;/td&gt;&lt;td&gt;Internet Explorer&lt;/td&gt;&lt;td&gt;50.34%&lt;/td&gt;&lt;td&gt;○&lt;/td&gt;&lt;/p&gt;
&lt;tr&gt;&lt;td&gt;Windows&lt;/td&gt;&lt;td&gt;Firefox&lt;/td&gt;&lt;td&gt;33.94%&lt;/td&gt;&lt;td&gt;○&lt;/td&gt;&lt;/p&gt;
&lt;tr&gt;&lt;td&gt;Windows&lt;/td&gt;&lt;td&gt;Opera&lt;/td&gt;&lt;td&gt;4.06%&lt;/td&gt;&lt;td&gt;×&lt;/td&gt;&lt;/p&gt;
&lt;tr&gt;&lt;td&gt;Macintosh&lt;/td&gt;&lt;td&gt;Firefox&lt;/td&gt;&lt;td&gt;3.54%&lt;/td&gt;&lt;td&gt;○&lt;/td&gt;&lt;/p&gt;
&lt;tr&gt;&lt;td&gt;Macintosh&lt;/td&gt;&lt;td&gt;Safari&lt;/td&gt;&lt;td&gt;3.45%&lt;/td&gt;&lt;td&gt;○&lt;/td&gt;&lt;/p&gt;
&lt;tr&gt;&lt;td&gt;Linux&lt;/td&gt;&lt;td&gt;Firefox&lt;/td&gt;&lt;td&gt;1.87%&lt;/td&gt;&lt;td&gt;×&lt;/td&gt;&lt;/p&gt;
&lt;/table&gt;

&lt;p&gt;となっていますから、サポートされる環境の91.27%より少ない程度がSilverlightが動作する可能性があります。&lt;/p&gt;

&lt;p&gt;…。というか、この数字えらく偏っていませんか？いくら技術系のblogだからってFirefoxのシェアが40%あるってどうなんだ。
OSもWindowsが89.41%でMacintoshが7.19%もあるし…。なんかあまり信用できる数字ではないですね…。
母集団が凄く偏っているような気がする。&lt;/p&gt;

&lt;p&gt;JavaFXは当然Javaベースの技術です。当blogのGoogle Analyticsでの解析ではJavaのサポートが95.41%となっています。
これからいくらか割り引いた程度が動作環境と考えられますね。&lt;/p&gt;

&lt;h4&gt;ポストWebシステムに求められるもの&lt;/h4&gt;

&lt;p&gt;前述のようにデータは怪しいものの、3者はかなりの割合で動作することが見込まれます。
移行の為の下地は整いつつあると言えるでしょう。&lt;/p&gt;

&lt;p&gt;機能的には古典的なHTMLによるWebシステムと違い、非同期通信がサポートされますし、アニメーションを伴う
かなり高度なUIを用いることができることがウリです。かなりのユーザビリティ向上が望めます。&lt;/p&gt;

&lt;p&gt;そして、これらのより高機能で複雑になったシステムを、より簡単に開発できる必要性があります。
開発費が高沸してシステム開発の敷居が上がるなんてことでは、普及は難しいでしょう。&lt;/p&gt;

&lt;p&gt;私は最近Flex/AIRのシステムを作っていたりするのですが、高度なUIが容易に作成できるようにとの
工夫が随所に見られます。このあたりの感触からも、そろそろリッチクライアント時代が来るな、という手ごたえを感じます。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/138721.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>静的オブジェクト指向は設計者が苦労を背負込むシステム</title><link>http://blogs.wankuma.com/nagise/archive/2008/05/10/137150.aspx</link><pubDate>Sat, 10 May 2008 13:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/05/10/137150.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/137150.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/05/10/137150.aspx#Feedback</comments><slash:comments>133</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/137150.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/137150.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/minekoa/20080508"&gt;
みねこあさんのところ&lt;/a&gt;で挙がっていた、
静的オブジェクト指向と動的オブジェクト指向の軽さについての話題から。&lt;/p&gt;

&lt;h4&gt;Javaは経済的事情をうまく捉えて普及した&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/08/03/88626.aspx"&gt;
プログラミングの効率と経済&lt;/a&gt;で書いているとおり、大量生産フェーズにおいては
&lt;strong&gt;「一部のプロフェッショナルと多数の凡庸なプログラマという取り合わせ」&lt;/strong&gt;で開発することで
その費用を抑えるということが行われます。&lt;/p&gt;

&lt;p&gt;こうすることで、一定の品質のものを低価格で提供できるわけですが、現行のJavaEEでのWebシステムと
いうものは正にこのような体制で製造されているということも、多くの人が認めるところでしょう。
これはバベッジ的な分業効果
&lt;span class="footnote"&gt;&lt;a href="#f1" name="fn1"&gt;*1&lt;/a&gt;&lt;/span&gt;
というもので、とりたてて目新しい話題ではないですが、
JavaによるWebシステムが流行ったのは、こうした経済的側面からして都合がよかったという点が大きいと思います。&lt;/p&gt;

&lt;p&gt;要するにJavaというのは登場した&lt;strong&gt;1996年当時の肥大化しつつあるシステムを
いかに経済的に製造するかという点で答えを与えた言語&lt;/strong&gt;であり、
こうした経済的視点がJavaの普及の原動力のひとつであったと言えましょう。
事実、MicroSoftはJavaの改造版を作りWindows開発に利用しようとしましたし(J++ 1997年)、
ライセンス上のトラブルがなければC#(2002年)を作る必要はなく、J++がその役割を担っていたことでしょう
&lt;span class="footnote"&gt;&lt;a href="#f2" name="fn2"&gt;*2&lt;/a&gt;&lt;/span&gt;。&lt;/p&gt;

&lt;p&gt;Java以前からオブジェクト指向が存在したことは周知の通りだし
&lt;span class="footnote"&gt;&lt;a href="#f3" name="fn3"&gt;*3&lt;/a&gt;&lt;/span&gt;、
Javaによってオブジェクト指向が広く使われることになったのもまた周知の通りです。
しかし、なぜ、Javaがオブジェクト指向を普及できたのか。
私が思うに、&lt;strong&gt;javaのオブジェクト指向がクラスの設計者と利用者の間のスキルの差を
バベッジ的分業効果で肯定した&lt;/strong&gt;からではないでしょうか。&lt;/p&gt;

&lt;p&gt;というのは、Javaの静的オブジェクト指向というのは、&lt;strong&gt;クラスを設計する側の立場に立つと
非常に苦労するものなのですが、クラスを使う側には非常に楽&lt;/strong&gt;なものなのです。
Java界隈で仕事をする会社の新人教育は、この「クラスを使うことができる」レベルまで
到達出ていればよいとされていると言って過言ではないでしょう。&lt;/p&gt;

&lt;p&gt;この、苦労をクラスの設計者に一身に背負わせたという点で、Javaの静的オブジェクト指向は
多数の凡庸な技術者を用いて開発を仕切らなければならないアーキテクト（先に言った設計者）の支持を得、
スペシャリストが作り上げたクラス群を使うだけという凡庸なプログラマ（先に言った利用者）にも
また支持されたのです。&lt;/p&gt;

&lt;p&gt;JavaやC#といった静的型付けのオブジェクト指向言語はまさにこのような環境下で多く活用されていますね。&lt;/p&gt;

&lt;h4&gt;初級者と中級者の間の壁&lt;/h4&gt;

&lt;p&gt;しかし、これはスペシャリストである設計者と凡庸な実装者の間に厚い厚い壁を作ることとなりました。
Javaはコーディングができるという初級者と、プログラミングができるという中級者の間に大きな壁があります
&lt;span class="footnote"&gt;&lt;a href="#f4" name="fn4"&gt;*4&lt;/a&gt;&lt;/span&gt;。
たどたどしいながらも、条件分岐とループを操り業務ロジックを実装するというレベルへは容易に到達できるが
そこから思った通りにプログラムを作れるまでの間が遠く、人がどんどん供給されてなお「人材」は
不足していると言われ続けるのは、この壁を越えて中級者となれる技術者の少なさを物語っているとも言えましょう。&lt;/p&gt;

&lt;p&gt;多分、その初心者と中級者とのあいだの落差が、LLと呼ばれる言語、つまるところ動的オブジェクト指向言語では
なだらかな斜面となっているのではないでしょうか。
それが、動的オブジェクト指向の「軽さ」のひとつではないでしょうか。
教育的な意味で、なだらかなステップアップが望めるのがLLではないでしょうか。&lt;/p&gt;

&lt;p&gt;さて、Javaで言ったクラスを利用できる初級者とクラスを作れる中級者・上級者との間の壁ですが、
これは、クラスの使い手が楽をできる分の揺り戻しというか、反作用と言うか、そうした類のものです
&lt;span class="footnote"&gt;&lt;a href="#f5" name="fn5"&gt;*5&lt;/a&gt;&lt;/span&gt;。
より&lt;strong&gt;使い手に優しいクラス設計にしようとすればするほど、クラスを作る段で苦労が増える&lt;/strong&gt;のです。
この初級者の苦労を中級者以上が代わりに背負うというシステムが、初級者と中級者の隔たりを大きくしている。&lt;/p&gt;

&lt;p&gt;しかし、クラスというのは作るよりも使う方が回数が多いのが通常ですから、作る側に労力を持ってくるというのは
非常に合理的で、うまく設計されたクラスと言うのはその使用に際して間違えることができない
&lt;span class="footnote"&gt;&lt;a href="#f6" name="fn6"&gt;*6&lt;/a&gt;&lt;/span&gt;。
ヒューマンエラーを機械的に排除した作りにすることができるのです。
これが、静的オブジェクト指向言語の何よりもの魅力なのです。&lt;/p&gt;

&lt;p&gt;逆に動的オブジェクト指向言語によるプログラミングは、初級者の苦労分まで中級者以上が背負うという責務が軽い。
これが、動的オブジェクト指向のもうひとつの「軽さ」ではないでしょうか。
他人の荷物を背負って山に登る必要がない。&lt;strong&gt;持つのは自分の手荷物だけでいい&lt;/strong&gt;のです。&lt;/p&gt;

&lt;p&gt;反面、動的オブジェクト指向言語のクラスライブラリの利用は静的オブジェクト指向言語でのそれに比べ
重いように私は感じるのです
&lt;span class="footnote"&gt;&lt;a href="#f7" name="fn7"&gt;*7&lt;/a&gt;&lt;/span&gt;。
自分で作ったクラスを自分で使う分には、両方とも自分ですからその重さはあまり気にならないかもしれない。
しかし、初級者を多数率いて行うような規模感の開発ではその重さが強く出てくるように思います。&lt;/p&gt;

&lt;h4&gt;それぞれの適所とは&lt;/h4&gt;

&lt;p&gt;つまり、LLというのは上級者であるスペシャリストが、多数の初心者を率いて巨大なシステムを作る
ということを行うには向かないが、&lt;strong&gt;中級者以上が集まったチームでは非常に手軽にサービスインまで
こぎつけることができる&lt;/strong&gt;のではないでしょうか。
ネットで話題に上がるような面白いサービスというのは正にこうしたチームによって作られていると思います。
手早くプロトタイピングし、その使い心地を評価するのに非常に向いている。&lt;/p&gt;

&lt;p&gt;逆にJavaのような静的オブジェクト指向といのは&lt;strong&gt;初心者の軍を率いて戦うには向いている&lt;/strong&gt;と思います。
業務用システムのような、大量の仕様を人海戦術で捌かなければならない状況によくマッチする。
ただし、これは軍を率いる将軍の采配が非常に重要であることをも意味しています。
上が荷物を持ってくれるからこそ一兵卒は軽い荷物で行軍できる。
上が荷物の持ち方を知らないなら、兵は生きて帰れぬ戦線で戦わされることになる。&lt;/p&gt;

&lt;p&gt;この責任の重さがJavaのオブジェクト設計の重さです。
しかし逆に、そこでさえうまくやれば、全軍を勝利に導けるという意味でもある。
Javaの静的オブジェクト指向というのは&lt;strong&gt;将軍の力でもって、初心者の大隊を常勝させるための技術&lt;/strong&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;静的言語の制約の多さは、制約される側の立場、つまるところ淡々と実装作業をする側としては
わずらわしいものであると思うかもしれません。
それらを統括して管理しなければならない側に回ると、これほど統治に便利なものはない。
Java開発者では設計の自由を手にできている開発者は少ないと思います。
日々、降りてくる仕様書を淡々とコードにし、テストするような人員が大量動員されている。
彼らには多くの能力は求められません。つまり、簡単な重労働なのです
&lt;span class="footnote"&gt;&lt;a href="#f8" name="fn8"&gt;*8&lt;/a&gt;&lt;/span&gt;。&lt;/p&gt;

&lt;p&gt;Javaでの開発を生業として、&lt;strong&gt;設計の自由を手に入れて楽しい開発をしたいのであれば、
どうにかして初級者の荷物を持つ力を手にしないといけない&lt;/strong&gt;
&lt;span class="footnote"&gt;&lt;a href="#f9" name="fn9"&gt;*9&lt;/a&gt;&lt;/span&gt;。&lt;/p&gt;

&lt;h4&gt;静的オブジェクト指向言語の軽さ&lt;/h4&gt;

&lt;p&gt;静的オブジェクト指向での設計に慣れた者は、たとえ一人でプログラミングするとしても、
クラスを使う側というのは初心者であろうと失敗することができないという設計にしてしまう。
これは、神経質すぎるように思うかもしれません。
しかし、この神経質とも思えるクラス設計が、&lt;strong&gt;クラスを使う側に自身が回った時に幸せへと変わる&lt;/strong&gt;のです。
つまり、自分自身さえも、クラスを使う側に回ったならば初心者のレベルまで脳みそを手抜きすることが
できるというわけです。これが静的オブジェクト指向でのプログラミングの軽さなのです
&lt;span class="footnote"&gt;&lt;a href="#f10" name="fn10"&gt;*10&lt;/a&gt;&lt;/span&gt;。&lt;/p&gt;

&lt;p&gt;静的オブジェクト指向の理想は、&lt;strong&gt;コンパイルが通った時点でバグがなくなっていること&lt;/strong&gt;です
&lt;span class="footnote"&gt;&lt;a href="#f11" name="fn11"&gt;*11&lt;/a&gt;&lt;/span&gt;。
その強い型付けを最大限に生かし、間違えることができない型設計をすることが、後の生産性を高めます。
だから、クラスの設計が終わってしまえば、そのクラスについて&lt;strong&gt;忘れることが許される&lt;/strong&gt;。
強い型システムがクラスの使い方を導出してくれます。導かれるままに使うだけでいい。
私がJavaで大量にロジックを書くことができる理由は、効率よく忘れることが許されているからに他なりません。
俯瞰視点で設計するときは細部を見ることはないし、細部を作るときには全体を見ることはない。&lt;/p&gt;

&lt;p&gt;一度に大量にプログラミングすると自分でプログラムしたことさえ忘れてしまうことがあるぐらいに
&lt;span class="footnote"&gt;&lt;a href="#f12" name="fn12"&gt;*12&lt;/a&gt;&lt;/span&gt;、
型を境目とする「契約に基づくプログラミング」は思考を分断することができるのです。
型が契約を分かりやすくし、保証をしてくれる。
契約は確かに面倒臭い。ダックタイピングは慣行に基づき契約書なしでの契約締結で楽なのですが、
逆にそれゆえに契約そのものが曖昧であやふやな感じが私は嫌なのです。&lt;/p&gt;

&lt;h4&gt;注釈&lt;/h4&gt;

&lt;p&gt;&lt;a href="#fn1" name="f1"&gt;*1&lt;/a&gt;
 &lt;a href="http://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%83%BC%E3%83%AB%E3%82%BA%E3%83%BB%E3%83%90%E3%83%99%E3%83%83%E3%82%B8"&gt;
チャールズ・バベッジ&lt;/a&gt;(Charles Babbage、1791 - 1871)&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn2" name="f2"&gt;*2&lt;/a&gt;
 J++で作られたMFCのアプリケーションはMS製のJavaVMでしか動作しない。
これはJavaの世界を二つに分断することになるとJavaのコミュニティは考え反発しました。
Javaのライセンスを持つSunとの訴訟となったが、別にSunだけが反発したわけではありません。&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn3" name="f3"&gt;*3&lt;/a&gt;
 JavaはSmalltalkやC++のオブジェクト指向の機構を参考にしています。&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn4" name="f4"&gt;*4&lt;/a&gt;
 目的を適える為の方法論を考えられる/られないという区切りでプログラミング/コーディングと
用語を使い分けています。自分のやりたいことを自分で考えてコードにできるようになって
初めてプログラミングと言えると思います。&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn5" name="f5"&gt;*5&lt;/a&gt;
 誰かの楽のためには誰かが苦労をすることになる…&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn6" name="f6"&gt;*6&lt;/a&gt;
 ただし、中級者の頃には、そのクラスの使用頻度・重要性に比べて凝りすぎたオーバースペックな
設計にしてしまいがち。でも、そうやって工夫を自分の手でやってみて設計を覚えていくのだから
教育的な視点では暖かく見守りつつ、バランス感覚を身につけるように諭さなければなりません。&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn7" name="f7"&gt;*7&lt;/a&gt;
 デバッグが困難なバグのひとつに、異常データがどこからともなく紛れ込むというのがあります。
ソースの流れを追うのに比べ、データの流れを追うのは難しい。
(&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/08/20/91054.aspx"&gt;
Objectよ、汝の出自を示せ&lt;/a&gt;を参照)
動的オブジェクト指向言語で私が一番不安になるのは、オブジェクトの動的さゆえに、この手のバグに
遭遇するのではないかという不安です。&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn8" name="f8"&gt;*8&lt;/a&gt;
 ニコニコ動画で知られる、ドワンゴが2ちゃんねるで求人をした際のフレーズ。
&lt;a href="http://www.itmedia.co.jp/news/articles/0803/12/news131.html"&gt;ITmediaの記事&lt;/a&gt;を参照のこと&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn9" name="f9"&gt;*9&lt;/a&gt;
 設計をする自由を手に入れるとIT業界は俄然楽しくなります。技術職の本懐でしょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn10" name="f10"&gt;*10&lt;/a&gt;
 情けは人の為ならず。使いやすいクラス設計を呼吸をするように無意識に出来るところまで
プログラミング能力を鍛えると静的オブジェクト指向の方が楽になると私は思います。&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn11" name="f11"&gt;*11&lt;/a&gt;
 実際、業務ロジックなどの単純なものであれば1000行程度なら、2～3時間ぐらいでがーっと書いて
コンパイルを通した後に2割ぐらいは1発動作します。
動作させて若干の修正というのがほとんどで、1、2回の確認でプログラミングが完了。
ただし複雑なロジックは流石にそうもいかず、JUnitのテストなどを使いつつ動かしながら完成させます。&lt;/p&gt;

&lt;p&gt;&lt;a href="#fn12" name="f12"&gt;*12&lt;/a&gt;
 &lt;a href="http://blogs.wankuma.com/nagise/archive/2007/10/10/101128.aspx"&gt;
小人さんとの出会い方&lt;/a&gt;を参照&lt;/p&gt;

&lt;h4&gt;追記&lt;/h4&gt;

&lt;p&gt;トラックバックできないとの問い合わせがありましたので、その点について追記しておきます。&lt;/p&gt;

&lt;p&gt;わんくまblog全体に言えることですが、トラックバックが分かりにくくなっているかと思います。
（自分も昔、わんくまblogにトラックバックを送ろうとして失敗したことがあります。）&lt;/p&gt;

&lt;p&gt;わんくまでは.Textというblogツールを使っているようで、挙動は.Textの使用に準じます。
また、スパムが多いらしく、厳しめにスパムキーワードを設定しているようで、リンクを書けないなど不便をおかけしています。
管理人に代わりお詫び申し上げます。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://itkz.blogspot.com/2008/05/2ch-8-8-2-itmedia-2ch-2ch-2ch-webdb.html"&gt;2ch 求人就職者の実状&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/137150.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>「ITゼネコンをぶっつぶせ」レポート</title><link>http://blogs.wankuma.com/nagise/archive/2008/05/02/136149.aspx</link><pubDate>Fri, 02 May 2008 14:17:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/05/02/136149.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/136149.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/05/02/136149.aspx#Feedback</comments><slash:comments>56</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/136149.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/136149.aspx</trackback:ping><description>&lt;p&gt;日本Javaユーザグループ主催で、クロスコミュニティカンファレンス(CCC)が、4/30日に行なわれました。
この稿ではそのうち「ITゼネコンをぶっつぶせ」というBOFについてレポートおよび考察となります。 
講演者はSeasarの開発者として著名なひがやすを氏。会場は立ち見が出るほどの盛況ぶりでした(100人以上はいたと思われる)。&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://d.hatena.ne.jp/higayasuo/20080416/1208328789"&gt;
ITゼネコンをぶっつぶせ - ひがやすをblog&lt;/a&gt;&lt;br&gt;
&lt;a href="http://d.hatena.ne.jp/higayasuo/20080418/1208485137"&gt;
ITゼネコンを倒す方法をみんなで考えよう - ひがやすをblog&lt;/a&gt;&lt;br&gt;
&lt;a href="http://d.hatena.ne.jp/higayasuo/20080501/1209636051"&gt;
プログラミングファースト開発 - ひがやすをblog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;セッション資料はそのうち公開されるのではないかと思います。&lt;/p&gt;

&lt;p&gt;本セッションはITゼネコンの問題点をまず挙げ、ひがやすを氏の考える打開案であるところの
「プログラミングファースト開発」についてのプレゼンといった流れ。&lt;/p&gt;

&lt;p&gt;残念なのはひがやすを氏が契約の部分に対して解をもっていなかったという点ですね。
セッション最後に「最大の弱点が契約」とおっしゃっていました。
まさにその点を克服しないことにはITゼネコンが変わることが出来ない。
このあたりについては手前味噌ではありますが以下の考察も参考にして貰えると幸いです。&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://d.hatena.ne.jp/Nagise/20071109"&gt;
SIerをカモに金を稼ぐ方法　- プログラマーの脳みそ&lt;/a&gt;&lt;br&gt;
&lt;a href="http://d.hatena.ne.jp/Nagise/20071128"&gt;
技術を持たない人で金を稼ぐシステム　- プログラマーの脳みそ&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;ITゼネコンよ、仕事しろ&lt;/h4&gt;

&lt;p&gt;序盤、ITゼネコンの問題については、「上流指向型」と「全丸投げ型」が例示されました。
全丸投げ型は論外として、上流指向というのも結局のところ、相応の仕事ができていないじゃないか、
という点が不満のポイントですよね。開発ができないのに設計するなんて無謀な話。&lt;/p&gt;

&lt;p&gt;相応の仕事をした上で、相応の金を取るなら別に文句を言われる筋合いはない。
そうした点で、共通して言えることは「ITゼネコンよ、仕事しろ」ということでしょう。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/04/17/133590.aspx"&gt;
「ひがやすを BOF ITゼネコンをぶっつぶせ」 に期待 - 凪瀬blog&lt;/a&gt;
のコメント欄にてメインフレームの話がでています。
メインフレームのような大手でしか扱えないものを扱って金を取るというのは相応の仕事でしょうし、
そういった仕事をやることに対して批判するものではありません。&lt;/p&gt;

&lt;p&gt;しかし、オープン系の開発では「資本力を持つ」以上の仕事が出来ていないITゼネコンもある。
そうした仕事はしないのに高利であがりを攫っていくというやり口は批判されるべきだし、
「ITゼネコンをぶっつぶせ」の対象そのものなわけですね。&lt;/p&gt;

&lt;p&gt;また、&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/04/20/134023.aspx"&gt;
システム開発が資本力で効率化できない理由 - 凪瀬blog&lt;/a&gt;
では、IT業界の大手はその資本をうまく活用できていないと指摘しました。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/08/14/90258.aspx"&gt;
大規模システムの設計 - 凪瀬blog&lt;/a&gt;
で取り上げた事項ですが&lt;/p&gt;
&lt;p&gt;&lt;blockquote&gt;
    システム開発のコストに一番大きく影響するのはステップ数です。&lt;br&gt;
    （中略）&lt;br&gt;
    次にコストに影響するのは開発に関わる人員の質だ、とジェラルド・ワインバーグ氏が論文で述べています。&lt;br&gt;
    このあたり、詳しくは ソフトウェアエンジニアリング論文集80'sで読むことが出来ます。
&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;と、30年前の論文ですでに開発のコストを下げたければ人の質を高めろと指摘されているのです。&lt;/p&gt;

&lt;p&gt;そして、開発者の賃金は、能力による生産性の向上に対してゆるやかな上昇しかしない、
逆にいえば能力に見合った賃金が払われていないため、常に一番能力のある人を高い賃金で雇うことが
最善だということも書かれています。&lt;/p&gt;

&lt;p&gt;人を育てて金額相応の仕事をしろ。これに尽きるかと思います。&lt;/p&gt;

&lt;h4&gt;プログラミングファースト開発&lt;/h4&gt;

&lt;p&gt;プログラミングファースト開発がいかなるものか、ということについてはひがやすを氏がblogで解説しているので
そちらを見て頂くのが一番でしょう。&lt;/p&gt;

&lt;h4&gt;既存の標準とどう向かい合っていくのか&lt;/h4&gt;

&lt;p&gt;質問で上がった気になるキーワードに「共通フレーム」というものがありました。
これは社団法人日本電気計測器工業会（JEMIMA）の規定する
&lt;a href="http://www.jemima.or.jp/info/galaxy/94-99/body/frame.html"&gt;
共通フレーム&lt;/a&gt;のことのようですね。&lt;/p&gt;

&lt;p&gt;こういったやり方を基準としている場合、どうやってその壁を破るかというのは大きな課題と言えましょう。
会場での質問と似たような指摘が他にもあり
&lt;a href="http://d.hatena.ne.jp/andalusia/20080423"&gt;
ITゼネコンは永遠に不滅、か？ - andalusiaの日記&lt;/a&gt;
では経済産業省の「システム管理基準」(
&lt;a href="http://www.meti.go.jp/policy/netsecurity/downloadfiles/system_kanri.pdf"&gt;
PDF文書&lt;/a&gt;)を取り上げて、&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
    ＩＴ全般統制という黒船が到来しようとしている今、おおっぴらに「プログラム設計書を書かない！」なんてことは、
    多分上場企業の役員さんは言えないでしょう。
    なにしろ、向こうには経済産業省謹製の「錦の御旗」があるのですから。
    残念ながら、滝派(*1)管理脳が官軍で、アジャイラーは賊軍(*2)なのです。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;という考察をしています。
最もこのシステム管理基準についてはその文章の中で&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
    システム管理基準は、本管理基準と姉妹編をなすシステム監査基準に従って監査を行う場合、
    原則として、監査人が監査上の判断の尺度として用いるべき基準となる。
    ただし、組織体が属する業界又は事業活動の特性等を考慮して、必要ある場合には、
    本管理基準の主旨及び体系に則って、該当する関係機関などにおいて、独自の管理基準を策定し活用することが望ましい。
    また、時々の関連技術動向、関連法令、及び社会規範などを考慮し、それらを反映した
    詳細なサブコントロール項目を策定することが望ましい。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;と、そのまま使うのではなく必要に応じて独自に策定しろと推奨しているわけで、
この基準に則らないと駄目だ！という代物ではないのですが、そのまま採用している会社であれば
やはりプログラミングファースト開発などの工夫にとっては障害となるのではないでしょうか。&lt;/p&gt;

&lt;h4&gt;オフショアなんてやめてしまえ！&lt;/h4&gt;

&lt;p&gt;ひがやすを氏曰く「オフショアなんてやめてしまえ！」ということなのですが（実際の語感は大分違います。念のため）
その根拠として「&lt;strong&gt;品質向上には垂直統合が効果的&lt;/strong&gt;」という話をしていたのがとても興味深い。&lt;/p&gt;

&lt;p&gt;垂直統合については製造業まわりではよく議論された話題だと思いますが、現状の低品質なソフト開発体制で
水平分散などというのは時期尚早と言えるのかもしれません。&lt;/p&gt;

&lt;p&gt;会場で、オフショアを経験した人に成功した例を聞きましたが、現地の教育も含めた質がその鍵のようにうかがえました。
ただ外に出せばいいというものではない。
また、スケールメリットというのも大きく、50名ぐらいの規模を下回ると採算がとれないのではないかという話も。&lt;/p&gt;

&lt;p&gt;ちなみに、会場でのオフショア事例を経験されている方は7割ほど、
そのうちオフショアの成功事例を経験されている方は2名ほどでした。
いかにオフショア開発を成功させるのが難しいか物語っているように思えます。&lt;/p&gt;

&lt;h4&gt;教育にはペアプログラミングを活用しよう&lt;/h4&gt;

&lt;p&gt;XP(エクストリームプログラミング)が注目された2000年前後にその概念が広まったペアプログラミングですが、
教育的効果が高いということはよく知られているのではないでしょうか。
私も実践経験から、教育手法としては非常に優秀だと捉えています。&lt;/p&gt;

&lt;p&gt;ベテラン - 新人というペアの他に、カテゴリ違いの人材をペアにするというアイデアを紹介していました。
これは面白いアイデアだと思いました。&lt;/p&gt;

&lt;h4&gt;ゲーム業界での事例&lt;/h4&gt;

&lt;p&gt;こうした方法論の実践事例はゲーム業界にあるとのことです。
この手法をSI業界に持ち込む。それがITゼネコンの体質改善のひとつの方策となるかもしれません。&lt;/p&gt;

&lt;p&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;a href="http://d.hatena.ne.jp/higayasuo/20080423/1208922541"&gt;
極力ユニットテストを書かずに品質を確保する方法 - ひがやすをblog&lt;/a&gt;
の手法を考察されているようでした。
テストに関しては多く議論が交わされていましたね。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/136149.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>Javaに恋するスクリプト</title><link>http://blogs.wankuma.com/nagise/archive/2008/04/28/135569.aspx</link><pubDate>Mon, 28 Apr 2008 14:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/04/28/135569.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/135569.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/04/28/135569.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/135569.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/135569.aspx</trackback:ping><description>&lt;p&gt;元ネタは&lt;a href="http://d.hatena.ne.jp/kwatch/20080426/1209230638"&gt; 「怠慢はプログラマの美徳」というけれど&lt;/a&gt;
というエントリ。&lt;/p&gt;

&lt;h4&gt;スクリプト言語はJavaに恋している&lt;/h4&gt;

&lt;p&gt;スクリプト言語はJavaに恋をしているのです。寝ても覚めてもJava、Javaと騒ぎ立てます。
PHPもPythonもRubyも、いつもJavaとの比較を行います。
XXのシステムはPHPだとか執拗にJavaを意識します。君たちはそんなにJavaが好きなのかい？&lt;/p&gt;

&lt;p&gt;JavaはXXでよくないからスクリプト言語であるXXを使いなさい、というプロパガンダ記事をよく見かけます。
対して、こういう理由でJavaを使うべきだ、というプロパガンダ記事は随分と少なくなりました。&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
つうかね、Java がほんとに使いやすくなったら、スクリプト言語なんてイチコロなんだよ。今、スクリプト言語に人気があるのとは対照的に Java に元気がないのは、Java 自身の失態がいちばんの原因だよ、ほんと。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;まるで好きな女の子に相手にされなくて強がって陰口を叩いているかのようです。
Javaはたしかに融通がきかないところもある。変数を扱うたびに型、型、型。
きっちりとしたその性格はキャリアウーマンのごとく。&lt;/p&gt;

&lt;p&gt;対してスクリプト言語は少年のごとく。型なんて面倒なものいらねぇよ。とにかく作ってみようぜ！&lt;/p&gt;

&lt;p&gt;でも、そんなスクリプト言語の憧れの的はやはりJavaなのです。
Javaに対して「俺たちの魅力」をアピールしている。
Javaはすでに確たる地位を手にしているので、わざわざプロパガンダしてまで交際を申し込む必要はないのです。
黙っていても富豪令嬢のようなJavaには言いよる相手ばかりなのですから。&lt;/p&gt;

&lt;p&gt;Javaはもう、シェアを奪いに行く立場ではなくなってしまった。
シェアを取ろうと躍起になる「元気さ」は確かにないかもしれません。&lt;/p&gt;

&lt;h4&gt;怠慢はプログラマの美徳&lt;/h4&gt;

&lt;p&gt;&lt;blockquote&gt;
Java 屋とスクリプト言語屋の間には、「めんどくさい」と感じるセンスについて超えられない壁が存在している。&lt;br&gt;
&lt;br&gt;
本質的でない事柄に関する記述があったときに、スクリプト言語屋は「めんどくさい」と感じ、Java 屋はそれを感じないか、または「これは必要な冗長性だ」と本気で思い込んでいる。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;ここで重要なのは「本質的でない事柄に関する記述」とは何かという点です。
Java屋が言う「必要な冗長性」がスクリプト言語屋の前提の下では無意味で面倒くさいものである、
というのが実態でしょう。&lt;/p&gt;

&lt;p&gt;スクリプト言語というのはフットワークの軽さが売りで、ちょっとしたアイデアをすぐに形にするには都合がよい。
反面、刹那的な代物で、保守性に乏しく、巨大で複雑なシステムを構築する言語としては適さない代物です。
世の中もそれが分っていて、スクリプトに都合のよい仕事はスクリプトで行うし、
重厚長大なシステムはJavaなどの巨大建築向けに設計された静的言語を用いるのが通例です。&lt;/p&gt;

&lt;p&gt;これらの適用箇所の違いは、さまざまな前提の違いを生み出します。
小規模なソースコードではデメリットにならないことが、大規模になると無視できなくなったりするわけです。&lt;/p&gt;

&lt;p&gt;その点を隠してスクリプト言語はいいよ！というのはプロパガンダか、無知かのいずれかでしょう。&lt;/p&gt;

&lt;h4&gt;怠惰のセンス&lt;/h4&gt;

&lt;p&gt;さて、前置きが長くなりましたが、スクリプト屋とJava屋の怠惰のセンスの違いについて見てきましょう。
あらかじめ断わっておきますが、壁ではなく方向性の違いなのです。
どちらかが優れているというものではありません。&lt;/p&gt;

&lt;p&gt;スクリプト言語は手軽さを売りにしています。手軽であることが正義という世界ですから、
怠惰の方向性もまた、記述の手軽さといった方向に向かいます。&lt;/p&gt;

&lt;p&gt;そのため型推論を好みます。プロトタイプベースのオブジェクト指向を好みます。
勢いで作って、さくさく動かすことを掲げ、その障壁となるものを排除するように怠惰であろうとします。&lt;/p&gt;

&lt;p&gt;IDEなど使いません。高機能な統合IDEは起動に時間がかかります。ちょっとしたソースを書くのに
そんなものを使ってられない。ちょっとしたテキストエディタにシンタックスハイライトの機能があれば十分。
デバッグは動かしながらやればいいのです。まずは動かすまでが楽であること。それがスクリプト屋の怠惰のセンスです。&lt;/p&gt;


&lt;p&gt;Java屋は堅牢さを重視します。何千というクラスを取りまとめ、何十万行というソースを統括し、
基幹システムとして鎮座する機能を作り上げる使命を背負っているからです。&lt;/p&gt;

&lt;p&gt;Java屋の怠惰のセンスは重厚長大なシステムを設計・製造・運用・保守していくための怠惰です。
静的な強い型付けを好みます。変数を扱うたびに型、型、型。
しかし、そうすることでコンパイルの段階で、システムを動かすまでもなくバグを取り除けるのです。
Java屋の望む怠惰はそういう怠惰です。そしてそのための面倒は大事の前の小事にすぎないと考えます。&lt;/p&gt;

&lt;p&gt;「Write once, run anywhere」という合言葉はJava屋の怠惰の一端を表しています。&lt;/p&gt;

&lt;p&gt;高機能なIDEを日常的に使います。テキストエディタでプログラムなんて書く気も起きません。
&lt;a href="http://blogs.wankuma.com/nagise/archive/2007/11/14/108284.aspx"&gt;EmacsでJavaを書いてはいけない&lt;/a&gt;
とEmacsの開発をしたジェームス・ゴスリン氏が語っているぐらい（彼はJavaの生みの親でもある）。
起動時間が長い？朝にIDEを起動して一日中使うのだからなんら気になりません。&lt;/p&gt;

&lt;h4&gt;Java6でスクリプト呼び出しができるようになった理由&lt;/h4&gt;

&lt;p&gt;Javaのような静的言語とスクリプト言語は、そもそもターゲットが違っているのです。
Javaに恋してJavaの領分をスクリプト言語で行おうとする人もいることでしょう。
でも、うまくいっていますか？もはやJavaは空気のように当たり前に基幹システム使われています。
スクリプト言語がそれを置き換える日はこないことでしょう。&lt;/p&gt;

&lt;p&gt;逆にJavaがスクリプト言語の代わりになるのであれば、そもそもスクリプト言語が生まれ来ることもない。
「つうかね、Java がほんとに使いやすくなったら、スクリプト言語なんてイチコロなんだよ。」
というのは、スクリプト言語の領分をJavaで代替えできるならという話。
そう、Javaはスクリプト言語の代わりにならない。逆にスクリプト言語もJavaの代わりにならない。&lt;/p&gt;

&lt;p&gt;そこで適材適所たるこれらを連携する機能性を、ということでJava6.0から追加になったのが
&lt;a href="http://java.sun.com/javase/ja/6/docs/ja/api/javax/script/package-summary.html"&gt;
javax.scriptパッケージ&lt;/a&gt;なわけです。&lt;/p&gt;

&lt;p&gt;Javaに恋するスクリプト言語には、JRubyやJythonといったようにJavaVM上で動くように
Javaのバイトコードを書き出すようなアプローチを試みたものもあります。&lt;/p&gt;

&lt;p&gt;それとはまた違った方法で、Javaとスクリプト言語はうまくその長所を生かせる
土台ができてきたということなのです。&lt;/p&gt;

&lt;p&gt;果たしてスクリプト言語のアプローチはJavaに届いたかのように見えます。
この先、その仲がうまくいくのかどうかは注目していきたいところですね。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/nagise/aggbug/135569.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>凪瀬</dc:creator><title>システム開発が資本力で効率化できない理由</title><link>http://blogs.wankuma.com/nagise/archive/2008/04/20/134023.aspx</link><pubDate>Sun, 20 Apr 2008 21:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/nagise/archive/2008/04/20/134023.aspx</guid><wfw:comment>http://blogs.wankuma.com/nagise/comments/134023.aspx</wfw:comment><comments>http://blogs.wankuma.com/nagise/archive/2008/04/20/134023.aspx#Feedback</comments><slash:comments>179</slash:comments><wfw:commentRss>http://blogs.wankuma.com/nagise/comments/commentRss/134023.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/nagise/services/trackbacks/134023.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://blogs.wankuma.com/nagise/archive/2008/04/17/133590.aspx"&gt;
「ひがやすを BOF ITゼネコンをぶっつぶせ」 に期待&lt;/a&gt;にて&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
技術力のあるところがプロジェクトを統括すれば、安く、早く、良いものを作ることができる。これは、技術を売り物に独立起業している人間であれば多くが「うちにやらせてくれるなら出来る」と言うことでしょう。この点はさしたる問題ではない。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;などと言ったわけなのですが…。この点、IT業界特有のものでしょう。&lt;/p&gt;

&lt;h4&gt;IT業界には設備がいらない&lt;/h4&gt;

&lt;p&gt;IT業界特有、というのはシステム開発において「設備」というものが重視されない点です。&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;/p&gt;

&lt;h4&gt;大資本が生き残るために選んだことは&lt;/h4&gt;

&lt;p&gt;車の製造のようなことでは、個人で太刀打ちすることはできません。
資本がなければ設計することも試作することもテストすることもままならない。&lt;/p&gt;

&lt;p&gt;しかし、IT業界は設備がいくらよかろうとも、優れた技術者を確保できなければデスマーチになりますし、
設備が貧弱だろうが優れた技術者であればものを作ってしまうこともある。
いや、環境が貧弱でもいいって言うわけではないのですけどね。&lt;/p&gt;

&lt;p&gt;工場のような、資本を投じることで生産性、収益性を得るという戦略が効かない業界なのですね。
それぐらいに技術者への属人性の高い業界とも言えましょう。&lt;/p&gt;

&lt;p&gt;そうなると、大資本ならではの高収益体制をどうやって作るか。&lt;/p&gt;

&lt;p&gt;システム開発は金額のかかるものです。100億とか1000億とかいうプロジェクトもあるわけです。
そして、その金額の取引をするには資本的な信用がいる。&lt;/p&gt;

&lt;p&gt;この信用に対して金を取る、これこそが大資本がその資本を活かして高収益を得るための唯一無二の方法なのです。&lt;/p&gt;

&lt;p&gt;メインフレームとかスーパーコンピュータとかハードの絡むことは単純に資本がないと取り扱えないですから
資本を使った仕事をすればいいわけですが、純粋にソフトウェアだけの開発では資本ならではのやり方というのがないのですよね…。&lt;/p&gt;

&lt;h4&gt;対応はあまりに簡単&lt;/h4&gt;

&lt;p&gt;大資本ならではの稼ぎ方というのはIT業界では資本の信用の部分ぐらいしかありません。
高性能な機械を導入すれば工場が高収益になるような業界ではない。&lt;/p&gt;

&lt;p&gt;別に資本ならではという稼ぎ方をしようというのでなければ、
&lt;a href="http://d.hatena.ne.jp/higayasuo/20080418/1208485137"&gt;ITゼネコンを倒す方法をみんなで考えよう&lt;/a&gt;
で言うところの&lt;/p&gt;

&lt;p&gt;&lt;blockquote&gt;
「ISIDだってITゼネコンじゃん」と思う方もいらっしゃるでしょう。昔は、そんなこともありましたが、最近は違います。「丸投げ禁止」「技術力という足腰を鍛える」「チームにアーキテクトをきちんと入れて全体のアーキテクチャをきちんと見させる」というのは、会社の偉い人からのメッセージです。
&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;という当たり前のことをやればいいわけです。もっとも、こんなことはどこのSIerも言っているぐらいには
誰にでもわかるようなことなのですが、そんな素朴なことを本当に実践できている会社はなかなかない。&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;img src ="http://blogs.wankuma.com/nagise/aggbug/134023.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>