私は最近かなりの数のインタビューに参加しており、企業から「[モデルを挿入]を設計する」という質問に何度も答えるように求められました。
* Kevinの応答を編集*
例:完全な質問は、「空きスロットを見つけるために使用できる駐車場管理システムを設計する」でしょう。
ParkingLot
とSlot
の2つのクラスを使用して実行するか、またはIVehicle
とVehicle
とCar
とMotorcycle
クラスを追加することができます。どこに線を引くのですか?
public class ParkingLot
{
IVehicle Vehicle {set; get;}
List<Slot> GetEmptySlots() { };
}
public class Vehicle : IVehicle
{
Slot SlotNum {set; get;}
}
public class Slot
{
int Row {set; get;}
int Column {set; get; }
}
ある程度、そうです。誰もが構文を暗唱したり、ソリューションを通じて自分のやり方をコピー/貼り付けたりすることができます。問題を解決できる人を雇いたい。
彼らは、あなたが彼らがそれを理解できるように(そしてそれ以上ではない)十分に設計を文書化することを期待しています。
はい、XYZ問題をどのように解決するかを人々に尋ねます。通常は口頭で説明します。要件を明確にするために質問するかどうかを確認します。彼らが他のプログラマーとどのようにコミュニケーションするかを見たいです。彼らが自分の足で考えることができるかどうかを見たいです。
それは私にとって役に立ちました。コードモンキーは必要ありません。ソフトウェアエンジニアが必要です。
私はこれらの質問をかなりばかげています。本当の答えは「ユースケースは何ですか?」です。ユースケースがなければ、デザインは必要ありません。たとえば、駐車場の質問に対する完全に合理的な答えは次のとおりです。
class ParkingLot {
boolean isFull();
void carEntered();
void carExited();
}
1つの明らかなユースケースを満たします。
実際に、編集可能なこのモデルの設計に失敗した編集で、この質問の1つの使用法を示します。
public class ParkingLot
{
IVehicle Vehicle {set; get;}
List<Slot> GetEmptySlots() { };
}
public class Vehicle : IVehicle
{
Slot SlotNum {set; get;}
}
public class Slot
{
int Row {set; get;}
int Column {set; get; }
}
var parkingLot = new ParkingLot();
var v1 = new Vehicle();
v1.Slot = parkingLot.GetEmptySlots()[0];
parkingLot.Vehicle = v1; // WHAT!??
また、Car
クラスとMotorcycle
クラスの作成についても触れていますが、これは、これ以上検討しなければ意味がありません。あなたのデザインはVehicle
をサブクラス化することから何の利益も得ません。 Motorcycle
とVehicle
の動作に違いがない場合は、失敗と見なします。
単一のVehicle
問題を見つけなかった場合は、ライブインタビューでほぼ完了します。あなたがそれを修正した場合(おそらくそれをList<IVehicle>
)、私はあなたのデザインの進化を見る出発点としてこれを使用します。要件が基本的である理由があり、明確に定義されたユースケースがない-それは世界が機能する方法とほぼ同じです。
「2つのオートバイが1つのスロットに駐車できる」という新しい要件を投げかけて、それを処理するためにデザインをどのように進化させるかを確認します。次に、並行性について話し合います(2つの入り口があり、2台の車が同時にプルアップした場合-デザインは失敗しますか?どのように?それを修正するために何ができますか?)。探索する他の可能な手段としては、割り当てられた駐車の実装方法、駐車料金、列あたりの料金(列が近いほど多くの料金を支払う必要がある)、時間制限のある駐車場、違反者の見つけ方などがあります。
また、駐車場に関する思考プロセスは、問題をインテリジェントに分析する一般的な能力を示していると考えます。基本的な使用例を尋ねたり、奇数の例(駐車場で2対1の特別料金など)を考え出す必要がある場合、実際に駐車場を使用したことがなく、少し複雑なものについてはコミュニケーションが困難になります。
コード生成のためにクラス図を作成したとき、私はこれらを尋ねていました。私はまだ時々行いますが、日常的には行いません。人の考えを見ることができるので、私は質問が好きです。
それはオープンエンドであることが意図されています。それで大丈夫です。正解は1つではありません。心の中で答えはありません。どこにつながるのか見たい。 「回答メール」ではなく、直接質問する方がいいと思います。コミュニケーション、仮定、相互作用についてです。ただの答えではありません!
私はこのタイプのインタビューを少なくとも12年前に見ました。それは私が過去6年間使用してきたアプローチです。経験によれば、20問の質問よりも優れた求職者が選択され、20点満点のスコアが与えられます。
繰り返しますが、私も非常にオープンエンドにしたいと思います。目標は、候補者が能力を発揮するためのスペースを提供することです。この段階で関連する質問をした候補者がいることはプラスです。適切な仮定をしている候補者と同じですが、それらが仮定であり、実装前に確認する必要があることを示すフラグを立てます。
私は、面接での仕事に必要なスキルを示すために、すべての潜在的な従業員に必要です。プログラマーにとっては、コードを実装し、その設計について話す必要があります。悪い採用を防ぐのに非常に効果的ですが、面接時に90%の失敗率に備えることができます。
小さなシステムを設計することは、実際にインタビューで尋ねるのに非常に関連のある演習です。これは、ドメインの問題に対する優れたソフトウェアソリューションを考案するスキルを示しています。
しかし、人間の操作なしでクラス図をオンラインで投稿するように依頼するのは奇妙だと思います。
ライブ面接では、候補者がとるべき理想的なステップは次のとおりです。
うまくいけば、ある時点で、採用担当者は候補者のスキルに関する十分な情報を収集し、それを1日と呼ぶようになるでしょう。目標は、完全に機能するソリューションを実装することではありません(偽装インタビューでこれらの無料サービスの1つでない限り)。
OOP質問は自由回答です。正解も不正解もありませんが、インタビュアーが期待するいくつかの原則があります(コンストラクターを使用して変数を初期化する、メソッドを小さく保つ、カプセル化/合成/ポリモーフィズム/継承(該当する場合)など)。
インタビューでは常にデータ構造、OOP、およびデータベース関連の質問を期待してください。これらは非常に一般的です。 「コーディングインタビューの解読」や「プログラミングインタビューの公開」などの本は、準備に役立ちます。