私は、人事部門が開発職に応募する候補者のためにいくつかの新しい面接の質問を作成するのを支援する任務を負っています。プロセスの一環として、コンパイラの助けを借りずにコードを理解し、潜在的な将来の問題を見つける能力を評価したいと思います。
そのため、私は基本的なコンソールアプリケーションを考案しました。私が候補者に提供し、次の質問をするソースコード:
- このコードはエラーなしでコンパイルされますか?そうでない場合は、なぜですか?
- 将来バグを引き起こす可能性のあるコード内の潜在的な問題を見つけることができますか?
- コードにどのような改善を加えますか?
私は質問に対する私自身の答えを持っていますが、私が見逃したかもしれない何かがあるかどうかを確認するためにいくつかのフィードバックを得たいと思います。
using System;
using System.Collections.Generic;
namespace DeveloperTest
{
class Program
{
static void Main(string[] args)
{
var users = new List<User>();
users.Add(new User("John Smith", "42", DateTime.Today));
string name = "Jane Smith";
int age = 37;
int yearJoined = 17;
int monthJoined = 01;
int dayJoined = 15;
users.Add(new User()
{
Name = name,
Age = age,
DateJoined = new DateTime(day: dayJoined, month: monthJoined, year: yearJoined)
});
users[0].PrintUserInfo();
RemoveUsersUnderAge(users, 40);
Console.ReadKey();
}
private void RemoveUsersUnderAge(List<User> users, int age)
{
foreach (var user in users)
{
if (user.Age < age)
{
users.Remove(user);
}
}
}
}
class User
{
private string _name;
private int _age;
private DateTime _dateJoined;
public User()
{
}
public User(string name, string age, DateTime dateJoined)
{
if (name == null) Name = "Unknown";
if (age == null) Age = 0;
if (dateJoined == null) DateJoined = DateTime.Today;
Name = name;
Age = Convert.ToInt32(age);
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Age
{
get { return _age; }
set { _age = value; }
}
public DateTime DateJoined
{
get { return _dateJoined; }
set { _dateJoined = value; }
}
private void PrintUserInfo()
{
Console.WriteLine($"Name: {this.Name}.");
Console.WriteLine($"Age: {this.Age} years old.");
Console.WriteLine($"Joined: {this.DateJoined}.");
}
}
}
あなたは正しい方向に進んでいますが、あなたのテストはいくつかの改善を使用する可能性があります。 コードを理解するために人々をテストするのではなく、アルゴリズムを理解するために人々をテストしてください。あなたが求めている分析の大部分はツールで実行できますが、代わりに候補者に分析を行わせますが、それは今日でも人間が実行する必要があります。
コードサンプルの問題の大部分は、ビルドを実行してから1/4秒で明らかになり、ほぼ同じ速さで修正されます。保護修飾子、静的/非静的メンバー、タイプミス、および同様の問題は、ほとんどがタイプミスハントであるため、候補者の全体的なスキルについてあまり明らかにされないため、時間を費やす価値はありません。
必要なものとコードサンプルに欠けているものは、分析とデバッグが難しいアルゴリズムです。毛むくじゃらの日付/時刻処理、C文字列分割アルゴリズム、小さな解析アルゴリズムなど。重要な要素は、ループ、分岐、およびデータ操作です。これらは、より陰湿なバグが隠れている可能性がある場所です。たとえば、オフバイワンエラー、境界チェックの欠如などです。特に優れたコードサンプルは、エッジケースまたはコーナーケースのみが問題となる場合です。
あなたが提供したコードサンプルはほとんど何もしません、それの大部分はただゲッターとセッター、最小限の意思決定とほとんど取るに足らないループです。さらに、コードサンプルは実際には特定のタスクを実行しないため、それを改善する方法についての提案は不自然で意味のないものになります。サンプルを研究することで、誰かがコードを分析する能力をある程度実証できますが、新しいコードを合成することはできません。これは、割り当てと操作の明確なモデルを示すことができる複雑なアルゴリズムを精神的に歩くことによって実証できます。
合成能力を実証する別の良い方法は、分析中のアルゴリズムの一部を欠落させることです。ネストされた関数などは省略しますが、アルゴリズムが何を実行するのかを明確にするために、本体は十分に残してください。次に、候補者に不足している部分を書いてもらい、アルゴリズム全体を再び機能させ、それが正しいことを確認します。
私が概説した種類のタスクは、メジャーリーグの選手をブッシュリーグから分離するというはるかに優れた仕事をし、代わりに、コンピューターがすでに100万倍優れていることを行う能力に基づいて彼らを評価しません。