算算本身大概面試了近十家公司,也拿到了幾個Offer,如今面試告一段落,簡單總結下面試經驗。程序員
我如今主要的方向是Java服務端開發,把遇到的問題和你們分享一下,也談談關於技術人員如何有方向的提升本身,作到有的放矢。面試
面試遇到的問題算法
百度sql
百度面了兩次,分別是百度糯米和金融事業部,百度目前只有這兩個部門的招聘崗位和我比較匹配。面試都在西二旗的百度新總部,園區還在施工,離地鐵也比較遠,須要打車過去。數據庫
面試官自帶電腦,整個面試過程都在記錄,首先詳細詢問了最近一份工做項目的架構和工做內容,面試主要圍繞工做中用到的組件和中間件技術來擴展,考察掌握程度。編程
MySQL InnoDB存儲的文件結構設計模式
索引樹是如何維護的?數組
數據庫自增主鍵可能的問題緩存
Redis的併發競爭問題如何解決安全
瞭解Redis事務的CAS操做嗎
分析線程池的實現原理和線程的調度過程
動態代理的幾種方式
Spring AOP與IOC的實現
爲何CGlib方式能夠對接口實現代理?RMI與代理模式
Dubbo的底層實現原理和機制
描述一個服務從發佈到被消費的詳細過程
算法方面考察了一個簡單的數組就地去重問題,用丟棄數組尾部元素的方式實現了。
百度金融的面試安排在了週六,一面面試官很贊,態度認真,有些問題沒有思路會給你提示,交流的不錯,
二面被告知缺乏金融支付背景,不過做爲一名工做不到兩年的新人,我以爲被Pass主要緣由應該是工做經驗比較少,教育背景也不太亮眼。
面試中的問題:
分佈式系統怎麼作服務治理
接口的冪等性的概念
Maven出現版本衝突如何解決
JVM垃圾回收機制,什麼時候觸發MinorGC等操做
新生代和老生代的內存回收策略
Eden和Survivor的比例分配等
Synchronized和Lock的區別
兩次面試,感受百度的流程比較嚴格,面試官挺不錯的,簡單可信賴
阿里巴巴
阿里的面試安排的很快,此次止步二面,兩輪面試都是電面。聽朋友說阿里五輪面試,四輪技術一輪HR,技術面試是部門的幾個同事交叉面試,也有了瞭解。
一面整體上仍是圍繞項目架構、Java基礎、JVM、併發編程、數據庫操做、中間件技術和Dubbo服務治理框架等展開,可能由於是雲安所有門,有一半時間在考察JVM,還提問了一些編譯優化的知識,一面結束後很快安排了二面,相對一面,二面的問題更深刻,問題比較刨根問底,更加註重對一些技術細節的理解和把握。
好比數據庫操做,面試官會詳細的問你數據庫插入和刪除一條數據的過程在底層是如何執行的,項目裏配置了讀寫分離,也會比較深刻的就實現方法和底層邏輯展開討論。
一些值得記錄的問題:
JVM內存分代,
Java 8的內存分代改進
深刻分析了Classloader,雙親委派機制
JVM的編譯優化
對Java內存模型的理解,以及其在併發中的應用
指令重排序,內存柵欄等
HashMap的併發問題
瞭解LinkedHashMap的應用嗎
在工做中遇到過哪些設計模式,是如何應用的
因爲阿里杭州目前社招都是P6起,自我感受和崗位要求有差距,二面在電話裏和麪試官交流了,沒有再參加後面的面試。
兩次面試,阿里給我留下的印象很好,面試官都是大牛,面試結束後次日,收到了阿里的郵件拒信,點贊。
阿里的崗位大都在杭州,面試結束特地關注了一下那邊的生活成本,目前杭州房子均價不到兩萬,相比浙江一些縣市的房價都破兩萬,杭州的房價應該比較正常。
若是拿到阿里和網易等幾家互聯網公司的高薪,買房和生活的確比北京要輕鬆不少,果斷決定再沉澱一段時間,兩年後P7再戰。
優酷土豆
優酷的面試都是二對一,每輪面試兩個面試官,一面比較順利,主要是Java基礎,Spring原理,JavaNIO,併發和集合框架等,多是由於視頻網站,優酷考察網絡原理的知識多,好比TCP/IP協議、長鏈接與短鏈接等。
一面提到了本身可能會在下半年學習大數據與機器學習相關的知識,二面就在這上面栽了跟頭,問了不少海量數據的問題。
TCP/IP協議
長鏈接與短鏈接
mapreduce過程
多路歸併的時間複雜度
海量url去重類問題
Java NIO使用
倒排索引的原理
對分詞技術的瞭解
面試中給了一個具體場景,考察對MapReduce過程的理解,好比Map階段和Reduce階段是如何進行的等,Reduce階段面試官但願分析給出一個多路歸併的時間複雜度,用外排序的知識簡單分析了一下,回答的不太好。
回來之後搜索了勝者樹和敗者樹的優化,發現這裏面的內容還挺多,深入體會到有些知識點若是平時掌握的不夠全面深入,很難信手拈來。
搜狐新聞
搜狐面試等待時間比較長。
作了筆試題,一面是個和我年紀相仿的面試官,針對筆試和簡歷提問了一些基礎問題,聊得挺投機,二面技術經理就比較偏架構和中間件的應用,提問了項目,主要考察了服務治理和消息隊列等中間件使用的問題,
消息中間件如何解決消息丟失問題
Dubbo的服務請求失敗怎麼處理
重連機制會不會形成錯誤
對分佈式事務的理解
深刻分析幾個設計模式
面試最後提問了一個不定長字符串轉爲定長字符串的問題,剛剛面過優酷,這個簡單的問題被我想複雜了,沒有Get到面試官的點,考慮了惟一性,性能等,扯了一大堆。
也提醒一下你們,面試過程當中要保持清醒,不要有思惟定式,除非是底層研發崗位,社招對算法的考察不會特別難,用正常的思路去解決就能夠。
其餘
值得一提的是一家創業公司的面試,過程十分簡單粗暴。
沒有自我介紹,面試官看完簡歷就在白板上提了一個多線程調度問題,遞過來MAC就開始敲代碼。寫完之後我表示這題目意義不大,問了Redis,要求十五分鐘實現一個LRUCache,再次現場寫代碼。
寫到一半面試官看沒問題就打斷了,問對公司有什麼想了解的,等了一會讓我回去了,就這麼被Pass,創業公司效率果真高(此處/dog臉)。
面試中要保持清醒,好比被問到十萬個ip段查找這個問題,首先是一個典型的查找問題,明確了這個,就能夠針對性的選擇相關的算法實現,如二分查找、二叉查找樹等。
推薦畫圖表達的方式。
作過的項目架構,各類框架和中間件的設計實現,經過畫圖的方式均可以很好的闡述,能夠隨身帶着紙和筆,面試原本就是一次很好的學習過程,一些問題也能夠記錄下來。
通常來講,面試過程相似一個尋路算法,交流過程當中若是提到了面試官感興趣的某一點,就會就這個點展開,而後一直提出問題到你不能回答爲止,或者你特別牛在這個領域直接秒殺面試官,這樣一條路線走通,再換下一條路線。
程序員如何提升技術水平
相比程序員,我更喜歡攻城獅這個名字,程序員在不瞭解這個行業的人眼裏已經被貼上了各類標籤,諸如各類宅,不修邊幅,其實寫代碼真的是高端大氣上檔次好嗎?
仍是聊工(cheng)程(xu)獅(yuan)如何有針對性的提升技術水平,進入目標公司。
通常來講,主流互聯網公司都在用的就是業內比較成熟和流行的技術,最簡單的方式就是看招聘要求,雖然大部分公司的Job Description都有抄襲的嫌疑,可是多比較幾個招聘,仍是能夠了解主流互聯網公司的技術方向。
仍是拿熟悉的Java服務端業務開發來講明,從拉勾上找幾個招聘:
百度核心業務部門:
阿里巴巴:
美團酒店事業部:
既然是社招,必定的工做經驗是必須的,三年以上最好,上面的幾個JD裏也體現了。因此若是想去大公司我的建議,在小公司積累2-3年經驗而後開始跳槽。
建議
1.基礎知識必需要紮實,包括語言基礎,計算機基礎,算法和基本的Linux運維等
針對Java語言,須要對集合類,併發包,IO/NIO,JVM,內存模型,泛型,異常,反射等都有比較深刻的瞭解,最好是學習過部分源碼。
這些知識點都是相通的,在面試中也能夠體現,好比集合類的HashMap,從源碼的角度,能夠深刻到哈希表的實現,拉鍊法之外的哈希碰撞解決方法,如何平衡內部數組保證哈希表的性能不會降低等;
從線程安全的角度能夠擴展到HashTable、ConcurrentHashMap等其餘的數據結構,能夠比較兩種不一樣的加鎖方式,RetreenLock的實現和應用,繼續深刻能夠考察Java內存模型,Volitale原語,內存柵欄等;
橫向擴展能夠考察有序的Map結構如TreeMap、LinkedHashMap,繼而考察紅黑樹,LRU緩存,HashMap的排序等知識。
Java方向的中高級職位,會比較重視對虛擬機的掌握,諸如類加載機制,內存模型等,這些在程序的優化和併發編程中都很是重要。
算法方面,基本的排序和查找算法,對遞歸,分治等思想的掌握。若是算法基礎不太好,推薦《編程珠璣》等,每一章都很經典。
另外計算機基礎,好比TCP/IP協議和操做系統的知識也是必備的,這些都是大學計算機專業的基礎課,也是作開發基本的素養。
2.設計模式,造輪子的能力,各類緩存和數據庫應用,緩存,中間件技術,高併發和高可用的分佈式系統設計
大型互聯網公司天天要面對海量的請求,都會考察分佈式系統的架構和設計,如何構建高併發高可用的系統,另外由於用戶基數比較大,一個細微的優化可能會給帶來很大的收益,因此對一些技術棧的掌握要求都比較深刻。
好比對MySQL數據庫,須要知道相關的配置和優化,業務上來之後如何分庫分表,如何合理的配置緩存,一個經驗豐富的服務端開發人員,也應該是一個稱職的DBA。
對經常使用的開發組件,好比中間件,RPC框架等都要有必定的瞭解,雖然工做中可能用不到咱們本身造輪子,可是掌握原理纔會駕輕就熟。
這部分知識主要靠工做積累,推薦《大型網站技術架構與Java中間件實踐》,還有曾賢傑的《大型網站系統架構與實踐》,裏面對大型網站的演變,服務治理和中間件的使用作了很詳細的闡述。
做爲業務開發人員,有必要了解壓力測試相關的指標,好比QPS,用戶平均等待時間等,能夠幫助你更好的瞭解本身的系統。
3.軟性指標,包括快速學習,良好的溝通能力,以及對相關行業的瞭解
公司招聘會比較看重一我的的學習能力,是否是值得培養,不少公司校招的畢業生薪資會倒掛工做多年的老員工,也是這樣。
像溝通習慣,邏輯分析能力,這些都屬於軟實力,短期內很難提升,須要長期的養成和持續不斷的投入。
好多公司還會看重所在行業,雖然是作業務,可是對產品和行業的瞭解也很重要。
好比互聯網金融類公司的崗位,若是有過支付和銀行相關的系統開發經驗確定會有加分,這點和每一個人的長期規劃有關。
有了方向,接下來就是如何提升,說一些本身的感想。
不少時候,除非你的工做內容就是要應對高併發,海量用戶等場景,不然經過加班或者說重複性的工做,其實很難有提升。
技術人員最直接的提升方式,仍是須要跳出來,在工做之外審視本身,好比普遍的閱讀技術書籍,多去論壇和各路牛人交流,瞭解主流互聯網公司的技術棧,有針對性的去學習和了解。
同時也能夠適當的瞭解一些產品或者設計的知識,以點帶面,複合人才確定更受歡迎,對待面試,要像和妹子約會同樣,表現本身日常的一面就能夠了。
代碼改變世界,要早日成爲明日大牛,程序員肩上的擔子但是很重啊,共勉。
歡迎工做一到五年的Java工程師朋友們加入Java高級架構:706315665羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!