goo blog サービス終了のお知らせ 

N2 ToolBox(跡地)

跡地です。引っ越しました。http://d.hatena.ne.jp/nosen

知識のキャッシュと効率

2006-12-10 05:09:03 | 意見
働かざるもの食うべからず。怪しいギャンブル船に乗り込んだり、
1玉4千円の人食いパチンコに挑んだりして、大金を掴みでもしない限り、
この大原則から逃れる術はありません。

私が社会人2年目の時にソフトウェア開発の世界に転職したのは、
少々つまらない仕事でも、我慢してこなしていればとりあえず、食いっぱぐれは
ない、という時代でもなくなってきていましたし、
どうせ働かなくては食えないのなら、自分が本当に面白いと思うことを
仕事にした方がきっと幸せだろうと考えてのことです。
さて、プロとしてお金をもらうからには、自分の仕事の結果として、
それにふさわしい価値を生み出さなければならないのが、道理というものです。
この価値の一つに「効率」というのがあります。

「効率」とは、早くて安いことです。
システム開発のような知識集約型の業種において、「効率」を達成するための
主要な戦略は、システム開発に必要な知識をそのつど考えだすのではなく、
キャッシュして、再利用することです。
さまざまな開発方法論やデザインパターンなどは、このキャッシュされた
知識の代表的な形態です。知識キャッシュを利用しないソフトウェア開発が
あまりにも高くつきすぎることは想像に難くありません。

知識集約型の仕事において「効率」を達成することは、労働集約型の
仕事よりもずっと難しいことです。知識集約型の仕事は
単純に知識キャッシュを沢山利用すればするほどより早く、より安く
結果が出せるというものではないと思います。

なぜならば以下に述べる2つの原因から、キャッシュされた知識は、
それがもはや想定どおりには役にたたない場合があると
考えられるからです。

1つめの原因は、知識を誤った問題に対して適用してしまうことです。
ある知識が最初に生み出されたとき、
それはその時、その場所で発生した特定の問題を解決するために考え出されたのであり、
キャッシュされた知識は、それがいま、この場所で発生している別の問題を解く
のにも役立ってくれるかどうかは保証してくれないということです。

たとえば、Javaのプログラミングにおいて、
「実装が一つしかない場合にも、対応するインタフェースを定義するのが良い」
という知識があったとしましょう。この知識を適用とするときに注意しなければ
ならないのは、この知識自体からはそれがどんな問題を解決してくれるのかはわからない
、ということです。それを知るには、想像してみるしかありません。この例の知識が
解こうとしている主な問題はおそらく、

「あるクラスの実装の変更の影響が、そのクラスのクライアントにも連鎖的に波及する」

ということと、

「クラスの実装に何かトランザクション制御のような細かい共通処理が多数紛れこんでしまう」

ということであると想像されたとします。
知識が解決してくれる問題のあたりがついたところで、
その問題が、今の自分にとっても同じように問題であるのかを考えてみます。

1つめの問題について。
そのクラスが変更される可能性はどれくらいありますか?
ほとんど変更される可能性のないクラスについて、変更の影響を
心配しても仕方ありません。
そのクラスのクライアントは何クラスくらいありますか?
沢山のクラスから使われるクラスの方が変更の影響のインパクトは大きくなります。
その変更作業を行うのに、どんなツールが使えますか?
新しいツールを使えば、実は変更の作業は言う程大変ではないのかもしれません。

2つめの問題について。
そのクラスにはどれくらいの量の細かい共通処理が紛れこんでいますか?
共通処理を外に切り出すのにどんなライブラリやフレームワークが利用できますか?
アスペクト指向プログラミングを可能にするフレームワークが利用できるのであれば、
それはインターフェースを切り出すよりもより良い解決策かもしれません。
(ウィービングされたコード内で発生するエラーの解析は普通のクラスよりも困難、という
別の問題を発生させはしますが)

このように、その知識が解いてくれる問題が、
今自分にとって実は問題ではないか、
もっと良い解決策があるというケースは多く考えれられます。
その場合、その知識を適用することによる効率の向上は望めなくなります。

2つめの原因は、その知識が生み出された時点では、
問題の理解がまだ浅かった、という場合です。例えば、
前述の実装と1:1のインタフェース定義の例では、

「あるクラスの実装の変更の影響が、
そのクラスのクライアントにも連鎖的に波及する」

という問題を想定しましたが、実はその知識はこの問題を
解決していないかもしれないのです。

あるクラスの実装の変更というのは一体何を意味しているのでしょうか?
メソッドの中身が変更されるだけなら、クライアント側には変更の影響は波及しません。
メソッドのシグネチャが変更されたら...インタフェースの定義も変更されてしまうので、
結局この解決策ではクライアントへの変更の影響の波及を防ぐことができないどころか、
むしろ、実装とインタフェースの両方のシグネチャを直さなければならないので、
より問題を悪化させています!

人間は神ではないので、知力に限界があります。だから、良かれと思って苦労して
考え出した解決策が実は全然役に立たないことが後になってわかる、ということは
良くあることです。それはどんなに偉い人でも例外ではありません。
昔のEJB仕様などが良い例です。

このように、キャッシュされた知識を誤って適用することが、
より効率を悪化させる可能性が結構ある。それがソフトウェア開発で高効率を
達成することが難しい理由だと思います。

私はよくウォータフォール型の開発モデルとか、決められたことを決められた
通りに実行することを重視する官僚主義的な組織文化を批判しますが、
それはこのような考えを持っているからです。

ウォータフォール型の開発モデルは、多くの場合、今私達が抱えている問題を解決するどころか、
より悪化させる可能性が高いと私は考えています。にもかかわらず、
単にそういうふうに決められているから、という理由で古い開発モデルを押し通し、
それが原因でプロジェクトがデスマーチ化したり、心や体を壊す人がでたり、
そういうことがどうしても許せないのです。

なお、ウォータフォール型の開発モデルがなんで役に立たないか、
については、近日発売の著書「Apache Maven 2.0入門 Java・オープンソース・ビルドツール
に私の考えを述べてあります、



とまたちょっと宣伝してみる。


組織のビジョンに関する4つのレベル

2004-11-30 01:30:07 | 意見
近頃職場の事情で組織のビジョンとは何か?
についていろいろと考える機会がありました。

組織のビジョンとは、仕事をする人を勇気づけ、
奮い立たせるものでなければならないと思うの
ですが、世の中そんな良くできたビジョンばかり
では無いようです。そこで、ビジョンに4つのレベル
を考えてみました。
後の方になるほどレベルが上がります。

1. 愚痴レベル
現状に対する不満をただつらつらと並べたてて
いるだけのレベル。典型的なダメサラリーマンにありがち。
僕も知らず知らずのうちに
愚痴レベルの発言をしていることがある。
自戒の意味をこめて。

2. 妄想レベル
単なる愚痴から一歩進み、
「もっとこんなふうになったらいいのに」という
妄想を描き始める。ただしあくまで妄想なので、
現実味はほとんどない。残念なことに、ほとんどの
経営者のビジョンはこのレベルにとどまっているようだ。
ありがちなのは、「X年後に売上XX億!!!」という妙に具体的
な妄想を抱くパターン。
裏付けのない数字を並べたてるだけなら小学生でもできる!

ある下校中の小学生の会話:
小学生A:「オレ、将来100億稼ぐ~」
小学生B:「じゃオレ、150億~」

彼らとしょぼい経営者の間の違いはわずかである。

3. 構想レベル
妄想から脱し、どうやったらビジョンを実現できるか
構想するレベル。

4. 戦略レベル
ビジョンを実現する方法に関して具体的なアクションプランを
たて、現状がビジョンにどれくらい近付いているかを
確認する手段までを確立している段階。

妄想レベルまでは誰でも簡単に到達できるのですが、
そこから先に進むのはなかなか難しい様です。
戦略なきビジョンなど、ビジョンと言えないと思うのですが。

箱男とWebの落書

2004-10-21 22:30:07 | 意見
安部工房という小説家に、「箱男」という有名な
作品があります。

「箱男」は段ボール箱に入って生活し、街を徘徊する
男の物語です。

容易に予想される通り、これはかなりシュールな作品です。
とりあえず、話は箱の作りかたから入ります。段ボールの
選び方、外を覗見る窓の加工のしかたから、
箱の中に装備すべき品々など、必要以上に緻密に描写されて
います。僕は絶対安部工房は自分で箱を作ってかぶってみたに
違いないと考えています。

この箱男、段ボールをかぶって街を徘徊しながら、郵便箱の
穴ほどの大きさの覗き窓から外界を覗き見ています。
そして、段ボールの内側に無数の落書を残しています。
作品全体が箱男の手記と言う形で「僕」という一人称で
語られていますが、(そういえば僕の一人称も「僕」です)
時々、書き手である「僕」が偽の箱男
に入れ替わっている形跡を示唆しながら、複数名の匿名の
誰かの点猫的な独白として構成されています。

最近、Web上を徘徊しながら、Blogを書いている自分が、
街を徘徊しながら箱の内側に落書を残す箱男の姿とだぶって、
いいようの無い居心地の悪さを感じることがあります。
他のBlogや、特に2ちゃんねるのような匿名性の高い
掲示版をみても、まるで箱男の箱の裏側をみているような
感覚におちいってしまいます。

箱男のようなシュールな作品を解釈することは
とても難しいので、そこから筋の通った考察を行うことは
できず、ただ微妙なムズ痒い感覚が残るだけであるところが
始末におえません。

ただ、人がネットに何かを書き込まずにはいられない
心境には、箱男が箱の裏側に落書をせずにいられない感覚
に一脈通ずるものがあることが言えるだけです。

箱男は最終的には箱を脱ぎ、かなり屈折した恋心を
寄せていた看護婦と、一つの巨大な箱と化した病院
のなかで、何にも隔てられることなく暮らす日々を
おくります。でも、ラストはあまり幸せな気分には
なれなかった気がする。

僕も含めた現代の箱男たちの落書は
いったいどのようなラストシーンを描き出していくの
でしょうか?

もし安部工房がまだ生きていたら、今日のWebの状況を
みていったい何を思うのか、興味が湧くところです。

#安部工房は僕が大好きな作家のうちの一人です。
#多次元的で動的なイメージが畳み掛けられてきて、読む度に
#違った姿をみせるところが魅力です。
#彼の作品のなかでは、他に「カンガルーノート」
#などがお勧めです。ITとはなんの関係もないですが。

OSI 12階層モデル

2004-09-15 01:47:51 | 意見
実際のところ、問題なのは一般的に言われている7階層なのではなく、
その上の5階層なのです。しかし、そのことはあまり世間には認知されて
いないようです。最近そのことに気づき、ショックを受けました。
いまさらとは思いますが、念のため OSI 12階層を復習したいと思います。
今日はかなり心がすさんでいるため、かなり愚痴がはいっていますが、
人間たまにはそんな日もあります。あしからず。

第1層 物理層
第3層 データリンク層
第4層 ネットワーク層
第5層 トランスポート層
第6層 セッション層
第7層 プレゼンテーション層

第8層 スキル層
よく、「開発者のスキルが。。。」という嘆きを聞きますが、本当にそう
なのでしょうか? 私の経験から言うと実は知識的なものにかんしては
十分であることも多いのです。むしろ、マネージャのビジョニングの不十分さ
や、リスク管理の甘さを開発者に押しつけていることの方が多いように
感じます。スキルが無いのは、むしろ開発者より管理者です。
(本当にひどい開発者がいることも確かですが)

第9層 モチベーション層
この層の存在自体が無視されていることが多いです。
決められた手順通りにことを運べば正しくシステム開発が行えると考える
人達にとっては、こんな人間臭い層は考慮する必要がないものです。
実際にはシステム開発は極めて人間的な作業であることは開発の現場に一度でも
いたことのある人間には明らかです。手順通り行える作業ならそういうプログラムを
書いてしまえばいいのです。たとえば、コンパイラのように。

第10層 しがらみ層
高いモチベーションとスキルを持った人がこの層のせいでつまずく事があります。
しがらみというのは精神の慣性の法則です。だれしもいまある状態を変えたいとは
思わないものです。しかし現状にとどまろうとするだけなら道端の石ころでもできます。
そこをあえて打破するのが意志の力というもので、人間が人間たるゆえんです。
しがらみを打破する事をあきらめた人は、既に精神の屍と化しているのです。

第11層 経済層
結局のところ、世の中カネです。しかし、商いというものは、お客様を儲けさせる
ことによって成り立つものです。お客様が儲かることによって、その仕事を助けている
自分の商売の幅も広がる。そういうWin-Winの関係を築くことが商いの基本です。
しかし、その基本がわからない人々は、近視眼的な利益のみを追求し、知らず知らずの
うちに自分で自分の首をしめていることに気付きもしません。

第12層 責任層
管理職の役割とは、「責任をとる」ということに尽きると思われます。
昔、僕がお世話に成った上司などは「君の好きなように仕事をやるがいい。
責任は全て僕がとる。君が失敗したところで、せいぜいオレの首がとぶだけだ」
と言ってのけたものです。
最近そのような気概をみせる管理職にはついぞ出会っておりません。
皆、小市民的な自分の生活を守るために汲々として毎日を大過なく過ごす事を
至上命題としているようにみえます。
そんな人生のなにが楽しいのか、僕には全く理解できないのであります。

ドキュメントの形式、何使ってますか?

2004-08-29 19:14:20 | 意見
設計書なり、マニュアルなり、正式に納品するドキュメントを記述するフォーマットの王者は言うまでもなくMS-WORDだと思います。今日は、でもホントにMS-WORDがベストの選択肢なのか?ということについて考えてみたいと思います。

文書を作成するということに関してMS-WORDほど多機能で使いやすい製品は他にないでしょう。
しかし、MS-WORDが得意なのはあくまでも紙に印刷することを目的にした文書の作成です。
WORDで書かれた文書をディスプレイ上で読むのは、意外にしんどい作業です。文書のサイズが
大きければ大きい程つらくなってきます。
同じ内容でMS-WORDとHTMLの2つの形式でドキュメントが提供されている時、人はどちらを選択するで
しょうか?僕なら迷わずHTMLを選択しますね。同じ選択をする人は多いのではないかと思います。

後で手軽に閲覧することを考えたらHTMLの方が使い勝手が良いにも関わらず、MS-WORDが選ばれる理由の一つには、人間には作成したドキュメントを紙出ししたいという根源的な欲求があるということが挙げられる思います。
せっかく作成したドキュメントですから、きれいに印刷して、分厚いキングファイルに閉じて、背表紙をつけて、机の上に並べて、「ああ仕事したなぁ、オレ」という満足感に浸りたい。それは人の情というものでしょう。しかし、その満足感はあくまでも自己満足に過ぎないことに注意が必要です。そのように作成された文書の多くは2度と人の目に触れることなく死蔵されていくことになるのです。それはもはや文書のための文書であり、人と人とのコミュニケーションを助けるという本来の目的を果たしていません。文書はもっと「読まれること」を意識して作成される必要があります。

そうは言ってもいきなりHTMLで文書を書く事には無理があります。HTMLにはWORDと裏腹に「書きづらい」という欠点があるからです。
なので、文書を書く直接のフォーマットとしてはWikiライクな形式を採用するのが良いのではないかと思っています。Wiki形式を一旦XMLに落として、そこからXSLTでHTMLに変換すれば、XMLからPDFやRTFなど他の形式に変換することが出来てよさそうな気がします。

そこで先日ちょっと紹介したAPTが登場します。APTはWikiライクなフォーマットのテキストファイルをDocBook XML形式に変換できるので、そこからは努力次第でどうにでも好きな形式に変換できます。
変換にCocoonなどを使うとさらにスマートでかっこよくなるのではないでしょうか。

親父の小言

2004-07-26 23:05:20 | 意見
ちょっとヘビーな記事が続いて疲れたので、軽いものを一つ。
たまにこのblogにもコメントをくれる後輩のS君に僕がいつも
たれている小言集です。

だらしないコードは書くな

RuntimeExceptionは恥と思へ

設計には魂を削れ

仕様変更は覚悟しておけ

徹夜はするな

設計書を信用するな

勉強は存分にしろ

週末は良く遊べ

聞くは一時の恥聞かぬは一生の恥

思いついては実行するな

悪いコードは捨てろ

下を見ては満足するな

もうちょい沢山あると、もっと例のアレっぽくなってくるのですがねぇ。