面試系統開發員(第一部份)」,建議你先閱讀那一篇文章。
怎樣處理困難的問題?
我首先聲明,我不會問任何刁難或者有陷阱的問題,因為面試的目的不是要難為別人,而是要找到優秀的同事。明知對方不懂得或者不擅長的東西,我不會問;需要大量思考的問題,我也不會問。不過我總會問一些有挑戰性的問題,否則怎能區分平庸和優秀的人?以下是一些多數應徵者覺得比較難以處理的問題。
- 我會要求你評價自己的能力,例如若果滿分是十分,你認為自己對於網絡保安的認識值多少分?你為何認為你適合這份工作?你如何說服我你比其他應徵者更好?等等。中國人一般比較含蓄內斂,不擅長推銷自己,所以會覺得這類問題難以作答,香港的教育制度也訓練我們一切要循規蹈矩,聽從上級的指令,何曾需要進行自我評估、自我推銷?不過,你應該清楚自己的長處、短處、強項、弱點,你要找哪類型的工作,你希望做甚麼工作,而不是隨意找一份有薪資高、保障好的工作。所以應付這類問題的最好策略,就是在面試前想一想自己的能力和興趣,作答的時候不妨具體一點,例如「我在網絡保安方面的認識不多,因為我一向主要是負責數據庫的開發工作,我會給自己十分之中的三至四分」,這個分數最好與你之前回答的技術性問題的表現一致,若果你自問對我所問的網絡保安問題對答如流,便應該回答一個比較高的分數,否則便應該回答低一點的分數,否則我會視為過度自信/自滿,或者過度自卑,都是不好的。
- 你不明白我的問題。前面已經說過,請要求我提供更多或更具體的資料,或澄清一些含混的名詞。例如我問你何謂 SQL injection,你不妨要求我澄清:「你是指網路保安中的一種入侵技術 SQL injection 嗎?」若果你根本沒有聽說過這個名詞,或者只是有點印象卻一時無法想起來(緊張的時候經常如此,我是明白的),不妨問:「這是哪一個範疇的名詞?」我是很樂意給你一點提示的。
- 你不知道問題的答案。前面已經提過,不知道便說不知道好了,或者承認只知道一些大概,沒有人知道所有事情,你也不會例外,我準備的問題涵蓋很廣泛的範疇,我有心理準備你不能回答所有問題。不過若果你真的嘗試回答,最好準備我會追問相關的細節,確保你不是只知道名稱,所以你不知道的東西最好還是承認不知道。
- 你為甚麼辭職。這個問題的目的,是要評估一下你將會待在新職位多久,與及你期望一個怎麼樣的工作性質和環境,而不是給你機會發洩對上一份工作或者老闆的不滿。比較好的答案通常是「為了更好的職業前景」、「擴闊自己的視野」、「公司把業務移到內地」、「公司把工作外判」、「公司前景不明朗」、「長期長時間工作(每星期工作六至七天,每天超過十二小時之類)」等等,比較差的答案包括「上司針對我」、「與同事合不來」、「人工低」(若果其他機構的薪資更高,你也會離開這兒吧)、「尋找比較舒適的工作」等等。
- 為甚麼你總是幹這麼短的時間便轉換工作。我很怕經常轉換同事,因為培訓新人實在很花心力,若果你每一份工作都只是幹一年半載,便要準備回答這道問題。通常比較好的答案是「這些都是合約工作,合約完了便要離開」、「這期間我正在兼職讀一個學位,考試期間的兩個月我要辭職溫習」等等。
面試題目,我為何問?你怎樣答?
很多人以為面試就是一個問答的遊戲,一問一答,但其實贏得高分的不一定是那些提供正確答案的人,有些問題根本沒有正確的答案,有些問題答案本身並不重要,以下提供一些我的經驗給大家。
- 我會請你介紹現在的工作。要取得高分必須做到以下兩點:第一要精簡,何謂精簡在本文的第一部份已經解釋過;第二要有條理,這是表現你的組織能力和溝通能力的機會,這一道問題其實你應該很熟悉,所以可說是「大贈送」,是你盡情發揮的機會。你回答後我通常會追問一些細節,所以請盡量只把你熟悉的部分告訴我,減低你失手的風險。
- 我會問你怎樣解決一道數學問題。這可能是我的個人取向,我認為優秀的人才應該有良好的理論根柢,對於電腦技術的基礎理論瞭如指掌,例如 big O notation、sorting algorithms、binary search、information theory 等等,因為應用技術日新月異,只有具備穩固理論基礎的人才能迅速掌握新的技術、評估新技術的優劣、和判斷它的實用性。香港的學生一般都太功利,他們編程語言很熟悉,但對於怎樣寫高效能的程式卻不甚了了。這一道問題可說是區分平庸和優秀技術人員的利器。
- 我會問你怎樣測試一個程式。我最有興趣聽到的是你怎樣測試非正常情況下程式的表現,例如測試不正常的輸入數據、硬盤沒有空間、缺乏足夠的存取權限等情況下程式如何運作(當然你的答案要包括正常情況的測試,但那不是最重要的),沒有相關的經驗很難設計出周全的測試項目。
- 我會請你比較兩個不同的開發平台,例如 web tier 和 database tier。要達到一個目的可以有很多方法,你是否有能力選擇最合適的方法?你是否明瞭手上每一件工具的特性和優劣?優秀的人才不單只擁有很多工具,他們還懂得甚麼時候用甚麼工具,而不是只懂得聽從上司的指令。若果你可以給告訴我一些我不知道的東西,從而使工作做得更好,我會以你為傲。
- 我會問你怎樣優化一個程式,例如一道數據庫的 SELECT 語句。好的開發人員不會滿足於程式有正確的輸出,他們還會在乎系統的運作是否最有效率,他們手上應該有一大堆優化程式的手段和工具,並且熟悉如何運用這些工具。
- 我會問你一些技術名詞的意思。這些通常都是某個範疇內的常見名詞,用來測試你對這個範疇的熟悉程度。若果你在履歷表中說你在這個範疇內有認識或者有經驗,最好在面試前上網溫習一下,免得我感覺你在欺騙我。若果你沒有相關的經驗,但仍然能夠回答問題,我會對你另眼相看,因為這證明你是一個有廣泛興趣,並且具備自學能力的人,這種同事現在越來越難見到了。正如我在前面說過,我重視同事的自學和分析能力,多於他們是否具備我需要的技能。
範例問題
我知道你等待這一個章節很久了,讓我告訴你一些我常提出的問題。以下的問題用英文撰寫,但我通常是用中文面試的,不用擔心,哈哈。
- When will implementing a business logic with database stored procedure is preferable over a classic programming language?
這兩個平台的特性有很大的分別,各有強項和弱項,例如 data intensive 的工作最好是放在數據庫內處理,省卻數據在網絡內傳送的麻煩(包括效能、保安等問題),需要由多台伺服器分擔工作量的運算工作,最好是放在專用的應用程式伺服器 (application server),由 load balancer 分配工作。當然還有很多考慮因素,請上網找找答案。
- In your opinion, what is the different between XXX and YYY (where XXX and YYY are PHP, Java, .Net, VB, C++, etc.)
這道問題的答案並不重要,我只是要看看你對 XXX 和 YYY 有多熟悉。
- What parts of Java don’t you like and why?
其實我對你怎樣看 Java 沒有太大興趣,我只是想看看你對 Java 有多熟悉。
- Given a number 1 to 1,000, what is the maximum number of guesses needed to find a specific number if you are give the hint ‘higher’ or ‘lower’ for each guess you made?
這是一道中學程度的數學問題,用來測試面試者的基本的邏輯思維。正確的答案是 log<sub>2</sub>1000,介乎 9 至 10 之間,優秀的人可以不假思索說出正確的答案,只要回答 9 或者 10 都可以了。能夠說出正確策略(二分法)的也不錯。
- If you had 8 participants in a tournament, how many games would need to be played to determine the winner?
優秀的人應該在略一思索後便得到正確的答案,用 information theory 便知道,有 n 名參賽的淘汰賽,需要 n-1 場賽事來決定優勝者,即是說答案是 7,若果你是即場設計賽程求得答案,也算是不錯,但最好你告訴我你是怎樣用 information theory 來計算答案。至於無法回答的人不用失望,因為這是證明你不是最優秀的人,但至少不是不合格的人。
- Could you tell me something about SQL injection? How to mitigate it?
SQL injection 是攻擊網上系統最常見的手段,不論使用甚麼編程語言、甚麼開發平台,你都應該認識。即使你不是為了面試,也應該工餘上網看看有關的資料。
- What would you suggest if a SQL statement runs very slow?
你對於自己所編寫的程式的效能有多重視?好的數據庫開發人員應該經常把提升效能放在重要的位置,並且手上有一大堆優化效能的手段和工具。
- What is the tradeoffs with having indexes?
你對於數據庫各種工具的強項和弱點是否有充足的認識?索引 (index) 的特色是可以提升查詢的速度,但減低修改數據的速度,並且會占用額外的記憶。
- What is a database trigger? Name some usages of database trigger.
你是否有能力選擇最合適的方法來達成任務?請告訴我你對這些工具的認識。
後記(可以不看)
一口氣寫了我面試系統開發員的心得,希望對大家有用,有些意見是很主觀的,但我相信其他面試官與我的相差不會太遠。有些意見可能你不會認同,請告訴我,讓我可以改進我的面試技巧。你可能有其他面試的心得要分享,歡迎啊,請使用下面的回應表格。有問題嗎?我很樂意回答,請在下面的回應表格提出,恕我不會回應電郵的查詢。
最後,祝大家找到稱心滿意的工作。