Nic Lin's Blog

喜歡在地上打滾的 Rails Developer

從被問到問人,那些我常問的面試問題

  • 沒工作的時候,面試是你必須學會的技能
  • 有工作的時候,面試是測試你自己價值的過程

我們很常被面試,但當角色轉換時,要如何成為那個自己不討厭的面試官呢?這是我不斷在思考的問題。

我過去的面試經驗

我的履歷教學

很幸運的是,在今年開始有機會從不一樣的角度去看待這件事情,所以我整理了一些我擔任面試官時的方向及問題,這些經驗都來自以前的筆記和記憶。

本篇文章主要是從我累積一些面試經驗後,從各種面試中自己主觀提取我所認為好的面試過程,進而整理成自己的面試風格

在這裡主要會分為幾個部分

  1. 定義找人的標準
  2. 面試流程
  3. 常見題目
  4. 後記

本文章將以招募「junior ruby on rails developer」為目標,所以技術問題以該框架的實作為主

找人的標準

我認為找人的主要目的是找出適合團隊、有向上潛力能力的人,而非神人。

面試時我主要觀察溝通能力+合作能力,技術能力我通常認為達標就可以。

溝通和合作能力可以透過以往的經驗來做為參考

我通常會利用問題嘗試測試面試者的極限,通常扣除緊張以外在極限之後的反應大概會比較接近挫折時的反應。

可以從反應看到挫折時是主動提出討論、還是愣住不知道該怎麼辦、亦或是直接選擇放棄,會比較能夠大約抓到人格特質進行參考。

然而技術能力通常從討論 genral tech concept 來獲取資訊,以及詢問之前做 project 的技術理解程度。

如果只是做的出來卻沒有理解程度的就比較危險,如果自己連自己怎麼寫出功能都不知道的人,其他隊友又能如何得知呢?

面試流程

面試流程我通常會抓這幾個步驟,依照當時情況在做臨時調整

  1. 熱身,打破僵局
  2. Rails 技術問題
  3. 一般技術問題
  4. 從 example code 探討解決問題的思路
  5. 希望被面試方提出至少三個反問的問題
  6. 詢問面試方這場面試是否有要改進的空間

我的常用題目

a. 熱身問題

  • 自我介紹
  • 最近有對什麼技術或人事物感興趣嗎?
  • 在過去經驗中,有欣賞哪位共事的同事嗎?

b. 非技術問題

  • 為什麼想轉職
  • 你對我們公司有什麼樣的瞭解
  • 你理想中的團隊長怎樣?
  • 最近有什麼感興趣的東西?
  • 有學過什麼 Design pattern? 他解決了什麼問題?
  • 看到你的 side project 覺得很有趣,為什麼當初會想做這個?和你合作的人是怎麼協作的
  • 你認為當一個功能比較趕著上線,卻又要同時補 spec 的時候,你認為要先寫 controller / model / view 的 spec? 為什麼?
  • 現在回想起來,在過去經驗中做錯的事。重新一次會怎樣 Approach?
  • 履歷上面有寫 API 的經驗,那有寫過測試嗎? 如果沒有如何確保正確?
  • 之前團隊的組成
  • 你擔任什麼角色
  • 跟 XXX (designer、產品、後端) 有沒有過意見不合的時候,怎麼解決?
  • 過去經驗中印象最深刻的事情
  • 過去經驗中做過最有成就感的事
  • 你的職涯發展規劃是什麼?為什麼會想換工作?
  • 你怎麼確保你照著自己的規劃走?
  • 未來兩年在我們公司想做到什麼?
  • 你在工作上有遇到很令人生氣的事情嗎?是怎麼發生的?又如何解決?重新一次機會你會如何做?

c. Rails 技術問題

  • resources :users 會創建哪些路由
  • 前端的 partial 和 helper 差別?
  • Gemfile 的用意?
  • migration 做了什麼?為什麼要用 migration
  • 淺述 MVC 框架解決了什麼問題? Rails 如何區分 MVC
  • ERB 是做什麼的?還知道 ERB 以外的樣版引擎嗎?
  • ||= 是做什麼的?

以一個食譜網站來說(申論 or 白版畫 relation)

  • 每個人可以發表食譜
  • 每個人可以將食譜加入最愛
  • 要如何透過食譜,搜尋有加入最愛的用戶?

d. 一般技術問題

  • 解釋按鈕在網頁按下去送出表單之後的整個過程(從 client <=> server),越清楚越好
  • 我看到你前一份 Project 是要做 XXX,可以說說看這個 Project 嗎?
  • 請問裡面的 OOO 功能是怎麼做到的?
  • 有什麼其他的作法?
  • 為什麼選擇之前的做法?
  • 重來一次會怎麼選擇?
  • 如果是使用 3rd party 供應商,背後的原理是什麼?
  • 最困難的地方是什麼?
  • 根據你之前的 approach,Bottle neck 是什麼?
  • 我想到另一個作法,是 XXXXXX,你覺得呢?(視情況再看要不要繼續鑽每個問題裡的技術細節)
  • Why do we need to use HTTPS instead of HTTP?
  • 什麼時候用 SQL 什麼時候用 NoSQL
  • 打 index 有什麼好處?為什麼?
  • 假設有銀行入金請求的 request,要如何確定來源可信?
  • 你在項目中的職責是什麼?
  • 你從他人那裡獲得了什麼幫助?
  • 介紹下那個功能的工作原理。解釋下數據的來源和去向、存儲方式以及這一切能帶給最終用戶的好處。
  • 這個項目中最糟糕的技術債務是什麼?
  • 有沒有出過生產環境下的 bug 或服務中斷?測試下他們是否理解 bug 的原因,以及團隊解決 bug 的方法。他們是否提前預期到了 bug?下次怎樣才能避免同樣的問題發生?

e. Example code 問題

輸出為何呢?
a = ['a', 'b', 'c'].map { |i| puts i }

=> [nil, nil, nil]
找出 code smell 並嘗試改進
def weather_assessment 
 if @weather_source.length > 0
   if @weather_source.weather_at(@city).skies == :clear 
    'Too sunny' 
   elsif @weather_source.weather_at(@city).temp > 20 
    'Too hot' 
   else 
    'Perfect for coding' 
   end
 else
   "Can not found weather source"
 end
end
請描述以下的 code 有什麼問題?
class User
  has_one :car
end

class Car
  belongs_to :user
end

# your controller
def index
  @user = User.page(params[:page])
end

# view
<% @user.each do |user| %>
  <%= user.car.name
<% end %>

(必要)感謝面試者

我認為面試應該是一個雙方都可以獲得進步的時間

這個步驟是一個收尾,通常我會在這邊感謝面試者今天撥空前來參與面試,並給予對方今天表現的認可,無論好壞都會盡可能給予建議,同時也會詢問對方今天對於面試當下的感受如何?有什麼認為不合適的地方或是建議都可以告訴我們,並且保證這個部分並不會納入面試評分內。

在建議的部分可以採用「三明治回饋法」來達到更好的溝通效果

  • 先稱讚對方今天哪裡做得很好
  • 給予一些修正的建議
  • 再次回饋鼓勵並感謝

後記

之前想說如果把自己整理的題目丟上部落格會不會之後更難面試新人 XD,但其實題目也是會不斷進步的,所以我倒不擔心自己將來還是只會重複問機械式的問題,不管是技術還是面試,都是要一直保持不斷進步的能力,是吧!

希望這篇文章能夠幫助到正在準備面試的你,或是第一次成為面試官的你囉

參考資源

comments powered by Disqus