2021年4月面試英諾瓦資訊科技的Java資深工程師職缺,簡單紀錄一下。
前幾年已去過這家公司面過了兩次都沒上,這次是HR在linkedin上邀請所以才有這次面試機會。一開始很開心接受面試,但後來覺得自己都沒準備leetcode之類的算法題(因為上一次面試考了個迴文的白板),去面也是浪費時間所以寫了封信要取消面試,不過HR說這次應該不會考算法所以才繼續。
首先用英文與team manager對答,問我對前後端哪個比較熟,熟悉哪些技術等。接著請我說明什麼是unit test,integration test, end-to-end test。然後問我mock主要用在哪種test。
這邊我與manager對於什麼是unit test, integration test與mock用在哪個test的意見不一致。我認為mock主要用在unit test,透過仿造依賴物件來隔離類別與類別間的相依進而達到單元測試的目的,而integration test是有多個模組(類別)相互依賴的邏輯測試,類別與類別間的依賴是真實的對象,因此用到mock的地方比較少;不過manager認為unit test是不完全依賴其他類別的測試,並以舉計算機類別來說明,但我回計算機類別如果沒有依賴其他類別確實不需要mock,但在現實中類別的功能幾乎都有依賴另個類別,但manager認為有依賴外部類別的測試就叫做integration test。最後我說我想是我們對於unit test和integration test的定義的認知不太一樣。
上網查了一下其實unit test的定義是有點歧異,不過完全不依賴其他類別的測試才叫unit test這我也是第一次聽到。
問知道什麼是agile碼?我就把之前工作碰過agile or scrum(其實我搞不清楚有什麼區別)的作業模式介紹一下。
Manager面完接著換兩個資深工程師進行面試,問題大概如下。
Java 8有什麼特性讓你比較印象深刻。我答lambda。
Java 8的Stream是什麼?有用過嗎?給你一個整數陣列,如何用Stream
API取得陣列中偶數的平方並加總。我答用filter()
篩出偶數,用map()
轉成平方,最後用sum()
加總。
Stream的lazy是什麼?
Java 8的default method是什麼?用在哪?與抽像類別的實作方法差在哪裡?關於default method的用途我回答是為了讓Java 8新增的lambda API能與之前版本相容而採取的折衷方案,事實上default method已經破壞了interface原有的特姓,如果新設計的API有共同的行為還是在抽像類實作比較好。但對方認為其他的語言如Scala、Kotlin的interface中可以有實作(意思似乎是說default method並非為了向後相容而存在而是有其他好處?)。
有多個類別有共同的行為,部分類別有其他的行為的話會怎麼設計,例如A,B,C三個類別都有x行為,A和B才會做y,C會做z,設計完後又說有另個D類別同時會x、y、z的話要怎麼設計。這是簡單的OO設計問題,測試面試者是否懂得使用介面定義行為,抽像類別定義共同特性,並用繼承來賦予行為。
Array,ArrayList
,LinkedList
有什麼不同?(參考一、二)。
Integer
與int
有什麼不同?
==
和equals()
有什麼不同?
Hibernate JPA的N+1問題是什麼?我工作中使用Hibernate JPA只有一次有真的在entity設定關聯,大部分關聯查詢及複雜查詢都是下原生SQL,所以只回答說印象中就是做了不必要的query影響效能之類的。
有沒有設計過資料表?我回答說有設計簡單的,但複雜如使用權限群組階層之類的沒設計過。
@Inject
、@ApplicationScoped
、@SessionScoped
、@RequestScoped
、@Dependent
是什麼?
對Spring Security有什麼看法?我答說包山包海,但太重了。
什麼是ThreadLocal
?用在哪?
Spring Security中如何使用ThreadLocal
?
Future
是什麼?我回沒用過,並亂答大概是多執行緒結束後callback之類的特性,類似JavaScript的event之類的。
Java 8 CompletableFuture
是什麼?我回沒聽過,事後想起來之前寫Spring Boot @Async非同步方法範例時有用過。
ConcurrentHashMap
是什麼?我答有執行緒安全的Map,效能比Hashtable
好。
Java 9的module是什麼?我不熟所以亂答說設計函式庫/套件(jar)的時候會用到,就是模組間是否可看到對方的package之類的。
Java Bean Validation是什麼?有何看法?我說是用來驗證類別屬姓,在方法參數前加上@Valid
啟用。我說很難用缺乏彈性,不同方法對同類別參數會有不同的驗證要求。雖然Spring 有@Validated
可依情況分組驗證但覺得不習慣用。
Spring @Transactional
的作用,MVC架構中通常放在哪?為什麼放Service不放Controller。
@Transactional
的propagation
屬性值Propagation.REQUIRES_NEW
、Propagation.REQUIRED
、Propagation.NESTED
是什麼?
最後結束前我向他們請教一些學習的經驗和方向等,對方也很熱情回答收穫很多。
隔天通知通過後進行下一關。下一關是出一份程式作業給一個禮拜的時間完成。
題目需求
試撰寫一個密碼格式驗證服務,該服務可以IoC容器配置。此服務用來檢查文字字串是否滿足任意的密碼驗證規則。目前的規則如下。
- 必須包含至少一個小寫英文字和一個數字。
- 長度必須介於5到12個字(含)之間
- 不可包含連續的重覆字串。
此專案應該能被IDE如Eclipse、IntelliJ,或建置工具Maven、Ant建構。此專案必須能被以運行的應用系統使用,並展示測試程式的結果。說明如何在執行期間使用該服務。
其他要求
- SOLID設計原則
- 使用適合的設計模式
- 以合理的方式使用依賴注入
- 可擴展
- 可維護
- 使用自動化測試證明可運作
- 單元測試與整合測試
- 測試程式也應使用設計模式
- 盡量發問確保對需求的理解
利用下班和放假時間完成上面的作業然後寄給對方審核。最終結果未錄取。
天啊
回覆刪除好難的面試
覺得自己差好多...
感謝分享,無償花自己的休息時間做作業這點真的讓人有點嘔阿~
回覆刪除好奇版大平常怎麼練習英文的呢
這幾年沒特別練,不過兩年前會特別聽youtube英文頻道,還有一些英文的podcase。另外一直以來我有問題都偏好查官方網站,可能這樣會讓我對英文熟悉一點。
回覆刪除另外作作業這點也不錯啦,其實就是個小專案如果有經驗其實很快。當作一種練習也是蠻有趣的,如果對方能給你一些回饋更好,可以從中了解自己哪裡不足。
回覆刪除好嚴格 早你半年面試過 但沒有出作業 就兩關面談講講就過了欸
回覆刪除聽朋友說這家最近面試很多關很麻煩 不知為何突然變嚴格
裡面分蠻多組的,可能不同組別面試的方式不同。
回覆刪除