開発中に開発仕様が変更されないようにする方法


61

問題:私が関与するほとんどすべての開発努力で、開発を開始する前に計画にどれだけ時間がかかっても、プロジェクトの途中またはプロジェクトの終わりに向かって大量の変更が常に必要と思われます。これらは時々大きな変更であり、多くの再開発が必要です。

私はお金を払っているクライアントのために働いていません。これは社内開発ウェブサイトの社内開発チームです。だから、私はそれまたは何かのために充電できるようではありません。そして、一日の終わりには、締め切りに間に合わなければなりません。

質問:仕様の変更が途中または開発後に発生するのを最小限に抑え、防止するために皆さんが見つけた最良の方法は何ですか?


9
開発中にFeature Freezeマイルストーンを確立し、そのマイルストーン以降に送信されたすべての機能リクエストが現在のリリースではなく次のリリースに送られるように、物事を整理/交渉します。ここでの重要なポイントは、もちろん複数のリリースを前もって計画し、この理解をクライアントと共有することです
-gnat

4
@gnat OPは、フィーチャーフリーズのマイルストーンを設置することが利害関係者に受け入れられる組織で機能すると想定しています。社内の開発チームでの個人的な経験に基づいて、そのようなことを提案する場合、利害関係者は私をじっと見つめ、「誰が私に変えることができるかできないかを教えていると思いますか?」私の機能は気まぐれに要求しますか?私はあなたに何を払っていると思いますか?あなたの場所を知っています。」
maple_shaft

29
仕様を読み取り専用ファイルに保存しようとしましたか?
-orlp

14
もちろん、あなたは彼らに請求します:仕様へのすべての変更はリリースを遅らせるので、変更要求への応答は、変更が仕様に追加された場合の新しいリリース日の推定値である必要があります。変更を求める人は誰でも遅延の責任を負い、支出を説明するのとまったく同じ方法でそれを説明する必要があります。
サイモンリヒター

7
これがアジャイルの存在理由ではありませんか?仕様を凍結することはできないため、プロセスが仕様の変化に対応できるようにします。
クレイグ

回答:


89

ヘルムート・フォン・モルトケに起因する有名な軍の格言があります:「戦闘計画は敵との接触を生き延びません」。同じように、将来を予測して関係者の心を読むことができなければ(たとえ彼らがまだ心を決めていなくても、変更する必要のない仕様を作ることは不可能だと思います)彼らがやったと主張する)。代わりに、いくつかの方法でアプローチすることをお勧めします。

  1. 変更できるものとできないものを明確に区別します。それを利害関係者に明確に伝え、できるだけ早く変更できないものを明示的に承認させます。
  2. 事前に変更に備えてください。変更可能な部分を簡単に変更できるコード手法を使用し、構成可能性、カプセル化、明確なプロトコルに投資して、部分を個別に変更および交換できるようにします。
  3. 利害関係者と頻繁に話し合い、フィードバックと承認を求めます。これにより、同期が維持され、手遅れになったときに「ああ、それは私たちが望んでいたものではない」と主張することを回避できます。他の回答で述べたように、アジャイルな方法論と頻繁なミニリリースがあなたの役に立つでしょう。
  4. 避けられない変化に対応する時間をスケジュールに入れてください。あなたがそう思うなら、早く「もっと時間が必要だ」と言うことを恐れないでください-あなたが与えられたスケジュールが非現実的であるなら、それよりも最初にそれを知っている(そしてあなたがそれを言っている)終わり。
  5. 変更が広すぎて期限を脅かす場合は、「この変更は可能ですが、X時間までに期限を延ばすので、選択してください」などのように言い返してください。
  6. 変更を要求し、変更に優先順位を付け、バージョンまたはリリースに変更を割り当てる正式なプロセスを作成します。「このリリースではできませんが、次のリリースのスケジュールに入れて喜んでいる」と人々に伝えることができれば、「遅すぎて、変更を入れられません」と言うよりもはるかに良いです、さようなら」とあなたの友人になります-彼らはあなたが時間内にリリースして幸せになるので、あなたの敵ではなく、彼らの変更がある次のリリースにすぐに行くことができます。

3
また、それらを段階的に「フリーズ」し、変更を「次のバージョン」にプッシュすることもできます。
グラントトーマス

3
変更プロセスを形式化し、範囲を明確にすることは、大きなアドバイスです-固定範囲/価格契約作業を行っている場合。他の設定では、スケジュールと価格が範囲と品質よりも優先されるため、このアプローチは研ぎ澄まします。たぶんそれはあなたが与えられた状況で必要なものです。しかし、その後、再び、多分それは...ではありません
tardate

3
番号6の+1。私は、PMがその要件を単独で実装するという素晴らしい経験をしました。
ジョシュアドレイク

3
短いサイクルが重要です。人々は、「次のリリース」が6か月先になるときよりも、次の2週間の短距離走に何かが押し付けられることに、それほど動揺しません。
アダムJaskiewicz

1
「構成可能性への投資、カプセル化」は、非常に危険なアドバイスです。それは、内部プラットフォーム効果と抽象化の空の層に簡単につながる可能性があり、どちらも実際にシステムを変更することをはるかに困難にします。最も簡単に変更可能なシステムは、最も単純なシステムです。
マイケルボルグワード

40

何かを早く(私は何かという言葉を使うのをためらいます)早く、頻繁に届けます。つまり、ある種の反復的な開発手法を使用します。

これはアジャイル開発の基礎ですが、(ほぼ)あらゆる方法で使用できます。

プロジェクトを一連のミニプロジェクトに分割することにより、クライアントの前に何かを早く置くことができるため、より制御しやすくなり、クライアントが気が変わったときに古くなる長い開発スケジュールに縛られることがなくなります(彼らは)。

システムが進化すると、要件の一部が変更され、一部は冗長になり、その他は優先度が高くなります。ただし、プロジェクトのライフサイクルを短くすることで、これらの変更に対処できます。


22

あらゆる規模のソフトウェアプロジェクトを完全に特定できるという理論は、完全な空想です。この理論は、ソフトウェア開発のほとんどすべての歴史において、大小の組織では機能しないことがわかっています。

変更に対応するための方法を見つける必要があります!ほとんどの利害関係者は、「はい、それが私が欲しいものだ」と言っても、実際には彼らの前に来るまで何が欲しいのか分からないからです。そのため、反復法を採用している人が非常に多くいます。

製品を反復するかどうかに関係なく、これらの変更に対応する方法を見つける必要があります。変更しないようにする方法を見つけることは、飛行を開始できるように重力を数分間オフにするよう求めるだけではありません。


2
NASAは、一部のソフトウェアを使用して、または少なくともシャトルを宇宙に送るのに十分な能力を備えています。問題は、彼らが実際にウォーターフォールモデルに従うということです。仕様は実際には凍結されています。少なくともこれは、組織外からの私の理解です。
ジョシュアドレイク

5
私はかなり重要なシステム(電話交換機付属品)を完全に特定することができたいくつかのプロジェクトに取り組みました。これらのすべての場合の鍵は、すでに開発されたハードウェアをターゲットにしており、公開された(ITU)仕様に合わせて開発しているため、どちらも変更できないことです。したがって、あなたの議論はすべてのプロジェクトに当てはまるわけではありません-それらのわずか99%!;)
TMN

@TMN:99%にも同意しません。滝のような開発は、アギリストが称賛するよりもはるかに成功していると思います。それ以外の場合は、もう使用されません。私が取り組んだほとんどのプロジェクトは、滝のようなものでした。重要なのはベースラインを設定することであり、その後の変更は追加の時間と費用で見積もられます。その後、顧客は変更を含めるかどうかを決定し、それに応じてスケジュールと金額がスライドします。
ダンク

1
@Dunk:私たちの成功の大部分は、Bell Labsで開発された方法論を順守したことです。要件から仕様、設計、テスト計画、コード、テスト結果、成果物まで、完全なトレーサビリティを備えた真のエンジニアリングでした。テストが失敗したとき、あなたが見ることができ、正確にどの要件(s)が満たされていないし、あなたが場所を正確に失敗コード(または失敗したデザイン)を検索する場所を知っていました。滝を機能させるには、多くの規律と監督が必要ですが、あなたは正しい、うまく機能します。
TMN

1
@TMNそれでは、どちらが成功の鍵なのでしょうか。ウォーターフォールモデルを使用するのか、それとも規律あるアプローチを使用するのか?私は後者の方がより重要だと考えています。
ロス・ゴダード

19

変更を防止しようとしないで、受け入れてください。事前に計画を立てるほど、計画が変更される可能性が高くなります。だから、計画はもっと少なく、もっと。作業コードの小さなチャンクを頻繁に配信するアジャイル開発方法論を採用し、顧客に数週間ごとに仕様を変更する機会を与えます。


なぜこれが私にはすぐに起こらなかったのかはわかりませんが、コードを持っていると変更を容易に受け入れることができるという考えはおそらく正しくありません。一部の図を変更したり、コードを変更したりするのは簡単で時間もかかりませんか?特に変化が大きい場合。変更を防止しようとしないことに同意します。単に影響を指摘し、スケジュールに応じてそれらを適用する必要があります。アジャイル抱擁の変化は、滝のような方法にすぎません。私は、変更を行うのにかなり費用がかかる可能性があるため、ウォーターフォールよりも悪い変更を処理すると思います(変更が発生する時期に応じて)。
ダンク

6
@Dunkダイアグラムを変更してからコードを変更する方が安価であるという点では正しいですが、変更を行う必要があることをどのように発見できますか?多くの場合、これはユーザーに使用するものを与えた後でのみ発生し、彼は間違ったアイデアを伝えた、これは彼が望んでいたものではない、または彼が望んでいたこれらの他のものもあることに気付きます。秘Theは、これらの変更をできるだけ早く発見する方法を見つけ出すことです。
ロス・ゴダード

@Ross:それがプロトタイプの理由の1つです。ある種の動作システムをモックアップして、フィードバックを取得します。滝では、顧客はそれが完了するまで何を得ているのか分からないという神話です。私は、ユーザーが望むものを確実に手に入れるために、UIの人/人が最初の数か月をかけて代表的なプロトタイプをモックアップするのに十分な大きさのプロジェクトに参加しました。実際のシステムを使用するほうが良いと主張することもできますが、コードを頻繁に再設計する必要があるために終了までに時間がかかる場合は、良いトレードオフではありません。
ダンク

12

あなたは間違った質問をしている。仕様の変更は、あらゆる規模のソフトウェア開発プロジェクトで常に発生します。

多くの場合、それはビジネス要件が変化するためですが、顧客(内部または外部)が反復するものを見ずに可能なことを視覚化するのが難しいと感じるために起こることもあります。開発ソリューション。

あなたが尋ねるべき質問は、「どのように仕様をロックダウンできますか」ではなく、「すでに書いたものをすべて捨てることなく、変化する環境に対応するためにコードとプロセスをどのように構築できますか?」

次に、アジャイル手法、反復開発、コンポーネントベース/モジュールコーディングなどの技術的ソリューション、継続的インテグレーションなど、流行語のビンゴアリーナに進みます。リストは続きます。

これらはあなたのすべての問題に対する特効薬ではないと言っているわけではありませんが、あなたが説明しているまさにその状況を管理したいという願望のために発生しました。

それが具体的な解決策を提供していない場合は申し訳ありませんが、変化を受け入れて管理することへの考え方の変化は、それを回避しようとするよりも大きな配当を支払うと思う傾向があります。


うん。元の質問を言い換えると:「クライアントがプロジェクトの最後に望んでいたものではなく、プロジェクトの最初に望んだものを提供することをどのように保証できますか?」
スティーブベネット

5

変化は驚きに過ぎません...驚きなら!

以下について考えることをお勧めします。

  • とにかくこれらの変化は一体どこから来るのでしょうか?
  • なぜ以前に気づいていないのですか?
  • なぜこれらの変更に貢献していないのですか(そして潜在的にさらに多くの変更を行っているのですか)?

変化は私たちの仕事の本質です。1日目に想定したとおりにアルゴリズムをコーディングしたのはいつですか?

しかし、不満のある開発者が絶えず変化に「驚かされる」ことを避けたい場合は、意思決定が行われるアクションにより近い方法を見つける必要があると思います。結局のところ、私はあなたが製品をより良くする方法のアイデアのバケット負荷を持っていると確信しています。テーブルに着席するか、それらの「サプライズの変更」に対処するだけでよいことを永遠に受け入れます。


+1「変化は私たちの仕事の性質です」-私は変化が好きです。変更は良いことです。それは、私のデザインスキルが十分かどうかを確認する機会を与えてくれます。変更により多くの手直しが発生する場合、私は悪い設計をしました。また、設計をより一般的にする機会も提供します。スケジュールを満たすために急いだものを修正するための言い訳になります。それは私が戻って他の人々のゴミを修正できるようにします。変更要求を追跡してスケジュールに組み込むだけで、元のスケジュールよりも遅れて配信した場合に、その理由を示す証拠が得られます。
ダンク

4

クライアントは常により多くを求めていますが、ここで考慮すべきいくつかのポイントがあります。

HTMLモックアップ:常にHTMLモックアップを作成して、アプリケーションのUI部分を定義し、どのように見えるかを示し、意見を求めます。変更するのに妥当なものを見つけた場合は、HTMLプロトタイプでそれを実行してください。これを使用して、UIの問題、基本的なフロー、いくつかのアドオン(並べ替え、ページネーション、表示するレコード数など)などの多くのことを整理します。


反対側からの積極的な参加:これは、あなたがビジネス組織のために開発している場合、彼らのビジネスにあなたの疑問を明確にするよう頼み、間違いなく彼らのフローにどんな変化が欲しいかを尋ねる場合に非常に重要です(必要な場合)。


モジュラーリリース:コードをモジュラー形式でリリースし、リリースし、テストし、フィードバックを取り、再度リリースします。


4

そのため、事前に計画を立てることはほぼ不可能ですが、まったく計画を立てないという言い訳にはなりません。あなたの計画に深く恋しすぎないでください。あなたの計画があなたの心を壊すことを心配する必要はありません。

社内では、ITリソースを使用するのにコストがかかります。だれかがそれを認めたり、追跡したり、予算を立てたりする必要があるかどうかは関係ありません。現実には、チームは一定の時間内に大量のコードしか作成できません。すべての部門とプロジェクトがこの予算で共有しています。

誰かが要件を変更することを防ぐことはできませんが、結果を逃れることはできません。変更により、開発時間が大幅に増加する可能性があります。それは、彼らが対処しなければならないか、変更しないことを決定しなければならないという事実です。ある部門からのリクエストは別の部門に影響しますか?変更要求は別のグループのタイムスケジュールに違反するため、プロジェクトを別の部門の背後に完全に移動する必要がある場合があります。


4

開発サイクル全体でユーザーが積極的に関与し、可能な限り多くのアジャイル手法を使用することで、製品の開発に本当に役立ちます。

仕様の変更は避けられませんが、ユーザーに対して透過的であり、何よりも頻繁に相談することは、ほとんどの変更ができるだけ早くキャプチャされることを意味します。


3

私にとってはとても簡単です。機能を注文し
「製品所有者」に、これで問題ないことを伝えてください。ただし、この期限までに予定していない機能をいくつか選択する必要があります。
スプリントが0に燃え尽きないことを彼に伝えるPOとのハーフスプリント会議と考えてください。

追伸 「PO」ではない場合、「PO」を介して話をしないでください


1

仕様の変更が途中で発生したり、開発後に発生したりするのを最小限に抑え、防ぐためにあなたが見つけた最良の方法は何ですか?

最善の方法はありません。開発の特定の段階で仕様の変更を制限するのは管理者の責任です。

ただし、変更を期待するような方法でソフトウェアを設計する必要があります。そうすれば、変更の影響ははるかに少なくなります。反復的かつ漸進的な開発は良いスタートです。


1

直接的または間接的に、顧客がほとんどの変更(および最も重大なバグ、BTW)の原因であることがわかりました。したがって、明らかな解決策は顧客を排除することです。(とにかく彼らは何がいいの?)


:)顧客がクレイジーなカスタマイズを望んでいる場合、彼らはお金と時間でそれを支払うものとします。営業担当者が、まだほとんどの時間、まだ販売していない機能を提供することを絶対に約束しなければならない場合、会社は全体的に大きな問題を抱えています。 SyBaseデータベースベンダー。企業としては無関係になるか、革新的なCEOと代理人が必要になります。
ジョブ

1

変更を防ぐことはできないので、それを受け入れる必要があります。あなたができる最も重要なことは、あなたができるだけ早く顧客から変更要求取得しようとする必要があると思います。そのため、プロトタイプ(おそらく紙のプロトタイプでも)を使用して、アジャイル手法などを使用して、できるだけ早く設計を顧客に提示する必要があります。


1

SCRUMのような方法論を使用して、開発プロセスに何らかの規律を導入することを検討できます。SCRUMでは、チームが機能の実装をストーリーに分割し、各ストーリーに作業時間の見積もり(そのストーリーの実装に必要な労働時間または日数)を割り当てることにより、初期計画を作成します。

(すでに実装されているストーリーの)遅い変更が要求された場合、新しいストーリーを作成し、その実装作業を見積もる必要があります。次に、マネージャー(製品所有者)にアクセスして、新しい機能には余分な時間がかかることを説明するだけです。その後、プロジェクトマネージャーは、余分な労力を受け入れ、スケジュールを調整する(おそらく実装されていない他のストーリーをキャンセルする)責任を負います。

チームがSCRUMまたは別の開発プロセスを完全に実装しない場合でも、少なくともストーリーに基づいた計画を導入し、各ストーリーの開発作業を見積もり、新しいストーリーが要求されたときにスケジュールを調整できます。


0

http://teddziuba.com/2010/05/why-engineers-hop-jobs.html

さらに別の人がソフトウェアビジネスの仕組みを理解したり、気にしたりしないので、私はストレスと不幸を感じて仕事後の夜を過ごしすぎました。私は上層の誰かと向き合うことに問題はありませんが、仲間のオタクの裏付けはありません。子供がいるのは雌犬ですよね?すぐに辞めるでしょう。

率直に言って、プログラマーにもっとボールがあればいいのにと思います。これを見てみましょう:

"" "私はお金を払っているクライアントのために働いていません。これは社内開発ウェブサイトの社内開発チームです。だから、私はそれまたは何かに請求できるわけではありません。そして、結局のところ、締め切りに間に合わなければなりません。 "" "

$を支払うクライアントを扱っていて、契約(http://vimeo.com/22053820?utm_source=swissmiss)でお尻をカバーしている場合、仕様の変更はこのクライアントにより多くの時間とお金(または潜在的に同じまたはより少ない時間ですが、指数関数的により多くのお金)。あなたの会社は、より多くの時間とお金のコストをかけることなく、仕様を変更することを避けようとしています。

それまでの間、締め切りを守ろうとすると、あなたと同僚は不必要なストレスを感じます。友人や家族と質の高い週末を過ごすことはできません。あなたに仕事を投げかけている人は誰でもおそらくそれさえ知らないので、それは本当に不要です、これは悲しいです。

私が提案する解決策:集合的にボールに立ち向かい、無料の昼食はなくすべてに費用がかかること、作業中に仕様が変更された場合はオートメカニックに時間がかかり、請負業者に時間がかかることを説明する作業中に仕様が変更された場合は追加料金が発生しますが、それには十分な理由があります。彼らが合理的な方法であなたと仕事をする気がないなら、あなたはグループとして立ち上がって去り、彼らはプロジェクトが中断されたところからピックアップして時間通りに配達できる開発者を雇わなければなりません。

また、アジャイル開発の約束もあります。これは、厳しい期限がないことを意味します。

プログラマーがストライキを行うのをまだ見ていませんが、これは何かあったでしょう。ソフトウェア企業では、無能なマネージャーが豊富にいます。あまりにも多くの人々が、Craigslist上または実際の企業内で何かを無料で手に入れたいと思っています。http://teddziuba.com/2011/07/the-craigslist-reverse-programmer-troll.html

プログラマーはより多くのボールを持っている必要があります。


0

(明らかにすべてのマネージャーではない)うまくいくとわかったアプローチは、「私はそれができると思います。はい。それはこのプロジェクトにどれくらいの時間を割り当てますか?あなたはかなり大きな変化です」要求しています。」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.