起源
自己經歷過的面試也不少了,互聯網的、外企的,都有。總結一下這些面試的經驗,發現面試官問的問題其實不外乎幾個大類,玩不出太多新鮮玩意的。細細想來,面試官擁有以下七種武器。恰似古龍先生筆下的武俠世界中的七種武器。下面我為各位一一道來。
(歡迎轉載。轉載請注明出處:http://www.cnblogs.com/hzg1981/)
長生劍是七種武器之首,同理,編程語言的考察也是技術面試中最基本的。這條不滿足的就直接Pass了。以Java為例,語言的考察大致可以分為三個層次:
初級:語法考察,也就是該語言本身的使用層面。
這個層次的考察會考察一些語言的基本語法,對於這個層次的考察要做到對於每一個細節都熟練掌握。 考察的形式可以是問你某一段代碼是否能成功編譯,或者會輸出什么結果,也可以是讓你說一些不同關鍵字的不同含義、某一個關鍵字都可以有哪些用法,等等。Java常見問題:
Inner Class, Static Nested Class的使用;
final finally finalized關鍵字的區別;
volatile\sychronized關鍵字的使用(Java開發往往是服務器端開發,所以並發相關的關鍵字要重點掌握);
static關鍵字都有哪些使用場景(說出static block及格,說出import static會加分)。
中級:庫或框架的使用。或者說是該語言的技術棧的使用層面。
庫的使用:
也就是該語言的標准庫的使用。以Java為例,會問你一些關於jdk中常見的framework,比如IO、 Collection、juc並發框架等,以及concurrentHashMap的實現原理等等。尤其要注意的是HashMap和ConcurrentHashMap的實現原理是面試官最喜歡攻擊的技術點之一,一定要好好掌握。同時,因為是Java開發往往是服務器端的,juc包也是要重點掌握的。 除此之外還有一些重要的規范,比如JDBC、servlet,等等。
框架的使用:
以Java為例,Spring SpringMVC和MyBatis(Hibernate)這些框架的使用、原理都要掌握。對於Spring來說,要重點掌握IOC和AOP的實現原理,其中AOP要知道動態Proxy和CGLIB兩種實現方式。對於ORM框架,要重點掌握MyBatis和Hibernate的實現原理和不同點。
高級:語言的底層實現。或者說是該語言的設計思想層面。
以Java為例,因為Java是以JVM為基礎的,會問一些關於JVM的問題,比如JVM的運行時內存區域,JVM內存模型,GC機制,JVM的性能調優,類加載機制等等。另外需要掌握JIT等技術,以及為什么Oracle的Java虛擬機叫做HotSpot?
還有就是對一種語言的歷史最好有一個大概了解,以Java為例,需要了解Java每個大版本都有哪些重大更新,等等。
刀和劍是武林中人最基本的武器。對於面試官而言,語言考察和手寫code題也是最基本的考察。道理很簡單,編程語言和手寫code是coder最重要的基本功。跟編程語言一樣,這部分通不過的話,面試直接Pass。同時,這一部分也是“talk is cheap, show me the code”的最好體現,杜絕誇誇其談的“水貨”。
手寫Code題可以分為下面三類:
1. 算法題。
最基本的算法題一般是排序,查找等,常見的有二分查找,快排等。一定要熟練掌握。這些題在各類公司的考察中都有可能出現。
中等難度的算法題一般會是動態規划算法(DP)的題,比如菲波那切數列問題及其常見變種。DP的題的關鍵點在於首先找出問題的遞歸解法,然后使用自頂向下或者自底向上的方法,消除遞歸過程中的重復狀態,降低時間復雜度。
其實,就算是MS Amozon這種以考察算法著稱的公司,基本上算法題的難度也很少超越DP這種中等難度的題。因為畢竟不是搞ACM。
2. 數據結構題。
最基本的數據結構題一般是針對鏈表這樣的題目,比如單鏈表的反轉、判斷單鏈表是否相交,等等。
中等難度的題目一般是針對二叉樹這樣的題目。反轉二叉樹、二叉樹的層級遍歷,等等。值得注意的是,二叉樹的題目可以考察的內涵其實非常廣泛。比如經典的LCS最近公共祖先題目,其實解決的思路就非常考驗解決問題的能力:把問題break down,再各個擊破。
高級的數據結構題一般是B樹,圖這樣的數據結構。一般這樣的題很少考到。
因為算法與數據結構是密不可分的,因此往往把它們合並為同一類,統稱為算法題,但其實二者還是有區別的。
3. 針對特定領域的手寫code題了。比如手寫JDBC的查詢實現,手寫生產者消費者原型,手寫單例模式,等等。
最后,還有一點要注意,手寫code題有個特點:你給出一種寫法,面試官往往會追問你有沒有更優的寫法?如果題目修改一些前提條件該怎么辦?因此,對於這一類問題,在平常的學習積累中一定要注意學會舉一反三。
孔雀翎=設計模式
孔雀翎,每一片都是那么美麗。設計模式也是一樣,每一種設計模式都蘊含着設計之美。在經典的23種設計模式中,能說出10種以上的模式及其思想,就算及格。
在這里,列舉一下需要掌握的幾種模式:
創建類:
單例(線程安全的單例?在Java中雙重檢查加鎖為什么會失效?),工廠方法,抽象工廠(工廠方法與抽象工廠的區別?),Builder。
結構類:
Adapter適配器,代理模式Proxy, 裝飾器模式(在Java IO Framwork中的體現?),外觀模式。
行為類:
觀察者,狀態模式(state),模板方法,策略模式,責任鏈模式(在Jetty中的體現?)。
設計模式在互聯網企業的面試中出現的比較少,一般只需要重點掌握單例模式即可。至於其他模式,能說出他們在jdk或者其他重要開源框架中的使用即可。
另外,除了23種經典設計模式,最好還能掌握比如多例,對象池(object pool)這樣的更為現代的設計模式。
多情環=Java開發中的其他環節
這部分內容比較多,而且而且這些技術環節與Java開發都有着環環相扣的關系。這些環節主要有: Linux shell編程或者Python腳本編程,在服務器運維中會使用;SQL關系數據庫;HTTP TCP網絡協議;反向代理,分布式緩存,等等。 下面按照客戶端數據的流入先后,介紹幾個比較重要的環節。
1 Nignx、Tomcat、 Apache、Jetty 等Web服務器
Nignx可以作為反向代理,所以位於整個服務器系統的最前端。Tomcat或者Apache可以負責轉發請求給應用服務器。Jetty可以在分布式集群中幫助服務器間通訊。
需要掌握Nignx與Apache的原理及不同、Jetty的原理,等等。
2 線程池、NIO框架等
需要掌握Java處理高並發的原理(線程),並了解其他常見方式,如Node.js的基於event的方式,以及Python GoLang的協程方式,等等。
由於應用服務器的性能瓶頸往往在IO上,所以還需要掌握Java常見的NIO框架如Netty等。
3 消息中間件及分布式框架
需要熟悉常見的消息中間件比如Kafka,以及常見分布式框架ZooKeeper等,如果研究過源碼就更好啦。
4 緩存
緩存是應用服務器(集群)與數據服務器之間的橋梁。常見的有MemCacheD和Redis。需要掌握的常見問題有MemCacheD與Redis的原理,它們的不同,Redis持久化方式,一致性Hash等。
5 數據
5.1 關系數據庫
需要掌握常用SQL語句,常見的SQL性能調優方法等。需要注意的是關系數據庫也可以做分布式哦,也就是分庫分表。另外一個性能調優的方法就是分頁(limit start),單表超過百萬記錄后常需要這種方法,等等。
常見問題:
什么是數據庫事務,如何實現數據庫事務? 如何實現分布式事務?
SQL性能優化方法:select * from table1; 如果有上百萬條記錄,如何優化? 覆蓋索引。
5.2 NoSQL
最好能掌握些Hadoop、Spark的知識,為將來轉型為數據工程師做准備。。
6 腳本及JVM監控
終於說到運維階段了。。 在日常運維中,需要至少掌握Shell或Python腳本,Shell要重點掌握awk,以及一些常見的性能監控命令。常見的題目會讓你寫一段處理日志的awk腳本,或者問你一些ps iostat netstat vmstat之類的命令如何使用,等。JVM監控主要是如何獲得java core和heap dump,以及如何分析他們,另外一些簡單監控命令如jstack和jmap jhat等也要了解。
關鍵點:
這部分內容往往會結合你的項目經驗來問。一定注意要誠實回答,不要誇大自己在項目中的作用,不然面試官會認為你在弄虛作假,很不誠實。如果這樣的話,你就死定了!
霸王槍=系統設計+架構設計
什么技術才是七種武器中的王者:霸王槍呢?那當然是系統設計和架構設計啦!不想成為架構師的coder不是好coder哦!
要想在這輪較量中勝出,面試者平常就要注意在系統設計&架構設計上的積累。即使我們開發的只是整個大系統中的一個模塊,也要對整個系統有一個總體的認識,尤其是我們負責的模塊在整個系統中的地位和作用是怎樣的,與系統中的其他模塊是如何交互的,一定要非常的清楚。
這部分題目的考察,往往會現場給出一種應用場景,並給出一定的約束和期望達到的目標,要求你給出你的設計方案。要特別注意的是,一定要先徹底搞清楚需求,然后才能設計。因為設計並實現一個系統,必然是為了滿足一個特定的需求。需求不清楚就設計,等於無的放矢。需求大致可以分為這么幾個方面:
功能性的:
除了搞清楚具體題目的獨特的功能需求,還要考慮一些通用的功能,比如,一般來講作為一個server系統,必然要有日志功能,這基本是必備的。又比如作為一個電商平台,商品推薦這個功能也是必備的,等等。
性能上的:
除了搞清楚具體題目的特定性能要求,還要考慮一些通用的性能指標,比如可擴展性,即是否使用分布式集群;吞吐量,即同時可服務的用戶數、QPS等;響應時間,等等。根據給出的這些性能指標的具體數據,結合其他數據,比如硬件性能,數據量大小等,決定采用何種設計,比如最常見的加分布式緩存、加反向Nignx代理,等等。
異常處理方面的:
寫一個函數,除了處理正常輸入,還要考慮非法輸入的處理;系統設計雖然比寫一個函數在規模上要大太多太多,但道理其實是一樣的:除了考慮實現正常的業務流程,還一定要考慮異常的情況,以及非法的輸入。
以Java服務器系統為例,通常需要考慮的異常情況有: 網絡故障,服務器集群中的單點故障(斷電等各種原因),各種惡意攻擊(SQL注入,惡意模擬用戶點擊等等),等等。應對這些異常的技術通常有:災難備份,數據冗余備份,分布式事務,等等。
常見題目: 設計電商秒殺系統、設計數據庫系統,等等。
離別鈎是七種武器的最后一種。同理,HR面試也是面試的最后一個環節。
考察內容:
HR會考察你的技術之外的其他素質,比如性格,是否能融入公司,是否能認同企業文化,與人的溝通交流會不會有問題,以及面對困難的應對等等。
該問的和不該問的:
千萬不要以為到了這一步就可以放心和HR談價了。。。 所以薪資這塊最好少問。同時需要注意的是,比如加班之類的最好少問,可以等拿到offer再問,
應該問一些企業文化方面的東西,這樣可以加分不少。
第七種武器?
第七種武器是什么? 水:“哦?” 車:“沒有武器!” 水:“沒有?” 車:“沒有,沒有武器就是有武器,有武器就是沒有武器”
面試中的第七種武器是什么?眼緣!有時候面試官就是看你不爽。。所以,你跟這個職位就沒有緣分啦,哈哈哈哈。。。。
寫在最后
好了,面試官的七種武器就介紹完啦,如果大家有任何補充歡迎留言。最后祝願大家都能熟知面試官的這些武器,做到知己知彼,百戰不殆。順利拿到自己心儀的offer!
(歡迎轉載。轉載請注明出處:http://www.cnblogs.com/hzg1981/)
參考文獻:
http://www.bing.com/knows/search?q=七種武器&mkt=zh-cn&FORM=BKACAI
http://www.my285.com/wuxia/gulong/qzwq/index.htm