面試工程師,除了一定要做的實際筆試之外,山姆鍋為了進一步了解候選人(candidate)的能力,會再口頭提問幾個問題。 這些問題對某些人來說,可能覺得不難,但山姆鍋的經驗發現,能夠正確回答出這些問題的比例比預想的少許多。 甚至可以說:會這些題目的工程師,能力已經在水準之上。
山姆鍋面試的習慣之一是在對方筆試結束,如果認為 Candidate 筆試結果不錯, 初步面談覺得會錄取時,會再問下列問題。
面試題目
- 一個樹狀結構,除了根節點沒有外,其餘節點都有且只有一個父節點;任一節點可以有不定個數的子節點,請定義類別(class) Node 及屬性 ( attribute)來表示這個樹節點。
- 欲將題目 1 的類別對應到關連式資料庫表格,請設計這個表格的 schema。
- 請修改題目 2 的 schema 使得查詢任一節點的所有直接跟間接子節點只需要一個 SQL 敘述(statement)。也就是回傳子節點,子節點的子節點,以此類推。
參考答案
底下是各個題目的參考解答:
- 類別 Node 需有兩個屬性(attribute)/欄位(field),分別表示它的父節點以及子結點。
public class Node {
Integer id; // 也可以使用 int
Node parent;
List<Node> children;
String name; // 作為節點其它屬性的代表。
}
- 將類別 Node 對應到一個關連式資料庫表格
CREATE TABLE node (
id INT NOT NULL,
parent_id INT,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(id)
);
給定一個節點 ID, nid, 可以使用下列 SQL 查詢其直接子節點:
SELECT * FROM node WHERE parent_id=nid;
其中,nid
要置換成實際的值。
- 這題基本上除非之前就看過,不然不會是很正常的。老實說,山姆鍋是先看到方法,才知道答案的。 這題其實真正的目的只是想看 candidate 如何解題以及遇到問題的處理態度。也就是說,根本就沒有預期 candidate 會答對! 至於解答,Simon Asika ⎘ 有一篇寫得很好的文章可以參考。 山姆鍋當初發現這個方法時,都還沒有一個正式稱呼。
結語
根據山姆鍋的經驗,只要會前兩題已經是水準之上,會第三題就算高手了。 山姆鍋是在確認對方已經適任時,才額外使用這些問題用來判斷對方程度到哪裏,希望大家不要弄錯先後順序。 還有順便分享一下:遇到不會的問題,最忌諱直接回答說不會,解決問題的過程遠比答案重要, 這也是為何這些問題採用口試的主因。
因為這些題目的答案在網路上越來越普遍,已經無法達到當初使用的目的,山姆鍋未來也不會再用了。
參考資料
Storing Hierarchical Data in a Database, Part 2: http://www.sitepoint.com/hierarchical-data-database-2/ ⎘
: 山姆鍋最原始參考的資料應該是這篇文章。