タイトルが示すように、お気に入りのホワイトボードのインタビューの問題は何ですか、そしてなぜそれがあなたにとって効果的であることが証明されましたか?
ジュニア、シニア、Java、C、Javascript、PHP、SQL、擬似コードなど
タイトルが示すように、お気に入りのホワイトボードのインタビューの問題は何ですか、そしてなぜそれがあなたにとって効果的であることが証明されましたか?
ジュニア、シニア、Java、C、Javascript、PHP、SQL、擬似コードなど
回答:
候補者に、日々の業務で実際に遭遇した問題の解決策を設計するよう依頼します。そうすることで、私と候補者との間に対話を作成しようとします。私は彼がこれまでに問題について考えたことがなかったかのように彼が構築している設計について議論しようとします。
私が評価しようとしているのは、お互いを理解できるかどうか、そして混乱なく技術的な問題について話すことができるかどうかです。
(Javaデスクトップ開発者向け)
Webブラウザーのナビゲーション履歴(前のページ、次のページ、前の10ページのリスト)を処理するAPIを設計します。これは、アプリケーションの多くの部分で再利用できます(ここでは、アプリで具体例を示します)。次に、実装をスケッチします。
私はこれが好きです、それは十分にシンプルで、説明しやすく、ステップバイステップで解決でき(すべてを壊すことなく追加の動作を追加できる)、エッジケースとエラー処理について話すことができ、データについて話すこともできます構造。
候補者にインタビューし、ビジネスが存在しない候補者を除外すると、これが非常に明るくなることがわかりました。複雑さはFizz Buzzに似ていますが、データベーススキルに焦点を当てています。
Assuming the following basic table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)
Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995
Part 2: Documents that contain the keyword "Blue"
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"
私は彼らに彼らが望むどんなSQLバリアントでもそれを書かせました、そして、マイナーな構文問題についてあまりうるさいことはありません。主に、リレーショナルDBの基本的な概念を理解していることを知りたいです。
ほとんどの候補者は、まったく問題なくパート3を通過できます。パート4の答えは、where句で演算子をORからANDに変更するだけであると考える人がどれだけいるかと驚くでしょう。
「デリケートな詳細を明かすことなく、ホワイトボードに最後に取り組んだプロジェクトのデザインを描いてください。」
実装strcpy
、strcmp
および友人。
atoi()
。
strdup()
。
strrev()
関数を実装するか文字列を逆にするように私に頼みました。私のホワイトボードソリューションは彼らに感銘を与え、現在仕事をしています。
いくつかの分野を含む私のお気に入りは、インターフェイス(C#で)が与えられたバイナリツリー内のノードの数を数えることです。
public interface IBinaryTree<T>
{
IBinaryTree<T> Left
{
get;
}
IBinaryTree<T> Right
{
get;
}
T Data
{
get;
}
// Other properties and methods not germane to this problem.
}
面白くするために、ここに実装を示しますが、インタビュー先はこれを見る必要はありません。
public sealed class BinaryTree<T> : IBinaryTree<T>
{
private readonly IBinaryTree<T> left;
private readonly IBinaryTree<T> right;
private readonly T data;
public BinaryTree(
IBinaryTree<T> left,
IBinaryTree<T> right,
T data)
{
this.left = left;
this.right = right;
this.data = data;
}
public IBinaryTree<T> Left
{
get
{
return this.left;
}
}
public IBinaryTree<T> Right
{
get
{
return this.right;
}
}
public T Data
{
get
{
return this.data;
}
}
// Other properties and methods not germane to this problem.
}
およびアシスタントクラス:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
// TODO: What goes here?
}
}
私が見たい解決策はこれです:
public static class BinaryTreeNodeCounter
{
public static int CountNodes<T>(this IBinaryTree<T> tree)
{
return tree == null
? 0
: 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
}
}
以下の知識を示しています:
私にとって興味深いホワイトボードの議論を引き出した2つの質問は次のとおりです。
それらは単純なものから始まり、その後、より複雑になります。
ホワイトボードの質問としてパズルやデザインの質問を使うのは好きではありません。私は、候補者のコードを書く能力をテストする、単純明快な質問を好む。私のお気に入りは:
1)単一リンクリストを逆にする関数を作成します。(3つのポインターが必要であると認識するまでに時間がかかります。)
2)二分木が与えられたら、二分木の深さを見つけます。(この質問は、再帰的なコードを記述する能力をテストします。ベースケースが損なわれていないかどうかを確認します。)
3)整数の配列をバイナリ検索する手順を記述します。(Jon Bentley氏(プログラミングパール)のように、多くの人がバイナリ検索の記述を間違える傾向があります。その後、バグの発見、テストケースの記述、コードの実行などを追跡できます。)
私が働いていたある会社でこれを使用しました。
候補者に時間の追跡に使用する紙を渡しました。これは、1つまたは複数の部門で使用される実際のタイムシートでした。候補者に、より良い時間追跡ツールを作成するための設計プロセスを順を追って説明するように依頼しました。境界はなく、どの言語なども言わずに、候補者が「フルライフサイクル」でどれだけ優れているかを見たいだけです。彼らがどのように要件を収集したかについて、私たちに本当の洞察を与えました。データベーステーブルをどのように構成したか、どのようなUIを使用できるか。このタスクには明らかにコミュニケーションスキルが必要でした。それは通常、いくつかの大きなホワイトボードのある部屋で行われ、2時間も続きました。
私たちはこのプロセスを使用して数人を雇いました。彼らがタスクで本当にうまくいったなら、彼らは私たちのために本当にうまくいきました。彼らが限界的であり、とにかく彼らを雇うことにした場合(別のトピック)、彼らは限界的プログラマーでした。
プログラミングドメインに関連する問題を使用しています。
Webアプリケーションを開発する場合、レコードを削除するWebフォームをどのように作成するか、たとえばデータベースからレコードを削除するためにどのようなアプローチを取るかを確認したいと思います。これは、データベースの基本原則を知っているか、ユーザーとどのように対話して削除を検証するか、そしてソフト削除とは何かを知っているかどうかを教えてくれます。
私にはお気に入りがありません。私が選択する問題は、仕事によって大きく異なります。
インタビューで問題を完全に解決できるかどうか、使用するテクノロジーと言語、またはホワイトボード上でコードがどのように見えるかは気にしません。思考パターンを探しています。彼らが問題をどのように考え、解決するかを知っているかどうかを見たいです。
私のお気に入りは私の友人が使用したものでした。
最初の「n」個の素数を生成/印刷/保存する関数を書いて、それがどのように機能し、どれだけ効率的かを説明してください。
次の理由でうまくいきます:
それはアルゴリズムの質問なので、インタビューを受けた人は考えてから考えを説明できる必要があります。そのため、彼らの脳がどのように機能するかを見ることができます。
言語に依存しません。
誰もそれを完全に正しく理解することはほとんどありません(通常は見逃すエッジケースがあります(通常1または2)、または彼らは負の数を処理しませんので、バグを処理し、間違っていると言われているのを見ることができます。
ほとんどは単純だが非常に遅いふるいとして行われます(たとえば、80%の人がnをn未満の整数で除算することにより素数であるかどうかをチェックします)。空間/時間のトレードオフについて。例えば、「2で割り切れないことがわかっているのに、なぜ数値を4で割るのですか?」または「sqrt(n)未満のすべての素数で除算する必要があるだけでしたが、その数をどこかに保存する必要があるので、その意味は何ですか?)
彼らが正しい答えを得る必要はありません。誰かが自分の考えを考えて説明できるなら、彼らは良い候補になるための道のりです。
私の工学学校のC試験の一部であり、休日から戻ってくるときに生徒を失敗させるための「ダミー」テストとして使用されたaff_zと呼ばれるものテスト全体を無効にします。モロニックの詳細に注意を払わせます。面接中に一度か二度それを再利用しました。
とにかく...正確な処方を忘れましたが、それはこのようなものでした...
Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:
- if c is bigger or equal to 0, then print 'z' to standard output
- if c is stricly smaller than 0 , then print 'z' to standard output
- in any other case, print the letter 'z' to standard output
悲しいことは、答えがかなり明白な場合、非常に複雑なソリューションを思い付く学生だけでなく、何人かは失敗することさえあるということです。
信じられないかもしれませんが、それはインタビュー中にも起こりました。
面接でそれを実行するのはかなり面白かったです。一部の申請者は可能なブランチを書き始めて、何が間違っているのかを理解するでしょう(明らかに、口頭で尋ねるだけなら、彼らが話すときにそうすることはかなり理解できます...書面でそれを与えてください、私はそれが不可解であるとわかります...)
それは馬鹿げていますが、私はそれが最小限のスクリーニングだと思います(同様に、JSプログラマーを雇うとき、私は常に変数を宣言する方法を尋ねます、そして彼らの答えに応じてvarを使用するかどうかはまったく違います。かなり悲しい瞬間、正直に。)
variablename = variablevalue;
、良い人は電話または直接会って笑って、違いが何であるか、またはウィットアウトするかを直接教えてくれましたvar
)。
画像を含む多くの動的なWeb作業を行う組織として、仕事に関連するジオメトリの質問をするのが好きです。いずれにせよ、幾何学的な質問をする傾向があります。それは、素晴らしく視覚的で、問題を自分の作業を視覚的に提示し、系統的に作業する候補者の能力を示すことができる優れた数学テストだと思うためです。
上級候補者のために、私は時々次の質問をします:
この画像は三日月を示しています。三日月の幅は、BからDまでは9cm、EとFの間は5cmです。Cは大きな円の中心です。
a)三日月の面積を計算してください。
b)任意のサイズから内側の円に収まるように画像のサイズを変更するために必要な計算を記述し、中心点がわかっている場合は円内に配置します。
簡単な質問のために、私は通常同じ種類の質問をしますが、「正方形の中の円の中の正方形」の例を使用します。これは非常に簡単ですが、完全な代数を期待します。
さらに、可変長データセットのすべての組み合わせを生成するアルゴリズムをノックアップするように依頼する傾向があります。
私が見た中で最高のFizzBuzzの答えは次のとおりです。
SQL Server 2008
;WITH mil AS (
SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
FROM master.sys.all_columns as c
CROSS JOIN master.sys.all_columns as c2
)
SELECT CASE WHEN n % 3 = 0 THEN
CASE WHEN n % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
WHEN n % 5 = 0 THEN 'Buzz'
ELSE CAST(n AS char(6))
END + CHAR(13)
FROM mil
C#(シンプル)
foreach (int number in Enumerable.Range(1, 100))
{
bool isDivisibleBy3 = (number % 3) == 0;
bool isDivisibleBy5 = (number % 5) == 0;
if (isDivisibleBy3)
Console.Write("Fizz");
if (isDivisibleBy5)
Console.Write("Buzz");
if (!isDivisibleBy3 && !isDivisibleBy5)
Console.Write(number);
Console.WriteLine();
}
C#(賢い)
Enumerable
.Range(1, 100)
.Select(i =>
i % 15 == 0 ? "FizzBuzz" :
i % 5 == 0 ? "Buzz" :
i % 3 == 0 ? "Fizz" :
i.ToString())
.ToList()
.ForEach(s => Console.WriteLine(s));
面接を受けた候補者の中からいくつかを探します。オンラインで説明できない理由から、私たちはかなり貧しい候補者を獲得し、それを期待するようになりました。それでも、私は探します:
デザインの認識。
「番号の説明(cell / home / work / etc。)などの複数の電話番号を持つことができる姓と名の連絡先を持つアドレス帳プログラムのテーブル構造を表示してください」
ここではUML 2.0の仕様図を探しているわけではありませんが、ここでの単純なバブル図は問題ありません。合理的である限り。
データベース(SQLなど)の操作に関する知識
テストの知識
public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
以前のクエリの結果を返すシグネチャを持つメソッドが存在すると仮定します。メソッドにnullを渡すと、NullReferenceExceptionがスローされます。この機能を実証するテストを作成します。
GetPhoneNumbersが姓 "smith"を持つ人に対して(123)456-7890の自宅電話番号を返すことを示すテストを作成します。
コードの書き方に関する知識
作成したテストの要件を満たすメソッドを実装します。
応募者の数と質を考慮して、これまで真剣に応募したすべての人にインタビューしました。私は誰も雇っていない。
次の問題のアルゴリズムを記述します。数nを指定すると、n個のノードを持つ(一意の)二分木の総数を出力します。
したがって、n = 0およびn = 1の場合、答えは1です。n = 2の場合、ルートノードが2つあり、次に左または右の2番目のノードがあります。
設計手法についての洞察を得て、再帰やメモ化、または動的プログラミングソリューションについて考えているかどうかを確認できます。
ソフトウェア開発者にインタビューする場合は、ソフトウェアを設計し、各行にフルネームを含む任意の大きなファイルから重複エントリを削除するためのハードウェア要件を説明するよう依頼します。問題の説明の一部を意図的に曖昧にしておきます。次に、要件、さまざまなトレードオフ、データ構造とアルゴリズム、I / O(セカンダリストレージ)、ソフトウェアとハードウェアテクノロジー、スケーラビリティなどの分析と明確化を理解しているかどうかを確認するように彼に挑戦します。
これは小さなながらも挑戦的な問題であり、多くのコンピューティング分野における応募者の知識と能力を明らかにするものだと思います。
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
多くの人がこれにこだわる可能性があります。何らかの解決策が与えられた場合-通常は再帰を使用します。その後:
Implement the same via 'for'-loop
両方のタスクを完了できないフェローの人数-候補者の50%
それが私がそれを好む理由です:)
fib(n)=round(power(PHI,n)/SQRT5)
。PHIとSQRT5は、それぞれ黄金比(1.618 ...)と5の平方根を表す定数です。
私が行くデータベースの場合:
表:物事 ID名 1ボドキンヴァンホーン 2フーズフーズ 3フーズフーズ 4ホットショット 5 Marvin O'Gravelバルーンフェイス 6スニム 7 Marvin O'Gravelバルーンフェイス 8 Marvin O'Gravelバルーンフェイス 9デイブ
名前に基づいてこのようなテーブルを重複排除するSQLを記述します(どのIDを取得してもかまいませんが、返されるIDはその名前に対して有効でなければなりません)。そのため、正しいSQLが適用されると、テーブルは次のようになります。
表:物事 ID名 1ボドキンヴァンホーン 2フーズフーズ 4ホットショット 5 Marvin O'Gravelバルーンフェイス 6スニム 9デイブ
私はそれが好きです:
(これは私がこれを行ういくつかの完全に些細な方法があることを見つけた場所であり、私は長年にわたってそれを複雑化してきました)。
SELECT min(ID), Name FROM Things GROUP BY Name
ます。
HAVING count(Name) > 1
ますが、サンプルの答えは、ボドキンヴァンホーン、ホットショット、スニム、デイブを省略するべきだと思います。
DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
。望ましい解決策はありますか?
私のお気に入りのC ++ホワイトボードの問題は、候補者に実装させることです
Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;
これから私は学ぶことができます
標準の52カードデッキをどのように表現しますか?どのプログラミング言語でも問題ありません。どのようにカードをシャッフルしますか?
私のお気に入りは、printfのプロトタイプを尋ねることから始めることです。次に、1文字を出力する低レベルAPI printc(char c)を指定して、printfを実装します。スタックがCPUの一部であるなど、あらゆる種類の興味深い応答を提供します。ご想像のとおり、私はCと組み込みのバックグラウンドから来ました。
varargs()
そのような関数を呼び出す必要があります。私は正しいですか?少し前に言ったのは一度だけです。
200匹の魚が入ったボウルがあります。これらの魚の99%はグッピーではありません。残りの2%がグッピーになるように、何匹の魚を取り除く必要があります。作品を見せてください。
これは混乱を招く要件です。同じ質問の中で視点を複数回変更することは、このように言われます。実際に何が起こっているのかを理解できるかどうかを確認するためのものです。
何人が間違っているのか驚くでしょう。
answer = 100
。[他の魚を選択的に選ぶことができると仮定します。グッピーを削除する場合、他の答えがあります。]良い質問です。プログラマーにとって子供の遊びであるべきですが、それをうまく処理できる人が少ないことに驚くでしょう。
私にはいくつかのお気に入りがありますが、ここにほとんど常に出てくるカップルがあります。私はほとんどの場合、最終ラウンドの技術(C ++)インタビューを行っているので、新しい興味のある分野につながる、より長く、よりオープンな質問を好んでいます。「正しい」答えはありません。他の会話を開くだけです。
1)基本的な共有ポインターの実装、tr1またはboostの実装での共有ポインターと比較して欠陥がある場所の説明、使用方法など
2)コードレビュー。経験豊富な採用の場合、設計上の問題、エラー、コーディングの恐怖、潜在的な保守性の問題について、提供されたコードを自信を持って確認できることが期待されます。また、もちろん、どのように修正するか。そして、時には彼らが撃shootingしているジュニア開発者にそのメッセージをどのように伝えるか。
私に使用されて以来、私が使ってきた質問の1つは次のとおりです。
1から100までのすべての数値を印刷する関数を作成します。
私がそれを使用している理由の大部分は、その後、そこに解決策を取り、さまざまな方向に移動できるという事実によるものです。
1から1000、10000、またはnまでのすべての数値を出力するように関数を変更するにはどうしますか?
これらの質問に対する回答は、変化する要件にどのように対応するか、またパフォーマンスの考慮事項を認識できるかどうかについての洞察を提供します。強力な候補者は、関数が呼び出される頻度に必要な関数に関する質問で応答する場合があります。
別の方向に移動する:
この関数が1分間に数回呼び出され、パフォーマンスが懸念される場合、どのように変更しますか?
私は彼らの側面的な思考をチェックする方法としてこれを使います。最大値が大きくなると素数の計算が遅くなる可能性があるため、解決しようとしている問題に基づいて調整されたある種の計算済みまたは事前計算済みのルックアップテーブルを使用する方が理にかなっている場合があります。
比較的大きいスペアマトリックスをどのように表現しますか。たとえば、1000x1000で、最大で100の非ゼロエントリがありますか?