我怎樣面試系統開發員(第二部份,共兩部分)

這篇文章將分為兩部分,這是第二部分,若果你未看「面試系統開發員(第一部份)」,建議你先閱讀那一篇文章。

怎樣處理困難的問題?

我首先聲明,我不會問任何刁難或者有陷阱的問題,因為面試的目的不是要難為別人,而是要找到優秀的同事。明知對方不懂得或者不擅長的東西,我不會問;需要大量思考的問題,我也不會問。不過我總會問一些有挑戰性的問題,否則怎能區分平庸和優秀的人?以下是一些多數應徵者覺得比較難以處理的問題。

  1. 我會要求你評價自己的能力,例如若果滿分是十分,你認為自己對於網絡保安的認識值多少分?你為何認為你適合這份工作?你如何說服我你比其他應徵者更好?等等。中國人一般比較含蓄內斂,不擅長推銷自己,所以會覺得這類問題難以作答,香港的教育制度也訓練我們一切要循規蹈矩,聽從上級的指令,何曾需要進行自我評估、自我推銷?不過,你應該清楚自己的長處、短處、強項、弱點,你要找哪類型的工作,你希望做甚麼工作,而不是隨意找一份有薪資高、保障好的工作。所以應付這類問題的最好策略,就是在面試前想一想自己的能力和興趣,作答的時候不妨具體一點,例如「我在網絡保安方面的認識不多,因為我一向主要是負責數據庫的開發工作,我會給自己十分之中的三至四分」,這個分數最好與你之前回答的技術性問題的表現一致,若果你自問對我所問的網絡保安問題對答如流,便應該回答一個比較高的分數,否則便應該回答低一點的分數,否則我會視為過度自信/自滿,或者過度自卑,都是不好的。
  2. 你不明白我的問題。前面已經說過,請要求我提供更多或更具體的資料,或澄清一些含混的名詞。例如我問你何謂 SQL injection,你不妨要求我澄清:「你是指網路保安中的一種入侵技術 SQL injection 嗎?」若果你根本沒有聽說過這個名詞,或者只是有點印象卻一時無法想起來(緊張的時候經常如此,我是明白的),不妨問:「這是哪一個範疇的名詞?」我是很樂意給你一點提示的。
  3. 你不知道問題的答案。前面已經提過,不知道便說不知道好了,或者承認只知道一些大概,沒有人知道所有事情,你也不會例外,我準備的問題涵蓋很廣泛的範疇,我有心理準備你不能回答所有問題。不過若果你真的嘗試回答,最好準備我會追問相關的細節,確保你不是只知道名稱,所以你不知道的東西最好還是承認不知道。
  4. 你為甚麼辭職。這個問題的目的,是要評估一下你將會待在新職位多久,與及你期望一個怎麼樣的工作性質和環境,而不是給你機會發洩對上一份工作或者老闆的不滿。比較好的答案通常是「為了更好的職業前景」、「擴闊自己的視野」、「公司把業務移到內地」、「公司把工作外判」、「公司前景不明朗」、「長期長時間工作(每星期工作六至七天,每天超過十二小時之類)」等等,比較差的答案包括「上司針對我」、「與同事合不來」、「人工低」(若果其他機構的薪資更高,你也會離開這兒吧)、「尋找比較舒適的工作」等等。
  5. 為甚麼你總是幹這麼短的時間便轉換工作。我很怕經常轉換同事,因為培訓新人實在很花心力,若果你每一份工作都只是幹一年半載,便要準備回答這道問題。通常比較好的答案是「這些都是合約工作,合約完了便要離開」、「這期間我正在兼職讀一個學位,考試期間的兩個月我要辭職溫習」等等。

面試題目,我為何問?你怎樣答?

很多人以為面試就是一個問答的遊戲,一問一答,但其實贏得高分的不一定是那些提供正確答案的人,有些問題根本沒有正確的答案,有些問題答案本身並不重要,以下提供一些我的經驗給大家。

  1. 我會請你介紹現在的工作。要取得高分必須做到以下兩點:第一要精簡,何謂精簡在本文的第一部份已經解釋過;第二要有條理,這是表現你的組織能力和溝通能力的機會,這一道問題其實你應該很熟悉,所以可說是「大贈送」,是你盡情發揮的機會。你回答後我通常會追問一些細節,所以請盡量只把你熟悉的部分告訴我,減低你失手的風險。
  2. 我會問你怎樣解決一道數學問題。這可能是我的個人取向,我認為優秀的人才應該有良好的理論根柢,對於電腦技術的基礎理論瞭如指掌,例如 big O notation、sorting algorithms、binary search、information theory 等等,因為應用技術日新月異,只有具備穩固理論基礎的人才能迅速掌握新的技術、評估新技術的優劣、和判斷它的實用性。香港的學生一般都太功利,他們編程語言很熟悉,但對於怎樣寫高效能的程式卻不甚了了。這一道問題可說是區分平庸和優秀技術人員的利器。
  3. 我會問你怎樣測試一個程式。我最有興趣聽到的是你怎樣測試非正常情況下程式的表現,例如測試不正常的輸入數據、硬盤沒有空間、缺乏足夠的存取權限等情況下程式如何運作(當然你的答案要包括正常情況的測試,但那不是最重要的),沒有相關的經驗很難設計出周全的測試項目。
  4. 我會請你比較兩個不同的開發平台,例如 web tier 和 database tier。要達到一個目的可以有很多方法,你是否有能力選擇最合適的方法?你是否明瞭手上每一件工具的特性和優劣?優秀的人才不單只擁有很多工具,他們還懂得甚麼時候用甚麼工具,而不是只懂得聽從上司的指令。若果你可以給告訴我一些我不知道的東西,從而使工作做得更好,我會以你為傲。
  5. 我會問你怎樣優化一個程式,例如一道數據庫的 SELECT 語句。好的開發人員不會滿足於程式有正確的輸出,他們還會在乎系統的運作是否最有效率,他們手上應該有一大堆優化程式的手段和工具,並且熟悉如何運用這些工具。
  6. 我會問你一些技術名詞的意思。這些通常都是某個範疇內的常見名詞,用來測試你對這個範疇的熟悉程度。若果你在履歷表中說你在這個範疇內有認識或者有經驗,最好在面試前上網溫習一下,免得我感覺你在欺騙我。若果你沒有相關的經驗,但仍然能夠回答問題,我會對你另眼相看,因為這證明你是一個有廣泛興趣,並且具備自學能力的人,這種同事現在越來越難見到了。正如我在前面說過,我重視同事的自學和分析能力,多於他們是否具備我需要的技能。

範例問題

我知道你等待這一個章節很久了,讓我告訴你一些我常提出的問題。以下的問題用英文撰寫,但我通常是用中文面試的,不用擔心,哈哈。

  1. When will implementing a business logic with database stored procedure is preferable over a classic programming language?
    這兩個平台的特性有很大的分別,各有強項和弱項,例如 data intensive 的工作最好是放在數據庫內處理,省卻數據在網絡內傳送的麻煩(包括效能、保安等問題),需要由多台伺服器分擔工作量的運算工作,最好是放在專用的應用程式伺服器 (application server),由 load balancer 分配工作。當然還有很多考慮因素,請上網找找答案。
  2. In your opinion, what is the different between XXX and YYY (where XXX and YYY are PHP, Java, .Net, VB, C++, etc.)
    這道問題的答案並不重要,我只是要看看你對 XXX 和 YYY 有多熟悉。
  3. What parts of Java don’t you like and why?
    其實我對你怎樣看 Java 沒有太大興趣,我只是想看看你對 Java 有多熟悉。
  4. 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?
    這是一道中學程度的數學問題,用來測試面試者的基本的邏輯思維。正確的答案是 log21000,介乎 9 至 10 之間,優秀的人可以不假思索說出正確的答案,只要回答 9 或者 10 都可以了。能夠說出正確策略(二分法)的也不錯。
  5. 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 來計算答案。至於無法回答的人不用失望,因為這是證明你不是最優秀的人,但至少不是不合格的人。
  6. Could you tell me something about SQL injection? How to mitigate it?
    SQL injection 是攻擊網上系統最常見的手段,不論使用甚麼編程語言、甚麼開發平台,你都應該認識。即使你不是為了面試,也應該工餘上網看看有關的資料。
  7. What would you suggest if a SQL statement runs very slow?
    你對於自己所編寫的程式的效能有多重視?好的數據庫開發人員應該經常把提升效能放在重要的位置,並且手上有一大堆優化效能的手段和工具。
  8. What is the tradeoffs with having indexes?
    你對於數據庫各種工具的強項和弱點是否有充足的認識?索引 (index) 的特色是可以提升查詢的速度,但減低修改數據的速度,並且會占用額外的記憶。
  9. What is a database trigger? Name some usages of database trigger.
    你是否有能力選擇最合適的方法來達成任務?請告訴我你對這些工具的認識。

後記(可以不看)

一口氣寫了我面試系統開發員的心得,希望對大家有用,有些意見是很主觀的,但我相信其他面試官與我的相差不會太遠。有些意見可能你不會認同,請告訴我,讓我可以改進我的面試技巧。你可能有其他面試的心得要分享,歡迎啊,請使用下面的回應表格。有問題嗎?我很樂意回答,請在下面的回應表格提出,恕我不會回應電郵的查詢。

最後,祝大家找到稱心滿意的工作。

我怎樣面試系統開發員(第一部份,共兩部分)

我快將離開現任的機構,決定告訴大家我以前是怎樣面試系統開發員,希望對正在尋找相關工作的人有用。

我服務的是一個資訊系統開發的部門,除了最高級和最低級的幾個人外,全部都是幹系統開發的工作,我們還雇用了一批透過仲介公司介紹的同事,名義上他們不是我的機構的員工,但他們也要事先通過面試才能上任。我是誰?我便是那個負責面試的「官員」,而且一幹便幹了三年。

這篇文章將分為兩部分,這是第一部分,第二部分在這兒

面試前你應該準備甚麼?

首先,請把你的履歷表覆看一遍,檢查它是否符合以下的原則,然後交給我(你的面試官)。

  1. 它不超過三頁。這是很重要的,負責面試的官員(例如我自己)是非常非常忙碌的,若果我不能在五分鐘之內掃描你的履歷,並且認為你值得面試,你很大機會失去面試的機會。我非常清楚自己需要甚麼同事,掃描履歷表的時候通常就是尋找相關的關鍵字,例如甚麼年份畢業,哪裡畢業,做過甚麼工作/項目,懂得甚麼系統、編程語言等等。即使我要求的關鍵字全部都在履歷表中,要我花太多時間尋找我是會斷然拒絕的。從另一個角度看,你不能在有限的空間內(三頁紙)推銷你的長處,你的溝通能力實在有限,你能否通過面試,將來能否與其他同事有效溝通,我實在有保留。
  2. 不要提及超過十年的陳年舊事或不相關的工作紀錄。以上兩點我完全沒有興趣,請注意我是非常非常忙碌的,對不相干的資料很抗拒。在資訊科技這一行,超過十年的知識基本上應該被淘汰,你告訴我你曾經在十三年前的一間公司負責網頁製作,對我判斷你是否適合網頁製作的工作毫無幫助。你告訴我你曾經負責電腦晶片的設計,對我判斷你是否適合開發應用程式的工作也沒有幫助。有些人為了故事的完整性,或者不希望在履歷表中留下一段空白的工作紀錄,偏執地把不相關的東西寫下來,我誠懇的告訴你,我不介意求職者有空白的工作紀錄,也不介意你只提及最近三年的工作,但很介意你把不相干的東西寫在履歷表中浪費我的時間。
  3. 不用寫太多個人資料。個人資料包括你的身分證號碼,居住地址等等,這些東西我並不需要,請把這些資料交給人事部門好了,不過連絡電話還是必須的。幸運地這一點並不致命,至少不會降低你獲邀請面試的機會,但會給我不好的印象。在任何一間機構,資訊部門通常掌握大量機密的資料和個人私隱,所以對處理資料的態度很重要,即使我們有嚴謹的制度,但始終還是要同事們謹守正直、誠實、忠誠等原則。你對自己的資料尚且如此輕率,怎能令我放心讓你處理敏感的資料?

能夠做到以上幾點便很好了,其他有關怎樣撰寫履歷表的方法,請到圖書館找有關的書籍,或上網找樣板好了。

第二,面試前請上網瀏覽我的機構,甚至我的部門的資料,當我被面試者問我的部門有多少同事的時候,心中總會嘀咕:「你為甚麼不上網看看呢?那裡有我們的架構圖,每一個職位由哪一位同事擔任都寫得很清楚,真是笨到姥姥家!」

我怎樣設計問題?

基於資訊行業的特性,我希望聘請有以下特質的同事,我問的問題也是環繞這些目的而提出:

  1. 具備自學能力的同事。這一點非常重要,資訊科技一日千里,三年前的業界標準,今天可能成為明日黃花,我不會有時間教導每一位同事最新的技術和標準,你必須自行想辦法學習,例如上網找資料、進修等等。
  2. 對資訊技術有廣泛認識和興趣的同事。這一點同樣重要,若果我要招聘一位懂得 Java 的網頁開發員,我會期望他同時懂得數據庫相關的知識,網絡安全的知識,黑客入侵網站的常見技術等等。
  3. 懂得技術的背後原理的同事。我要的是具備獨立思考能力的人,不是裝配線上的工人,所以你最好充分明瞭每一項標準、技巧、指引背後的原理,而不是盲目按本子辦事。
  4. 具備良好溝通能力的同事。你必須有能力把一件複雜的事用簡短的言詞交代清楚,你或者認為這很簡單,但據我的經驗,在面試時這一方面令我滿意的人很少,大部分的系統開發員都是電腦怪人,他們對於甚麼是 CPU、GNU、DDOS、TLD 等名詞很熟悉,但這些不是與普通客戶溝通時應該使用的詞彙,他們的思維也跳躍得很快,正在說一個話題,在沒有先兆的情況下突然跳到另一個話題,令旁人無從捉摸。

你除了要具備這些特質,也要令我知道你有這些特質,否則就是「錦衣夜行」,浪費了你的漂亮衣服。

注意我不太注重你是否擁有我需要的技術,我要找一個 Java 的開發人員,你具備這方面的知識和經驗固然很有優勢,但沒有也不是致命的,你令我相信你有自學的能力、對資訊技術具有廣泛興趣、明白每一項技術的原理,我會相信你能夠在很短的時間內掌握一項你不懂得的技術,這些特質才是我真正重視的。

答問題的技巧

在具體告訴你我會問甚麼問題前,你必須明白回答問題的一般技巧,其他面試官問的問題可能跟我的不同,但掌握了回答的技巧,你便無往而不利。

  1. 聽清楚問題,不肯定的話不妨要求澄清。重複一次:我非常非常忙碌,所以不想花時間聽一些答非所問的答案。你最好第一次便準確回答了我的問題,無須我追問和澄清。若果你不肯定我的問題的意思,歡迎要求我澄清,我明白我也有說話不清的時候(可能當天實在太累,或者是一些即興的問題我沒有時間組織好句子),所以你指出我問題中含糊不清的地方是一個顯示你的聆聽能力、理解能力、和分析能力的機會,請不要錯過這個機會。
  2. 小心含混不清的問題。我有時故意問一些含混不清的問題,或者資料不足令你難以作答的問題,根據前面的建議,你應該要求我澄清,或者提供補充資料,而不是勉強作答,或者猜測我的意思然後嘗試作答。在工作的崗位上你經常會遇到類似的情況,上司或者用戶下達了一些不清不楚的要求,你用自己的方法猜測他們的意思然後執行,最後發覺原來是一場誤會,你認為誰要附上責任?當然是你,因為你沒有要求他們澄清。
  3. 不要充好漢。你不一定有能力回答我的所有問題,我從來沒有要求面試者認識所有我懂得的東西,遇到這類問題,請誠實地回答說:「對不起,我不認識這東西。」不妨附送一個尷尬的笑容,顯示你對於不懂達回答是有一點兒歉疚的。倘若給我發現你冒充好漢,你獲聘的機會幾乎是零,因為你不是一個誠實的人,我不希望處理敏感資料的部門有一個不誠實的同事。事實上,你能夠成功騙過我的機會近乎零。
  4. 你的眼睛請看著我。不論我是否很醜陋,或者很兇惡,說到底我也是面試官,請給我一些起碼的尊重,回答問題時眼睛請看著我,若過看著我的眼睛令你感到壓力或者不安,請看著我的鼻子、嘴唇、或者下巴。有些人回答問題時會四顧遊盼(不知他們自己是否知道),令人感到他們口心不一致;又有些人眼睛只是盯著桌子,他們的緊張令我也緊張起來。
  5. 請說得清楚一點,不用急。有些人不知是否因為緊張、很熟悉答案、還是天生性格如此,說話很急,急得有點兒亂,甚至聽不清楚,我的解讀是你的溝通能力不足。雖然我很忙很希望節省時間,但你只是嘴唇比別人快,卻要麻煩我要求你重複說一遍,或者把部分內容解釋得清楚一點,豈不是更浪費時間?請努力做到說話精簡,「精」就是內容的質量高,言之有物,一語中的,不會說模棱兩可的答案(除非你申請的是公關工作),每一句都落地有聲,「簡」就是沒有多餘的內容,也沒有「嗯」、「啊」、「呀」。
  6. 請用清晰的聲量說話。這個問題一般出現在女孩子身上,不知是否因為緊張還是矜持,很多人的聲量都很低,隔著一張桌子實在很難聽清楚她們的說話,我會要求她們提高聲量,但若果她們一開始便令我感到舒服豈不是更好?
  7. 請保持笑容。我知道面試是一個令人神經緊張的過程,作為一個面試官我同樣緊張,但我一定提醒自己要保持笑容,因為我每緊張一分,面試者便會受到感染而雙倍緊張,屆時影響了他們的表現,令我錯失了一個優秀的同事便不划算了。這個方法同樣適用在你的身上,請時刻提醒自己保持笑容,有助放鬆心情,也使我感到你是一個容易相處的人,對於你的獲娉有很大幫助。

第二部分將討論怎樣處理困難的問題,和列舉一些面試題目,解釋我為何問這些問題,和應該怎樣作答(正確的答案不定是我希望聽到的答案,有時甚至答案根本不重要呢!)

定期更改密碼的迷信

你的公司、網絡服務商、電郵系統、網上銀行等等,總會提醒你定期更改密碼,例如每三個月或者半年,有的甚至要求用戶最近幾次的密碼不能相同,其實這個方法是基於一些錯誤的假設、對入侵技術的無知 (不要以為系統管理員都是專家,哈),不論從運作上還是技術上來說,這不單指不能保障你的帳號,反而使你的帳號更容易被入侵。

寫在便條紙上的密碼

誰能記住每三個月改變一次的密碼?若果要記住很多密碼,這些密碼又要每幾個月更改一次,每次都要全新的,怎樣創作這麼多高安全性又易記的密碼?很多人索性把密碼寫在紙條上,這張紙條收藏在錢包或者抽屜裏,這些地方有多安全大家都很清楚。

使用簡單易記的密碼

有些用戶會在密碼末端加上一個序號,每次只是把序號遞增,例如密碼是 myPass01,三個月後改為 myPass02,如此類推,這樣完全失去了定期更改密碼的原意。

循環使用密碼

有些人會創作三、四個密碼,然後在系統間循環使用,這些密碼一般在設計上保安性不錯,用戶努力記著這幾個密碼,不記錄在任何地方,每次改動密碼便循環使用。其實這樣跟使用固定密碼沒有甚麼分別,至少從破解密碼的技術層面來說,這種做法根本沒有提高安全程度。

系統管理員開脫責任

透過強逼用戶定期更改密碼、最近幾次的密碼不能重複等等,系統管理員以為系統的安全性便得以提高,但基於以上的原因,真正的效果是適得其反,系統的安全性反而比以前更差。為何很多系統管理員仍然這樣做?

最常見的原因是實施這些措施後,日後即使系統被入侵他們也不用付上太大的責任,因為他們已經做了一些預防措施,既然世上沒有萬物一失的保險箱,系統被入侵原是不能完全避免的,他們只要擺擺姿態做了預防措施便算盡了責。

另一個常見的原因是他們根本不知道這些措施的設計原意,與及用戶的可能應對方法。事實上他們也懶得去了解,因為實施這些措施可能只需要按幾下滑鼠,完全無需了解背後的原理。

黑客的最怕

你應該猜到我一定會這樣說,黑客根本不怕你定期更便密碼。若果你的密碼是利用身邊的人、物、興趣等等來設定的話,你的密碼根本就形同虛設。若果你的密碼很難猜,但卻會寫在紙條上,也等同虛設。若果你的密碼是隨機的字串,但每次更改都只是把序號遞增,你的情況好得多,安全程度視乎你的密碼有多麼隨機,但在黑客眼中,你其實只有一個固定不變的密碼。若果你有幾個循環使用的密碼,每一個都有不錯的複雜性,很好,你有幾個固定不變的密碼,黑客的困難程度增加了幾倍,但區區這幾倍並不礙事。

這些都不是黑客最怕的,他們最怕的是複雜的密碼,越複雜越怕,他們寧可攻擊 100 個長度是 8 的密碼,也不想攻擊一個長度是 9 的密碼;他們寧可攻擊 1000 個只包含小寫字母的密碼,也不願意攻擊一個同等長度,但包含大小寫字母、數字和標點符號的密碼。

所以,一個足夠複雜的密碼便足以阻擋黑客的攻擊,何須大費周章幹多餘的事?

給系統管理員的忠告

請不要再要求用戶定期更改密碼,那是毫無益處的,用戶總有應對的方法,最後系統的安全性不增反減。你真的重視系統的安全、重視用戶的保障,倒不如要求他們設定一個足夠複雜的密碼,例如最少 20 個字符,其中包含最少一個數字或類似的方案,然後叮囑用戶好好牢記這個密碼,以後不要更改。

兩個月仍然不能修正錯誤,Adobe 公司越大反應越慢

大象體型龐大但動作緩慢,老鼠體型細小但動作靈活迅速,軟件公司也有類似的情況,這究竟是宇宙定律還是偶然?

Adobe 大約兩個月前將 Arobat 升級到 9.4.5 後,多重選擇 (multi-select) 頁面的功能突然消失,這對於需要選擇性地列印文件的人很重要,初時我以為這只是偶然的失誤,Adobe 一定會很快把這麼簡單的錯誤修正,但是兩個月後的今天問題仍然存在,沒有版本更新,沒有修正檔,也沒有任何官方的解決建議。

失望嗎?有一點,但更令我感興趣的是甚麼令 Adobe 反應這麼慢,究竟是 Adobe 認為這不是一個失誤,還是她認為這個失誤很輕微不值得針對性進行更新?還是由於某些原因 Adobe 無法在短時間內修正問題?

反觀一些較小型的公司,她們都非常重視用戶的建議和回饋,甚至由用戶投票決定哪些功能他們最希望在下一個版本見到,把用戶拉進產品設計和開發的週期中,整個建議、投票、決定的過程都在網上公開進行,對用戶的歸屬感和忠心度起了很大的幫助。