Jr. Ruby on Rails Engineer面試初體驗(上):事前準備 & 技術面試
2018/06/06 上午突然收到一封軟體業界主管詢問有無求職意願的mail,信中除了詢問是否處於求職狀態之外也一併提供了 Junior Ruby on Rails Engineer 職缺及該公司的資訊。其中很酷的事是業界主管並非是透過網路人力銀行(如: 104 、 1111)、也非社交求職網站 LinkedIn 、 mit.jobs 或新創職涯平台 Yourator 等管道,而是透過Github找到我的聯繫方式。
當天下午我也將個人線上履歷 ( CakeResume ) 、Github 及履歷電子檔一併回覆給該主管,並表示有興趣進一步了解該職位及該公司,並歡迎隨時與我聯繫。
而在靜待回應的同時,首先我抓緊時間先了解了該職位的定義,並透過網路資源針對公司提供的產品、服務、管理團隊及相關新聞做初步的了解。在過往的面試經驗中,針對該職務、應試公司的文化及新聞的事前了解,我確信是一個必備的態度,面試官也能透過交談的過程感受到你對這份機會、該職位的企圖心或渴望程度到什麼程度,某種程度也能透過交談觀察到應試者的表達能力及思考邏輯。
這是我在第一次與該主管在電話交談前所做的準備,也順利在電話交談的過程中順利爭取到了隔日 ( 2018/06/07 ) 面談的機會。再來就是隔日面試前的準備,針對該職位的定義做功課,並依據職務必備技能去做專業知識的準備及加強。
如果對事前準備想有更多的準備方向,建議可以閱讀 侯智薰(Raymond CH Hou) 的文章 :
第零章|求職之前:先研究職位、主管,再來才是公司
06/07當日上午的面談,分為技術面試及主管面談兩個部分。
技術面試
上機考
給予30分鐘,線上實作指定的兩題 LeetCode ( 258. Add Digits , 344. Reverse String )。
應試心得:
在我的理解中,上機考所代表著這份職務注重透過實作解決問題的能力,且面試官能透過code review及應試者解說為什麼這樣寫的過程去了解應試者的邏輯及口述程式的表達能力。可以從平常努力練習及學習中來克服上機考面臨的各種情況。
筆試第一題
一間餐廳有很多食物可以單點,而單點的組合又可以變成套餐,請列出單點跟套餐間關係的 model 和 relation.
應試心得:
在職務定義中有提及「熟悉RDBMS」這樣的需求,所以馬上透過題目去了解應試者對關聯式資料庫觀念的掌握度,而這題考的是多對多。所以會畫ERD跟知道如何設定 Model 關聯這些都是很重要的基本功。
筆試第二題
foo, bar = [], 1
foo ||= bar
foo
應試心得:
||=
稱作 Double-Pipe Equals 或 Or Equal , 是 Ruby Conditional Assignment Operator. 可用於簡化 if
邏輯。
這樣的寫法邏輯說明:回傳||左邊的變數值,但假如左邊變數值是 nil
或false
,則會把右邊的變數值指向左邊的變數並回傳。foo ||= bar
等於 foo = foo || bar
。
這題考驗著應試者對於 Ruby Operators 觀念及應用的了解,在實作時operator 邏輯運用是家常便飯。
參考資料: Ruby code整理系列 ||= 的使用
筆試第三題
module Cat
def say
puts "Hi!"
end
endclass Dog
extend Cat
def say
puts "Hello!"
end
endDog.say
應試心得:
這邊提及的觀念包含了 Module & Class ,似乎是Rails職缺必考的觀念。這題考的是 Extend 的觀念及應用,再延伸到 Include 的觀念及應用,並且知道兩者之間的差異。
參考資料: Ruby中的include, extend及require 、 第 08 章 — 類別(Class)與模組(Module) 、 Ruby 語法放大鏡之「類別跟模組有什麼不一樣?」
筆試第四題
透過 where
操作資料表取得 array of user,請問如何取得所有的 object id
應試心得:
這邊運用到的觀念是透過 ActiveRecord Finder where
操作資料表取出的資料型態是 Array , 以及運用什麼方法去快速取得所有 object id 並且是以 Array的形式表示。這裡我用的方法是 Ruby 的 map 。
延伸學習可以針對 ActiveRecord Query 以及 Ruby iterator 去做更深入的了解。
參考資料: 迴圈走訪與迭代器Iterator 、 ActiveRecord Query Interface — 資料表操作 、[Rails] find 和 where 的差異 、 Ruby 中 map方法 、 常見 block 說明和應用:do, map, collect 、 #map(&:method)是怎麼一回事? 、 Ruby的each, map, select方法比較
筆試第五題
user有很多clients,client有很多contacts,請問如何有效取得user有多少contacts
應試心得:
這是稍複雜的table結構,關聯的稍遠 ( User > Client > Contact )。
class User < ActiveRecord::Base
has_many :clients
end
class Client < ActiveRecord::Base
has_many :contacts
belongs_to :user
endclass Contact < ActiveRecord::Base
belongs_to :client
end
為了避免 N+1 query 的問題,所以使用了 ActiveRecord Finder 的方法 includes
,讓 Active Record 所有指定的關聯需要的查詢減到最少。再搭配 flat_map
使Array 平坦化。
因此可以這麼寫:@contacts = @user.clients.includes( :contact )
。
此題運用到了 ActiveRecord Query 及 N+1 的概念及解決方式,延伸學習方面則是可以運用 Ruby Enumerable Module 中的 flat_map
去使 Array 平坦化。
參考資料: Rails 用巢狀include和查表方式來避免 n+1 query 、 Rails使用 include 和 join 避免 N+1 query 、 Active Record 查詢 、 Ruby on Rails — 好用的 Enumerable 、 你应该学会使用的5个ruby方法