主にプログラミング会社ではない会社のプロジェクトを開始するときの期待の1つは、最終的にすべてのバグのない完成した製品があり、必要なすべてをすぐに実行することです。しかし、それはまれなケースです。
ソフトウェア開発が他のタイプの製品開発とどのように異なるかを、期待を管理し、プログラマーでない人に説明するいくつかの方法は何ですか?
最近コンピューターを持っている人はだれでも「バグ」の概念に出くわしているので、そこから始めるかもしれません。 「アプリケーションがこれまでに失敗した中で最も煩わしい方法は何ですか?これを10倍にすると、テストとメンテナンスに十分なリソースを費やさなければ、ユーザーエクスペリエンスが得られます。」
また、非プログラマーと良好な関係を築くことの価値を過小評価しないでください。あなたの判断が信頼できるものであると確立できれば、Yのプロントを行わないと、Xが見事に失敗するという警告を発したときに、彼らがあなたの推論を完全に理解していなくても、彼らはあなたを真剣に受け止めます。
私が成功していることがわかった1つのアプローチはこれです:
私たちは皆、コンピュータが実行するように指示されていることだけを正確に実行することを知っています。
プログラミングとは、私たちがコンピュータnowに何をすべきかlater。
これは、振る舞いの振る舞いがnowであるのは、マシンで実行されているコードのいずれかを書いたすべての人の意図が組み合わさったためです。オペレーティングシステム、ドライバ、プログラミング環境、ライブラリなどの複雑さを考えると、ほとんどのシステムでは2万人以上の人が関与している必要があり、10万人を超える可能性があることが簡単にわかります。
各人が書いたコードは、彼ら自身の理解、動機、意図、能力を反映しています。システムの完璧な動作には、これらの2万人が作成したコードのallがエラーなしに対話する必要があることを考えると、コードのallは、驚くべき事実は、私たちにバグがあるということではなく、バグが非常に少ないということです。
IMO、アジャイルプロセス(スクラム、クリスタルなど)によって提供される透明性は、開発が平均的な利害関係者にどのように機能するかを示すのに長い道のりを歩んでいることがわかりました。
比喩による説明は漏れやすい抽象化ですが、ここで私のためによく働くいくつかのアイデアがあります:
これらの説明はどれもずさんな仕事を言い訳するものではないことに注意してください。
コンピュータプログラムは、すべての変数が可動部分である機械と考えてください。これにより、些細なプログラムでさえ、何百もの可動部品で構成されるマシンになります。
それが失敗したときは、プログラムにエラーがないことを数学的に証明することは可能ですが、非常に時間がかかり、努力する価値がないという事実に立ち返ります。
最後に、IntelとMicrosoftがバグを回避できないかどうか尋ねますが、彼らは私たちにどのように期待していますか?
それを述べる伝統的な方法は、プロジェクト管理のトライアングルです。スコープ、コスト、スケジュールの3つの競合する基準です。通常、「安価、高速、良い-2つ選択」と表現されます。
設計、開発、展開プロセスのendでは、製品に設計上の欠陥が比較的なく、指定された機能で動作するという期待は完全に合理的です。同じ期待は、プロジェクト、プロセス、または職業に関して完全に不合理です。
ハードまたはソフトの科学に基づく専門家は、探索のプロセスを通過せず、不正確で不正確な概念化を形成し、最適ではない(または単に間違っている)戦術に従い、試行錯誤を通じて機能するものを発見し、繰り返しますリソースがなくなるか、十分なレベルのパフォーマンスが得られるまで、何度も繰り返し処理しますか?
より高い品質レベルに漸近的に近づくことはできますが、欠陥のないプロセスはありません。
これは、戦術が当て推量やプロトコルを伴うことが多い医療専門職にも当てはまり、活動の多くは、基本的にほとんどウェットウェアマシンのデバッグです。それは土木工学と建築に当てはまります。そこでは、新しい工学材料のアプリケーションを現場で検証する必要があり、標準に厳密に準拠しているにもかかわらず、長年の使用後に突然失敗する可能性があります。適用されるエンジニアリングまたは修理サービスの障害がなく、経年変化および動作条件の変化が一般に障害点までパフォーマンスに影響を与える自動車分野に当てはまります。ソフトウェア開発はnotのような点でこれらの職業とは根本的に異なります。それは、新規で目的のあるマシンの開発に関与することに焦点を当てているだけです。
私は同様の質問に回答しました 詳細には ですが、要点は「プログラミングは工場や組立ラインを構築するようなものです」です。
あなたはそれを彼らが見ることができるものと比較し、可能であれば毎日使用するかもしれません。
たとえば、自動車。自動車は、今日よりもはるかに洗練されていない信頼性の高いデバイスから始めました。自動車は100年以上製造されていますが、ソフトウェアはおそらくその半分くらいです。車は大幅なカスタマイズが可能で、一部は価格に含まれています(色の選択など)。その他に、エンジンサイズ、トランスミッションタイプ、ホイール/タイヤ、トリムレベルなどが大幅なコストドライバーです。
自動車とソフトウェアには、多くの機能、品質、コストの要因があります。次に、ソフトウェアテクノロジー、専門知識の可用性、それが構築されている場所でさえも、どのように大きな違いが生じるかについて話し合うことができます。適切な開発サイクル(たとえば、小さな変更を伴う年次モデル、ボディ/エンジン/プラットフォームの変更が約3年ごと)は、顧客のニーズと複雑な設計プロセスの組み合わせによって推進されます。一部の製品は、小さくてだらしのない外観(Honda Accordのことを考える)から始まりますが、最高の評価が得られるまで毎年改善されます。
自動車にはリコール(ソフトウェアアップグレードよりもコストがかかることが多い)とパーツリストへの変更の実行という形での漸進的な改善(バグ修正を考える)があり、多くの場合、長期的なサポートが必要です(後方/前方互換性を考えます)。車の費用の多くは、車を家まで運転した後に発生します。ソフトウェアのコストの多くは、顧客を更新およびアップグレードする際の最初の製品リリース後に発生します。
場合によっては、ソフトウェアまたは他のソフトウェア製品を含むよく知られた製品を参照できます。たとえば、電話機にはリリースサイクルがあり、更新後、最初の販売後に機能を追加して収益を増やす方法があります。電話は、前方/後方互換性の優れた例です。多すぎると、人々は古いものを捨てて新しいものを買うことはありません。少なすぎると、顧客は契約が切れる前に嫌がらない電話を手に入れようと必死になります。
Windows、Microsoft Office、Webブラウザー、Webページなどの製品はすべて、ディスカッションで使用できるソフトウェアです。それらは年次または3年サイクルで更新されていますが、自動更新がより頻繁に行われる場合があります。バグやセキュリティホールがあり、お客様にさまざまな影響を与えますが、最善を尽くしても状況の一部になっています。顧客は修正を無料で入手できますが、通常はバンドルとして、場合によっては個別のモジュールとして、またはライセンスキーを介して、機能拡張の料金を支払います。
Microsoft、Apple、Google、Amazonなどの業界リーダーはすべて、比較的安価な顧客をユーザーに提供しています。しかし、彼らはそれらの製品を可能にする莫大な費用を持っています。彼らの経験によると、ソフトウェアは高価ですが、価値があり収益性があります。多くの場合、品質と、必要なすべての機能を備えていること、タイミングが適切なときに市場に参入することの間で妥協しています。彼らが作るすべての製品が成功するわけではなく、名前を変更したり、マーケティングや販売を改善したり、損失を減らしたり、後の製品で学んだことを利用したりして、犬を勝者にすることもあります。
原子炉制御、深宇宙通信、医療用インプラント装置などのハイレルソフトウェア開発に精通している場合は、そのレベルのプリジェクト管理とQAのコストと納期の仕組みを説明できます。典型的な企業がソフトウェアプロジェクトに費やすことができるものよりも大きいかもしれません。
おそらく、1対1で、または理想的には少人数のグループで、開発する必要があるソフトウェアの使用例について説明します。ユースケースについて説明しているので、さまざまな事態が発生する可能性がある場合のポイントを特定します(予期しないが不合理なケースではありません)。それらを列挙し始め、いくつかの説明を求め、行うか、または解決する必要があるすべての決定と指示、およびそうすることで行われるトレードオフを説明します。彼らが困惑して答えを出すことができなくなるまで続けてください。何百、何千ものコースの決定とコードの記述の両方で、おそらく自分で、おそらく自分だけで、明確な方向性がほとんどないことを理解してもらいます。誰によってもレイアウトされている場合とされていない場合のユースケース。また、自分のことを考えていなかった場合は、プログラムの動作を保証することはできません。多分それは「正しい」ことをするかもしれません、多分注意してください。そしてそれがバグです。そして、それがソフトウェアの作成に時間がかかる理由です。時間が短いほど、検討して対応できる機会が少なくなり、プログラムが未知の状況で「正しい」ことを行わなくなる可能性が高くなります。
コストと時間。
時間
XをY時間で納品するという期待を設定します。それはこれ以上何もないでしょう。次に、次のバージョンがいつになるかを伝えます。最初に彼らは、XのビルドにはYの時間がかかると信じて驚くかもしれません-ここで、ソフトウェアのビルドにかかる時間と複雑さを説明します。彼らが驚いていない場合は、推定時間は非常に短いか、ソフトウェアの構築について考えるよりも知識が豊富でした。
コスト
これはSteve McConnelのCode Competeの本からです(メモリから引用しているので、同じ効果でそれを伝えることができなかった場合はご容赦ください)-新しい機能を顧客が求めるのは簡単です。プロダクトマネージャーは、顧客からの質問に答えるべきではありません。その新しい機能を構築するために必要な労力とコストを見積もる必要があります。彼らは新しい機能がお金/時間に本当に値するものではないこと、あるいはおそらくそれを必要としないことをゆっくりと理解するでしょう。これを怖がらせるために武器として使用することはお勧めしませんが、正直に使用すれば、要点を理解しやすくなります。