コードを簡単にデバッグできる人はどのようなスキルで決まりますか?しばらく前に、私の友人が比較的優れたプログラマーとのインタビューを行いました。プログラマーを雇った。彼は良いコードを書くことができ、フレームワークとデザインパターンを理解していました。彼が欠けていたのは、デバッグのスキルでした。彼はまったくデバッグできず、自分や他の誰かのコードの問題を見つけるのはとても大変でした。
それ以来、人のデバッグスキルをどのように評価または推定できるかを考えています。
したがって、最初の質問は次のとおりです。人がソフトウェアを効果的にデバッグできるかどうかを決定するスキルは何ですか?
そして2番目:面接中にそれらのスキルをテストする方法?
その人が最初にしたいことは、コードを見て、デバッガーでコードをステップ実行することです。その人は優れたトラブルシューティングツールではありません。
まだ行動計画がなく、デバッガブラインドに飛び込む場合は、基本的にイースターエッグです。これは、あらゆる種類のトラブルシューティングに当てはまります。
インタビューの状況で、システムの動作方法を尋ね、システムの履歴について尋ねる人は、誰かが可能性があるが良いトラブルシューティングであると思います。最初にシステムを考え、2番目に力学を考える人は、優れたトラブルシューティングとなる可能性があります。
これはどんな複雑なシステムにも当てはまります。
特定の言語またはフレームワークにおける優れたソフトウェア開発者の最良の尺度は、複雑な問題を批判的に分析し、その言語またはフレームワークにおける優れたデバッグスキルを持つ能力であると私は主張します。彼らは、低レベルのデバッグと、一般的なデバッグツールを使用した高レベルのデバッグの熟練度を示すことができなければなりません。
これは、選択したIDEで高い適性のデバッグツールを示すシナリオを作成することを意味します。次のようなものを探す必要があります。
サンドボックスアプリケーションまたはサーバーをデバッグモードで実行するか、デバッグ用のシンボルを使用してアプリケーションをビルドする
シンボルを使用して構築されたリモートデバッグポートまたはサンドボックス化されていないアプリケーションのデバッグを利用可能にしてデモンストレーションする(言語に該当する場合)
ブレークポイントの戦略的な使用
ブレークポイントのカスタムプロパティ、ブレークポイントの条件式(言語に該当する場合)
変数値または参照を監視するための式または変数ウォッチの使用
アドホック変数値または参照またはポインター操作のリアルタイムでの使用
アプリケーションフローにステップイン、ステップオーバー、およびステップアウトする能力を示す
コールスタックの重要な評価
マルチスレッドアプリケーションのデバッグとこれの理解。
ログやソースコードの分析や、IDEを使用せずに低レベルのデバッグを実行する機能など、ツールを使用しない他のデバッグ戦略も示す必要があります。
システムにあったバグを、インタビューの文脈で議論できるものにまで蒸留すると思います。デバッガーを起動して、彼をそれに任せてください。
彼に次のような質問をします。
どのように問題に取り組みますか?
あなたがやった複雑なプロジェクトの1つは何ですか?どのようにそれを達成しましたか?
どのデバッグツールを使用しましたか?
特定のツールを好みますか?
あなた自身のシナリオの例を挙げて、彼がどのようにそれに取り組むかを彼に尋ねますか?
他の誰かのコードに侵入する能力をどのように評価しますか?
質問することで、懸念に対処できます。彼は特定のスキルで良いかもしれないしそうでないかもしれないリスクが常にあります。しかし、彼が優れた学習者であれば、それは大きな助けになります。
プログラマがデバッグできるかどうかを確認したい場合は、修正するコードを提供します。彼らがコードを書くことができるかどうかを確認したいのであれば、それは同じアプローチです。問題を与えて、コードを書いてもらいます。
さて、私はこのプログラマーがコードを書くのに問題はないが、デバッグするように頼まれたときにひどく失敗するプログラマーについて混乱しています。この人はコード例を逆流させますか、それとも彼がデータベースの読み書きのような経験を積んだ領域に固執しますか?彼らが最初に正しいコードを取得しない限り、彼らはそれを修正することはできませんか?
たぶんその人はデバッグが嫌いで努力もしませんか?私はこれが得意ではないので、私にそうするように頼むのをやめてください-無力感を学びました。
既存のコードベースで作業するには、コードを調べ、ドキュメント化し、おそらく独自のメモや設計を作成する必要があります。
失敗したプロダクションコードを修正するものとしてデバッグを考えていることは知っていますが、コードを書いている最中にコードをデバッグする必要があります。この人はあまり上手なプログラマではないか、単に新しいコードを書くことを好むだけです。私たち全員ではありません。
誰かのコーディング能力を決定するのと同じ方法で、デバッグについて質問します。
特定の状況でバグを追跡する「方法」を尋ねます。
さらに一歩進んで、コンピューターの前に座って、問題のデバッグを観察します。
私はしばしば候補者に仮説的な状況を与えました...例えば、生産システムは応答を停止しました。職業はなんですか?彼らは「ログをチェックして」と答える場合があり、「問題が発生し始めてから何も書き込まれていないことを除いて、ログには何も異常は示されていません」と私は言います。そして、問題解決の候補者の能力を評価したことに満足するまで、それは続きます。
通常、適性のある人は、デバッグのスキルが高い人でもあります。
面接では、(年功序列に応じて)アルゴリズムなどのパズルの割り当てを与えることができます。それが簡単な方法です。
可能であれば、いくつかの作業からコードを印刷して、ここで何か問題があるかどうかを尋ね、問題がある場合は修正方法を尋ねます。
私は、構文を読み、修正する人々の能力に焦点を合わせる傾向がある、難読化されたインタビューの質問をすることをあまり好みません。
インタビュー中に、彼らが過去に修正したバグとそれをデバッグするのに使用した手順について説明するように依頼します。
最後の仕事や宿題などで何をしたのか、そして問題を見つけるのに何をしたのかを話してもらいます。
候補者のデバッグスキルのテストについて、新入社員の視点と一緒に経験を共有します。私はかつて、3つのステージからなる面接を受けました。第二段階は「実際のケース」でした。その瞬間、私はもっと知りませんでした。そこに私は知らされていましたが、機能しなくなったシステムがあり、彼らは知りません。いくつかのバグが背後にあります。
それは古いテスト環境へのリモートデスクトップとして配置されました。おそらく、接続されていない、または隔離された環境へ。プロジェクトは、いくつかのASP.NETコントロールと関連するコードファイルコードを含むいくつかのWebフォームでした。コードファイルは、ソースコードとメソッドの説明がなく、dllがあるビジネスレイヤーの一種を参照していました。 Webformsは、期待できるCRUD機能を実行しました。また、小さな検索機能。次に、ビジネスレイヤーはビューおよびSQLサーバーのSPと対話しました。
彼らは異なるレベルでいくつかの部分を壊しました。症状のある紙が渡されました。 「検索できません」「最後の更新後に「地域」フィールドが消えました」など。あなたのようなユーザーから受け取ることができるような。
すべての詳細を覚えているわけではありませんが、少なくともテーブルフィールドの名前が変更されたため、SPが破損し、検索機能で使用されていました。これは、VSにエラーがなく、フィールド名を追跡するBLソースコードがないことを意味します。 Sqlcommandに対するSELECTパラメータのスペルが間違っていたため、Webフォームが誤動作しました。また、GridView(Autogeneratecolumns)で欠落していたフィールドも省略されました。 ASP.NETボタンは、複製され、拡張されたメソッドであることを意味し、ボタンを新しいメソッドにポイントすることを「忘れた」ものと呼ばれていました。
また、htmlタグでタイトルを使用することを許可しないマイナーなこと。また、反対のALTタグは、それを必要とするコントロールで省略されました。また、不正な閉じたhtmlタグでいくつかのエラーが発生しましたが、誤動作しませんでした。それらすべてが純粋なプレイハウスプロジェクトのエラーなのか、それともさまざまな採用の同じプロジェクトなのかはわかりません。私は尋ねたことはありません。もちろん難易度は新入社員のニーズと一致する必要があります。
そのようなテストは、インタビュー後にデバッグがどのように行われたかを確認するために、おそらく(追跡されないで)スクリーニングされるべきです。その段階の私にとって、テストは少しばかげていると思いましたが、それも大きなポイントになるでしょう。それがそうでなかったとしても、候補者を適切な場所に配置することで多くの価値があるはずです。
* テストは候補者/私のスキルを証明したと思います*
*外部システムを分析する
*最小限の情報を使用してエラーとバグを見つけます
*時間のストレスの下で、誰かがあなたの助けを借りずに、コードは修正を想定しました
*さまざまなレベルの知識。
** sql dbとストアドプロシージャ、
**プロジェクトでのdllの使用、
** asp.netテクニック、
**階層化アーキテクチャ
**問題指向の側面
しかし、開発者環境の処理、DBサーバー管理ツールの検索と理解など、より明白なことも含まれます。確かに、紙の上で本当に素敵に見える候補者がいますが、実際には、そのような仕事にこだわる可能性があります。
私は出会った実際の問題をその職位に関連するものとして選び、私に提示されたのと同じように候補者に提示します。もちろん、私はそれらにいくつかの一般的な背景と、コードスニペットや回路図のような少量の関連ドキュメントを提供します。
私は彼らに彼らの仕事は問題を解決することであることを伝え、彼らが持つ技術的な質問に答え、彼らが実行したい実験の結果を彼らに伝えます。 「スコーププローブをここに設置します」と言われたら、彼らが見つけたかもしれない痕跡をスケッチします。ループにprintf
を挿入したい場合は、それが出ない(!)か、最初に「7」を出力し、次に「5」を繰り返し出力することを伝えます。彼らが雑草の中で遠く離れすぎて、意味のある答えを出すことができない場合、私は間違った方向に進んでいることを認め、別の場所に戻ってきます。行き詰まった場合は、先に進むまで、主導的な質問をするか、ヒントを示します。
私が見たいのは、秩序だった思考プロセス、解決策にたどり着くための決意、よく考えられた質問と実験、そして理想的には問題をうまく特定することです。時々私は誰かが1時間のインタビューで完全にデバッグするには複雑すぎる問題を選び、最後に私は彼らに本当の答えを与えます。その時点で、私は彼らが問題に従事していたことを示す反応を探しています。そして、その「あは」の瞬間を経験し、原因に到達することへの喜びを感じています。最良の候補者は、その時点で自発的にフォローアップの質問をし、問題の彼らのメンタルマップを実際に起こっていることと関連付けようとします。
ヌルポインター参照またはそのような+ソースコード+ gdbでsegfaultするいくつかの単純なバイナリ(デバッグ付き)シンボルをコンピューターに置いて、クラッシュの原因を見つけられるかどうかを確認しますか?
候補者に予備のコードテストを行ってもらう場合は、面接中にコードを変更してバグを解決するか、新しい機能を追加するか、両方を追加するよう依頼してください。コードテストの仕様をかなり曖昧にすると、「バグ」が含まれるテストケースを簡単に作成できるようになります。
小さなコードスニペットで「バグ」を見つけることは、非常に不自然な状況です。パズルや頭の体操と同じように役立つかもしれません。
より包括的なアプローチでは、特定のインシデントを引用して候補者が過去にデバッグをどのように実行したかについて行動の質問をし、その後質問をフォローアップします。
トラブルシューティングが得意な人は、IDEのデバッグ機能だけでなく、それ以上のことを話すことができます。バグ報告ツール、エンドユーザーの操作、バグの再現、ログファイルの分析、検証についてはどうですか?
コードのブロックをたどるよりもデバッグの方がはるかに多く、デバッグにおける誰かのスキルの評価はそれを反映するはずです。
あなたの会社が本番環境で実行している素晴らしいコードを誰かに与えてください。微妙なバグを紹介するように依頼してください。彼らがそれを選んだ理由を尋ねてください。彼らにそれを見つけて修正する方法を尋ねる。
元のコードにバグが見つかった場合のボーナスポイント。
元のコードのバグを修正できる場合は、2倍のボーナスポイント。
私は人々に、追跡して修正する必要があった最も難しいバグと、それを見つけて修正するために何をしたかを説明するように依頼する傾向があります。また、最も難しいバグが、初心者だけが難しいと思うものである場合は、それがトラブルシューティングに適していない可能性があります(これはエントリレベルのインタビューでない限り)。それが本当に難しい何かであり、彼らがそれを追跡しようとしたときの彼らの思考プロセスを説明している場合、私は彼らのスキルレベルが何であるかを感じることができます。いつも私を驚かせているのは、「ヘッドライトの中のシカ」の外観を手に入れ、複雑なことをした単一の例を考えることができない人の数が非常に多いことです。大変申し訳ありませんが、他の誰かが修正するために困難な問題を残しているのは、私が学校に通っていない、非常にジュニアレベルの仕事以外の何にも興味がない人です。
次のようなテクノロジーにとらわれない質問をいくつか行います。
これは電話インタビューで特にうまく機能します。問題をトラブルシューティングしている間、彼が本当にどうやっているかを示す説得力のある答えをその人に与えるだけでよいからです。