凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46608
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

今回は大規模システムの開発のお話です。
ただし、技術的な難しさを論じるのではなく、大規模システムを経済的に作るには?という視点でいきたいと思います。

システム開発のコスト

システム開発のコストに一番大きく影響するのはステップ数です。 と、言うと反射的に違う!といいたくなるのですが、落ち着いて考えてください。 1,000stepのプログラムと1,000,000stepのプログラム、開発にコストが掛かるのはどちらでしょう? そう、ステップ数というのは確かにシステム規模と強い正の相関性を持ちます。 次にコストに影響するのは開発に関わる人員の質だ、とジェラルド・ワインバーグ氏が論文で述べています。 このあたり、詳しくは ソフトウェアエンジニアリング論文集80'sで読むことが出来ます。

大規模システムのソースのうち、その多くは単純で退屈な、しかし分量だけはめいっぱいある、そんなソースです。
システム開発コストを抑えるためには、この人海戦術的な部分をいかに効率よく作り上げるかが重要です。 つまり、まずは一番人手の掛かっている部分でざっくりとコスト削減しようという考えです。
システムの難しい部分はその全量からすればごく一部です。そこの部分の作業量を削ったところでコストへのインパクトは少ない。 それよりは、頭数で大量生産的に製造しているような箇所の生産効率を考えるほうが実りが大きいわけです。

プログラミングの効率と経済の稿ではバベッジの原理について解説しました。 「労働を分解し、単純労働を分離して安い労働力をこれにあてる」という手法です。

システムアーキテクトは、もちろん顧客の提示する要件を満たすようにシステムを設計することが 第一に求められるでしょうが、当然ながらコストについても考えなければなりません。
そうなると、バベッジの原理なりを用いてコスト削減を図る必要があります。 これを念頭においてソフトウェアのフレームワーク的な部分を選定あるいは設計しなくてはならないのです。

単純労働の分離

システム開発の単純労働の分離は難しい課題です。 しかしながら、システム開発の経済性という強い要求により、 ここに答えを見出そうと各社がさまざまなフレームワークを提唱しているわけですね。

ビジネスイベントにいって各社のブースを回ると、この単純労働の分離について 盛んにアピールしていることが見て取れます。
これらのプレゼンを見ると、まるでアーキテクト不在でもシステムが魔法のように仕上がるような風ですが、 そんなことはありません。実態は設計に精通した人が少なくても済むような 開発ツール、フレームワークなだけなのです。 0では駄目なことはIT業界の人であればうなずけるところでしょう。

単純労働の分離ということは、逆にアーキテクトが難しいところを一身に背負うことに他なりません。 単純労働側はあまりものを考えなくても作業が出来るように、そのための苦労をアーキテクトが 肩代わりしているわけです。

分離のための道具

オブジェクト指向はこれらの要件を満たすための道具として優秀です。 1996年のJavaの発表以来、C#も含め、単純労働の分離のためにオブジェクト指向は 積極的に活用されてきました。いまや、プログラマの必修事項となりつつあります。

このオブジェクト指向の効能は、近年の大規模開発のインフラとしての 普及を見て分かるとおり、相当に高いものです。
GoFに代表されるデザインパターンはオブジェクト指向の活用法の道しるべとなり、 単純労働の分離をさらに後押ししてくれます。

クラスの使用は簡単で、単純労働の効率の向上に寄与してくれます。
しかし、アーキテクト側の立場でのオブジェクト指向は難解で、相当の修行を必要とします。 簡単に使えるようなクラスを設計することの難しさは筆舌に尽くしがたいものがあります。
この非対象性は単純労働の分離を象徴しているかのようですね。

IDE(等号開発環境)の普及、および高機能化も単純労働の分離に大きく作用しています。 コンパイラレベルでの警告も随分と高度化し、コーディングの段階で事前にバグとなりそうなものを 排除してくれるようになりました。これは、作業に従事する人員の学習を助け、ハードルを下げるものとなっています。 ヒューマンエラーの排除としても大きく寄与していますね。

2007年現在、スクリプト言語が熱を帯びてきていますが、これもまた、 単純労働の分離のための効果的な施策とみられているためでしょう。
Javaも6になってスクリプト言語との連携機能が盛り込まれました。 こういったインフラ整備がどのように萌芽するのか、今後注視しておきたいところです。

投稿日時 : 2007年8月14日 15:16
コメント
  • # re: 大規模システムの設計
    凪瀬
    Posted @ 2007/08/14 15:25
    επιστημη氏のblogでの大規模システムでOO必須という発言をしましたが
    http://blogs.wankuma.com/episteme/archive/2007/08/13/90048.aspx
    どちらかといえば技術的な観点というより、経済的な観点での発言になります。

    もっとも、可能か不可能かという2分法で言えば、OOを使わずともなんとかする手法はあるのだろうとは思うのですが、
    現実解として代替手段あるの?というと私はちょっと思いつかない。
    今後可能性があるとすればスクリプト系での単純労働の分離かなぁとは思っているのですけども。

    小規模なものとかはOOのメリットが出にくいのでなくてもいいじゃない?とは思うのだけど、大規模でOOを敢えて採用しない積極的な理由というのがちょっと想像できないですね。
  • # re: 大規模システムの設計
    中博俊
    Posted @ 2007/08/14 15:47
    立場によっては違うけど、単純労働者(やないいかただな)は知らなくてもいい。とまで思いますよ。ええ。
  • # re: 大規模システムの設計
    kox
    Posted @ 2007/08/14 16:30
    単純労働がどこまで単純に行えるのか?が問題だと思います。
    大規模システムの場合、その他大勢が大半を占めるわけですし、そのスキルの幅もかなりあると思います。
    使うだけと一言で言っても、その垣根が高い場合もあります。そう考えると、あえて大規模システムだから使わないという選択肢もあるかもしれないなぁと。
  • # re: 大規模システムの設計
    中博俊
    Posted @ 2007/08/14 16:32
    徹底化するとStaticになるんですよ。

  • # re: 大規模システムの設計
    凪瀬
    Posted @ 2007/08/14 16:52
    OOの、というかJavaやC#の場合、正しくない使われ方をした場合に例外なりアサートなりで落として警告するような、防衛的なコーディングができますよね。
    正しくない状態でも使えてしまう、動いてしまう、というのはヒューマンエラーという観点で見るとよくない。
    正しい使い方を強制するための障壁を置けるというのがJavaなどの実装のよさだと思うのですよ。


    OO以外の手法でそういうところに対処できるのか、というと疑問がある。

    > 徹底化するとStaticになるんですよ。

    解説を是非。
  • # re: 大規模システムの設計
    ひろえむ
    Posted @ 2007/08/14 20:39
    さすがに「いらない」は言い過ぎな気がしますが、必須とも思っていないんですね。 

    実際、どれだけのSIerがOOを使った大規模開発(設計)をしているかというと・・・・正直疑問が残ります。

    で、それで正常稼働していないシステムばかりかというと・・・そんなこともないですよね(^^;

    ケースによって適切に手法を選択して、必ずしても「こうでなければ」というケースばかりじゃないと思うんですよ。

    すべての技術者のスキルが均一ならそれでも効果があるかもしれませんが、必ずしもそうじゃないこともあるでしょうし、環境的にOOを適用しにくい(OO言語などが使えない・OOを知った技術者があまりに少ないなどなど)場合だってあるでしょう。 

    ただ、まるまるOOでなくてもOOの中にある手法を拝借して適用することだってできるワケですから、知らなくていいなんてことがあるワケはないと思います。

    ですが、積極的に利用すべき場面ばかりではないと思うんですね。 divide and conquerはOOだけに許された手法ではないですしね。
  • # re: 大規模システムの設計
    凪瀬
    Posted @ 2007/08/14 21:11
    いろいろと用語の定義があるので難しいところなのですが、ざっくり言えば

    「OOを使う」とは
    1.OO対応言語を用いてOOを設計に生かす
    2.OO非対応言語だが、設計思想にOOを用いる
    3.OO対応言語を用いているが設計は非OO的
    などなどの状況で線引きがどこと考えていますか?

    「必須」とは
    1.なければプロジェクトが立ち行かない
    2.なければプロジェクトの工数が膨らんで経済的な競争力を保てない
    などの状況で線引きをどこと考えていますか?

    あたりが重要な前提になるのでしょうか。

    私の場合は、「OOを使う」では1、「必須」では2を想定しています。
    OOがなくても物理的な不可能はない。ただ、経済的に現実的か?という話。

    OOをうまく活用したプロジェクトとそうではないプロジェクトのコストの差を計測してみたいところ。
    このあたり比較しにくいので表にでてこないけども、いまどきのSIerのシステム開発の競争力ってどの程度のものなんだろうなぁ…。
  • # re: 大規模システムの設計
    ひろえむ
    Posted @ 2007/08/14 22:08
    >OOをうまく活用したプロジェクトとそうではないプロジェクトのコストの差を計測してみたいところ。

    そのうまく活用できるスキルのある技術者がどれくらいいるかって問題もありますよ(^^;

    大手のSIerでそういったメンバーを集められるプロジェクトがどれだけあるんでしょう? 

    少なくとも私は参加したことがありません(^^; 

    ま、もっとも私は弱小のフリーランスだから凪瀬さんが想定するような大規模プロジェクトに参画していないからかもしれませんが、私自身、数々の現場でお仕事させていただいておりますが、OOのことがわかっているだろう人にはほとんど出会えていません(^^;

    だからって、飯が食えていないかというとちゃんとこうしてご飯を食べれております(^^;

    つまり、経済的な競争力が保てていなければOO使う・使わない以前に仕事がとれてないでしょうし、こうして仕事を納めているところをみるとそれでもなんとかなっているんでしょう。

    もちろん、これは知らなくていい理由にはならないですが、なくてもなんとかなってるという現状もあるんですよね。

    もちろん、OOのコストメリットを否定するつもりはないんですが、OOを導入することのコストメリットと引き替えにできるかどうかも、ひとつのファクターとして考える必要もありますよね?ってことですね(^^;
  • # re: 大規模システムの設計
    シャノン
    Posted @ 2007/08/15 10:28
    > 徹底化するとStaticになるんですよ。

    Static というか、OO 以前の構造化時代のようになるということでしょうね。
    OO がそれ以前と大きく違う点の一つが、「オブジェクトをたくさん作れる」ことですから。

    > 1.OO対応言語を用いてOOを設計に生かす
    > 2.OO非対応言語だが、設計思想にOOを用いる
    > 3.OO対応言語を用いているが設計は非OO的

    1ですね。
    3はよくある現状だと思います。
    2はインピーダンスミスマッチが発生するため、1よりも難易度が高いんじゃないでしょうか。

    > 1.なければプロジェクトが立ち行かない
    > 2.なければプロジェクトの工数が膨らんで経済的な競争力を保てない

    「プロジェクトが立ち行かない」が「技術的にシステムを作れない」という意味なら、2なんでしょう。
    採算度外視ならアセンブラで作れないプログラムはありません。
    ただ、ひろえむさんのおっしゃるように、工数があまりに大きいと、そもそも仕事を取れないとは思います。

    個人的には「OO有害論」くらいのはっちゃけた説も聞いてみたいところw
  • # re: 大規模システムの設計
    凪瀬
    Posted @ 2007/08/15 16:32
    工数というか、経済的な競争力を考えたときにOOを活用できていると強いよね、と。
    ひろえむさんの感触とおなじような感触を私も感じています。大規模開発でもなかなかOOに精通した技術者に会うことが少ない。
    そういうところで、業界の人材不足を実感しますね。

    私は日本のソフトウェア業界はもっと国際競争力を伸ばす余地が大きいと思っています。
  • # re: 大規模システムの設計
    凪瀬
    Posted @ 2007/08/15 16:33
    OO有害論はちょっと興味ありますね。
    昔はOOなんて~みたいな論調のは多かった気がしますが、
    普及と理解が進んだ現代にあってなお説得力を持つ有害論があるなら聞いてみたい。

    意見がぶつかるところには何らかの真実が隠されているものですから。
  • # re: 大規模システムの設計
    シャノン
    Posted @ 2007/08/15 18:01
    工数ってのはちょっと違いましたね。
    総合的に「コスト」って言うべきだったかなーと。
    経済って、お金にも時間にも使っていい言葉ですよね。
    # 分野が分野だと、お金に限らず「量が減る」ことを指して「経済的」って言ったりするし。
  • # re: 大規模システムの設計
    シャノン
    Posted @ 2007/08/15 18:02
    中さんあたりなら、本当にOOが有害だと思っているかどうかは別として、その気になれば語れるんじゃないかなーと思っていたりする。>OO有害論
  • # re: 大規模システムの設計
    中博俊
    Posted @ 2007/08/15 18:07
    嫌われることはあまり喋りたくないyo.
  • # re: 大規模システムの設計
    シャノン
    Posted @ 2007/08/15 19:16
    ほらねー。
    「喋れない」じゃなくて「喋りたくない」なんだ。すげーよなー。
    聞いてみたいなー。
  • # re: 大規模システムの設計
    凪瀬
    Posted @ 2007/08/15 19:43
    なんというか、とんがった話ってオフレコならともかくオープンな場では話しにくかったりしますよね。
    ちゃんとした議論ができる人が相手ならいいんだけど、変な風に曲解したりとか鵜呑みにしたりする人がいると怖い。

    私もこの手のネタは正直、書いていて怖い。
    感情でこられると困るからなぁ。

    私は汎用的な有害論はぱっと思いつかないな。
    シチュエーションを限定すれば、弊害のような話はできるだろうけど、メリットの方がよほど大きいと思っているので。
  • # 「ITゼネコンをぶっつぶせ」レポート
    凪瀬 Blog
    Posted @ 2008/05/02 14:18
    「ITゼネコンをぶっつぶせ」レポート
タイトル
名前
Url
コメント