以Java工程師為例,技術面試應該怎麽準備?
定制簡歷
我自己的經驗是,每個崗位的具體要求都不同,因此大家不要用一個通用的簡歷去應付所有的崗位,最好是根據特定公司的特定崗位來定制簡歷。當然這並不是讓大家編故事,而是突出與目標崗位匹配的經驗和能力。大家去應聘一個開發或者測試工程師,和去應聘一個 Team Leader 或者技術經理的角色是完全不一樣的。比如,如果我要去應聘一個有管理性質的崗位,我就會在簡歷裏適當突出我曾經從 0 組建了一個 10 人的技術團隊,裏邊有多少資深 Java 開發工程師,多少數據庫工程師等等,這樣就會更有說服力;同理,不同的技術崗位的需求也是有區別的。大家寫簡歷的第一個目標,就是讓簡歷在篩選階段生存下來。因為往往一個崗位會收到大批簡歷,如果簡歷不能寫得很清晰,讓 HR 覺得很適合,很有可能在開始就被刷掉了,沒有機會去面試。
突出亮點
我見過很多簡歷都會寫自己既會 Java,又會 JavaScript,還會 Python,一下寫十幾行。這個本身沒有錯,但最好能突出自己的核心技能,比如,“我有 8 年 Java 開發經驗,很擅長 Java 並發或者 Java 安全”。但要註意的是,我們在突出亮點的時候,也不要過分浮誇,因為有時候當我們發現一個簡歷有太多“精通”、“深度掌握”這類詞,第一感覺是懷疑,而不是覺得這個人很牛,所以要適當的把握程度,事實是基礎。另外,項目經驗上,我建議按時間順序由近到遠排序,最好體現目標崗位的匹配度,突出自身項目的難度和價值,以及自己在項目中的作用。這樣就能進一步幫助面試官判斷候選人的能力和在團隊中的位置。
用事實和數據說話
對於工程師,定量比定性更重要,因此要讓面試官和 HR 體會到大家的經歷或亮點是可度量的事實。比如在簡歷中強調“我非常善於快速學習”固然有幫助,但如果配上一句“我在兩個星期之內就學會了 Clojure 語言,做了一個撮合系統”,更能體現出“快速學習”能力。還有很多人會表述比較含糊,比如在簡歷中寫“我大幅度提高了系統性能”,但作為面試官,我可能不清楚這個“大幅度”到底是什麽概念。因此大家最好寫的明確一些,比如“我在一個四核 8G 的配置上,把吞吐量從 2000 QPS 提高到 8000 QPS,平均的請求是 100K bytes 等等”,這樣就會非常有說服力。
公開成果很加分
比如是開源項目的貢獻者,有一個很有內容的博客,在 Github 上提供了很多被采納的 PR,發表過哪些技術論文,在 QCon 或者 ArchSummit 上做過分享,或者寫過哪些著作等等。像這些公開可見的成果,遠比自己評價自己更有效果。
簡歷形式
在形式上,最好參考一些優秀簡歷,借鑒它們的模版。要註意的是,中國人和外國人的習慣不一樣,如果是去應聘歐美公司,最好去 Google 上查英文簡歷模板,而不要把直接把中文簡歷翻譯成英文。
如何在面試中體現代碼能力
有的面試者,平時很認真工作,但面試前沒有時間準備充分,就會比較吃虧,因為很多面試時考察的算法和數據結構在平時工作中未必用得到,面試時如果有點生疏,就會給面試官留下不好的印象。所以大家在準備技術面試時,在代碼方面一定要事先做個熱身,至少讓自己對基礎知識的掌握處於一個良好的狀態。
還有,在面試編碼的時候,面試官會逐步深入,考察面試者是否對算法的理解達到了預期的深度,是否能夠很好的溝通,是否能夠理解面試官的主要目的,以及是否能夠把不清晰的東西通過探討逐漸清晰化。具體到代碼的編寫,至少要體現出良好的編碼的習慣,讓面試官覺得你是一個能夠思考全面,寫出高質量代碼的人。包括在命名和結構上,最好參考業界比較好的實踐,因為這些小的地方,恰恰也是代碼質量的體現。
另外,很多時候面試者都需要在白板上編寫代碼。這一點,我發現很多人並不是很適應,例如 Java 開發者,絕大部分是用 Eclipse 或者 IDEA 這些 IDE 去進行開發,以至於有的面試者,甚至連 main 函數的一些細節都不確定,這個是很可怕的。因此,大家要記住比如主要的 API 結構等等。
最後,關於刷題,我覺得仁者見仁,智者見智。我自己沒有刷過,但必須承認刷題網站是有效的,所以,我並不反對求職者去類似 LeeCode 這樣的刷題網站學習一下,當然,區分刷題高手是面試官的能力。
Face to Face 面試必考 Java 知識點
首先,大家要仔細閱讀招聘需求。因為招聘需求往往就體現出了面試官對我們的期望和未來工作的主要範圍。比如,一個普通的 Java 後端工程師崗位,可能會寫明需要應聘者懂高並發、懂 JVM 基礎、熟悉 Spring 或者 Netty 這些開源框架,大家就可以有針對性的去做準備,因為誰也不能保證自己還能清楚的記得一、兩年前做的項目用到的知識點。
關於 Java 面試核心知識點,大家可以參考我在極客時間推出的《Java 核心技術 36 講》專欄,這個專欄的設計,就是針對的這方面的需求。極客時間團隊在內容和選題上充分參考了主流互聯網大廠在 Java 面試中的問題域,選取了其中的典型問題,一定會對大家有幫助。在專欄中,內容設計的目的都是為了讓大家對 Java 語言的核心基礎特性可以非常的熟悉,掌握主要的知識點。比如,並發的容器和基礎的容器,最常見的 ConcurrentHashMap 或者 HashMap,各種並發的基礎元素,Synchronized 底層機制,或者 ReentrantLock、線程池等等,都是 Java 面試中的長期熱點。還有 JVM,它是一個很龐大的範圍,它分為 Runtime、GC、編譯器等模塊,包括所謂的 Serviceability 的一些特性,這每一個方面實際上都有可能被面試官刨根問底,雖然可能我們整個中國做 JVM 開發的團隊連一只手都不到,但是不妨礙 Java 面試中會去考 JVM,大家還是要在這些知識點上面深入了解。
另外,現在 Java 開發越來越廣泛的應用到各種開源框架,包括像微服務這種新的軟件架構形式,所以大家對主流的開源框架也要有充分的認識。比如,做普通業務開發時,Spring 或 Mybatis 這類框架可能是業務開發的一個標配,那對 Spring 裏的一些機制,比如 Bean 的生命周期、AOP 等基礎概念,就要有深入的認識。如果大家應聘的崗位是大數據,那對 Hadoop、Spark 這類開源框架就必須要有深入的理解。
關註熱點也非常重要,我們技術人也要時常擡頭看這個世界。比如曾經有段時間,面試就會被問哈希碰撞之類,就是因為當時有些大廠發生了這種***。再比如前兩年,非常多的人在面試中被問到類似搶購、秒殺這樣的場景等等。如果大家完全沒有關註這些熱點,等面試中被問到才去思考,時間有限加上緊張,很難考慮的充分。這兩年,微服務似乎變成了一個必考的題目,比如對用 Dubbo 還是用 Spring Cloud,就需要有基礎性的理解,以免被問到的時候沒有準備。除了熱點,特定領域都有特定的專業知識,例如,深度學習、推薦算法等,只有準備充分才能保證大家在面試時的表現完美。
大廠面試實例分析
下面,我就以自身的經驗來介紹一下作為面試官,我在面試中會考察哪些方面,有哪些側重點。不同的公司、不同團隊,面試風格會有區別。我聽到個別朋友說過,在一些公司面試完了,感覺經歷很痛苦,我的團隊不會這麽苛刻的對待候選人。因為本質上,我們面試的目的並不是要表現面試官自己有多厲害,而是為了找出合格的候選人。有時我在面試中,也會刨根問底,但目的絕不是為了為難面試者,而是想看一下對方深度到底是在哪裏,以及遇到挑戰的時候,會有什麽樣的反應。
其次,就是考察面試者是否“適合”,對於不同的崗位,“適合”的定義是很不同的。
比如說像 JDK 團隊,因為是一個非常基礎的、底層的軟件,最在乎的是性能、質量、可靠性等,所以對底層和基礎技術的把握程度很重要。候選者可能是一個很棒的業務開發工程師,但是經驗和技能可能不適合。
為了公平起見,我們也不會特別隨意的問候選人各種問題,當然也會即興發揮,但總體上是有固定的套路和節奏的,因為只有用同一標準去考察不同面試者,才能保證候選人的判斷沒有太多主觀因素。
再有,面試者的興趣和態度也非常重要,如果面試者對編程語言沒有什麽興趣,那以我們的工作,他可能會做的非常痛苦。對於我們團隊來說,我們招人的標準就比較特別,我們甚至不要求候選人精通 Java,只要你敢說自己很擅長某種編程語言。比如,我們這有個很資深的工程師,他在加入 Java 團隊之前是不懂 Java 的,基本完全沒有用過 Java,但是我們團隊有足夠的耐心,去讓他發揮他的能力,構建自己的強項。不是每個團隊都會這樣,我覺得這也沒有對錯,得看具體的需求。
我們也會很在乎候選人過去的背景,如果跳槽過於頻繁,就會有所疑慮。因為太頻繁的跳槽可能意味著你的耐心和態度有一點問題(當然也可能是一些被動原因),這樣的話,招聘成本就會很高。因此,這裏也有一個建議,如果大家有選擇,盡量不要過於頻繁的跳槽。同樣,我們也會看面試者在過去崗位中的表現,一個基本的判斷就是,如果一個人在前一個崗位非常優秀,那他在下一個崗位繼續優秀的可能性也會非常大。
具體流程
下面,我介紹一些具體的流程。一般來說,開始的時候我不會直接問特別嚴肅的問題,會讓面試者做一下自我介紹,或者從輕松的話題開始,比如像前兩天西二旗這邊發大水了等等,讓面試者先放松下來。
然後,我一般會問的一個問題是“談談你做過的最有挑戰的項目”,例如,難度很大、在這個項目中起到的作用比較大、能力表現最充分的項目。從答案裏,我就可以看到很多方面,一方面是面試者是不是對自己的項目了解的很透徹,因為如果一個項目做了幾年,還對它了解不很透徹,就會反映出一定的問題;另一方面就是面試者能不能清晰的表達出他所做的東西。因為在工作中,我們彼此之間交流的場景會非常多,尤其是像 JDK,有相當一部分要進行互相交互的 Review,或者在開源社區進行討論。能不能清楚的表達問題,就決定了能不能完成任務。在介紹過程中,我也會選擇性的問一些項目的細節,看下面試者對細節的態度,也防止面試者在講故事。我會側重考察面試者做事情的態度,解決問題的思路和能力,以及在遇到難點的時候采取什麽方法,這些角度都很有參考價值。
這之後,對於 Java 工程師崗位來說,我就會考一些算法和數據結構的基礎知識,因為好的基礎是成功的一半。我一般會從很基礎的題目開始,甚至如類似鏈表之類的數據結構。考察簡單的數據結構,可以看出面試者寫程序是否很 hands-on。如果上來就問一個很難的題目,很多時候,即使是很資深的工程師也未必寫的出來,這樣就會很尷尬,甚至導致談不下去了。然後,就會考一些相對深入的問題,類似把簡單的數據結構進行組合達到一個新的功能,或者在一個常規的算法上面進一步優化,計算算法復雜度等等。這時候通過面試者給出的思路,我再來看他是不是能夠體會到一些常見的,比如空間換時間這些變通的思路和方法。在面試過程中,我也會觀察面試者和我之間的交流是否流暢、準確、完整,也能體現出我們之間是不是可以很好的合作。因此,建議面試者即使遇到比較難的題目,也要盡量表現出積極溝通的態度。
最後,我在面試時並不會去死摳特別復雜的算法,或者特定的知識點,也不會選擇刷題網站上的那種題目,以免招聘到面試高手,真實的業務能力未必和刷題能力相關。知識點和能力可能是兩碼事,考住一個人很容易,準確判斷他的能力才是重點。其實我們工作中解決的絕大部分問題,只要有好的基礎和好的態度,基本上就能做得到,畢竟我們不是在解決過於艱深的科學問題,也不是在×××。以上這些,就是我在面試中比較看重的一些方面。
這裏是程序員秘密聚集地,各位還在架構師的道路上掙紮的小夥伴們速來。“
加QQ群:611481448
以Java工程師為例,技術面試應該怎麽準備?