まさるblog

越後在住子持ちプログラマー奮闘記 - Author:まさる(高野 将、TAKANO Sho)

目次

Blog 利用状況

ニュース

著書

2010/7発売


Web掲載記事

@IT

.NET開発を始めるVB6プログラマーが知るべき9のこと

CodeZine

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

第1回 3層データバインドを正しく活用しよう(前編)

ブログパーツ


書庫

日記カテゴリ

コミュニティ

生産性向上の限界とそれを突破する方法の模索

最近は開発言語、開発環境、インフラ、フレームワークなど、生産性を向上させるような仕組みがかなり整備され、実際にプログラムを作成する時間はどんどんと短くなっています。至近の例でいえば、.NET Framework 3.5の登場によってVBでもC#でもLINQが使えるようになり、従来なら面倒なコードをこねくり回していた処理が1行で出来てしまうようになりました。

しかし、実際アプリケーションを作成する時間が短くなったかといえば、そんなことはありません。プログラムはあっという間にできるのになぜでしょう?

その原因の一つが「設計が追いつかない」です。厳密に言えば「要件定義」→「概要設計」の部分が全く追いつきません。その為、「詳細設計」以降を見切り発車せざるを得ず、概要設計のレビューの結果、詳細設計にも結局戻り作業が発生するため、単体テストまで終わっても再び修正が入り、工数も膨らみます。

従って、いわゆるウォーターフォールの枠組みの中では、上流と呼ばれる部分がボトルネックとなり、生産性は頭打ちになってしまいます。ここが生産性向上の限界です。

これを何とかするにはどうしたらよいのでしょうか?私がない頭をひねって考えたのは以下の2つです。

  1. 「要件定義」→「概要設計」→「詳細設計」という流れをやめ、「要件定義」→「機能仕様」とすることにより、概要設計と詳細設計部分の乖離をなくす。
  2. 「設計」→「プログラミング」→「レビュー」のサイクルを数回回す。(プログラミングには単体テストも含む)

1.については「仕様の書いていない概要設計書」や「コーディング設計書みたいな詳細設計書」ではなく、がるさんも言ってたMECEかつKISSに書かれた「機能仕様」があれば、それでプログラムを作成することは可能だと考えるのです。

ただし、機能仕様作成にもプログラム作成にも相応のスキルは必要とされることが問題です。本来は仕様策定者=プログラム作成者となるべきですが、大抵のプロジェクトではそうはいきません。コーダレベルのメンバもプロジェクトにはいますし、いなくてはそのメンバ成長も見込めません。

そういったメンバにはやはり先輩(というか相応のスキルを持ったメンバ)がしっかりサポートに着ける体制が必要です。個人的にはペアプロはこういう場合非常に有用でないかなと考えています。(ただ、実行にはまだ移せていません。)

2.についてはいわゆるアジャイルなプロセスがやはり必要かなと感じています。現状は設計とプログラム実装を比べて、設計にかかる時間の割合が大きくなっていて「設計待ち」の状態ができています。ですので、設計の粒度を小さくして段階的に行うようにして、「設計待ち」の時間を短くすることにより、スループットが向上するのではないかと考えました。

ただ、これは「如何に適切な粒度で設計を分けるか」が鍵になり、ある程度こなせるようになるには時間が必要でしょう。また、設計を段階的に行うためにはユーザとの調整が欠かせないでしょうから、政治的な話も出てくるかもしれません。

 

とりあえず色々と模索してみましたが、なんとかこのボトルネックを回避しなければ、これからの時代システム開発で生き残っていくことはできないでしょう。食いっぱぐれないためにも、今後も個人でできること、できないことを含め、模索を続けていくつもりです。

投稿日時 : 2009年6月6日 20:37

Feedback

# re: 生産性向上の限界とそれを突破する方法の模索 2009/06/06 21:30 biac

> 「要件定義」→「概要設計」の部分が全く追いつきません。その為、「詳細設計」以降を見切り発車せざるを得ず

するどい観察だと思います。

そのなかでも、ビジネスアプリケーションでは要件定義がいつまでも完了しないのではありませんか?

http://dictionary.goo.ne.jp/leaf/jn/131609/m0u/%E5%AE%9A%E7%BE%A9/
/*
ていぎ 【定義】: 区別できるように明確に限定すること。
*/
つまり、要件定義とは、すでに要件は存在しているのだけれど、あいまいであるので、(今から作るシステムに含まれるものを) 区別できるように明確に限定すること。 …であるはずなのですよ。
ところが、いまや、ビジネスアプリの要件はお客さんの頭の中にも存在しないか、 せいぜい雲を掴む程度だったり ( これぞ、クラウド・コンピューティング! (違w )

いまや、要件定義の「定義」は、「相談してきめること。(主として明治初期に用いた語)」 (広辞苑 第4版) だと思うしかないような f(^^;

そのことを認めた上で…

・要求開発アライアンス ( http://www.openthology.org/ )
 ちゃんとした要件なんて最初は存在しないのだから、お客さんと一緒に要件を「開発」していくしかないんだ。 定義は定めたら完結だけど、開発には終わりはないよ。

・アジャイル開発
 要件なんて、作ってみなきゃわからんよ。 だから、お客さんと一緒にちょっとずつ作っては試してみるんだ。

・ソフトウェアファクトリー
 要件が固まるのには時間が掛かる。 でも、だいたい見えてきたら、骨組みとサンプルになる画面くらいは作れちゃうよね。 それで、設計書の書き方から結合テストまで、きちんとトライアルをやって実証しておいて。 ちゃんと要件が決まったら、サンプルをベースにして、みんなで一気に作っちまえばいいよね。

…とまぁ、 いろんなやり方が提案されてきてます。
共通するのは、 要件を固めるには時間が必要だし、 その中でアプリケーションの具体的なイメージがわかるものをお客さんに提示していくことも必要だ、 ってあたりかな。

# re: 生産性向上の限界とそれを突破する方法の模索 2009/06/08 15:09 aetos

> 「要件定義」→「概要設計」→「詳細設計」という流れをやめ、「要件定義」→「機能仕様」とすることにより、概要設計と詳細設計部分の乖離をなくす。

それぞれの文書は誰が読むことを想定しているんでしょうか?

前者は、
要件定義:顧客も読む
概要設計:顧客も読む
詳細設計:開発側だけが読む
気がします。

後者は
要件定義:顧客も読む
機能仕様:???
です。

JoelOnSoftware によれば、「機能仕様書」はユーザー視点で、また、ここに挙がっていない「技術仕様書」というドキュメントが存在します。
しかし、このエントリでは、「機能仕様書を元にプログラムを作る」というところから、機能仕様書は開発側も対象とした文書であると受け取れます。
俺は、Joel の言うところの「技術仕様書」は、前者の「詳細設計書」と同じものであると認識しています。

このエントリが言う「機能仕様書」には、このような技術的な内容が盛り込まれているんでしょうか? → それを顧客に読ませるんでしょうか?
はたまた、そんな内容はどこにもなくても、プログラマはプログラミングを書けるんでしょうか? → そして、別人がメンテナンスすることができるのでしょうか?

# re: 生産性向上の限界とそれを突破する方法の模索 2009/06/18 6:21 まさる

biacさん
> そのなかでも、ビジネスアプリケーションでは要件定義がいつまでも完了しないのではありませんか?

> いまや、要件定義の「定義」は、「相談してきめること。(主として明治初期に用いた語)」 (広辞苑 第4版) だと思うしかないような f(^^;

まさにそんな感じですね。
結局は要件定義≒概要設計みたいになってますし。

aetosさん
> それぞれの文書は誰が読むことを想定しているんでしょうか?

> このエントリが言う「機能仕様書」には、このような技術的な内容が盛り込まれているんでしょうか? → それを顧客に読ませるんでしょうか?
> はたまた、そんな内容はどこにもなくても、プログラマはプログラミングを書けるんでしょうか? → そして、別人がメンテナンスすることができるのでしょうか?

「技術仕様書」のことをすっかり失念していたうえ、ご指摘の通り「機能仕様書」の定義を捻じ曲げてしまっていました。申し訳ありません。

そうなってくると、1.の方法は再検討が必要ですね。

なんかこううまいこと概要→詳細(機能仕様→技術仕様)の乖離をなくす手立てがないものかなぁ。

タイトル
名前
Url
コメント