|
問題の考察
1.典型的な症状
要求定義フェーズが完了した。スケジュール通り、順調に進んでいる。顧客との関係も良好である。肝心の要求も、定期的なヒアリング会議によって十分に獲得できたものと思う。業務上の意味がよく理解できない要求もあるが、顧客がこれで良いと言っているのでおそらく良いのだろう。意味を深く追求したい気もするが、そこまで詳細にこだわっていてはスケジュールが遅れてしまう。今の時点で進捗を遅らせてまでわざわざ確認することはないだろう。
個別のアプリケーションの概要設計フェーズに入っている。要求をヒアリングする会議は要求定義フェーズで終わりになるはずだったのだが、現在も続いている。本当は最後になるはずの会議で未決事項や保留事項がかなり残っていたため、「では次週もやりましょう」ということで始まったのだが、「なんだかんだ」で次週だけでは終わらずに今までだらだらと続いている。会議の場では、最初は全く話にも出ていなかった要求がちょくちょく出ている。プロジェクトに大きな影響はないとは思うが気になる。進捗自体にも遅延はないがメンバーには時折残業が発生している。
スケジュール上は詳細設計フェーズに入った。とはいえ、一部の機能はまだ概要設計を引きずっている。ヒアリング会議で顧客が毎回新しい要求を出してくるため、なかなか仕様が確定しないのである。そもそもヒアリング会議がまだ存在していること自体がおかしい。なぜこんなことになってしまったのだろう。
詳細設計も佳境である。メンバーの残業時間は目に見えて増大している。しかし新たな要求は「定期的に」発生しており、収まる様子もない。さすがにプロジェクトに危機を感じてきた。顧客にはこれ以上の追加要求は対応できないと伝えたが、「それでは業務がまわらない」と言われると返す言葉がない。メンバーには申し訳ないが、ここは顧客のために頑張ってもらうしかない。
コーディングフェーズに入った。要求は相変わらず不安定なままである。メンバーの中には、明らかに疲労感が漂わせている者もいる。確かに意味のある残業ならば耐えられるかもしれないが、同じ作業のやり直しばかりでは疲れるのも当然だ。ようやく要求にタイムリミットを設けることで顧客の合意を取りつけた。これ以上の仕様の膨張は余程のことがない限りないはずである。
ところが現実には要求のタイムリミットは全く機能しなかった。確かにタイムリミットを設けた直後は要求は発生しなくなったが、それも一時的なものだった。2週間も経つと前と変わらない状態になってしまった。タイムリミットを理由に要求を断っても、「業務がまわらない」という顧客のいつもの主張には勝てないのである。メンバーは明らかに残業過多である。モチベーションが低下しているメンバーもいる。プロジェクトは明らかに危険水域にある。
なぜ要求が確定しないのだろうか。しかしよく考えてみると、新しい要求は次々に発生するが、その最終的な業務上の目的はよくわかっていない。根本的に、何のために必要な仕様なのだろうか。要求定義フェーズで「突っ込んで」ヒアリングしておくべきだったのだろうか。しかし現実的にスケジュールを考えると、そこまでできただろうか。
チームメンバーは皆疲れている。ダラダラ感が漂ってきている。そんな時、一部の機能に、覚えのない仕様が追加されているのが目についた。他の機能もよく見てみると、把握していない仕様の追加が複数見つかった。調査してみると原因は大きく3つに分けることができた。一つはメンバー自身が顧客のために「よかれ」と思って自ら追加した仕様、もう一つはメンバーの単純な技術的興味から追加された仕様、最後は顧客が開発メンバーに直接依頼して追加した仕様であった。要求は既に管理下から離れている。検収のことを考えると頭が痛い。
2.問題の考察
システム開発に携わったことがあるならば誰でも、仕様が延々と膨張していく現場を経験をしたことがあるはずです。私も数多くのプロジェクトに携わってきましたが、仕様が膨張しないプロジェクトに遭遇したことはありません。どのプロジェクトでも多かれ少なかれ、必ず仕様は膨張していったものです。
実際の話として、業務のスペシャリストがしっかりとした要求定義を行っても仕様は膨張するものです。仕様の膨張の原因にはしばしば、要求定義のスキル不足や、業務の理解不足が挙げられるのですが、問題はそれほど単純ではありません。たとえ顧客の担当者以上に業務を理解しているSEでも、重箱の隅まで要求を洗い出せるスーパーマンはいません。そして得てしてこの重箱の隅には、「小さな要求」どころか「新たな重箱」を発生させかねない重大な「きっかけ」が隠れているのです。
さて、簡単に膨張していく仕様ですが、その影響まで「簡単」に考えることはできません。「塵も積もれば」ではありませんが、小さな仕様の膨張でも積み重なればプロジェクトに重大な影響を及ぼします。
例えばコーディングには10分もかからないような「安請け合い」した小さな要求でも、本番リリースまでに必要とされる作業はコーディングだけではありません。再設計から再試験、他の要件との整合性の維持、メンテナンスが必要となる種々のドキュメンテーション、構造の複雑化、保守性の低下、障害時の影響範囲の増大など、プロジェクトに課せられる負荷は多岐に渡ります。仮にその追加仕様が原因で障害が発生した場合、実作業以外に必要となる品質会議などの付随時間・関連作業時間を含めると元々10分のコーディングだったものが一人日にも二人日にもなってしまってもおかしくはありません。
また、正式な変更管理プロセスに乗らない仕様の膨張は、プロジェクト収支を圧迫する大きな原因の一つです。契約金額が固定の請負契約では、仕様の膨張はプロジェクトの成否を左右しかねない重要事と認識すべきでしょう。にもかかわらず仕様の膨張を安易に容認してしまう現場リーダーが多いのもまた事実です。(※話がそれてしまいますが、このようなリーダーには机の前にプロジェクトの予想収支を貼っておき、仕様が膨張するたびに利益が減っていく様子を「見える化」するくくらいのことをしなければ、本当に意識的になることは難しいかもしれません。)
さて、容易に発生し、かつプロジェクトへの影響も無視できない仕様の膨張ですが、流れを逆方向へ持っていくのは非常に困難です。一旦膨張した仕様を縮小させようとすれば、相当のトラブルと混乱を覚悟しなければなりません。急流の中を上流に向けて重い舟を漕いでいくようなものです。実際、一旦「やります」と請け負ってしまった顧客の要求は、苦しくなったからといって「やはりできません」などと簡単に断ることはできないでしょう。膨張してからの対応は困難です。まずは仕様を膨張させないように、予防に全力を尽くすことです。
原因と予防策の一例
1.開発組織の問題
【原因】
・顧客からの要求は最大限に受け入れるべきだという文化が開発組織にある。
・顧客からの要求はルールを破って受け入れても仕方がないという文化がある。
・マネジャーが過剰に顧客志向である。マネジャーが顧客の要求を全て実現しようと頑張ってしまう。
【予防策】
@(顧客ではなく)自社にとってのプロジェクトの目的と、その目的の優先順位を明確にする。
◇自社にとってのプロジェクトの目的の例
・プロジェクトの利益をあげる。(本プロジェクトでの利益の最大化)
・プロジェクトの利益をあげる。(長期的スパンで見た場合の利益の最大化)
・これまでの顧客との関係を維持する。
・このプロジェクトを「次の大きな仕事」を受注するための布石とする。
A過度の顧客志向が、自社のプロジェクトの目的に則したものかどうかを判断する。
B過度の顧客志向による影響が、プロジェクトの目的を失することがないかどうかを検討する。
【解説】
顧客の満足を第一に考え、顧客の要求を全て実現しようとしたシステムは、逆に開発リスクを高め、顧客の失望を買うような結果に終わりかねません。当初の思惑とは正反対に、顧客に最大の迷惑をかけてしまうことになるのです。顧客から「100万円でベンツを作ってくれ」と言われたら、「はい、一生懸命頑張ります」と答えるのが正しい対応ではありません。「100万円ではベンツは作れない」ということを、根気強く説明するのが正しい対応です。そうでなくても開発側自ら、顧客の「便利」になる機能、追加できる機能は次から次へと思い浮かんでくるものです。顧客志向のマネジャーはこれらの機能を全て盛り込みたいと思う自らの願望に気をつけるべきです。S.マコネルは言っています。「約束過多の人は最初は楽ができるが、結局は苦しい思いをすることになる」
【原因】
・そもそも開発側に、仕様の膨張への危機意識が薄い。
・開発側にシステム開発に関する知識や能力が不足している。
【予防策】
・マネジャーあるいは担当者を交代する。
【解説】
開発側の組織の人間が仕様の膨張やその影響に無関心であったり無頓着であるならば、厳しいことを言うようですが、その組織はプロジェクトを推進していく立場としての資格はありません。今から勉強してもらう時間はありません。手遅れになる前にマネジャーやリーダー、担当者を交代すべきです。
【原因】
・開発メンバーが善意から、マネジャーや顧客への確認なく勝手に機能を追加している。
【予防策】
@勝手な仕様追加、便利機能の追加はプロジェクトのリスクを無用に高め、結果として顧客に迷惑をかける可能性が高まることを開発メンバーに説明する。
A善意から出たものであっても、勝手な仕様追加、便利機能の追加は厳禁する旨を、開発メンバーに徹底する。
【解説】
開発途中で要求の不備や不足に気づいた場合、プロジェクトへの影響を勘案しながら、そして顧客に確認の上で仕様を追加すること自体に問題はありません。しかし開発者は時に、業務のニーズとは無関係な、あるいは他の機能との調和を壊すような仕様を勝手に追加してしまうことがあります。いわゆる「飾り」や「金メッキ」と呼ばれる仕様で、本人は顧客のために善意で行ったのかもしれませんが、これは(特別な事情がない限り)無条件に禁止すべきでしょう。リソースが無駄に費やされるばかりではなく、システム全体の統一性にも影響を及ぼします。もともとの顧客の要求と実現したシステム仕様の紐付けも曖昧になります。
【原因】
・開発者が技術的な興味から、マネジャーや顧客への確認なく勝手に機能を追加している。
・マネジャーが開発メンバーの「技術者としての本能」を理解していない。
【予防策】
@まずはマネジャーは、技術者の「自分が知らない技術へのニーズ」を理解すること。
A技術的関心のためだけに要求されていない仕様を追加させてしまうのは、基本的には厳禁であることを開発メンバーに徹底する。
Bその上で顧客の要求仕様とシステムコンセプト、およびコストとスケジュールの許す範囲で、開発者の技術的関心へのニーズを満たすための道を探る。
【解説】
仕様の膨張は顧客のリクエストからだけ発生するわけではありません。開発側自ら仕様を膨張させることもあります。例えば技術者には常に、新しい技術や注目を浴びている技術に接していたいという本能的なニーズがあります。そしてこのような技術への欲求が往々にして仕様の膨張につながるのです。これまで「顧客志向」という理由を隠れ蓑にして、本来は不要であるはずの機能が追加され、不要であるはずの技術が実験的に使用されてきました。その結果多くのプロジェクトが危機に陥ってきました。もっとも、技術者の技術への欲求は本能と呼ぶべきものなので、これは否定することは困難です。重要なことは、このような技術者の性向を十分に承知した上でプロジェクトを運営していくことです。プロジェクトを守るために抑えるべきところは抑え、技術者のモチベーション維持のために緩めるべきところは緩めるといった、意識的な制御が必要です。ただし開発メンバーによる無秩序な趣味的、自己満足的な技術の適用には十分注意しなければなりません。
2.顧客組織の問題
【原因】
・ちょっとした要求の追加であればプロジェクトにはほとんど影響はないだろうと思っている。
・要求の追加に当たって、そもそもプロジェクトへの影響や、必要なリソースという考え自体を持っていない。
・「あればよい機能」でも「あれば便利な機能」でも、何でもかんでも要求しなければ損だと思っている。
・顧客の頭の中に、「要求」と「開発に必要なリソース」を結びつける観点が欠如している。
【予防策】
@使用可能なリソースに変化がない以上、要求が増えれば一つの要求に費やすことができるリソースの量は少なくなることを顧客に説明する。
A使用可能なリソースに変化がない以上、「あればよい機能」が増えれば「重要な機能」の開発に費やすことができるリソースの量は少なくなることを顧客に説明する。
B要求が次々に膨張していくと、リソース不足のため、プロジェクトのリスクはそれだけ高まることを説明する。
C「あればよい機能」や「あれば便利な機能」程度の要求は、削除あるいは次期開発にまわすことを提案する。
【解説】
同じ金額であればできるだけ多くの「モノ」が欲しいと思うのは人情です。しかしちょっとした要求ばかりでも、際限のない機能の拡張はトランプのブラックジャックのようなものです。もう少し、もう少しと積んでいくとある時突然ゼロになってしまうのです。「もう少し」と欲張った機能のために、本当に重要な機能までをも失ってしまう羽目になるのです。顧客には、予算一杯までギリギリに要求を詰め込もうとするのは「危険な賭け」であることを説明しなければなりません。余裕を持った見積でさえちょっとしたことで超えてしまうのがシステム開発なのです。
- 「あればいい」機能を開発するだけの余裕はないものと考えること。
これまで開発してきたシステムを振り返ってみてください。あってもなくてもいいような機能がついている一方で、最も重要であるはずの機能が機能不足や使い勝手でユーザの不評を買っていることはないでしょうか。あってもなくてもいいような機能を一切開発せずに、最も重要な機能にリソースを注ぎ込んでいれば、システムが生み出す価値はもっと高いものになっていたことでしょう。重要な機能は単に「重要な機能」とラベル付けしただけでは重要であることの意味はありません。リソースの配分という具体的な行動を通じて、実際にその重要性を示さなければなりません。
3.業務のASISの問題
【原因】
・現行でも明確なルールがない業務をシステム化しようとしている。
・現行の業務のルールを詳細まで洗い出せていない。
・開発しようとしているシステムが、そもそもシステム化が難しい業務を対象にしている。
【予防策】
@システム化の対象と考えている業務の目的と、そこで求められる作業、あるいは作業成果物を明らかにする。
A過去、どのような属人的な判断、臨機応変な判断で業務が進められてきたかを調査する。
B過去、どのような例外事項が発生し、都度どのような対応が取られてきたのかを調査する。
Cシステム化が難しい部分については、無理をせずにきっぱりとシステム化をあきらめる、あるいは延期することを顧客に提案する。
【解説】
コンピュータが得意とするのは単純繰り返し作業です。そして苦手とするのは例外処理や臨機応変な対応です。システム化を考える場合は、このコンピュータの基本的な特性を押えておくことが重要です。システムの目的にもよりますが、場合によっては詳細かつ複雑で難解なマトリックス表や分岐図と格闘するよりも、その業務のシステム化の範囲を縮小することが最適解であったりするのです。現在ではコンピュータの利用目的は、その「不得意分野」への進出が目立ってきていますが、あくまでコンピュータの特性を忘れずにいることが重要です。
4.業務のTOBEの問題
【原因】
・システムのあるべき姿が明確に固まっていない。
・開発しようとしているシステムが、そもそも事前に仕様を決定することが難しい性格を持っている。
【予防策】
@システムが持つそもそもの性質として、「膨張しやすい」システムなのか「膨張を制御しやすい」システムなのかを見極める。
◇膨張しやすいシステムの例
・新たなサービス創造のためのシステム
・情報活用支援のためのシステム
・業界の変化に対応するためのシステム
◇膨張を制御しやすいシステムの例
・業務効率化、省力化のためのシステム
・業務プロセスの標準化のためのシステム
A「膨張しやすい」システムすなわちスコープを明確に定めることが難しいシステムの場合、その旨を顧客に説明しておく。
B「膨張しやすい」システムの場合は、要求フェーズの期間を厳格に区切ることで「スコープ確定」とする。また、この件については、(開発条件等で)事前に顧客の了承を取りつけておく。または交渉しておく。
【予防策2】
@インクリメンタルな開発プロセスを採用する。
【解説】
システムには仕様膨張につながりやすいシステムと、仕様膨張を抑えやすいシステムが存在します。合理化、省力化のためのシステムは一般に目的や費用対効果を明確にしやすく、仕様の曖昧さも少ないものです。一方、能力開発システムや付加価値創造システムはシステムと目的との因果関係が不明確な場合が多く、要求仕様も曖昧になりがちです。費用対効果がわかりにくく、後々の仕様変更も多くなり、目的に対応する要求仕様の切り分け、境界線も曖昧になりがちです。こうしたシステムの場合は、要求フェーズの期間を明確に区切り、その期間を過ぎて発生した要求については(別プロジェクトでも次のインクリメントでもよいので)明確に今回の開発とは切り離すことが重要です。ズルズルと中途半端に対応しながら進めるは危険です。(※もっとも、開発の効率性を考えて今回の開発に取り込んでしまった方がよい場合もありますが、そこはプロジェクトの個別判断となります)
また、このような先が見えにくいシステムを開発する場合は、インクリメンタルな開発プロセスが適しています。メリットがあればデメリットがあるのは当然で、このプロセスを採用すると1機能あたりのコストは高くなります。ただし先が見えにくいシステムとはそもそもが「手探り」プロジェクトであり、確定した仕様を効率的に開発していくプロジェクトではないので、そこは顧客にも納得してもらうように説明しなければなりません。
【原因】
・システムの目的が明確に絞られていない。
【予防策】
(主要な問題その3「要求の誤解と的外れの理解」参照)
5.要求定義のアクションの問題
【原因】
・要求を選択する仕組みがない、あるいは要求に優先順位をつけていない、あるいは優先順位という考え方がない。
・要求に優先順位が存在していても、開発にその優先順位を反映させる仕組みが存在しない。
【予防策】
@開発に「優先順位」の考え方を導入することのメリットを顧客に説明する。
◇要求に優先順位をつけることの顧客側のメリットの例
・重要な機能から先に完成することになる。
・後で不要になるかもしれない機能を開発することの無駄を排することができる。
・開発に集中することができ、品質や生産性が向上する。
A要求の優先順位を曖昧にすることのデメリットを説明すること。
◇要求の優先順位を曖昧にすることのデメリットの例
・要求に優先順位をつけないということは、プログラマにその決定をさせるということになる。
・要求に優先順位をつけないということは、「全ての重要度が高い」ことであると同時に「全ての重要度が低い」ことでもある。それぞれの機能の「重要性」の意識が薄れる原因になる。
B開発に「優先順位」の考え方を導入するよう提案する。
【解説】
確保可能なリソースから考えて10機能にしか対応できない状況に対して、顧客の要求が12機能にまで膨れ上がってしまった場合、開発側はどのように対応すべきでしょうか。僥倖を期待して、あるいは何も考えずに12機能の完成を目指して遮二無二頑張るのも一つの手ではありますが、その結果は多くの方は経験済みでご承知のことと思います。しかもそのようなシステムに限って、運用が始まってみると実際に使われているのは一部の機能だけだったりするのです。実際、システムに盛り込まれた機能が全て有効に活用されているという例は極めて少ないのが現状です。一度も使われたことがない機能や滅多に使われることのない機能というものは少なからず存在しているものです。
ではなぜ、使われない機能まで作ろうとするのでしょうか。要求定義の不備もその大きな原因の一つですが、そればかりではありません。ここには顧客の心理的な要因も絡んできます。まず、顧客の中で「同じ金額を支払うならできるだけたくさんの機能が欲しい」という意識が働いている場合があります。完成品の工業製品を購入するのであればこの考え方は有効ですが、ソフトウェアの開発にはもちろん当てはまりません。機能を増やせば増やすほど品質は低下していくでしょう。このあたりの力学は、開発側が積極的にシステム開発の実際について説明し、顧客の誤解を解いていかなければなりません。
しかし中にはプロジェクトに及ぼすリスクを理解した上でも、機能の追加を求めてくる顧客もいます。通常、追加要求という形で後から機能を追加すると、別途新たなコストが発生してしまいますが、このリスクを避けるため、「必要になるかもしれない」程度の機能であっても「念のため」を考えて最初から要求に含めてしまうのです。しかし当然ながら、この「本当に必要かどうかわからない」程度の機能のために、「本当に必要な」機能を開発するためのリソースが圧迫されてしまうことになります。
しかしそれは顧客にとっても本心から望んでいることではないでしょう。このような事態を防ぐためには、まずは機能の重要度を明確にし、「本当に必要な」機能には、最初に必要なだけのリソースを割り当ててしまうことです。その結果、「必要かもしれない」程度の機能に対しては、「間に合うかもしれない」程度のリソースしか割り当てることができなくなるかもしれませんが、それは仕方ありません。そうでなければ「本当に必要な」機能にさえ十分なリソースを割り当てることができなくなってしまうのですから。
もちろん、これらの「リソース配分の論理」は開発側の判断だけで行うべきものではなく、事前に顧客の同意を得ておく必要があります。「必要かもしれない」機能の開発は、リソース不足によって機能が縮小されたり中止されたりする可能性について、あらかじめきちんと説明しておかなければなりません。
- 優先順位を決定する際の重要性の基準を明確にすること。
基準はシステムの目的に合致したものでなければなりません。
◇優先順位を決定する際の基準の例
・現行のビジネス価値が最も高いのはどの機能か。
・将来のビジネス価値に貢献する可能性が高いのはどの機能か。
・費用対効果が最も高いのはどの機能か。
・開発リスクが最も高い(低い)のはどの機能か。
・開発効果がないリスクが最も高い(低い)のはどの機能か。
・開発コスト削減に最も効果があるのはどの機能の削減か。
※優先順位は「機能の重要性」×「機能の緊急性」で測られるのが一般的です。
- 要求の優先順位を明確にし、無用なプレッシャーから現場を解放すること。
適度なプレッシャーは生産性の向上に多少は貢献するというデータもありますが、現実にはそれが「適度」に収まることは滅多にありません。しかし限度を超えたプレッシャーは往々にして品質の低下、それに伴う生産性の低下、それに伴うモチベーションの低下などの悪影響を連鎖的に引き起こすことになります。ここで優先順位を明確にすることにより、仕様が膨張しても「全てを取り込まなければならない」というプレッシャーから解放されることになります。ただしこの「解放」は、メンバーの意識レベルによっては単なるダラダラ作業を引き起こす可能性もあることを忘れてはいけません。
- どのステークホルダーの要求を優先するのかを明確にすること。
ステークホルダーによってシステムへの関心の視点は異なっています。どのステークホルダーの視点でシステムを考えるのかを、あらかじめ決めておかなければなりません。
◇それぞれのステークホルダーの視点の例
経営陣
・少ない予算で完了する。
・短い開発期間で完了する。
プロジェクトマネジャー
・予算内で完了する。
・期間内で完了する。
・品質が許容範囲内である。
開発者
・新技術が身につく。
・技術的な挑戦ができる。
・「常識的」な作業時間である。
エンドユーザ
・機能が多い。
・使い勝手がよい。
・統一感が取れており「驚くような」ことがない。
・サクサク動作する。
・バグがない。
保守要員
・信頼性のあるドキュメントが揃っている。
・バグがない。
・バグの修正が容易である。
【原因】
・信頼関係が醸成されておらず、顧客が「優先順位」の重要性を理解していてもその適用を拒否する。
【予防策】
@インクリメンタルな開発、段階的な納入方式を提案する。
Aインクリメンタルな開発、段階的な納入で開発を進める。
B日々の作業を通して顧客の信頼を勝ち取る。
C残りの開発分について、「優先順位」の考え方を導入するよう提案する。
【解説】
「優先順位」の考え方は合理的であり、顧客も簡単に納得してくれそうなものですが、現実はそれほど甘くありません。事実、「優先順位」の考え方を導入すると、「何が何でも開発しなければならない」というプレッシャーから現場のメンバーを解放することにつながります。成熟度の低いチームではそれが作業の怠慢に発展することも考えられないことではありません。「最後の機能はできなければできなくてもいいや」というような怠惰な空気が醸成される危険性があるのです。これは顧客の最も懸念することの一つです。優先順位を設定した上で「できるところまでやります」と口ばかりに宣言して、実際はのんびりした仕事をされたのでは顧客はたまったものではありません。開発チームにはより以上の高い意識を持って作業をすることが求められます。これができずに優先順位ばかりを取り出していては、顧客からの信頼は回復不可能なまでに低下してしまうでしょう。
【原因】
・要求の正しさや要求の妥当性をチェックする仕組みがない。
・追加変更要求が発生した場合の対応方法や要求管理のルールが事前に明確に決められていない。
【予防策】
@追加変更要求が発生した場合の(標準的な)変更管理プロセスを作成する。(☆「追加変更要求の発生」−「治療のためのヒント」参照)
A変更管理プロセスの例外プロセスを検討する。
B変更管理プロセスをプロジェクトの特性に合わせて改変する。
【解説】
追加変更要求に対する変更管理プロセスを明確に定めている組織はまだまだ多くはありません。まずはプロセスを定めるところから始めなければなりません。もっとも現実の話では、プロセスを定めてはいてもそれをマニュアル通りに運用している組織は少数派でしょう。なぜならプロセスの多くは固定的で融通が利かず、現実のプロジェクトの実情に合わないからです。標準的なプロセスを定めた後は、プロジェクトに合わせてカスタマイズしていく必要があります。プロセスを定める際には、くれぐれも「どのプロジェクトにも通用する」ようなものを作ろうと頑張ってはいけません。無意味な一般化か無駄な精緻化に陥るのが関の山です。
【原因】
・要求管理のルールを定めていても、それを実行できていない。
・要求管理のルールが定められているだけで、簡単に破られる。
【予防策】
@変更管理プロセスの顧客にとってのメリットを説明する。
◇変更管理プロセスの顧客にとってのメリットの例
・プロセスを経ることによってシステムの統一性や一貫性が保持される。
・プロセスを経ることによって無駄なリソース消費が抑えられる。
・プロセスを経ることによって管理されない要求の混入を防止し、品質低下のリスクが低減する。
・都度、仕様膨張のリスクを検討することによって、プロジェクト崩壊のリスクを低減することができる。
A要求定義フェーズを終了してから発生した要求には、変更管理プロセスとその例外プロセスが適用されることについて、顧客の了承を得る。
【解説】
ルールというものは実行されてはじめて価値が生ずるものです。そしてルールというものは、参加する全員がそれに従うことによってはじめて価値が生じます。そもそもルールというものは実行可能性を考えて策定されるべきですが、ルールが実行できなかったり簡単に破られたりするのであれば、まずは実行に向けての働きかけが必要です。それが無理であることが最初からわかっているのであれば、現実的な落としどころを考えなければなりません。理想論や「あるべき論」は唱えずに、現実的に「目的が達成できる」案を考えるべきです。
【原因】
・「追加変更要求」の定義が曖昧で、要求管理のルールに乗せる以前の要求の切り分けが困難である。
【予防策】
@「追加変更要求」の定義を(可能な限り)明確にする。
◇「追加変更要求」の定義の例
・要求仕様書に記述されていない要求は追加変更要求である。
・一定期間を過ぎて発生した要求は追加変更要求である。
A「追加変更要求」の定義について、顧客の合意を取りつけておく。または顧客と共通認識を図っておく。
【解説】
変更管理のルールが定められていても、それが適用できるか否かの判断ができないのであれば、そのルールは存在しないのと同じです。ルールを作ったら、そのルールがいかなる場合に適用されるのかを、できるだけ明確かつ具体的にしておく必要があります。
【原因】
・要求の出所が一元化されていない。
【予防策】
@要求の出所を一元化することのメリットを顧客に説明する。
◇要求の出所を一元化することのメリットの例
・無秩序な要求の発生が抑えられ、システムのコンセプトや統一性を維持しやすくなる。
・無秩序な要求の発生が抑えられ、品質低下のリスクが低減する。
・無秩序な要求の発生が抑えられ、スケジュール延長やコスト超過のリスクが低減する。
・要求の管理洩れがなくなり、設計洩れや試験洩れのリスクが低減する。
・要求の管理洩れがなくなり、要求の追跡性や保守性が向上する。
・顧客の要求定義への意識が向上する。(いつでもやってくれと言えばやってもらえるという感覚がなくなる)
A顧客と相談の上、要求の出所を一元化する。
【解説】
要求の出所が明確に一元化されていない場合、時と場所を選ばず様々なステークホルダーから様々な要求が飛んでくるようになります。これは仕様の膨張につながるだけでなく、管理洩れによる種々のトラブルの発生、システムのコンセプトや全体の統一性を壊す原因にもなります。貴重なマネジャーや担当者の時間も非効率的に費やされてしまうことになります。個々のユーザへのインタビューなど、開発側から積極的に要求を獲得していく場合はもちろん別ですが、基本ルールとしては、顧客からの要求は(要求定義の定例会議などに)一元化してもらうことです。
【原因】
・顧客が開発メンバーに直接要求を依頼している。
【予防策】
@正式なルートを通さない要求は(基本的には)受けつけない旨を、顧客側に説明する。
A正式なルートを通さない要求は受領しないように、開発メンバーに徹底する。
【解説】
追加変更要求を、顧客が正式なルート(要求の入り口)を通さないで直接開発メンバーに依頼することがありますが、これはご法度です。「1分で対応できる」ような些細な要求でも、正式なルートを通してもらうように顧客にお願いしなければなりませんし、メンバーにも勝手に要求を引き受けないように徹底しておかなければなりません。要求が管理できずに、後々の問題発生の種を残すことになります。
【原因】
・一旦膨らんだ顧客の要求を削減する仕組みがない。
【予防策】
@顧客が納得するような「要求削減の条件」「機能削減の条件」を検討する。
◇要求削減・機能削減の条件の例
・明らかにシステムの目的との関係性が薄い場合。
・明らかに便利機能でしかない場合。
・明らかに特定の個人にしか役に立たない機能である場合。
・当該機能の重要性が低く、かつ他の重要な機能の開発を圧迫することが明らかである場合。
・機能を削減しなければプロジェクト自体の崩壊が予見される場合。
A「要求削減の条件」「機能削減の条件」について顧客と相談する。
※上記条件は判断の基準が難しいですが、少なくとも事前に(要求削減をお願いしなければならなくなる前に)顧客と折衝して了解を得ておくことです。
B可能であれば契約に上記条件を項目として盛り込む。
【解説】
要求仕様書や設計書に既に記述されてしまったという理由だけからで、実際は重要性の低い機能の開発が続けられてしまうことがあります。誰もが不要と知っている機能を、「一旦決まった機能だから」「一旦約束された機能だから」と強引に開発を進めるのは明らかに間違っています。政治的な動きを好まない、あるいは潔しとしないマネジャーもいますが、最も重要なものは「製品そのもの」ではなく「顧客の満足」ということを忘れてはいけません。
【原因】
・要求定義の作業で開発側が「聞くべきこと」と「裁量で判断すべきこと」の切り分けができていない。
【予防策】
@システムの目的、システムのコンセプトを明確に理解する。
A要求を固めていく過程において、顧客に逐一確認して進めていくべき点と、開発側の裁量で進めていくべき点とを、明確に切り分けを行う。
B裁量で進めるべき点については顧客に不要な確認はせず、要求定義の作業を進めていく。
【解説】
聞かなくてもよいことまで顧客に逐一聞いて確認を取ることは、不必要な要求肥大の原因であり、要求定義の非効率化の原因です。例えばシステムによっては、ボタンの大きさなどは「どうでもよいこと」であり、常識的に判断すべきものです。そのようなシステムではボタンの大きさは開発者の裁量、開発側の標準に任せておくべきです(※もちろんボタンの大きさが重要なシステムもあります)。何を聞き、何を聞くべきでないかの切り分けができていないと、防御的になり、何でも顧客に確認を取ることになります。顧客は聞かれればもちろん、自分達の希望と考えを答えることでしょう。確認するステークホルダーがが異なれば、それぞれ違った意見が出てくるでしょう。かくして要求は詳細化し、「重箱の隅」化し、膨張していくのです。
- 本質とは無関係な細部の仕様は、(とりあえずでも)開発側の裁量に一任してもらうこと。
システムの目的とは無関係な箇所、取るに足らない細部の仕様で、要求仕様の確定に手間取ることがあります。これは時間の無駄以外の何ものでもありません。そしてそれらの詳細な仕様を(コード一行単位で)ドキュメントに落とすことも、少なくとも一般のビジネスシステムの開発においては費用対効果に見合うものではないでしょう。過剰に開発者の裁量範囲を制限すると、システムは非常にコストの高いものになってしまいます。しかもそのために得られるものは多くはありません。
治療のためのヒント
1.まず対応に向けて検討すること
仕様の膨張とは基本的にサービスで、すなわち無償で対応しなければならない顧客の要求のことを意味しています。もちろん追加費用の交渉が可能な「正式な追加要求」でも仕様は膨張しますが、この項では顧客から正式な追加変更とは認めてもらえない要求に目を向けています。つまり、当初予定の費用もスケジュールも変更することなく、対応しなければならない要求ということです。
約束されていなかった仕様の膨張、想定していなかった仕様の膨張でも、それは必ずしもプロジェクトのスケジュールやリソース計画に影響を与えるものではないかもしれません。そもそもの見積や計画が100%正しいとは限らないのです。まずは仕様に取り込むことを前提に、膨張した仕様への対応を考えてみるべきでしょう。
- まずは開発側内部の「やりくり」だけで対応可能かどうかを検討してみること。
仕様の膨張に対しての選択肢は最後には「やるか」「やらないか」しかありません。しかし、ほとんどの現場では「やらない」選択肢を選ぶのは非常に難しいのではないかと思います。「やらない」ためには顧客を納得させるだけのロジックが必要です。しかもそのロジックは顧客のロジック、つまり「それがなければ業務がまわらない」という強力な意見に勝たなければならないのです。まずは「やる」方向で考えていかざるを得ないのが、多くのプロジェクトの現状でしょう。
- 銀の弾丸を求めないこと。
無秩序な仕様の膨張によってプロジェクトが制御不能に陥りそうな時、納期・費用・品質いずれにも影響を及ぼすことなく事態を収拾する方法があればどれほどよいことでしょう。それを本気で望むのは、いわゆる「銀の弾丸」症候群です。熱望するあまりその存在を「確信」し、存在しない「錬金術」を血眼になって探すようなパニックに陥ってはいけません。まずは現実を直視し、合理的な問題の解決を目指すべきです。
- まずは「計画に誤りを見出す」という考え方をすること。
仕様が膨張してプロジェクトが危機に陥っているならば、膨張した仕様の削減を考えるのが常道です。しかし全ての仕様がシステムの目的と整合性が取れており、しかも全ての仕様がシステムの目的のためには必須のものである場合、仕様の削減を顧客に納得させるのは困難です。トレードオフの原則からすると、必然的に納期・費用・品質のいずれかに手をつけなければ膨張した仕様に対応することはできません。あるいは自社が赤字を覚悟して、仕様も納期も費用も品質も満足させることです。一見正しいように見えるこの論理は、幸いにも机上の論理でもあります。当初の計画に誤差や誤りがないと仮定した場合の話です。他の何物にも手をつけずに膨張した仕様に対応するためには、計画に誤りがあればよいのです。否、計画に誤りを見出さなければならないのです。
- 唯一の可能性は生産性の向上だが、そこに「無理」はきかない。
この期に及んで使用したこともないような方法論に助けを求めてはいけません。断言します。それは現場にオーバーヘッドを課すだけで、却って逆効果となるでしょう。外部条件に変化がないままでアウトプットを増やすための唯一の方法は生産性を上げることです。しかし労働集約的なシステム開発の作業で生産性を向上すること自体、そもそも非常に困難なことです。顧客の要求を呑むのであれば、あえてその現実を踏まえた上で生産性向上の可能性を探っていかなければならないのです。30年前に比べてコンピュータの性能(生産性)は何倍になったでしょうか。その間、農業の生産性は何倍になったでしょうか。この生産性の伸びの差はどこにあるのでしょうか。問題は根源的です。逆らうことができない「自然の法則」がそこには存在します。外部条件に変化がない以上、追加仕様に対応する唯一の方法は生産性を上げることだけですが、検討に当たってはこの「自然の法則」を無視した無理な計画を立ててはいけません。
- 個々の生産性の向上は必ずしも全体としての生産性向上にはつながらない。
全てのメンバーに常に全速力で走る事を命じても、必ずしも全体としての作業の進捗がはかどるとは限りません。生産性を論じる場合、常に全体としての生産性を念頭においておく必要があります。例えばCが作業をするためにはAとBの成果物を必要とする場合、Aだけが急いで完成させてもBが終わらなければCの作業を始めることはできないのです。このときの「待ち時間」を別の作業のために使用することもできる、という主張も確かにあるでしょう。しかし人間を、しかも知的作業に関わる人間を全速力で走らせておいて、少し時間が空いたら全く別の作業でまた全速力で走らせるというやり方が果たしてどこまで通用するでしょうか。本人に高いモチベーションや一種の使命感のようなものがあれば話は別ですが、一般的にこのような管理は「やっつけ仕事」を生み、プロジェクトを更なる窮地に追い込むものです。
- リーダーは自らプロジェクトに全力投球しているか。
リソースに余裕がない中で膨張した仕様に対応するためには、メンバーの献身的な協力が不可欠です。リーダー自身が漫然と作業をしている中でメンバーが全力投球などするはずがありません。仕事をしているフリはすぐに見破られます。徹夜でごまかそうとしても駄目です。もし、これまでの自身の姿勢に問題があったと思われるならば、(パーソナリティにもよりますが)自戒の言葉とこれからの姿勢をメンバーに伝えるのも一つの手かもしれません。急にバタバタと行動し始めても「所詮火がついたから焦っているだけ」と思われては何の効果もありません。(※厳しい言い方ですが、すでにリーダーが「そういう見方」でメンバーに見られている場合、その見方を変えるのは至難の業です。「重要」なプロジェクトならば、デスマーチに陥る前にリーダー交代の選択肢についても考えるべきです。)
- メンバーはプロジェクトに全力投球しているか。
余程目に余るようなものでない限り、タバコや無駄話、休憩の時間を無闇に禁止したり制限したりする必要はありません。そのような対策はむしろメンバーの士気も生産性も暗黙知を醸成するコミュニケーションも低下させるようなものです。リフレッシュしているのか、本当にさぼっているのか、明確な判断基準を客観的な指標で示すことはできませんが、両者の違いくらいは(余程パニックに陥って盲目になっていない限り)わかることでしょう。
- チーム内コミュニケーションを促進する、あるいは妨げない仕組みを設けているか。
生産性は周りのメンバーとの協力関係や信頼関係が築かれているときに向上するものです。周りのメンバーと一体感を持って仕事に取り組んでいるときに向上するものです。生産性に影響を与えるのは個々の能力ばかりではありません。例えばおかしな管理ルールをメンバーに押しつけて、その自由なコミュニケーションを妨げるようなことがあってはいけません。
- リーダーはメンバーのためにリスクを冒す覚悟はあるか。
チームの「盛り上がり」は生産性向上にしばしば不可欠な要素ですが、そのために必要ならば職場ルールでもリーダーの全責任で「破ってしまう」くらいの覚悟がなければなりません。机での飲食は禁止されているかもしれません。ヘッドホンをつけながらの作業は禁止されているかもしれません。しかしそれで生産性の向上が認められるならば、リーダーの責任で許可することも考えなければなりません(※もちろん、隔離された部屋など、他のチームに悪影響を与えない環境に限られますが)。リーダーには、士気を高めるためには必要なことは何でもするくらいの心構えが必要なのです。
- 外圧ではなく、メンバーの「内なるモチベーション」を重視しているか。
生産性に全く目標値を設定しないケースと、自ら目標値を設定させたケースと、目標値を上から押しつけたケースとを比較した場合、どのケースが最も高い生産性をあげることができるでしょうか。実は、全く目標値を設定しないケースの生産性が他の場合に比べて最も優れた結果を出したとの研究報告があります。要するに知的労働作業は、緻密な管理をしたからといって計画通りに進むものではないのです。「生産性の評価」や「残業規制」や「管理者や顧客からのプレッシャー」など、気にしなければならないものが何もないときに向上するものです。知的労働者の生産性は、外からのプレッシャーではなく内なるモチベーションに基づいて作業を行うときに、最も高くなるものなのです。
- メンバーが担当している作業に、リーダー自らサポートしたり手伝ったりできる作業はないか。
自ら設計やコーディングに携わることができないならば、リーダーは極力メンバーのサポート役にまわるべきです。(極論でも何でもなく)コピー屋でもドキュメント係でも何でもよいのですが、とにかく便利屋に徹することです。メンバーの時間は全て、最終成果物に直接貢献するような作業にのみ有効に活用されるようにすべきです。表面上のプライドは多少痛むかもしれませんが、プロジェクトへの執着がプライドを上回るならば、すぐにでもそうすべきでしょう。
- リーダーが何をすべきかをリーダーはわかっているか。
生産性を向上させる方法を一番よくわかっているのはメンバー自身です。メンバーの生産性向上策について、本来はリーダーがあれこれ考えるべきことではありません。まずはメンバー自身に生産性を向上させる方法を直接聞いてみることです。何が生産性の向上を阻んでいるのか、何が余計なオーバーヘッドになっているのかを聞いてみることです。タスクへの担当者のアサインや作業順序等、マネジメント面が生産性に与えている影響を聞いてみることです。個人の生産性を最大にする方法とともにチームとしての生産性を最大にする方法も聞いてみることです。もちろん、メンバーの意見やアイデアをそのまま実行しなければならないわけではありませんが、中には「目から鱗」の意見もあるはずです。
- メンバーの提案策を安易に却下していないか。
生産性向上策を最もよく知っているのは現場のメンバーです。生産性向上策についてマネジャーが悩むのは間違っています。その方法を開発者に教えてあげる必要はありません。マネジャーの教える方法が得てして間違っているのです。ところが多くの場合、折角あげられた現場の意見でも(ほとんど何も考えずに)実現性が低いものとして却下されてしまいます。その上で悩んでいるのですが、悩むのは当然です。最も有効かもしれない策を却下してしまったのですから。メンバーの提案策はマイナス点だけがたいそうに取り上げられ、そのメリットが検討される前に却下されがちですが、このような態度は自らの首を絞めているようなものです。
- 「生産性を向上させよ」と指示することの無意味さを理解しているか。
指示されたからといって突然、才能が開花したり能力が向上するわけではありません。「生産性を向上させよ」という言葉だけで生産性が向上する見込みはほとんどありません。そのような無意味な言葉を発し続けてメンバーからの信頼を失う前に、生産性が向上するような環境を準備することに頭を悩ませるべきです。また、生産性の向上を指示するのであれば、そのやり方を示さなければなりません。やり方を示すことができないならば、少なくともメンバーから生産性向上の方法を聞くべきでしょう。
- ペーパーワークに埋まってしまわないように気をつけること。
システム開発では管理者だけではなく、現場の開発者にも多くのペーパーワークが求められるものです。システム開発と言いつつも、そのほとんどの作業がペーパーワークで占められているSEはざらにいます。ペーパーワークは設計書ばかりではありません。管理者がその上司あるいは顧客に説明するためのペーパーワークや承認を得るためのペーパーワーク、変更管理や進捗管理など無数の管理のためのペーパーワーク、報告や確認のためのペーパーワーク。それらは納品物である場合もあるし、そうでない場合もあります。何も考えずに受身で作業をしていると、システム開発の作業は非常に多くのペーパーワークで埋まってしまうことになります。
- ペーパーワークにかかるコストを意識すること。
重量級の方法論に準拠した大規模プロジェクトでは、しばしばペーパーワークのコストが全コストの50%を超えることになります。そこまで「大袈裟な」例を挙げずとも、通常のプロジェクトでもペーパーワークのコストはコーディングのコストを十分に上回っているものです。
- ペーパーワークの修正管理の難しさを理解すること。
ペーパーワークの修正管理は、厳格に行うことが困難であると同時に、なにより非常に面倒です。機械的な単純労働作業はメンバーを疲弊させてしまいます。「なぜ、こんな無意味な作業をしているのか」とメンバーに疑問を抱かせることによって、プロジェクトの士気も徐々に低下していくことになります。
- ペーパーワークの修正管理の無駄を省くこと。
最初からきちんとした設計書を書くこと、書こうとすることは無駄につながります。例えば最初に100時間かけて完成させた設計書ならば、おそらく開発を進めていく中で、あと50時間はメンテナンスのための時間が必要になるでしょう。最初からきちんとした設計書を書くことは大きな無駄につながります。設計書の作成が顧客との重要な契約事項である場合を除いて、一般のプロジェクトであれば設計書はコーディングが完了した時点で保守用に作成するくらいの気持ちで丁度良いのではないかと思います。
- ドキュメントの作成は可能な限り遅く、そして少なくすること。
ペーパーワークによって実装が遅れるならば、そして「きちんとした」ドキュメントがなくても実装が可能ならば、ペーパーワークは極力実装後にすべきです。「言った、言わない」の解決はノートの隅に書かれたメモでも十分です。「動かないもの」「最終成果物ではないもの」「無駄になるかもしれないもの」に早々から貴重なリソースを費やすべきではありません。リソースはまずは、「動く製品」に最も多く割り当てられるべきです。
- ドキュメントの作成に貴重な開発者の時間を使うことには極力慎重になること。
ドキュメントを作成するために、本当にその開発者の技術を要するもの以外は、管理者またはサポート要員が作成すべきです。「替えのきかない」技術者の貴重な時間を、誰でもできる作業のために奪ってはいけません。
- 最終成果物に直接貢献しない中間成果物を作成しないこと。
プロジェクトで最も重要な成果物とは何でしょうか。顧客にとってどの成果物には価値があり、どの成果物には価値がないのでしょうか。最終目的だけを見据えるならば、そこに至るまでの中間成果物が少なければ少ないほど生産性は高まります。中間成果物の作成が契約にあるならば仕方ありません。しかしそれがあくまで「開発側が決めた」手段であり、最終目的ではないのならば、そのために費やす労力を最小限にする方法を考えるべきです。例えば最終成果物に直接結びつかない「保守のため」のドキュメントを作成するならば、その作成をプロジェクトの(二次的な)目的に最初から入れておくべきです。開発側が「常識」で勝手に判断して、そのためにリソースを費やすべきではありません。例えば設計書を作成するのであれば、その精度やフォーマットへの準拠の必要性を顧客に確認すべきです。そのために必要となるコストや時間を説明し、顧客に判断してもらうことです。開発側自ら、最終成果物に費やすことのできるリソースを減らすような行動を取ってはいけません。最終成果物を作成するために中間成果物は必要です。しかし手段としての中間成果物ならば、手段として役に立つ必要最小限のレベルに抑えるべきです。全ての(中間)成果物は、その成果物の利用目的から見て有用であれば、それが不完全に見えるものであっても問題はありません。目的に対して役に立つか立たないかだけが判断基準です。中間成果物の出来にこだわるべきではありません。
- 成果物は利用目的を考えて作成すること。
作業の心構え、作業成果物の心構えは「目的のために必要最小限のものを」です。作業の際には、常にその作業の成果物の利用目的を考えるべきです。そしてその目的を達成できる必要最小限のものを必要最小限の完成度で作るべきです。余計なリソースを注ぎ込むべきではありません。貴重なリソースを費やして作成された成果物も、目的からはみ出した過剰な部分は全て、目的の達成を阻むものとして考えることです。本来、目的のために投入可能であったはずのリソースが削減されてしまうのです。
- メンバーの作業に無駄なオーバーヘッドはないか。
生産性向上を阻む大きな原因に様々な作業のオーバーヘッドが挙げられます。何をオーバーヘッドと見なすかはプロジェクトによってその認識は違ってきますが、基本的には「製品に価値を付与しない作業」「顧客に価値を生み出さない作業」は全てオーバーヘッドと見なすべきです。
◇オーバーヘッドと見なすものの例
- 各種割り込み作業
- 各種兼任作業
- 担当者にとっては5分間分の価値しかない2時間の会議上司への詳細な報告書(・・・これは直接製品に価値を付与することはない)
- 設計やプロトタイプの作成(これが最終的な製品に価値を付加しないならば無駄である)
- コミュニケーションのための場所の移動や連絡のための時間、コミュニケーションの伝達ミス
- 価値を付加しない規則遵守作業
- 引継ぎ時間
- 引き継がれない暗黙知
- 引き継がれない暗黙知を獲得するために要した時間等
- メンバーを割り込み作業や兼任作業から守っているか。
割り込みはその「大きさ」だけが問題なのではありません。わずかでも作業を中断させる事が問題なのです。マネジャーは得てして小さな割り込みを小さなものとして考えます。例えば「今週の作業時間の報告」などは、ものの5分もあれば十分だと思っているのです。確かにそのために実際に手を動かす時間はわずか5分かもしれませんが、その5分がこれまでの思考を中断させてしまうのです。問題は割り込みの時間ではありません。3分でも1分でも思考の中断が問題なのです。はずみ車ではありませんが、一度軌道に乗った頭の回転を一旦ストップさせ、再び元の回転に戻すためには、大きな労力と時間を要するものです。マネジャーはこのような思考の中断を強いる割り込み作業や兼任作業から担当者を守ってあげなければなりません。ましてやマネジャー自らそれを依頼することなどは論外です。ラインの割り込み作業など、プロジェクトのマネジャーには如何ともしがたいものもありますが、切羽詰った状態にあるのならば、その割り込み作業の削減・免除・延期をメンバーに代わってラインマネジャーと交渉すべきです。
- 管理作業自体が生産性や品質の低下の一因になることを自覚しているか。
成果物の作成に直接結びつかないオーバーヘッドの最たるものが管理報告用の作業です。たとえそのために必要とされる時間が5分や10分であっても、「書かなければいけない」という意識は8時間頭の中にあるかもしれません。もちろんこれは集中力欠如の原因です。報告の負荷など大したことではないだろうなどと考えずに、軽くできる負荷は全て軽くするつもりでメンバーの作業を見直してみることです。本気で考えれば代替案はいくらでもあります。例えば管理用の報告であれば、リーダー自らメンバーの席まで行って口頭で簡単に確認すればよいのです。本当に忙しいときには、共有フォルダを探してファイルを探してファイルを開いて記述するといった簡単な作業でさえ、非常に面倒でイライラさせるものなのです。
- 知識労働者を管理するための作業が、その成果物の生産性や品質を低下させる一因となっていることを自覚しているか。
官僚的な管理と意味のない会議で奪われる時間は、(特に大規模プロジェクトにおいて)相当なものになります。設計者が設計に使える時間、プログラマがプログラミングに使える時間は、(後からは全く思い出せないような)実に様々な理由で奪われていきます。本当に生産性を向上させたいのであれば、プロジェクト管理を根本的から見直す必要があります。管理が原因で生産性が低下しているならば、一つの解決策は管理を緩めて現場の判断に任せることです。往々にしてマネジャーは「労働者というものは管理しなければサボるものだ」という考えを持っていますが、これは肉体労働者に対しては有効な考え方かもしれませんが、エンジニアのような知的労働者にはむしろ逆効果となりかねません。そもそもエンジニアというものは、指示されなくとも最も効率的な作業方法を選択するものですし、品質の低下を最も嫌うのはエンジニア自身です。このような知識労働者にとって(的外れな)管理は単に生産性を低下させ、作業への集中を妨げる要因でしかないのです。テイラーの科学的管理法の考え方はエンジニアの仕事にはそぐわないのです。(※もちろん、本当に経験の浅いメンバーや新人に対する管理については、この限りではありません)
- 管理や規則によってチームの成果を最大化することはできない。
管理や規則が行動原理となっているチームでは、メンバーに管理や規則以上のものを期待するのは難しいでしょう。ガチガチの規則の中で「自主性を発揮せよ」というスローガンが掲げられる事がありますが、これは笑い話にしかなりません。都度変化する現場の状況に対して臨機応変に最適な行動をとっていくために求められる自主性は、管理や規則の中からは生まれてきません。一方、自分の作業成果物がいつ、誰が、どのような作業をするために必要とされるのか、を十分に意識した上での行動や作業は、結果としてチーム全体としての成果の最適化に貢献することになります。しかしこのような行動は、明確な目的意識と行動原理から生まれるものです。官僚的な管理の中から生まれるものではありません。管理のルールや規則は、チームの成熟度を考慮の上で検討されるべきでしょう。
- 無駄な待ち時間の存在を意識しているか。
マネジャーはまさか自分が生産性の低下の原因だとは思ってもいないことでしょう。しかしマネジャーは往々にして開発者を「待たせる」ことによって生産性の低下を招いているのです。マネジャーが自分の行き先を明示していないために、メンバーは承認や確認をもらうために10分間探し回らなければならないかもしれません。マネジャーが外出していたら、その仕事はその日には着手できないかもしれません。マネジャーは(もちろん自身の行動だけではありませんが)極力、開発者の待ち時間を減らすように意識すべきです。
- 現場の判断をどれだけ許容しているか。
生産性向上の基本は、「現場に判断させる」です。開発者がある行動を取るために1時間かかるとします。しかしその行動の許可を得るために6時間かかるとします。これが現実の開発の現場です。生産性を高め、作業の進捗を早める最も良い方法は現場に情報を与え、現場に判断させることです。
- 必要なときに必要な情報が必要なメンバーに過不足なく提供されているか。
・情報の流通ルートは確保されているか。
・情報の流通ルートに障害物はないか。どのような障害物が想定されており、どのような対策が施されているか。
・マネジャーやリーダーが「権力志向」であることはないか。(※権力志向のマネジャーは情報を自分だけで持っていたがります)
- 承認や許可の伺いに関するルールが最小限か。メンバーは自分の判断で行動できるか。(権限委譲されているか)
・承認や許可は、その必要性がきちんと吟味されているか。「慣習」で課せられていることはないか。
- 過度に官僚主義的になっていないか。
・マネジャーやリーダーが「権力志向」であることはないか。
- システムの基本方針やコンセプトが明確になっているか。
・個々の詳細な判断のためにマネジャーの指示を仰ぐ必要はないか。
- 標準や規則、及びその適用について明確になっているか。
・個々の詳細な判断のためにマネジャーの指示を仰ぐ必要はないか。
- それぞれのメンバーに必要な道具、必要な環境が十分与えられているか。
- 外部インターフェースなど、外部要因による影響を極力抑える努力をしているか。
2.そのままでは対応できない場合に検討すること
対応できないのであれば、対応できない旨を顧客に納得してもらわなければなりません。本項では顧客に納得してもらうためのネタ、またはそのヒントを紹介します。
- 膨張した顧客の要求への対応がどうしても困難な場合、その要求は却下せざるを得ないことを覚悟すること。
あらかじめ「余裕を持った」見積で顧客の承認を得ているのであれば、ある程度の仕様の膨張に対応することは可能です。しかしそうでない場合、つまりギリギリの見積で開発がスタートしている場合、顧客との交渉で踏ん張れないと、後に控えているのはデスマーチの影です。一旦プロジェクトに無理を強いると、更に無理せざるを得ない状況が必ずやってくるものです。「踏ん張りどころ」は最初の「踏ん張りどころ」が一番重要です。
- 要求を呑んだ場合、結果としてリリース日が延期されることになるリスクを顧客に説明すること。
・遅延のリスクはどれだけ現実的か。どれだけ可能性があるものか。
・リリース日が一日延期されると、その遅延コストはどのくらいに見積られるか。
・要求への対応は、遅延リスクに見合うものか。
- 要求を呑んだ場合、納期や費用をそのままで機能だけを追加する場合のリスクを顧客に説明すること。
スケジュールや予算は、当初の機能ボリュームを前提としています。予備の見積を取っていない場合、スケジュールや予算をそのままで機能だけを追加しようとするならば、いずれかが破綻するのは目に見えています。
◇計画にない機能を追加する場合に覚悟しなければならないリスクの例
- 作業工数の増加→稼動遅延のリスクまたは品質低下のリスク
- プログラム構造の変更と破壊→品質低下のリスク
- プログラム構造の複雑化→品質低下、生産性低下、保守性低下のリスク
- バージョン管理の煩雑さ→品質低下のリスク
- どれほどスケジュールが押し迫っていても、人海戦術に頼れる作業と頼れない作業があることを説明すること。
「カネは出すからこれだけの機能追加を納期厳守でやってくれ」と依頼されても、対応可能な作業と不可能な作業があります。作業が量的な作業に還元されていれば人海戦術で対応できるでしょう。しかし質的作業は要員を何人追加しても「かかる時間はしっかりとかかる」のです。よくある例えですが、「二人の女性がいても妊娠期間を半分にすることはできない」のです。
- 膨張した仕様に対して(多くの)開発組織が実際に取っている「策」の危険性を説明すること。
多くの場合、費用もスケジュールも再見積されることなく、開発側は膨張した顧客の要求を仕方なく呑んでいます。どのようにしてこの見積の不足分をカバーするのでしょうか。多くのリーダーは自らの責任を放棄し、対応は現場のプログラマ任せになっているのが現実です。それがサービス残業によって対応されるのか、試験項目の省略によって対応されるのかはわかりません。いずれにしろ、最終的には成果物の「品質」で補われることになるのです。
- 正論だけで顧客を納得させようとは思わないこと。
正論だけで顧客が納得するわけはありません。それでは単にシステム開発の講義になってしまいます。あくまでも正論を裏づけにして、顧客の感情を納得させることに意識を集中しなければなりません。とはいうものの、顧客を感情的に納得させるためには、正論の裏づけとなる論理もまた必要になるのです。勢いと情熱と感情だけでは不足です。顧客を納得させるためには、確固としたバックボーンが必要なのです。
- 現場の生産性に問題がないことを説明すること。また、実施している生産性の向上策について説明すること。
リソース不足を理由に仕様の追加が難しい旨を伝えると、「生産性向上で対応して欲しい」などと無理な要請をされることがあります。まずは開発側がどのような努力をしている中で要求への対応が難しい状況になっているのかを、丁寧に説明する必要があります。
◇生産性向上策の例
- 開発ツールの使用
- 共通コンポーネントの使用
- 既存コンポーネントの流用
- コミュニケーションツールの使用
- コミュニケーションロス防止のための開発環境整備(机の配置等)
- 各種情報共有による暗黙知の醸成(判断ミスの削減と質問時間の削減)
- 各種権限委譲による判断待ち時間の削減
- 各種モチベーション向上策
- 各種割り込み作業の排除
- 各種兼任作業の排除
- 個人の性格を考慮したチーム編成
- 個人の性格と能力を考慮した作業の割り当て
- 他社との比較については「消極的に」推論で対応すること。
システム開発のトレードオフを理解してもらったからといって顧客が納得するとは限りません。トヨタもGMも同じトレードオフの中で競争しているかもしれませんが、生産性には違いがあります。「それでも他社だったら対応できるはず」と思っている顧客を納得させるためには、何らかの説得力のある説明が必要です。他社の実情はわからないので推論に基づくことになりますが、それでも説明するのです。推論であることを認めながら説得していくのです。ただしこの場合、ありもしない他社の批判につながらないように気をつけなければなりません。
◇顧客を納得させるための推測の例
「開発能力の違いについて当社はここまで考えています。決して当社の能力が低いわけではありません」というロジックで説明します。
- 他社の見積はそもそも過小見積だったのではないか。
- 他社は問題の難しさを理解していないのではないか。
- 他社はその業務、その技術についての経験が浅いのではないか。
- 他社はプロジェクトを崩壊に導きかねない「賭け」をしているのではないか。
- 他社は保守やサポートで「損失補填」をしようとしているのではないか。
- 他の戦略があるのではないか。(次プロジェクトへの期待など)
- 顧客の「生産性向上」の要求に対しては、最後には正論で対応すること。
◇「正論」の例
- 生産性向上には日々会社として取り組んでいる。ソフトウェア業界は過当競争の業界であり、そのような努力なしに生き残ることはできない。
- 生産性向上には日々取り組んでいるが、S/Wは人間による知的労働作業であり、H/Wの生産性向上とは全く別の話である。短期間に10%や20%といった生産性の向上は不可能である。可能であるとすれば、それは何らかの作業を省いた結果である。
3.新たな解決策の模索
仕様の膨張に対して「できない理由」を説明しただけではだけでは顧客は納得しません。顧客は目に見える効果を期待して投資をしているのです。身銭を切っている顧客の立場を考えなければなりません。代替案や新たな対応策を提示しなければなりません。少なくとも、その準備をしておく必要はあります。
仕様の膨張に対して最も効果的な解決策はトレードオフのバランスを回復することです。それが「物理法則」に則った自然な問題解決法と言えます。
トレードオフバランスの中でも、機能の膨張に対しては機能の削減で対応するのが最も合理的です。追加の仕様を受け入れる代わりに、重要度の低い機能をシステムから落とします。トレードオフの他の要素への影響が少ないため、現実的な解と言えるでしょう。ただし機能の削減はユーザの抵抗が最も大きいことも事実です。「システム導入の意味がない」という意見に対して「我慢してください」とはなかなか言えません。「次期開発」など、将来に向けた何らかの展望は必要でしょう。
- 削減すべき機能、削減してもよいと思われる機能を洗い出すこと。
◇削減すべき機能、削減してもよいと思われる機能の例
- システムの目的との整合性が取れていない機能
- システムの目的との整合性が薄い機能
- 「あればよい」機能、「あれば便利な」機能
- 優先順位の低い機能
- 特定の個人の要求で追加された機能
- 当面は使用されない機能(※ただし2次開発が前提)
- (該当機能を外す旨の)顧客説明の準備をすること。
・該当機能のシステムにおける位置づけを検討する。
・該当機能を削減しない場合に想定されるPJ遂行上のリスク(納期・費用・品質等)を検討する。
・該当機能を削減してもシステムの目的には影響しない理由を検討する。
・該当機能を削減すると得られるPJ遂行上のメリット(納期・費用・品質等)を検討する。
・該当機能を削減すると得られるシステム上のメリット(統一性・使用性等)を検討する。
・顧客説明のための資料を作成する。
- 検討内容を顧客に説明すること。
- リリースを延期しても問題がないと思われる機能を洗い出すこと。
◇削減すべき機能、削減してもよいと思われる機能の例
- システムの目的との整合性が取れていない機能
- システムの目的との整合性が薄い機能
- 「あればよい」機能、「あれば便利な」機能
- 優先順位の低い機能
- 特定の個人の要求で追加された機能
- 現在のリリース予定日では使用される予定がない機能
- (該当機能のリリースを延期する旨の)顧客説明の準備をすること。
・該当機能のシステムにおける位置づけを検討する。
・該当機能のリリースを延期しない場合に想定されるPJ遂行上のリスク(納期・費用・品質等)を検討する。
・該当機能のリリースを延期してもシステムの目的には影響しない理由を検討する。
・該当機能のリリースを延期すると得られるPJ遂行上のメリット(納期・費用・品質等)を検討する。
・顧客説明のための資料を作成する。
- 検討内容を顧客に説明すること
- 機能の増加を増員で対応しようとするのはリスクを伴う方法である。
機能が倍になったらスケジュールは単純に倍以上必要になります。スケジュールを変更しないとすれば必要な増員は倍では全くききません。場合によっては3倍、4倍の増員をしても対応できません。チームの人数が増えると相互コミュニケーションのパスは幾何級数的に増大します。コミュニケーション上のミスやロスが増加します。管理工数も増加します。教育・訓練期間も必要です。一人当たりの生産性は低下します。つまり、機能の増加分だけ線形的な見積で増員しても、それでは全く足りないのです。
- 増員によってスケジュールの短縮を図るのはさらにリスクを伴う方法である。
仕様膨張対策ではありませんが、「増員ついで」の話です。増員してもほとんどの場合、期待されたスケジュール短縮効果は見込めません。要員を3倍に増員しても先の非線形効果から期間は1/3には縮まりません。2/3でも難しいのではないでしょうか。また、分割不可能なタスクが多い場合、増員は全く効果がありません。また、クリティカルパス上にない作業をどれほど早く終わらせても、全体スケジュールが短縮されるわけではありません。スケジュールの問題を解決するための増員には十分に注意すべきでしょう。
- 新規要員の教育・訓練のために費やされる既存メンバーの時間を考慮しているか。
- 新規要員の教育・訓練のために低下する既存メンバーの生産性を考慮しているか。
- 新規要員の立ち上げに許容される時間はどのくらいか。
・許容される時間内に、本当に立ち上げが完了するのか。前提条件や制約条件が隠れていないか。
- 新規要員に求めるスキルは明確か。
◇新規要員に求めるスキルの例
・技術スキル面
・プロジェクト独自の技術スキル面
・業務スキル面
・既存のメンバーとのコミュニケーション面
- 新規要員をどこから調達するか。
・社内に適当な要員がいるか。
・協力会社からの要員確保は可能か。
- 新規要員を調達する際の制約条件は何か。
◇新規要員を調達する際の制約条件の例
・コストの制約
・時間の制約
・性別の制約
・環境の制約
- その制約条件で要員確保は可能か。
・制約条件を緩和すると要員の確保は容易になるか。
- 要員確保の制約条件に合わせるために、プロジェクトの計画を変更することは可能か。
・どのような条件があればプロジェクトの計画を変更することが可能か。
- 何のために、何を期待されてチームに配属されたのかを明確に説明すること。
- あらかじめプロジェクトの概要資料を渡しておくこと。
事前の知識もなく、オリエンテーションでいきなり2時間を超えるような長い説明は不可です。説明する側は1回で済ませたいところですが、説明を受ける側はそれでは吸収しきれません。
- 説明時間はたっぷりと取ること。
説明時間を惜しんではいけません。30分や1時間を惜しむことで、後でその100倍の時間を失うことになりかねません。
- ボリュームが多ければオリエンテーションを複数回に分けること。
説明時間を惜しんで、一回で済ませてしまおうと思ってはいけません。近道だと思う道は決して近道ではないのです。
- 不明点や疑問点はきちんと聞くように新メンバーに念を押すこと。
念を押しても聞いてこないメンバーもいます。これはもちろんメンバーに問題がありますが、だからといって放置しておいてよいわけではありません。適宜質問して確かめることです。
- 同じ質問を何度もされても都度丁寧に説明すること。
一度に頭に吸収できる量はそれほど多くありません。同じ質問をされても「それは説明しただろう」などと返してはいけません。忍耐強く何回も説明することです。
- 説明後は相手の理解を確かめること。
一度説明しただけで相手が理解したとは思わないことです。本当にわからなければ質問もできません。また、「理解しただろ」などと、理解を「強要」してはいけません。
- どれほどのスキルの持ち主であろうとも、新規参画要員には即戦力は求めないこと。
即戦力を期待して無理に作業を割り当てても、却って品質の低下を招くだけです。結果として「丁寧に指導した場合」よりも多くのコストを要してしまうものです。
- 新たなチームの一員に対してコミュニケーション上の配慮をすること。
くれぐれも既存のチームメンバーで固まらないようにします。
- 新メンバーに最初に依頼する作業として下記の作業を検討すること。
・ドキュメントの作成・修正
・優先度・重要度の低い障害の欠陥部分の特定
・優先度・重要度の低い欠陥の修正
・コードレビューの実施
・試験ケースの技術的なレビューの実施
・追加の試験ケースの作成
・要員の雑用
- メンバーのモチベーションを高め、メンバーの作業をサポートし、無駄なペーパーワークを削減し、無駄なオーバーヘッドを削減し、無駄な待ち時間を削減したとします。その上で顧客に仕様膨張への対応が困難であることを説明し、了承してもらえなかったとします。それでも何とか対応するために、機能の削減やリリース日の延期の交渉、増員の交渉を行いましたがいずれも不調に終わったとします。ここまで来るとさすがに切ることのできるカードの数は少なくなってきます。
- 標準・規則への「過度」の準拠をあきらめてもらうことは可能か。
「適度」な標準・規則への準拠は保守性を高め、生産性の向上にもつながりますが、これが過度に適用されると逆にオーバーヘッドとなってしまいます。
- 再利用性や保守性をあきらめてもらうことは可能か。
再利用性や保守性はシステムの「当座の直接の目的」には貢献しません。とにかく最も重要なのが「目先の機能」であるならば、これをあきらめるのは一つの手です。
- 性能・信頼性のレベルを下げてもらうことは可能か。
非常に高い性能や信頼性を求められるシステムの開発は生産性を低下させることになります。性能・信頼性要件への対応を、次期開発にまわすことができないかどうかを交渉します。(※ただし性能や信頼性は基盤のアーキテクチャに大きく依存するため、目処がないままに安易に約束してはいけません。)
- 新技術をあきらめられるか。
新技術をはじめて適用するプロジェクトでは、一般に生産性も品質も低下することになります。「後戻り」ができる位置にいるならば、早急に見切りをつけて「慣れた道」を通るのも一つの手です。
- 「素晴らしいな設計」をあきらめられるか。
「素晴らしいな設計」は頭を使うだけに設計には時間がかかります。メンバーの理解にも時間がかかります。また、一般的に例外事項への柔軟性は低くなりがちです。平凡でシンプルな設計で顧客の要求に応えられないかを検討してみます。
- 最後はやはり、膨張した仕様に対しては対応の対価を求める交渉をすること。
仕様の膨張とはサービスで対応しなければならない顧客の要求のことですが、対応の自助努力にも限界があります。その場合、まっとうな仕事をするためには相応の対価が必要になる旨を説明し、納得してもらわなければなりません。納得してもらえない場合、赤字を覚悟するか、品質の低下を容認するかを決定するのはマネジャーの責任です。くれぐれも現場の判断にゆだねてはいけません。現場にゆだねるということは、明確な指示はせずともメンバーに無理な要求をつきつけることによって、暗に品質低下を認めたりサービス残業を強要するということになるのです。
|