ソフトウェアの欠陥の主な原因は何だと思いますか(およびそれらを最小化する方法)[完了]


14

欠陥を次のように定義します。

「要件に従って機能することを妨げるアプリケーション設計またはコード内の何か。」

欠陥の原因についてのアイデアを探しています。例えば、ヒューマンファクター、テストの欠如、プロトタイピングの欠如、これらを緩和するための考えなどです。


5
要件さえ間違っている可能性があるため、「要件」を「ユーザーのニーズ」または「予想される動作」に置き換えます。
mouviciel

要件が間違っていること?(そしてコードは正しい?)

回答:


13

ソフトウェアの欠陥の主な原因は解釈です。

機能の顧客の解釈は、設計者の解釈とは異なります。

デザイナーの解釈は、プログラマーの解釈とは異なります。

ほとんどの方法論は、この影響に対処する方法を発明しました。しかし、結局のところ、私たちは人間であり、完璧ではありません。また、多くの場合、時間的なプレッシャーがあり、ほとんどの方法論の魔法は、プレッシャーにさらされている間はしばしばスキップされます。

テストでは問題を早期に検出できるだけです。しかし、テスターでさえ人間であり、100%をテストすることは不可能です。宇宙が終わる前に解放したい場合。


私がそのマインドリーダーモジュールを動作させることができれば、すべてうまくいくでしょう。
HLGEM

@Gamecat:そして、世界中の人々と仕事をしているとさらに悪化します。言語の壁があるだけでなく(多くの場合、少なくとも1人の参加者が英語に堪能ではありません)、文化的な違いもあります。
マチューM.

2
あなたが1つを逃した-「プログラマの解釈はコンパイラの解釈と異なる」...;)
アレックスファインマン

@Alex:私が書いたコードでコンパイラが何をするか知っています。その知識は簡単に習得することはできませんでしたが、私はそれを行いました。これで、コンパイラとランタイムデータとは対照的に、私が書いていないコードの解釈ができました。
デビッドソーンリー

@David、コンパイラーを作成および保守しない限り、内部が行っていることに関する知識は、実際に何が起こっているかを抽象化したものであり、実際のアプリケーションに頭脳空間を費やすことができるので、おそらく最善です。
アレックスファインマン

8

ソフトウェアの欠陥の主な原因はプログラマーだと思います。

ただおかしいと言っているわけではありませんが、私が仕事で見た大きな問題の1つは、要件の収集が不十分であり、問​​題の領域に対する理解が不十分であり、プロジェクトの主要な欠陥と使いやすさの問題を引き起こしているためです。

その一部は、エンドユーザーの用語を学習/理解する意思がなく、誤解を招くことに起因します。

その一部は、あなたが何について話しているのか、なぜそれが重要なのかについての手掛かりを持っていない人々に、技術の話をプロセスの早い段階で行うことから来ています。

その最良の例は、質問/回答が文字でどれだけ長くなるかを把握しようとしているプログラマーの1人を耳にしたときです。データベースで使用するサイズフィールドを把握しようとしていることはわかっていましたが、これを要求する部門は、それが重要な理由であるか、スペースが重要であるかという最も霧のかかった理由ではありませんでした。それは明らかなように思えますが、彼らにとっては本当の啓示でした。


8

欠陥の主な原因は、不適切な管理です;)

真剣に、良い状態で働いている、過労、品質の削減、適切なツール、静かな労働条件などを求められていない開発者は、厳しい圧力の下で働いている人よりもバグが少なくなります。

また、管理者が悪い開発者を雇うと、バグの数が増えます。

悪い管理

(免責事項:開発者を雇って管理することになっています)


それが主な問題だとは思わないでください。ほとんどの開発者は静かな環境で働いています。私はAnonJrとGamecatに同意します-問題の領域を完全に理解することはできず、迅速な反復とテストのみが役立ちます。
radekg

1
ほとんどの開発者が静かな環境で働くのはなぜですか?私が昨年訪れた数十の会社では、静かな会社はありませんでした。

良い管理はあなたを遠くへ連れて行くことができ、悪い管理はあなたをどこへも連れて行くことができません!
クリス

静かな労働条件に関する+1。私が働いたことのある会社はすべて、ディルベルテスクのキュービクルファームでした。ここでは、4フィート離れた人々が爪を切り、食べ物をむしゃむしゃ、電話をかけているのを常に聞くことができます。
ボビーテーブル

5

主要な原因は1つも見当たりませんが、言及されていない原因の1つは、他のコードとの意図しない結合です。目に見えない副作用を持つコードを記述し、抽象化レイヤーを突破し、データについての仮定を行います(変数は使用せず、定数は使用せず、ユーザーからの入力は安全ではありません)。それ自体など。

開発プラクティスのほとんどは、私は、還元まで沸騰を研究することをNプログラムの複雑さは、少なくともあるので、O(N^2)おそらくO(k^N)。定義することNは読者の課題として残されていますが、ここでは循環的な複雑さなどを考えています。ロジックとデータをカプセル化すると、問題を区分化してNを減らす効果があります。




4

コミュニケーションのギャップ。要件のコレクション。スケジュール通り。設計ドキュメント。機能仕様。コード内(プログラマーが望むものとコンパイラーに伝えるものとのギャップ)。

社会的エチケット。能力のない人を呼ぶことは社会的に受け入れられません。


3

完全に理解せずに物事を急ぐ。機能要件または技術アーキテクチャを完全に理解せずにコードの記述を開始します。

プログラミングはほとんど自動的に行われ、自明であり、すでに頭の中で解決されているものを書き留めてください。実際には、コードが何をすべきかを正確に把握しようとするために、コードに多くのフレアが見られます。私はこれを何度も犯しました。


新しい仕事を始めて4か月が経ちますが、私はいまだに「完全に理解する」ことにごくわずかな割合です。急ぐつもりはありません。あなたの言うことは本当です。しかし、そのような長い間非生産的であるように吸う。
DarenW

作業中のシステム(200万回線システム)でフルスピードに達するまでに1、2年かかりました。その場合でも、私には分からない大きなセグメントがあります。
ジョーリセブレヒト


2

スケジュールプレッシャーは確かに強力なソースです。

急いでいる開発者は、要件を完全に指定したり、要件の背後にある意図を完全に理解したり、代替案を完全に調査して最良のソリューションを見つけたり、行っている変更のすべてのエッジケースと相互作用を十分に検討したりすることはありません。テストケースのフルセットを開発する、ユニットテストをすべて実行する、統合テストを完全に実行する、プラットフォームの依存関係を完全に検討する、インストーラーを完全にテストする、または次の開発者が理解できるように実行した内容を完全に文書化する....


2

言及されるべきもう一つのことは、部外者のテストを持っていないことです。開発者がテストを作成して実行すると、実際の要件ではなく解釈のみがテストされます。開発者によって書かれた単体テストはいくつかのバグをキャッチするのに役立ちますが、ほとんどのバグはこれらのテストに合格しますが、ユーザーが望むものやニーズではありません。開発者以外の誰かによってテストされていないソフトウェアはテストされていません(開発者のテストを実行するだけではありません)。


2

ソフトウェアエンジニアリングが本質的に複雑だからです。エッセイ「No Silver Bullet」はこれについて議論しています。

皮肉なことに、ここでの他の回答の多くは、そのエッセイの言語で「偶然に複雑な」トピックに触れていますが、実際には、ソフトウェア開発者が行うことのほとんどは「本質的に複雑」です。ソフトウェアは難しく、ソフトウェアにはバグがあります。私たちの仕事はそれに対処することです。


1

ソフトウェアをステートマシンのネットワークとして理解できないこと、その動作の基礎となる原則(ステート、その決定と遷移)、およびステートマシンの相互作用。


1

黙って失敗するコードとすべてのエラーを報告するコードを書く。


1

「発生しない」または発生する可能性が低いことを確認することができないのは大きな問題です。時には完璧は善の敵です。よく考え抜かれた例外階層の価値がなければ、いくつかの迅速で汚れた処理は、何もしないよりも常に優れています。私は巨大ですリリースビルドでのパフォーマンスへの影響が無視できるほど速く失敗する、アサートする、アサートを断念するのが好きです。すべての入力データを制御する高速でダーティな1回限りのスクリプトでさえ、通常はアサートと同等であるが常にオンのままである関数を使用して、クイック/ダーティなエラー処理を行います。私の経験則では、発生する可能性が低いか、発生しないと思われる場合、ユーザーフレンドリーなエラーメッセージで正常に失敗する必要はありませんが、少なくともエラーメッセージが表示されてすぐに失敗する必要がありますプログラマーに何がうまくいかなかったかについてのヒントを与えます。

編集:関連する便利な方法の1つは、主要なデバッグツールとしてアサートを使用し、デバッグセッション終了した後もそのままにしておくことです。その時点から、コードベースには、関連するバグが再び発生するのを非常に困難にする組み込みの健全性チェックが行われます。これは、ユニットテストが難しいコードに特に役立ちます。


1

ソフトウェアの欠陥の主な原因は、コードの記述です。

より少ないコードを書くと、バグが少なくなります;-)


0

1つのレベルでは、管理。しかし、それはPHBだけではありません。それは、コード自体の管理であり、企業管理の反映である場合とそうでない場合があります。

「ライフサイクル」全体の参加者は、品質と完全に死ぬことのない製品を作ることに完全に投資する必要があります。適切な抽象化の信頼性を考えると、ソフトウェア自体には決して壊れないという約束があります。これは、ソフトウェアコンストラクターがその完璧な操作に関心があるかどうかの問題です。

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