最近更新: 2013-02-09

求才者應如何面試程式人員

今天有人在「Java Spring framework 開發人員面試題」留下一則回應。 我看了回應之後,想到了求才者應該如何面試程式人員的事。

我分成兩部份來看。分別是「觀念或語法」,「方法或答案」。

觀念或語法

首先,以 Java Spring 框架的事為例。我在「Java Spring framework 開發人員面試題」出了三道問題。我問的是基礎觀念,而不是程式人員的記憶力。所以我期望的答案是概念性的解釋。我希望程式人員回答的內容,就像這篇「 程式設計師小心別被框架給「框」住了...」的原作者所期望的內容。我要的答案是「Concept」不是「Syntax」。

出這三道題目時,我會在旁觀察解答者。前兩題就算有些關鍵字或語法記不起來也無妨,那不重要。真正重要的只有第三道問題的答案,那才是真正的基礎觀念。

我列的那三道問題,涵蓋了 Spring 框架「正、反、合」的三種觀念層次。第一道問題是 Spring 框架如何重複使用既有的舊類別,而不需要修改舊類別的程式碼;將 POJO 對應到 Spring 框架的 Bean ,這是「正」。第二道問題則是在 Spring Bean 已經設計好之後,如何實作新類別抽換舊類別;方向和第一道問題相反,故是「反」。第三道問題則是 Spring 框架如何實現以上兩項目標的基礎,故為「合」。

第三道問題的觀念至為基礎,而答案異常簡單。若是跳過前兩題,直接看第三題的參考答案,我相信沒有人會覺得這四行程式碼有什麼難以理解的地方。這基礎觀念簡單到理解之後,我可以順手就用 PHP 寫一個簡化版,詳見「PHP 實作 IoC/DI 設計模式」。

喔,用 PHP 實作 IoC 模式還需要對 PHP 語言有足夠的熟悉度才行。但是了解觀念的人,自己創造工具只是時間早晚的問題。而不懂觀念的人,則永遠也踏不進這個領域。 連基礎觀念都沒有建立的人,充其量是看書打字的打字員。

附帶一提,關於資料結構與演算法的題目。我不是資訊科班出身的,不曾為了學期考試而去記過那些演算法公式或程式碼。在我看來,那些演算法的數學公式或實作程式,都是形式答案。面試時問這些東西只是在考記憶力。要問基礎觀念的話,我認為排序只需問氣泡,搜尋只需問二分。

方法或答案

我唸 MBA 研究所時,有一門課叫「研究方法」。這門課的內容就是在教我們「找答案的方法」。 因為在科學研究的領域,很多事還沒有答案存在,甚至我們還要習慣巔覆已存在的答案。 所以我們必須學習與熟悉找答案的方法。

在軟體設計的領域中也是如此。工具與技巧不斷推陳出新,而使用者的需求也一再改變。已經存在的答案總是不能滿足我們。所以熟記答案不如熟悉找答案的方法。

我個人學習的態度一向秉持「直讀原本」的態度。在國學領域中,直讀原本尚有原本考據的難度。但在軟體設計領域,直讀原本基本上沒有來源取得的問題。軟體設計領域要讀的「原本」就是許許多多的規格書或參考手冊。要學 HTML DOM,我首先會看 W3C 的 HTML Spec;要學 PHP 則必看 PHP Manual」;要懂 JavaScript 則必讀 EMCA-262。這就是最基本的「找答案方法」。

那要怎麼知道面試者是否熟悉找答案的方法?很簡單,就是在旁邊看他找啊。

以 PHP 為例,我特別喜歡問「echo "Hello " . $name;」和「echo "Hello ", $name;」有什麼不同。這牽涉到一個指令與兩個運算子的意義,而大多數的 PHP 程式人員不會去記這種事。不知道答案是正常的,而那也正是我想要的狀況。這樣我就可以丟一台筆電給他,請他找答案。

在搜尋引擎的幫助下,他通常會用 google ,然後我會引導他搜尋 php 和 echo 這兩個關鍵字。馬上他就會靠近我的陷阱。我會觀察他如何選擇搜尋結果。不過呢,這問題在我眼中只有一個選擇是正確的。只要他點下的連結不是搜尋結果的第一筆,也就是 PHP Manual 那一筆,我就準備說「謝謝再聯絡」了。

PHP Manual 這麼正式的參考文件都不先看,而跑去看那些不知真偽的論壇或部落格文章,這不是找答案的方法。對了,就算他點下的部落格叫「石頭閒語」,我也判定不合格。

我習慣提那些簡單而正式參考文件通常在 Google 搜尋結果第一頁的問題,然後觀察他們找答案的過程。只要他們查看的網頁離答案愈來愈遠,那麼合格也會離他們愈來愈遠。

我過去求職時面試過的資訊軟體公司,幾乎無一例外,全是先丟一份考卷給求職者寫。寫完後,助理再收回去給負責的人對答案。很遺憾,這種作法測不出求職者會不會找答案。找答案的方法永遠比答案重要。而他是否熟悉找答案的方法這件事,顯現在他找答案的過程中,而不是答案紙上的最終結果。

在旁邊觀察對方找答案與寫答案的過程,其實很快就能看出對方懂不懂觀念、會不會找答案。這花不了多少時間。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/21337470.html

樂多舊回應
reborn2266@gmail.com(mars) (#comment-22779550)
Sat, 09 Feb 2013 10:03:03 +0800
"我看來,那些演算法的數學公式或實作程式,都是形式答案。面試時問這些東西只是在考記憶力。要問基礎觀念的話,我認為排序只需問氣泡,搜尋只需問二分。"
資結與演算法其實跟任何知識技術一樣,如果只是背誦形式答案而不需變化運用自行設計,只能說是因為應用領域不同。:-)
pjtsai.tw@gmail.com(pjt) (#comment-22790832)
Thu, 21 Feb 2013 14:07:41 +0800
很贊同面試的時候給機器讓求職者使用search engine,不過通常我不會在旁邊引導查詢.至於是不是一定要看官方manual,我倒是沒那麼要求,只要答案是對的即可.我的重點反而是求職者使用什麼關鍵字去search,以及他怎麼確定答案是我的問題的解答("這是官方manual寫的"當然是其一,但是我更期待聽到"我在XX找到這段sample code,而且試跑過了").
跟您比較不同的是,演算法還有資料結構我非常重視,這不是期待求職者是個背誦機器,而是這些東西是基本中的基本.不需要記得數學證明或是實作方法(那個查就有了),但是要知道各個資料結構的原理和使用時機(例如說要知道hash/array/linked list/tree的優缺點各是什麼,什麼情況下該用哪一個).
未留名 (#comment-22790906)
Thu, 21 Feb 2013 16:11:00 +0800
關於「我在XX找到這段sample code,而且試跑過了」這點,我認為證據力不足。
例如他在石頭閒語找到一段code,並且也跑過了。這是一定會過的,因為我習慣就是放整段能跑的。
但他能不能用口語化的方式表達程式碼的內容,就要考驗他的觀念水準了。

我在本文中只是例舉我對演算法的要求,沒提到資料結構。但這可不是說我不重視喔。

基本上,quick 或 shell sort 是切成小片的氣泡。hash 則是抄捷徑的中分搜尋。
所以連演算法中的氣泡排序和中分搜尋都不能用口語講清楚的人,我想更上一層的演算法也不必問了。

至於資料結構這一部份,某些高階語言是直接提供一種容器就全包了。所以我覺得這部份可以適度地網開一面。

但 Python 的話,我就會問 array, hash, list, tuple 的區別。這不只是在考資料結構,也在考驗 Python 語言的熟悉度。如果他能上網查看Python doc 並指著相關條目說明的話,我的評價會更好。像 C/C++, Java, C# 也是如此。
pjtsai.tw@gmail.com(pjt) (#comment-22790948)
Thu, 21 Feb 2013 17:20:53 +0800
我沒寫清楚整個過程所以有點誤解,search engine這題我的目的純粹只是在考"使用search engine"這個技能.整個過程我著重的是受試者拿什麼key word去search(根據我的經驗,能掌握精確的search term的人很少,例如有一題我用web page view conter做例子,想考race condition,只有一個人試了幾次後有拿出"thread"去找,剩下的全部都用"web"或是"counter"之類的,找不到就放棄了).受試者找到答案後,當然會請他說明他的答案,他說有跑sample code,那就會問為什麼他覺得這個sample code可以回答我的問題.
我之所以覺得sample code會比official manual好,是因為用了sample code,代表這個人除了找資料以外,還有動手做實驗的念頭,我認為這是很重要的工程師特質.我們給的是一台白機器,要跑sample code還得裝compiler / interpreter,並不是順手就能完成的事(除非他找到的是shell script或是可以在browser跑的java script).
這題除了考找到正確的key word能力以外,我還會順便觀察語言能力.能在英文網頁找答案的人會大幅加分(我們的題目是出中文的).至於讀code的能力,另外有一題code refactor給受試者答.
題外話,個人不覺得hash是抄捷徑的binary search,他是使用數學做pin point location(hash collision狀況不算)
未留名 (#comment-22845196)
Thu, 18 Apr 2013 08:54:03 +0800
"我看來,那些演算法的數學公式或實作程式,都是形式答案。面試時問這些東西只是在考記憶力。要問基礎觀念的話,我認為排序只需問氣泡,搜尋只需問二分。" 非常不認同, 台灣的軟體業就是太多不重視基本科學才一堆代工的短暫獲利沒有價值的創造, 你可以看看google或facebook這些大公司的面試就知道演算法有多重要,當然也絕對不可能只問這兩種簡單過頭的演算法。
未留名 (#comment-22845216)
Thu, 18 Apr 2013 09:27:31 +0800
看文章請看仔細。請分清觀念和語法。我說的是「演算法的"數學公式或實作程式",都是形式答案」。我可沒說演算法的觀念不重要。

演算法的數學公式是考記憶力的東西,一個學生把演算法書上的數學公式或範例程式背起來,再複誦給你聽,就代表他了解這個演算法的觀念嗎?

與其聽他背答案,我寧願聽他用口語解釋 why and how 。

最後,我在上面對其他人的回應中還說了「連演算法中的氣泡排序和中分搜尋都不能用口語講清楚的人,我想更上一層的演算法也不必問了」。你們公司有大量演算法設計的需求,自然要再問更進一步的演算法。但你認為簡單過頭的演算法,不正是那些進階演算法的基礎嗎?如果面試者連這兩種簡單過頭的演算法都講不清,就不必再浪費時間深問了。省點時間不是很好嗎?
未留名 (#comment-22845230)
Thu, 18 Apr 2013 09:46:40 +0800
台灣的教育就是太重視後面的形式答案,才不能系統性創新。而且常常要在「題目」的引導下,才知道要用哪個 solution 。

但是在實際的設計工作中,有時並沒有考試題目上那麼明顯的方向性。於是沒有明顯的「題目」或者高人點破,就不會想到在這個時機或情況下可以用其他 solution 。就變成了總是因循前人腳步、固步自封的結果。