web-dev-qa-db-ja.com

「それは昨日働いていた、私は誓います!」あなたは何ができますか?

午前中に到着すると、昨日の夕方に出たときにソフトウェアが機能しなくなったことがわかります。

職業はなんですか?最初に何をチェックしますか?怒りを止めて問題に取り掛かるにはどうしますか?同僚のせいにして直接彼らのところに行きますか?そのような状況になるのを避けるために何ができるでしょうか?

59
Nikko

通常の容疑者は次のとおりです。

  • 昨日はうまくいくと思っていましたが、丸一日の仕事を終えた後、盲目すぎてうまくいかないことに気づきませんでした。

  • 今朝は、昨日のIDEキャッシュメモリの内容を参照できなくなりました。

  • ワークステーションが昨夜再起動したか、毎晩のメンテナンス操作により/ tmpディレクトリがクリアされました。

  • コードベースで何かが変更されました:昨日の最後のコンパイルと今日の最後のコンパイルの間で誰か(おそらく自分)が変更をコミットしたかどうかを確認してください。

  • サポートライブラリに変更がありました:それらのライブラリが再コンパイルまたはアップグレードされているかどうかを確認してください。原因は、特定のライブラリのプロジェクトの内部か、明らかに独立したパッケージの新しいバージョンがデプロイされている場合は外部の可能性があります。

  • テスト環境で何かが変更されました:仮想マシンの新しいバージョン、変更されたスタブ、リモートデータベースサーバーの変更...

  • コンパイルチェーンで何かが変更されました:Makefile、IDEの新しいバージョン、コンパイラ、標準ライブラリの変更...

96
mouviciel

1)今日機能していない場合は、昨日も機能していませんでした。

あなたthoughtは機能していましたが、機能していませんでした。

2)問題があり、解決する必要があります

これに対して誰が責任があるのか​​、他人を非難することについて考えないでください。

昨日と今日の間に何も変更されなかった場合(私があなたの質問を読んでいると思います)、それは実際に述べる前にコードをテストするより良い仕事をすべきであることを意味しますそれは働いています。

この状況を回避するには、適切なTestingおよびDebuggingを実行する必要があります。

「動作」を定義し、コードルーチンの境界をテストします。

  • プログラムまたはコードの機能を使用するユーザーの1人になるようにしてください。
  • コードを許可された制限以上にプッシュし、実際にそれが壊れているかどうかを確認します。

これを行う1つの方法は、夜間に広範なテストの自動化セットを実行することです。これにより、翌日に問題が発生していないかどうかを確認し、問題を修正できます。

49
Jose Faeti

非難する人を見つけようとすることは非建設的であり、問​​題を解決しません。しないでください。

何かが昨日機能し、今は機能しない場合は、非決定的な動作(競合状態など)があり、それを昨日機能させることが運が良かったか、またはその間に何かが変わったので、それを調べる必要があります。です。

どのケースがどれであり、どのように修正できるかを正確に見つける方法は、状況の詳細によって異なりますが、原因を取り除くために常に系統的であることが役立ちます。問題の原因となった具体的な原因を特定し、3週間後に再び発生したときに調べられるように、修正方法を書き留めてください。

適切な診断ツール(デバッガー、プロファイラー、ネットワーク分析ツール)を使用することも大きな違いを生む可能性があります。

26

私は一晩で変更されたように見えるコードで作業しましたが、しばらくして結論が出ました。これは、悪意のあるピクシーが夜にコードベースを這い回り、昨日は機能したという事実にもかかわらず、現在は変更されているためです。まったく機能しません。実際、クラシックな Schroedinbug スタイルでは、今は機能しないだけでなく、これまでにない方法があることは明らかです

時間が経つにつれ、ピクシーは実際にはそれとは何の関係もない可能性があること、そしておそらく「家に帰るまでの時間、それで十分だ」という最後のビルドでは詳細なテストと注意が得られないことに気づきました。

午前中にこれに遭遇したときの私の最初の仮定は、私が自分の機能や作業しているソフトウェアのコーナーを担当しているのが私自身の責任であるため、おそらくそれが私のせいだということです。私の2番目の仮定は、私は今、そのコーヒーを手に入れるべきだということです。サルが理解できることが明白に明らかでない場合(それはときどきあります)、古いバージョンのライブラリをドラッグして管理した可能性はあり、ロールする必要のないファイルを誤ってロールバックした可能性があります。それをチェックせずにビルドに持ち込んだ場所に何かをキャッシュしたり戻したりします。最近のソース管理アクティビティを実行すると、私が行ったことが明らかになる傾向があり、ビルドをクリーンアップすると、誤ったキャッシュバージョンが削除されることがよくあります。

時にはそれは本当に私とは何の関係もありません-誰かがそれを言及せずに依存関係を更新した場合、WindowsUpdateは環境を変更する何かをインストールして私のコードが機能しないようにしました。背景には多くの可能性がありますが、通常、それは多くの人々のように、基本的に私がばかであるということを認めて受け入れるケースです。

25
glenatron

バージョン管理を使用します。 diffを実行するか、VCSの非難機能を使用します。

  • diff:すべてのVCS。バージョンの違いを表示します
  • blame:たとえばgit。誰が何を変更したかを行ごとに表示します

バージョン管理がない場合は、自分自身または上司の責任以外に、ファイルの変更日を確認し、OSのログ機能を確認できます。

それとは別に、すべてを再コンパイルし、補助ライブラリも必ず再コンパイルしてください。

もちろん:エラーの原因を見つけた場合は、落ち着いて、変更が行われた理由を尋ね、問題を説明し、両方を満足させる解決策を提案してください。彼女/彼に怒鳴らないでください、それはあなたの生産性を害するでしょう。

変更がまったくない場合は、システムで何が変更されたかを確認します。たとえば、最近のMac OSコンピュータは、Apacheの新しいバージョンに更新されており、一部の構成が無効になっています。

20
phresnel

さて、ここでは、今日ではなく「昨日機能した」コードの実際の例を示します...今月初めのものです。

問題のアプリケーションはデータベースから情報を日付で取得します。デフォルトの動作では、当日のデータを取得します。これは8月8日には問題なく機能しましたが、9日には失敗しました。これよりも前にテストされていません。 9月9日と10月10日にも機能します...

別の手がかりは、私たちが英国にいることです。問題のデータベースは米国にありました...

したがって、最初に何をチェックするかについての質問に対する私の答えは、日付と形式のフィールドを混在させると完全に機能するため、日付の形式を再確認することですが、1か月に1日のみです:-)

11
Steve

何かが機能しなくなったときに最初に行うことは、自分自身に問うことです-何が違うのですか?変化したこと?

昨夜何かがうまくいったが今朝失敗した場合、明らかに変わったのは-日付と時刻 :)です。

私が取り組んでいるロジックの一部が日付に依存し、時間の経過に影響される可能性があるかどうかを試してみて考えます。それがそのような問題の原因であるのは驚くべきことです。

それが失敗した場合、ここで提供される他のすばらしいアドバイスを間違いなくフォローアップする必要があります。

5
urig

バグを修正(通常は行います)。次に、原因を見つけた場合は、問題の原因を知らせる丁寧なメールを送信します。

すべてのコーダーは間違いを犯し、あなたが非難を始めた場合、次に同じことをするときに真剣に逆効果をもたらします。 (おそらくこのバグもあなたのものでした)

いくつかのバグを大々的に処理する必要があるのは、彼らが定期的に不注意であると疑う場合だけです。

5
Tom Squires

...回帰テストを実行し、失敗したものに焦点を当てます。

実際、去る前にあなたが昨日忘れていたことです、それは起こります。

ありませんか?わかりました、どこで言ってるの? 非難?まあ... それはうまくいくかもしれません、そして

5
ZJR

(書くには)ちょっとした答えですが、その要点を得るにはちょっと長いです: プログラムが失敗する理由:体系的なデバッグのガイド Andreas Zeller(これは少し学術的に見えるかもしれませんが、そうではありません)

4
Shady M. Najib

ユニットテストが失敗したときに継続的インテグレーションエンジンによって送信されたメール(または、特定の問題を確認しなかった場合はログページ)の後にメールボックスを調べ、ビルドの直前に誰がチェックインしたかを確認します。 。

その後、彼または彼女と話してください。

4
user1249

コードが今日失敗する理由は2つしかありませんが、昨日は機能しました。

データを見てください

テストも説明もしなかったデータに何かがあります。データが適切に検証されていないか、予期しない論理条件が発生するまでロジックのエラーが明らかになりませんでした。これは、バグが昨日そこにあったが、有効なデータの下であなたから隠れていたことを意味します。

私はかつて、何週間も問題なく動作している注文入力コードを持っていました。ある日、家に帰って死にました。翌日の調査の結果、一連の関数呼び出しにバグが隠れていることがわかりました。弱く型付けされた言語では、long intを使用する必要があるときに整数を宣言しました。言語は、数値が整数に収まる数を超えたために、2つの間の変換を自動的に行いました。システムは、注文番号32768で失敗しました。

変更点を確認

機能してから何が変わったか見てください。 ITセクションはOSアップデートをプッシュしましたか?別のコーダーが、プログラムが使用するコードを変更しましたか?ユーザーの権限は変更されましたか?多くの場合、変更点を見つけると、バグが見つかります。

4
Andrew Neely

バイナリチョップ

難しいJavaScriptエラーに対して特に効果的です。基本的に、コードの半分にコメントを付けます。エラーが発生するかどうかを確認します。エラーが発生する場合は、コードの半分にあります。もう一度半分にして、続けます。

コードが適切にカプセル化されている場合、これは素晴らしい、時間節約、ストレス破壊ツールです。

有罪のコードを見つけたら、それ自体のテストページでエラーを分離することはしばしば価値があります。

3
chim

そしてもちろん、そのような状況になるのを避けるために何ができるでしょうか?

この質問に対処するには、 継続的インテグレーション(CI) を調べてください。簡単に言うと、CIは開発者が頻繁に(1日に数回も)すべてのコードを統合してテストするプロセスです。別のモジュールを壊す1つのモジュールへの変更がすぐに見つかるという考え方です。

実際には、CIを採用するほとんどのチームはCIサーバーを使用します( Wikipediaのリスト を参照)。 CIサーバーは通常、SCMリポジトリを監視し、変更を検出したときにビルドを開始するように設定されます。ビルドが完了すると、一連の自動テストが実行され、ビルドとテストの電子メールまたはWebページ、あるいはその両方を介して結果と、ビルドの原因となった変更が投稿されます。うまくいけば、何かがビルドやテストを壊したとき、あなたが見るべき非常に小さな変更セットしかないので、それはより早く解決されます。

使用するCIサーバーについては他にも質問があります。興味のあるものを見つけてみましょう。個人的には、私はジェンキンスの大ファンです。

【壊れた事をどうすればいいの?】

他の人がすでに言ったように、何が壊れているかを見つけて、それを修正してみてください。非難を試みるのに費やす時間は、問題を解決しないまま費やされた時間です。

3
jwernerny

私の自然な反応は常に他人を責めることですが、時間がたつにつれて、それが通常自分のせいだと気づくようになりました。上記のすべての優れたコメントに加えて、最終的な理由が何であったかを自分で記録することが重要です。他のチームメンバーと共有しているWiki、プライベートTwiki、Evernote、ログブック、優れたメモリのいずれを使用するかは関係ありません。重要なことは、答えを見つけたとき(そして仕事に戻りたいとき!)、その理由を記録することです。

3
Ant

通常のバグ追跡方法が機能せず、すべてが完全に混乱している場合は、簡単に復元できるバックアップがあると素晴らしいでしょう。

これは私がローカルで実行しているもので、午前8時から午後6時まで1時間ごとに自動的に実行されます。

rdiff-backup /path/to/mystuff /path/to/mybackup

シンプルですね。

何かを復元する必要がある場合は、

rdiff-backup -r 24h /path/to/mybackup/specific/dir /tmp/restored

rdiff-backup 異なるファイルのみを保存します。 Linux、mac、およびwinでrdiff-backupを使用できます。

もちろん、これが唯一のバックアップではありません。しかし、ローカルバックアップを作成するのは非常に簡単で安価な方法です。

さて、これを通常のバグ修正方法としてはお勧めしませんが、他のすべてが失敗した場合、それはフォールバックです。

2
olafure

バグはすでに存在している可能性がありますが、外部要因またはシステムの深い問題によって隠されています。

これは私に起こりました。プロジェクトの2つのビルドの間に発生したバグ。文字通り、私たちが行った変更のみは、基礎となるライブラリの1つをより新しいビルドに更新することでした。

当然私達はそれらを非難しました。しかし、theyが行った唯一の変更は、より高速なコンパイルのために一部のヘッダーをリファクタリングすることでした。私はそれがシステムを壊してはいけないことに同意しました。

多くのデバッグの後、問題はmyyearsのコードに潜んでいた不正なポインタのバグであることが判明しました。彼らのリファクタリングが実行可能ファイルの配置を変更するまで、どういうわけかそれは決して引き起こされませんでした。

2
Matthew Scouten

おそらく機能していない場合は、機能していない、つまりハングアップしたり、ユーザーに特定のエラーダイアログをスローしたりするなどの症状が見られます。

問題の唯一の説明が「機能しない」である場合、最初に行う必要があるのは、問題の症状に関する詳細情報を収集することです。

次に、ログまたは問題の再現の試みまたはその両方の組み合わせのいずれかを介して、考えられる原因の検索を開始します-システムのセットアップ方法によって異なります。

次に、それらを排除し始めます。

2
temptar

それは私が休暇を取るときに通常起こることです:-)

もっと真剣に、私は最初に彼らに言います:

  • 詳しく調べます何が問題で、何が原因であるかを確認します

  • 私はベースに触れます私が見る機会があったら30-60分で何が起こっているのか

それ以降は、何が起こったのか、まだ修正されていない場合は修正にかかる時間、および該当する場合は失われた可能性のあるデータ(ただし、適切なバックアップがあるため、決して発生しない)の見積もりを危険にさらすことができますうまくいけば)。


非難の部分については:

  • それが単なる同僚のタイプミスである場合は、言及する必要はありません。たわごとが発生し、バグの恐怖が彼に教訓を教えた可能性が高く、うまくいけば、彼は再びそれをしません。

  • 彼が故意に私に言わないことをした場合(たとえば、運用サーバーのrootパスワードを新しい人に渡して、監督なしで直接変更するように言ってください)(そうです、それはすでに起こりました...)、それから私はそれについて言及する必要があります。

2
wildpeaks

正しく使用されていたため、昨日は機能していました。

他の人が物事を壊す良い方法であるとは思わない方法で物事を使用していることがわかります。

良いテスト環境が得られるので、その日の早い段階でコードを更新することは常に良いことです。

バックアップ!

1
Robert