這不單單是一篇面經

原文做者:_XiaoTeng_
原文連接:https://www.nowcoder.com/discuss/29890?type=0&order=4&pos=4&page=7
原文來源:牛客網

php

 5月份一個很偶然的機會,加了葉神的微信,還收到了祝福。一激動就承諾說寫篇最詳細的面經分享給你們,畢竟用了這麼久的牛客網,收穫真的很大。
    校招真的是段勞心傷神的經歷,我把這一路的體會,寫在秋招前,也許能給那些和我同樣迷茫過,懷疑過,失落過的人一些幫助。
 
    (這篇文章有點長,可能須要點耐心)

0. 寫在以前

    首先呢個人面試經歷和一些麪霸和收割機的大神相比毫不算豐富,但我這三個月應該能表明很大一部分人的心路歷程:
    從無憂無慮也無知的狀態,而後遭遇挫敗,跌入低谷,連續數天的黑暗,慢慢調整,逼着本身不能鬆懈,看到改變,收穫確定,分享經歷。 前端


    先大概說下本身的面試經歷吧 (詳細的面試過程和麪試題解析在最後)

相關的公司有四類: java

  1. 筆試就掛了的:網易、頭條。(對於筆試這個東西我到如今都沒太多經驗) python

        網易是第一家參加筆試的,面試會報銷費用去總部,因此仍是有難度,這個公司呢,內推不內推都要參加筆試。因此筆試要好好準備(固然筆試也很差準備) mysql

        頭條只有四道編程題,一我的作確實難度挺大的,尤爲是工程爲主,不太專搞算法的同窗。 linux

  2. 筆試過了但由於時間地點緣由沒去面試的:京東、小米、去哪、攜程、招銀。 c++

        這幾個公司面試必定要現場,不少都要求去總部,還不報銷路費。因此在遇到這種狀況時,你們要有選擇的安排,畢竟時間和精力都是有限的。 git

  3. 最終參加面試的: 程序員

    • 阿里(電話2面,很輕鬆地就掛了)
    • 騰訊(現場2面,好久以後hr電話說要轉C++,就只能算了)
    • 百度(電話2面+經理面,offer)
    • 滴滴(視頻2面+現場終面,offer)
    • 360 (視頻2面+hr面,offer)
    • 美團(電話2面+hr面,offer)。

    阿里呢你們都知道,巴不得把全國學生都面一個遍,對於這種策略我只想說三個字,晚點投(下面會解釋)。 golang

    騰訊的面試體驗仍是很好的,會在酒店的房間裏,安靜溫馨。只是java的同窗可能要被問到不少C++和網絡的知識,建議仍是提早準備一下。

    百度內推都是電話面,會在某網站實時寫代碼,感受百度的面試官都很不錯,給個人體驗也很好。內推的時候最好注意下部門,在一個好的部門和邊緣部門仍是差異很大的。

    滴滴面試比較晚,外地能夠先視頻面,最後會有現場面,報銷花費。工做體驗很不錯,內部氛圍很好,由於成立時間短業務擴展太快,技術方面正在沉澱期,工做仍是比較有挑戰性的。

    360要先筆試,而後能夠視頻面試。這個公司比較穩定,業務也都很成型,實習的話留用率仍是比較高的。

    美團的話印象比較深,由於我是二月底內推的美團,而後內推沒面我,三月正常筆試經過,而後待面試兩個多月。。估計是補招了纔給我打的電話(我都已經準備入職了)。經驗就是必定要選一個事業羣,最開始選都喜歡的大可能是覺得這樣機會多,相反這樣不少部門因爲本身的簡歷池太滿而顧不上撈你。

4.還有一投簡歷就沉的外企:Amazon、FreeWheel(不知道是他們只收北京生源,仍是我英文簡歷寫的太爛了)

    文章最後的面經固然只包括第三種由於筆試這東西真的很差講,雜七雜八什麼題都有,編程題大多人也要看發揮。


    而後這是我最直觀的感覺:

    offer = 心態 * (實力 + 面試技巧) + 緣分運氣

    我就從左到右提及吧。

1. 心態

    其實每一個階段的改變,也都是心態轉變的過程,因此首先要說的一點,就是心態。在上面這種公式裏,心態做爲一個因子存在。沒錯,心態能夠影響你面試的準備,筆試的狀態,實力的發揮,能夠影響一個面試過程的方方面面。心態崩了,就只剩運氣了,offer估計也就走遠了。

那怎麼調整本身的心態呢?

  • 首先是要正視本身的能力。不輕視,不高估。

    不輕視指的是咱們都要對本身有信心,畢竟選了這個行業和方向,說句很差聽的話,機會那麼多,就算你不怎麼努力也會有個差很少的offer不是麼?千千萬萬的初中創公司,各類擁有垂直領域穩定份額的二三線公司甚至有些已經上市,除此以外還有銀行,投資,金融的IT崗,還有各行各業爲了互聯網+的策略而擴展的互聯網分支(固然像鏈家這種已經算互聯網+傳統行業的典範了,我前些天還瞅到了像萬達德勤一類的各行業巨頭也在招程序開發...)因此啊,要對本身有信心,在這個行業十分缺人的年代裏(固然各個層次的公司缺人的標準是不同的),總不至於會失業吧。

    不高估就是要清楚本身的能力範圍,不是說指望太高很差,但太高的指望會讓你的心理變得脆弱,稍有不順心態就有崩掉的趨勢。由於面試畢竟有太大的偶然性,就算你達到了必定的水平,相應水平的崗位也不是百發百中的,更不要說身邊有那麼多大神和收割機,每天拿offer拒offer,對心理都是不小的衝擊。
  • 不要總給本身消極的暗示,心態差了積極調整。

    大多數的人,總暗示本身說什麼時間很少了,怎麼天天過這麼快效率怎麼這麼低。到筆試了,跟本身說這個算法太難了,確定作不出來;臨到面試了,跟本身說千萬別問我linux內核,別問我分佈式,問我確定完;面試過以後,沒有結果,就每天想確定又掛了,唉我怎麼這麼菜。

    若是這一系列的表現造成習慣,那心態這個係數最多0.5,能發揮出來的東西也都打了一半的折扣。凡事都不要太悲觀,一個offer沒拿到,正常狀況是這個失敗的經歷產生的經驗和總結是會讓下一次的成功率提升的,千萬別由於這些消極的暗示,反而讓該有的提升都沒有了。

    心態差的時候反而要停下你重複而沒有效率的工做,去調整一下,能夠出去玩一玩,吃吃喝喝,不要把這幾個月看得有多麼不同,好像耽擱兩小時就要來生再見同樣。

  • 對於身邊的同窗,多交流,不比較。

    有一些一塊兒準備的好夥伴是件很是好的事情,不只能夠互相督促,並且能夠在交流和分享的過程當中取長補短。(哪怕是偶爾一塊兒吐吐槽發泄一下也比一我的崩潰要好得多)。但對於每一次面試,只跟本身比就好了,面試的整個過程都是最怕比較的,偶然性大,並且每一個人適合的方向和技術棧都不同,結果不能說明一切問題。若是身邊有些收割機,那更不要太在乎這些每天拿offer的(尤爲是拿一個就跑過來說一句的,他們也許沒有惡意,但他們可能真的想不到這種方式會對別人產生怎樣的衝擊)。

    對本身的水平有個很清楚的認識,並選擇本身合適的公司,好好準備本身的筆試、面試,不怕失敗,但保證每次面試都有收穫和提升,那滿意的offer遲早會來。

2. 實力

    這裏說的實力指的是硬實力,也就是技術上的真實積累(固然產品崗的就是對於產品相關知識的積累),而其實呢軟實力在面試過程當中也尤其重要(有時候真的要更重要),主要是指和麪試官的溝通,對一個問題的闡述方式和表達方式,邏輯思惟能力以及的價值觀和爲人等。

    而後關於這個軟實力我想放到下面的技巧中去說。

    若是你平時有些項目積累,不擅長也歷來沒有怎麼系統地總結過;若是你學習呢不算那麼認真刻苦,研究搞得也不算出衆,可是你該努力的時候也會努力,能夠爲了一個好的工做逼本身一把。

    那也許下面說的實力和技巧均可以在必定程度上幫到你。(由於我就是這樣的狀況)

  • 實力怎麼能體現出來

    這麼說是由於不少人其實在這些年的項目或是學習中有一些積累,可是在剛開始面試的時候徹底感受使不出力,就是有種你問的我都能講上一點,但根本說不清楚的感受。(往深了問天然是完蛋)

    知識面或者或者說技術棧都是有寬度和深度的,咱們要作的就是在短期內提高寬度,抓住以往自己就熟悉或是感興趣的幾個點去深刻。

    我是認爲知識的寬度能夠很大程度上決定你能不能經過面試(這裏說的寬度並非簡歷上了解、知道或者你都沒往簡歷上寫,僅僅是據說過的層面修飾的方面,而是寫熟悉的那種,通俗地說是能夠講清原理,不涉及橫向對比和優化的方面)

    一兩個點的深度呢在保證你能經過面試的同時(尤爲是你的點正好cover了對方部門的技術棧),而且仍是影響offer等級的關鍵因素。(達到足夠的深度,不僅能說出原理,還能進行橫向技術對比,縱向的延伸技術,優劣點及優化,或者在這個點寫了幾篇很透徹的博文,更厲害的同窗甚至有相關的開源項目的參與與貢獻)

    關於怎麼提高寬度和深度能夠看下面的積累(其實說真的短時間內寬度是好補的,深度確實要看我的,是代價較高,性價比不必定高的一方面,看本身的決定吧)

    因此個人建議是,先把寬度提上來,把你能cover的知識點及原理搞懂是第一步。建議對本身以前的項目和技術積累作一個總結和分類(能夠參考下面的技術路線),而後對已經瞭解的方面儘量延伸,對盲區或是薄弱的地方進行鍼對性的學習和練習。

        當你的知識面覆蓋到必定程度的時候,你天然會把他們的聯繫搞明白,慢慢理解這整個技術體系,在面試的過程當中結合表達技巧能夠關聯起來講各個方面,也就能夠很大程度上展示本身的真實實力(更厲害的同窗甚至能夠有超出本身真實實力的表現。。)

  • 實力包含哪些方面

(我也只是腦子裏過了一遍,確定有遺漏的,你們本身補全就好了,畢竟每一個人的知識覆蓋範圍也不一樣)

  1. 基礎知識:
    1. 算法和數據結構
      1. 數組、鏈表、二叉樹、隊列、棧的各類操做(性能,場景)
      2. 二分查找和各類變種的二分查找
      3. 各種排序算法以及複雜度分析(快排、歸併、堆
      4. 各種算法題(手寫)
      5. 理解並能夠分析時間和空間複雜度。
      6. 動態規劃(筆試回回有。。)、貪心。
      7. 紅黑樹、AVL樹、Hash樹、Tire樹、B樹、B+樹。
      8. 圖算法(比較少,也就兩個最短路徑算法理解吧)
    2. 計算機網絡
      1. OSI7層模型(TCP4層)
        • 每層的協議
        • url到頁面的過程
      2. HTTP
        • http/https 1.0、1.一、2.0
        • get/post 以及冪等性
        • http 協議頭相關
        • 網絡攻擊(CSRF、XSS)
      3. TCP/IP
        • 三次握手、四次揮手
        • 擁塞控制(過程、閾值)
        • 流量控制與滑動窗口
        • TCP與UDP比較
        • 子網劃分(通常只有筆試有)
        • DDos攻擊
      4. (B)IO/NIO/AIO
        • 三者原理,各個語言是怎麼實現的
        • Netty
        • Linux內核select poll epoll
    3. 數據庫(最多的仍是mysql,Nosql有redis)
      1. 索引(包括分類及優化方式,失效條件,底層結構)
      2. sql語法(join,union,子查詢,having,group by)
      3. 引擎對比(InnoDB,MyISAM)
      4. 數據庫的鎖(行鎖,表鎖,頁級鎖,意向鎖,讀鎖,寫鎖,悲觀鎖,樂觀鎖,以及加鎖的select sql方式)
      5. 隔離級別,依次解決的問題(髒讀、不可重複讀、幻讀)
      6. 事務的ACID
      7. B樹、B+樹
      8. 優化(explain,慢查詢,show profile)
      9. 數據庫的範式。
      10. 分庫分表,主從複製,讀寫分離。
      11. Nosql相關(redis和memcached區別之類的,若是你熟悉redis,redis還有一堆要問的)
    4. 操做系統:
      1. 進程通訊IPC(幾種方式),與線程區別
      2. OS的幾種策略(頁面置換,進程調度等,每一個裏面有幾種算法)
      3. 互斥與死鎖相關的
      4. linux經常使用命令(問的時候都會給具體某一個場景)
      5. Linux內核相關(select、poll、epoll)
    5. 編程語言(這裏只說Java):
      1. 把我以後的面通過一遍,Java感受覆蓋的就差很少了,不過下面仍是分個類。
      2. Java基礎(面向對象、四個特性、重載重寫、static和final等等不少東西)
      3. 集合(HashMap、ConcurrentHashMap、各類List,最好結合源碼看)
      4. 併發和多線程(線程池、SYNC和Lock鎖機制、線程通訊、volatile、ThreadLocal、CyclicBarrier、Atom包、CountDownLatch、AQS、CAS原理等等)
      5. JVM(內存模型、GC垃圾回收,包括分代,GC算法,收集器、類加載和雙親委派、JVM調優,內存泄漏和內存溢出)
      6. IO/NIO相關
      7. 反射和代理、異常、Java8相關、序列化
      8. 設計模式(經常使用的,jdk中有的)
      9. Web相關(servlet、cookie/session、Spring<AOP、IOC、MVC、事務、動態代理>、Mybatis、Tomcat、Hibernate等)
      10. 看jdk源碼
  2. 項目經歷
    • 這個每一個人的項目不一樣,覆蓋的技術也不同,因此不能統一去說。
    • 這裏的技巧呢,在下面也會詳細說明。
    • 無非是找到本身項目中的亮點,簡歷上敘述的簡練而且吸引眼球,同時本身要很熟悉這個點(畢竟能夠提早準備)
    • 最好本身多練,就像有個劇本或者稿子同樣,保證面試中能夠很熟練通俗地講出,而且讓人聽着很舒服。
  3. 實習經歷
    • 這個很抱歉,由於我是找實習的經歷,因此也沒有實習經歷的講述經驗。
    • 但我想若是你有實習經歷,那面試過程的重點也會在實習作了什麼上面,因此你們最好對實習所作的工做作一個總結,而且一樣抓出亮點,搞懂內部原理,提早鍛鍊講述的過程。
  4. 其餘擴展技能(這個方方面面太多了,所有掌握基本上不可能,只是做爲你們其餘時間擴充技能的參考)

    • 分佈式架構:(瞭解原理就行,若是真的有實踐經驗更好)
      • CAP原理和BASE理論。
      • Nosql與KV存儲(redis,hbase,mongodb,memcached等)
      • 服務化理論(包括服務發現、治理等,zookeeper、etcd、springcloud微服務、)
      • 負載均衡(原理、cdn、一致性hash)
      • RPC框架(包括總體的一些框架理論,通訊的netty,序列化協議thrift,protobuff等)
      • 消息隊列(原理、kafka,activeMQ,rocketMQ)
      • 分佈式存儲系統(GFS、HDFS、fastDFS)、存儲模型(skipList、LSM等)
      • 分佈式事務、分佈式鎖等
    • 腳本語言:(只是做爲橫向擴充,通常問到linux也會問問shell腳本)
      • python
      • php
      • shell
      • golang
      • ...
    • 大數據與數據分析:
      • hadoop生態圈(hive、hbase、hdfs、zookeeper、storm、kafka)
      • spark體系
      • 語言:python、R、scala
      • 搜索引擎與技術
    • 機器學習算法:
      • 模型和算法不少。不細說了,若是很熟練就去投算法,國內不少公司都算法崗都很稀缺,其餘崗能夠大概瞭解下理論。
    • 其餘工具的理論和使用:
      • 這個更多了,問的多的好比git、docker、maven/gradle、Jenkins等等,本身須要的話選擇性地去學。
  5. 實力要怎麼積累

    積累實力最好的方式就是平時在項目中或是學習中,多學多問,多思考多鑽研。這裏就說說短時間內學習的一些方法和路徑:

    總結下來,一方面是經過看書、看視頻、看面經來不斷擴展本身的知識面,一方面是經過不斷的面試積累經驗和知識盲區,在每次總結的過程當中積累實力。

    • 先說說看書學習這一點

    這裏應該是有個推薦書籍的環節,這幾個月確實看了很多書,可是並非全部都有很高的性價比,在這邊大概列一下,先後順序也必定程度上表明瞭我認爲的重要度前後,'/'作分割的是一類的書籍,通常來講看一個就夠了:

書單:
    算法與數據結構:
        數據結構(嚴蔚敏)/大話數據結構  //若是以爲教材無聊就能夠看大話系列,印象中裏面還有不少詩
        劍指Offer/程序員面試金典/編程珠璣/編程之美/牛客網+leetcode
        程序員筆試面試最優解(左程雲)/不如直接看左神的筆試面試指南視頻
        Java的版本(不是很推薦):
            數據結構與算法經典問題解析(Java語言描述)
            圖解數據結構(使用Java)

    計算機網絡:
        計算機網絡(謝希仁)
        TCP/IP 詳解
        HTTP權威指南
        圖解TCP/IP
        圖解HTTP

    數據庫://數據庫主要是多用,書上主要看索引和性能的部分
        高性能MySQL/深刻淺出MySQL

    操做系統:
        OS原理:操做系統(課本,黑色的那個)
        Linux:
            Linux私房菜 //鳥哥寫的,很全,包括bash部分
            跟阿銘學Linux //主要偏重於命令和操做,比較淺顯
    java:
        Java瘋狂講義/Java編程思想/Java核心技術 卷1
        深刻理解Java虛擬機
        併發編程的藝術/多線程編程核心技術
        Effective Java
        Java程序員面試筆試寶典 //何昊的那本,我的感受是突擊知識點的神器
        Java程序性能優化
        實戰Java高併發程序設計

    Java Web:
        Spring實戰/輕量級JavaEE 企業應用(紅皮,講SSH的) //主要看最後一部分Spring的就能夠
        深刻JavaWeb技術內幕(阿里 許令波)//這個講的仍是比較深的
        SpringBoot實戰/深刻實踐SpringBoot

    設計模式:
        大話設計模式 //通俗易懂
        各種博客的總結

    分佈式與大數據:
        分佈式服務框架原理與實踐
        大型網站技術架構
        Hadoop實戰(hadoop體系包括得很全)
        //還有一本我暫時想不起來名字了

    其餘:
        Git:
            Git權威指南
            Git官方講解視頻(牛客網有帶字幕的)
        Redis:
            Redis實戰

    還買了docker、springCloud等等一些工具書,由於過小衆就不列舉了

    除了上面說的書和視頻,最有用的仍是你們分享的各類面經。

    面經是個很不錯的東西(嗯,想看的能夠直接翻到最後一節)。記住不要一掃而過(除了那種崗位不太匹配能夠快速抓重點看),崗位匹配的你能夠順着面經逐條去看,模擬一次面試過程(雖然是單向的,可是你內心應該是知道每一個問題你能答道什麼層次),這種不斷地模擬可讓你知道盲點或者說弱點在哪,對於一個你內心沒底或者想不太起來的問題必定要當時記下來或者當時就弄懂。

    我當時是天天晚上在牀上看幾篇面經,而後把存疑的問題copy到記事本中,次日找個固定的時間短查詢解決和總結。長期下來會養成一個很好的習慣,你的知識點會不斷地擴充。

    • 在一次次面試中提升

    這一點其實跟剛剛看面經的那個很相似(那個我不是叫作模擬面試了嗎),每次面試完,必定要把本身不會的東西儘快記下來(固然你若是有記面經的習慣就更好了,還能再分享出去),而後找時間弄懂和總結。

    除了知識點,每次面試(跟模擬面試不一樣的地方)還要總結的是哪裏發揮得很差,哪裏有能夠提高的地方,下次必定要注意之類的。(就是有關面試技巧的東西,好比此次語速太快,致使面試官反饋了,又好比此次發現對方讓你在紙上畫個項目邏輯圖忽然一時腦梗,那回去就好好在本上畫一遍)

3. 技巧

  • 一些自身的軟實力

    軟實力這個東西與面試的準備關係不大,基本上是長期造成的。

    包括和麪試官的溝通(有的時候也會成爲聊天瞎扯的能力);對一個問題的表達方式,邏輯思惟(像有些人的發言就讓人聽上去頗有層次感,很舒服,這方面欠缺的能夠推薦玩玩狼人殺);除此以外對方也會很在乎你的價值觀和爲人(這個是我進了公司發現的,不少公司在內部的面試細則上面都會註明這一點,若是價值觀或是人品問題會直接否決。)想一想也是有道理的,由於這個是入職以後能不能好好相處的關鍵,設想若是你是一個面試官,面對一個有實力可是說話太有棱角聊不太來的和一個不算出衆但基礎不錯很聽話能夠培養的,你會選哪個?(若是你由於生活太平淡了想選第一個,那這一條當我沒說。。)

    這些軟實力其實要在生活中慢慢鍛鍊,好比多參加些活動,多和別人溝通,發表意見前好好組織本身的語言等等。(每一個人都有每一個人的性格,這些都因人而異,但有一點咱們要記住的是在面試中,不論什麼狀況,都要保持冷靜和清晰的頭腦,和一個謙卑的態度,交流要坦誠<尤爲做爲應屆生>,這樣起碼印象會好不少,要知道雖然面試有各類各樣花式的打分項,可是印象好每每是隱藏的決定性因素)

  • 關於面試的準備和技巧

    面試的技巧首先就是剛剛說到的態度。 一個謙卑(注意不是自卑,也不是把本身放的很低的樣子)和禮貌的態度和表達方式每每可讓面試官的印象分提升不少,印象分很像以後要考察的實力分的係數。留個好印象,面試就成功了一半。(固然你必定也聽過那種聊得很嗨,或者偶遇校友之類的,毛都沒問就聊經過了的場景。這種狀況仍是不算在技巧中了吧,應該屬於運氣和緣分的範疇。而大多時候聊得開心和舒服會讓你感受到經過率會比較高,這一點不少人仍是深有體會的)

    • 而後說一下面試以前能夠作足的準備。

    首先從簡歷開始說,簡歷怎麼調格式,作幾頁,排版啥的就不想多說了,感受不少文章都分享過。我只說說技術方面的內容怎麼寫。

專業技能的描述謂詞無非就那麼幾種:精通、熟練、熟悉、瞭解。(還有一級叫據說過,這個級別的可千萬別往上寫啊兄弟)

    精通感受通常仍是不要寫,除非你在某個技術點上真的有足夠的把握,好比源碼看的很透徹的同時還能深入理解原理並能靈活處理各類case場景,若是還有相關的開源貢獻,那就自信地寫精通吧。

    咱們把本身掌握的大多數技術點叫作熟練掌握,這個須要咱們在以前對各個技術點進行橫向縱向的複習和總結,並不僅是用的多有經驗就行,有的時候咱們以爲熟,但真讓你說的時候殊不知道從何提及。

    至於熟悉和了解,能夠寫一些本身理解原理可是不經常使用的技術點,尤爲是比較流行的,各大公司都在用的技術(好比MQ,分佈式緩存等等),這些你在學校不必定用過,可是你能夠經過看博客,寫demo去理解他的設計和原理,面試的時候能夠講得清楚。

    這裏還有個技巧,更細心的同窗能夠針對每一個公司崗位的job detail不一樣,熟悉和了解這塊就針對jd中cover的技術點去寫。這個作法是很聰明的,畢竟熟悉和了解這個層面是能夠提早學習和準備的,有針對性的去寫對方須要的,是提高經過率很好的一種方式。(若是嫌麻煩就算了,好比我就是)

    下面再說說項目經歷這塊:敘述必定要精煉到位,細化到每個亮點上。我如今再看我二三月份的簡歷簡直是有種想撕了的衝動,當時就是項目描述兩三行,而後歸納下我大概作了哪幾個模塊。完了。
事實上,不能講得這麼泛泛,就從中找2-3個亮點,一句話高度歸納,突出亮點。

    好比後來我就把我一個普通的web項目挖出來三個點(爬蟲,通訊控制方面,安全加密方面),分別用一句話敘述,這一句話最好包括這個技術點的思路,解決了什麼,有沒有作什麼優化。好比一個爬蟲工具能夠寫成這樣:

    我負責這個系統中爬蟲的開發,終端控制管理,店鋪管理。。。。

    是的,上面這個爬蟲就佔用了五個字,等於沒說,面試官看到壓根不知道怎麼去問。這裏還能夠這樣寫:

    負責系統中爬蟲模塊的開發,用於爬取影片的各類信息,包括年份,介紹,主演信息等。

    這個起碼告訴面試官爬蟲作了什麼,可是你並不能保證他會問,由於你的敘述不必定能引發他的興趣。那還能夠這麼寫:

    獨立開發多線程影片信息爬蟲工具, 並針對線程池性能、網絡異常以及反爬蟲措施進行屢次優化,容錯性良好並達到併發請求30+的QPS。

    你以爲面試官看到這句話,他不想問點什麼嗎(除非他真的就不想要你)。

    因此說,其實面試官呢都是但願在面試的過程當中發現咱們的亮點和優點,從而展開更深層次的交流,可是每每在簡歷中沒有一個讓他詢問的入口,這樣就可能致使他會隨意問(好比你瞭解什麼什麼嗎?通常狀況下都不太樂觀),或者就說那你來說講吧(這種問法其實已經表達出他不知道怎麼問的狀況了,你在講的時候必定要突出重點,不然會讓人感受沒什麼亮點,普普統統的項目而已(固然就算是普通的項目,咱們也要挖掘它的價值和本身的價值不是))

    咱們在面試的過程當中最重要的是本身掌握主動權,若是面試官問的都是咱們熟悉的範圍和準備過的領域那咱們答起來也會更加駕輕就熟。而讓面試官隨着咱們簡歷中埋下的這些亮點(他就算知道你有意想說這一點,每每也會去問,由於他就是想在短期的面試中瞭解你處理問題的能力),去進行更深層次的交流,而這個更深層次的交流,還須要咱們針對簡歷上的每一句話,都準備多個層次和維度的擴展。

    好比仍是這個爬蟲,你能夠充分擴展線程池的相關優化(有可能項目中沒有怎麼優化甚至就是個單線程,可是在準備面試的過程當中仍是能夠專門去作一些code重構的),優化網絡的NIO相關擴展,以及反爬蟲的各類各樣的措施,以及爬蟲方分別如何應對。這裏只要你去想,能準備的東西太多了,面試多了天然也就愈來愈熟,好像項目就是作得這麼完美同樣。

    這裏我就不怎麼擴展去說了,再講下去這篇文章就寫不完了。。。

最後是面試中的技巧和經驗。

  1. 好好對着本身寫的簡歷一行一行看一遍,這都是你挖的坑,是準備給面試官做爲切入點交流的,並非本身往裏跳的。(對每一行都要有足夠了解和把握)

  2. 面試過程沒關係張,尤爲是前幾回,建議先從小公司入手鍛鍊下面試經驗(參考我以後自身的反面教材

  3. 面試方式不一樣,側重點不一樣(無非是電話、視頻、現場三種)。

        電話面試建議找我的少安靜的地方坐着回答,而且建議拿紙筆多作記錄多畫多寫。(固然若是你以爲身邊不少朋友可讓你越聊越嗨那也能夠,坐着是讓你整個節奏慢下來,說話明顯更加沉穩,親身體會過站着走來走去和坐着的區別)

        視頻面試其實和電話相似,只是能夠實時寫代碼,面試官能看到你的表情。這裏仍是要放鬆,若是你比較緊張,能夠不直視鏡頭,好好想問題就是了,由於不少面試官你答得好也會面無表情(由於他們也不常視頻,表情都很尷尬),而後你看到他們沒表情的表情確定會受影響。

        現場面呢,最重要的是和麪試官互動了,說幾個點:語氣要輕鬆點,多點肢體動做有助表達,多笑;不太好說清的就用筆在紙上畫,一遍畫一邊講,面試官也會更容易和你交流;若是你能夠時不時幽默一下開開玩笑是更好了;見面和離開記得禮貌地握個手說聲謝謝。

  4. 學會平等交流,別把本身身段放的過低。其實有一點你要清楚,面試是個雙選的過程,他能夠拒絕你,你也能夠拒絕他。千萬不要太上趕着,反而會影響本身正常的表達和邏輯。(就跟你見了喜歡的姑娘就不會說話了一個道理)

  5. 回答問題的時候不要一口氣把知道的所有說完,而後還毫無條理。學會一個知識點由淺入深講解給面試官,而且留有餘地給他進一步去問。

    舉個例子:

        就說最簡單和廣泛的HashMap,讓你講講,你就能夠先說說hashMap的設計原理,底層結構(鏈表+數組)擴容方式等,從這你就能夠說說這種設計好在哪裏(好比講一講put是如何作hash的),這時候你能夠說這種hash可能會有衝突,hashMap也是作了相應設計的。

        而後面試官會問題你怎麼解決衝突?你能夠再給他講講解決hash衝突的三種一般方式,而hashMap用的是鏈式法,而後能夠說到這樣會有隱患就是hash鏈過長。

        面試官再問,你會給他講解決複雜度高的長鏈用了紅黑樹的結構,這裏還能夠延伸到紅黑樹的特色或者jdk7和jdk8的不一樣實現,這時候你能夠說解決hash衝突,但hashMap還會有併發和同步的問題。

        面試官會讓你再講講,你能夠說說hashtable是線程安全的,怎麼實現的(sync函數),並很差,從而引出更好的juc包,說說concurrentHashMap,以後又能夠說道鎖分段原理,弱一致性迭代器,concurrentHashMap的鎖粒度(java7和java8不一樣),同包的CopyOnWriteArray等等。

        你還能夠延伸說到鎖(重量、輕量、悲觀樂觀各自實現、底層源碼等等)、緩存(由於不少時候Map的結構能夠做爲緩存,從而能夠說到緩存系統的設計,kv原理,分佈式緩存redis、memcashed等等)    

        舉這個例子就是想說,一個簡單的基礎問題能夠一步一步有條理有層次的回答,每一層表達完拋個引子,讓面試官能夠繼續問下去,從而讓面試官真正瞭解你的掌握的深度。

  6. 若是真的不巧聊到不擅長的地方,學會轉移話題,從一個點中聊本身感興趣或是有把握的方面(好比你對消息隊列不太熟可是redis用的熟,你就能夠在問到消息隊列的時候說,由於以前都是本身作的項目嘛,性能方面沒有考慮到最優,一些異步的方式仍是靠redis list去實現的,雖然redis的消息機制並不常見,但當時仍是知足了需求,以後能夠考慮性能方面的提高和技術評估;又好比問你http請求細節,rest的設計實現細節,你能夠說http restapi服務接口性能的一些不足,後來使用了rpc的方式,固然你這麼說必定是要對rpc很瞭解)其實有的時候面試官是知道你是有意轉移的,可是每每他們也不會抓着你不會的去問,非讓你本身認可本身的盲區,他們也許根本不在乎這些。

  7. 若是真的被問到不會的,就直接說你不會(說你不會、說你不會,我再補充兩遍),或者禮貌地說這方面可能我還要多學習。(對一個拿不許的問題千萬不要猜,即便是二選一的那種問題,猜錯了直接完蛋,猜對了被人看出來,再往深問仍是完蛋)另外,像可能,大概是,我以爲這種表達最好不要,一聽就是對一個點沒把握,有可能會讓面試官以爲學習太浮躁不喜歡尋求原理。
    那對於本身知道原理(確實是理解了的)可是沒用過的東西,就講講原理,並認可本身實踐不足,表現出好學的態度。面試必定要真誠。

  8. 問到有什麼offer就直接說,不要藏着掖着,也不要把更好的offer(好比bat的)講的很是誘人,一副bat我都拿到了的樣子(面試官會心想,那你還來面試咱們幹什麼)。再強調面試過程必定要真誠。除了直接說,誠實點以外,也要真的作些思考:對方公司跟以前的offer比優點在哪,好比平臺更大?專業技能棧更match?工做更有挑戰力?地點更合適?有機會留用?隨便一條符合的均可以講出來,起碼讓對方以爲你想來面是有緣由的而且真的有可能加入。(若是你還提早了解對方公司的文化,能夠講出這個文化本身很認同那就更能夠了)

4. 緣分和運氣

    關於這一點只有一句:平時多作好事,熱愛生活。

    其實都知道面試要講緣分,講運氣,但人每每能夠在很順利地經過面試以後說句運氣好運氣好,卻很難在努力準備卻失敗的經歷以後保持平靜。

    但無論能不能轉運是否是本命年有沒有緣分,努力和收穫的關係老是多年不變的真理。

    因此,講心態,講實力,講方法。足矣。



下面是面試的詳細過程,包含面經:

    按時間順序,詳細敘述一下我面試的過程,包括面經和心態的轉變:
    (括號裏是對問題的補充,若是感受有知識點的盲區,你們正好能夠去深刻學習一下。這裏說一下我投的大可能是Java研發崗,因此其餘語言的能夠忽略java問題)

    首先說一點,複習準備必定要早(固然這是說給19屆師弟師妹們聽的,嗯大家看到這裏已經能夠開始複習了),有同窗去年暑假劍指offer都刷了一遍,而後我居然今年3月纔買這本書。。還有同窗前一年冬天就已經去實習了,這種機會也不錯。但寒假若是不實習的,必定要進入到學習狀態。我準備的就有點晚,寒假徹底沒看書,真正開始準備,大概是2月中旬號玩了一夜狼人殺以後。

    就是那個時候發現校招就要開始了,而後開始慌了。大概看了一週的書(基本上都是java基礎),而後師兄說阿里內推了,心想趕忙投吧要不人家招夠了就不招了(後來發現都5月6月了還在招。。),而後就慌慌忙忙投了簡歷。

    這裏我要說一點最重要的事情: 必定不要在沒有面試經驗的狀況下先面大廠,或者是你想去的公司。
    我是3月1日下午三點半在阿里的官網完善的簡歷,5點電話就過來了。做爲一個java coder,阿里是個很好的平臺,(固然C++的崗能夠好好準備騰訊),必定仍是準備充分了再投,你先面的結果極可能是焦急地等一兩個月而後被後來準備充分再來面試的人取代

阿里 3.1,3.2(兩面)

    兩天各面了一面(投的螞蟻金服,第一天面的就不太好,次日又把我撈起來面,而且面完感受就走遠了,但當時卻沒有reject,這就致使以後一個月一直在流程中,阿里其餘事業部的師兄師姐沒辦法把個人簡歷提走,最終到要筆試了而後變成了rejected)

    那個時候就是處於我所說的無知狀態,知識點掌握的不夠牢,簡歷寫的亂七八糟,面試經驗爲零(這應該是我上學以來的第一次面試),面試技巧就更不懂了。

    而後當時兩次都感受聊得不好(尤爲是聊算法模型的時候都想自爆了),也根本沒有記錄面經的想法。因此有些問題我都記不起來了,大概說一下吧。

  • hashMap的擴容原理,初始有13個,要怎麼new?(達到了負載因子,直接手動>>1)
  • Integer的常量緩存池的問題(-127~128範圍有個cache)
  • ConcurrentHashMap的size()怎麼作的(並無徹底加鎖,而是先樂觀的認爲不會有寫,經過modCount判斷是否更改,這個我當時記不清就用了不少可能、大概、應該這種詞,事實證實直接說不清楚會更好)
  • Spring的AOP關於攔截private方法一些問題.(細節忘記了,當時答得也很差)
  • 項目中數據字典怎麼作的緩存,如何作的通訊,有沒有用什麼模塊。(說了本身的作法,用的全局的HashMap,而後他會延伸到高併發的場景,分佈式緩存怎麼作等等,因爲沒實際操做經驗提早也沒準備,而且尚未直接說不會,又是用不少模棱兩可的語句答得)
  • 講講你的論文相關的模型吧(這個其實在簡歷上根本沒寫,只是寫了數學建模的獎,而後面試官就開始問機器學習的算法,不少都是我沒準備的,而且我心想我投的也不是算法崗啊。。。因此說對於簡歷上的每一條必定要熟悉,作足準備,而且遇到簡歷上沒有都扯到的方面,要想辦法轉移,不要在這耗着
  • 講完算法的問題,面試官很尷尬的說了句,你這本身的研究方向你都搞不清楚嗎?我當時預感就差很少走遠了。。。

    其餘問題真的過久遠了,我當時也沒有記面經的習慣,因此就沒有了。可是最大的感覺是面阿里的時候整我的都是緊張的狀態,語速特別快,巴不得把知道的都說出來,沒有條理,而且把本身姿態放得特別低,還在樓道不停走來走去。(對,以上說的這幾點全都是不該該的,但主要緣由仍是當時準備太不充分,簡歷方面的準備以及知識點的積累都不夠;另一點,仍是要強調不會的就是不會,千萬別說大概是,我以爲吧這種東西,說的很差很容易讓面試官認做不懂裝懂,雖然你只是很想向面試官表達點什麼,哪怕只是積極的態度)

    從阿里面完試開始個人心態基本上就崩掉了,對本身極度懷疑,加上今年諸事不順,心情直接跌到了低谷。而後整個三月基本上都是黑暗的,整個一個月都沒再投內推,天天從早晨起來,大多時間就在看書刷題,晚上十點回宿舍躺在牀上,還要刷兩個小時牛客的面經。一個月下來不多說話,提高確定是有,可是這個過程,其實徹底能夠用更好的心態去經歷。

    而後這段極其黑暗痛苦的日子持續到三月底,一個師兄想幫我內推百度,由於以前由於沒信心也錯過了騰訊的內推,就心想要不試一下吧。

百度(123面)

一面 3.30 下午兩點 45mins

  • 自我介紹,印象最深最費心的項目(這個一套能夠提早準備,在某些亮點能夠估計拋出等面試官來問)
  • 講講項目中的爬蟲和優化怎麼作的,爲何選用jsoup而沒有用python的urllib
  • 說說你瞭解的反爬蟲措施,和針對異常的處理。
  • 那你覺的你來作一個網站要從哪些方面考慮反爬蟲。

        這裏能夠提早和學習,即便你真正使用的只是一點,也能夠在相關問題上作更深的瞭解。

        最簡單隻分析請求,攔截全部非瀏覽器的直接請求(能夠經過添加僞報頭解決);查看refer頁作防盜連接(能夠改refer項);基於用戶行爲的策略,同一ip類似請求斷定(代理或ip池,或間隔請求解決);基於用戶session的策略(模擬多用戶登陸解決);封裝前端數據,用js渲染生成(經過探取和模擬異步ajax請求解決);對ajax請求進行加密等等方法。

  • 講講項目中怎麼實現的充值,鎖的機制和事務註解,如何保證了事務的一致性。
  • spring層面作事務和數據庫層面作的區別,各自實現方式。
  • 聊了事務的傳播性和隔離級別,問了mysql的默認隔離級別(可重複讀)
  • spring中事務傳播性怎麼配置(xml方式和註解方式,還有關於savepoint的使用)
  • 算法:O(1)刪除執行鏈表結點,作分析(實際上是要指出劍指offer中那個直接copy值的方法的缺陷和隱患)
  • 算法:二叉樹的最長距離(遞歸的思想)

二面 3.30 下午五點 50mins

  • 聊項目(此次是針對項目中的加密算法和安全性作了闡述,大概20分鐘吧,以前爬蟲那個例子已經說了項目亮點要怎麼準備了,這裏我就很少說了)
  • 詳細聊了聊spring的IOC和AOP思想
  • 關於AOP在spring的應用(好比事務,通知,aspectJ,slf4j的原理,和log4j的對比)
  • 關於jdk代理和cglib第三方代理(說出對接口代理和子類繼承的區別)
  • 用的什麼數據庫,Mysql。
  • 最大的數據量多大,用了索引沒有,怎麼用的(聊了前綴索引,對於varchar類型的值,又聊了聊char,varchar,text,blob的關係和區別)。
  • 爲何索引不能隨便用,何時用(何時失效,何時最高效)。
  • 如何達到索引開銷和性能的平衡,用了一個表去舉例。(方法就是,根據情境看常常作的查詢是哪些,而後依次是什麼查詢條件,保證最高效索引的同時,也保證索引不失效,避免無效開銷,而且根據show profile和explain功能進行對比分析)
  • 數據庫用了緩存沒有,講講redis的理解(用做緩存,隊列,也可作存儲)。
  • redis是單線程仍是多線程的,舉個例子(作計數器,rank排行榜)
  • 講講hbase的原理,CloumnFamily包含哪些,region什麼狀況作分割,對於版本號這個第四維度的使用方式(通常默認三個版本)等等
  • 讓我等消息,說經理會聯繫我。

經理面 4.12 中午 40mins

  • 經理面其實更加放鬆,不僅是技術方面,還有生活,性格多方面,感受是個技術+hr的綜合面。
  • 聊家庭,家鄉,工做意願,愛好等等(聊了十幾分鍾,感受都很不錯,而後以後的面試也就很輕鬆了,基本是我在講他在聽)
  • 講了講項目的設計,包括異常的處理,數據庫設計,通訊模型的設計。
  • 講講你理解的JVM吧(從內存劃分說到了GC算法、分代思想,CMS和G1 collector,到類加載模型,tomcat的非雙親委派、線程上下文加載器,到JVM調優的策略,gc參數設置策略,如何找死鎖,讀快照,發現內存泄漏等等吧)
  • 而後說了下部門的技術棧和部門介紹,說了部門可能沒有留用的hc,問我介不介意(當時還沒offer固然說不介意只是但願去學習)
  • 而後就說把我簡歷鎖了,以後會給我發offer。

    其實到如今我都很感謝百度,雖然最後由於部門和留用hc的緣由沒有去,可是此次面試收穫最大的就是信心。而且經理電話裏就給了口頭offer,這個讓我懸了一個多月的心一會兒就放下來了,接下來的幾天乃至以後的面試整我的都是放鬆的狀態。(真的很難形容,這種轉變就在這一個電話的先後)

    因此,其實你們也遲早會有這一天,不必一直那麼緊張的狀態,太痛苦了。(雖然我知道這種話說得簡單),另一點就是三月份確實有了很大的提升,這個告訴咱們,該逼本身的時候仍是要狠心一點。

360(123面)

    有了信心或者說有一個offer以後,你就會愈來愈順利,從這以後的每次面試都會有不一樣程度的收穫。360的流程是走得最順利的,筆試+面試,三次面試一天完成,可是360的面經可能寫得稍微簡單一點,由於不少知識點在後面的面試中也出現了,就沒有作過多解釋,騰訊滴滴美團的面經要詳細一些。

360一面 4.12

  • 自我介紹加項目
  • 線程池如何優化的爬蟲,數據規模
  • 網絡時延如何處理
  • 同名影片如何選取,有沒有更好的方式。
  • 反爬蟲的原理,從低級到高級說一下,分別如何應對
  • 收穫了什麼
  • 線程進程區別
  • 說下資源方面的區別,共享,不共享
  • 共享的具體哪些資源
  • jvm內存模型
  • 堆區的特色
  • 數據庫左鏈接右鏈接,場景
  • 給200個200個數的數組,找到最大的200個
  • git 經常使用的操做,git rebase和git merge區別
  • 分佈式數據庫怎麼調用
  • linux經常使用命令,查看內存,查看磁盤使用率

360二面 4.12

  • 聊項目,介紹下背景,怎麼談的
  • 印象最深的模塊及解決,其餘項目呢,跟着老師作的,還有簡歷上沒寫的項目
  • 項目經驗還能夠那基礎怎麼樣本身以爲,
  • 說下jvm吧你知道的,中間會問
  • jvm詳細以下
  • 內存模型
  • 垃圾回收
  • 分代及回收算法
  • 哪些做爲gc root
  • 收集器的特色分類
  • 類加載機制和雙親委派模型
  • 幾個加載器
  • tomcat類加載有什麼不一樣,說加載順序並非雙親模型,具體順序說一下
  • 併發注意什麼,線程實現同步的方式,通訊
  • 幾種同步的區別
  • 悲觀鎖樂觀鎖,底層怎麼實現的,越詳細越好
  • 單例模式的特色,幾種實現,容易引起的問題
  • 如何防止內存泄露,哪些會容易形成
  • jvm調優如何檢查內存泄露,如何優化gc參數
  • 寫sql 查詢帶日期屢次考試成績表中,每一個學生的每門課最高成績,日期要準確
  • 分別用having子句寫和用子查詢寫
  • 寫代碼 旋轉數組中查找某一個值

360 三面 hr 4.12

    這是惟一一篇hr面經,由於我只面過這一次hr,其餘的三面要麼是技術,要麼只是打個電話說說狀況,還沒問問題就掛了電話(好比騰訊的)。

  • 講一下項目怎麼接的,怎麼跟甲方溝通,遇到的最大問題,怎麼克服的
  • 本身的項目和老師的項目和安排怎麼協調。
  • 平時有什麼愛好,怎麼安排本身的時間
  • 攝影都去哪拍,喜歡什麼運動,何時運動
  • 爲何選咱們部門,其餘部門你怎麼看
  • 咱們是作移動端後臺的,喜歡玩手機嗎
  • 說說經常使用的app平時怎麼用,頻率
  • 之後會不會創業,爲何
  • 之後的規劃,職業技術和生活兩方面

    hr面沒有太多經驗,我的生活愛好這類我感受就是放輕鬆聊,規劃方向這些能夠本身提早準備準備,可是好比創業,offer(以前說過了),價值觀一類的問題,其實你也不知道對方想要什麼樣的回答,乾脆隨緣吧。

騰訊 (12面)

    騰訊的面試有一點印象很深,很考察思惟能力,常常會有一些意想不到的問題,或者智力題。挺有意思。

一面 4.23

  • 上來看了個人簡歷問我會不會C++,我心想雖然學過,可是好幾年不寫,仍是說不會吧,而後面試官很好,就不問了。
  • hashmap底層結構畫一下,手寫代碼作一個url解析器,用正則方式和hashMap的數據結構。
  • 識別2的n次方,寫個函數。(最快的是用位操做,你們應該都知道n&(n-1)能夠去掉二進制最右的1,那2的n次冪&以後便爲0)
  • 本身實現http response響應頭的結構及解析,用buffer(寫個僞代碼)
  • resp頭中都有什麼(主要考察http相關知識)
  • 海量數據找到出現次數最多的100個(內存不足的時候能夠先作hash分片,最後多路merge,每次操做能夠用hashMap計數,也能夠本身作hash函數計數)
  • redis底層實現,zset數據結構(問到了SkipList跳錶這種結構)
  • jvm內存模型,分代,cpu100% 怎麼排查(我覺得問Jconsole的使用,實際上是想問linux性能監測和調優)
  • 用int值表示ip如何作(恰好32位bit一對一映射),寫個僞代碼作transfer
  • nio模型說一下
  • selector中的wakeup什麼含義(這個答得不是很好)
  • select poll epoll (linux內核相關的知識)
  • arraylist.sort怎麼實現的(這個能夠看看TimSort的思想)
  • 怎麼看待java跟c++(說下區別和本身的感覺)
  • 能實習多久(這個好說)
  • 去深圳工做怎麼看(這個真沒想過,不過當時說也能夠吧)
  • 有女友嗎(...)

二面 4.24

    二面其實就兩個大問題,但一直往很深的地方問。

  • 100億個數找最大1000個(說了分片,用堆,再歸併)
  • 問你肯定嗎?(我一想是最大的1000個不是出現次數最多的,實際上是能夠順序讀取,仍是用堆實現)
  • 有什麼缺點,分佈不均勻(說一下堆的複雜度由來)
  • 有沒有其餘思路(用hash散列,計數排序)
  • 這個更慢,還有更快的嗎(我心想我平時就都是答得堆啊,怎麼此次還有更快的?)
  • 而後講了基於partition的劃分思想(找到第k個開始partition,在左邊就在右面遞歸,在右面就在左邊遞歸,最後肯定partition出最大的k個)
  • 這種思想了解了,但最壞狀況太差,不穩定,還有更快的嗎
  • 是否是要用機率統計學,抽樣估計?
  • 說下思想。。
  • 不夠精確,還有又精確又穩定的嗎?
  • 。。。
  • 那又給你一個數,你怎麼快速告訴我是否是在這100億個數中?
  • 這個我知道有多是想問Bloom Filter,可是具體到hash函數去幾個怎麼算,怎麼判斷偏差等細節,我也記不太清了,就說了說思想。

而後進入第二個問題:

  • 一個進程最多申請多大空間(看機器cpu的處理位數看狀況)‘
  • 怎麼保證進程間數據的安全?線程呢?
  • 安全方面有沒有作過一些研究?
  • 登陸驗證怎麼作的,爲何用md5,有沒有改進(+salt使md5庫難解出),微信用的什麼方式你知道嗎?你想一想應該用什麼方式?(這裏多是問SSO單點登陸的原理吧,能夠講講SSO JWT token等技術的原理,這個也是我實習以後瞭解到的,當時答得通常)
  • 那說到通訊安全,怎麼保證http的安全性,冪等性,回調同一個會話怎麼標識不一樣請求,不一樣會話怎麼區分(這個每一個問題都畫圖敘述了下)
  • TCP 3次握手和timewait講一下原理
  • 講一下滑動窗口,飽和了怎麼處理
  • http安全嗎?https說一下?
  • get和post請求
  • linux怎麼查看網絡狀態(vmstat)
  • 查看udp的性能,udp端口多少,何時用udp?
  • 爲何tcp不行?
  • qq裏哪些用的tcp哪些用udp?分別針對每種狀況說一下爲何?

    能夠看到騰訊仍是很愛問網絡通訊、大數據處理的(固然C、C++也很愛問,只不過我說了別問,他們就真沒問,固然你作java的也不要指望他們會問你多少java問題)

    而後當時並無hr面,我心想應該是掛了,可是微信的狀態又遲遲沒掛,結果到了一個月以後五月底我都回家準備入職了(絕對又是補招的備胎),而後打電話問問我的狀況(也沒說是否是準備給offer),問可不能夠去深圳,轉C++方向。

    當時也有比較好的機會了,而且實習轉崗,若是不肯定能留下,絕對是不建議作的一件事,因此就實話實說了。

滴滴新銳(123面)

一面 5.12

  • 說說你對現有Web開發框架的理解(從各個層入手橫向對比優缺點,印象中說了SpringMVC和Struts,mybatis和hibernate及jpa)
  • mybatis和hibernate各自的緩存原理和比較,hibernate的一級二級和查詢緩存,還有針對緩存的miss率,置換策略,容量設置和性能的平衡問了本身的理解。
  • 要你設計的話,如何實現一個線程池(就講線程池的原理,從初始線程數,核心線程數,而後到任務隊列,滿了繼續到最大線程數,再滿了到飽和策略handler,飽和策略通常有哪幾種,基本上要理解ThreadPoolExcuter的構造方法那幾個參數)
  • synchronized關鍵字,實現原理(和Lock對比着說,說到各自的優缺點,synchronized從最初性能差到jdk高版本後的鎖膨脹機制,大大提升性能,再說底層實現,Lock的樂觀鎖機制,經過AQS隊列同步器,調用了unsafe的CAS操做,CAS函數的參數及意義;同時能夠說說synchronized底層原理,jvm層的moniter監視器,對於方法級和代碼塊級,互斥原理的不一樣,+1-1可重入的原理等)
  • 算法:手寫一個ArrayList類,實現add,remove,等基本的方法(主要考擴容的原理和實現,重點寫出擴容機制以及擴容時的copy過程)
  • 而後讓對這個ArrayList進行改進,使之能夠應對併發的場景
  • 算法:手寫字符串的正則匹配,實現*和.的功能,用的遞歸(寫了一半他說時間差很少了,思想大概瞭解了)。

二面 5.12

  • 說說你認爲項目中技術最薄弱的一個地方(答了IO網絡監控和通訊模塊,短鏈接性能太差)
  • 舉例說說在什麼狀況下會出現性能瓶頸,如何優化(答了用NIO的方式)
  • NIO的原理,jdk中有哪些工具和類去實現,如何實現(selector和channel的用法),真的好用嗎?還能夠用什麼?(面試官應該是想問netty,由於沒有實際用過,只能給他講了netty的原理)
  • 那來講說AIO吧,和NIO什麼區別(對異步的理解),AIO在工程中如何實現的?(大概說了下ajax的回調函數),又問回調函數具體是怎麼實現的(傳遞函數指針)。
  • 而後藉着異步IO想問消息隊列,講了一下幾種模型和原理。(面試中沒有用過不要緊,只要你懂原理仍是能夠跟面試官講,起碼能夠證實你是愛學習的)
  • 項目中非技術上的困難(和甲方溝通需求,沒有規範化的項目設計,需求變動太頻繁等),問了我解決的方法還有之後但願怎麼改進。(變相問互聯網公司裏面各個team以及需求方是如何合做和分工的)
  • 講講Spring中怎麼對初始化的bean作其餘操做。(這裏有三種方式,@PostConstruct註解方式,init-method的XML配置方式,InitializingBean接口方式)
  • 三種實現上有什麼區別(還好看過點源碼,其實前兩種是一個意思,都是經過反射的方式用aop思想實現,能夠消除對spring的依賴;接口方式是直接調用afterPropertiesSet方法,效率更高點。spring加載bean時先判斷接口方式,再執行配置註解方式)
  • 算法題,一個先減後增的數組,查找目標值。(這裏並非查找最值,也不是劍指offer上的旋轉數組,可是思想上也能夠用二分的方式)
  • 算法題,兩個大數求和,要按高到低位的輸入,實時輸出結果的對應位,空間O,時間O(n),不借助工具類。(要考慮實時的進位標識,以及多個9以後的連續進位標識)

    兩面完了電話讓去參加新銳的現場終面,頗有誠意地報銷了全部的花銷。新銳的三面仍是有難度,基本上圍着算法在問。

三面 5.12

  • 算法:int範圍的隨機數的階乘編碼實現。
    (這個題若是直接按最簡單的算法題確定是不行的)

    1.首先考慮要用字符串作運算(由於中間數太大了,只有String能保存,固然你能夠藉助BigInteger或BigDecimal類去輔助實現)。
    2.階乘直接計算代價太大,循環太多,考慮設計中間緩存。(正常算複雜度過高,自己就是階乘級的,因此正常想到用時間換空間)
    3.只用空間換時間的話緩存也不能覆蓋所有,若是把全部的中間值保存,空間是eb級別,不現實。(這裏就要達到一個空間和時間複雜度的平衡點)
    4.存部分中間值用部分空間換取時間,達到空間複雜度和時間複雜度的最優平衡。(開始說的二分作分割存儲以後改成等間隔作分隔存儲,間隔選取多長爲好?我以爲要首先肯定空間複雜度的接受極限,而後儘量減少時間複雜度,由於空間複雜度是能夠有預估值的,而時間複雜度固然咱們是但願約小越好的)

(這裏說一下,我並非一開始都想到了,只是面試官一直在提示我思路,給我時間思考,沒有否認過我)

  • 由於頭一次手寫白板,返回類型有錯誤,面試官說你這個編譯器會提示什麼?
  • 又問了異常體系,checked unchecked虛擬機原理怎麼作。
  • 解釋下iaas.paas.saas和之間的關係,外呼接口和服務怎麼調用的。
  • 數據庫主從備和讀寫分離原理,ibatis怎麼配置。(這個只講了數據庫層面的原理,好比監聽線程,主機和從機的同步方式等,可是具體代碼層面的配置,因爲沒親自作過,就說不太知道。)
  • 算法,股票最長增加區間,優化
  • 算法,最長遞增子序列,一個dp數組一個max數組,最優狀況

    ps:這個面試官應該是面試過程當中遇到最nice的一個,也是我如今的老大。其實面試除了自身的因素也有面試官的因素,一個好的面試官不會隨便地否認和質疑你(固然有專門壓力面的),而是可讓你在放鬆的環境下,挖掘你真正對於一個方面的深度和理解。最後的十幾分鍾他並無問我問題,只是在跟我聊天,他跟我說無論是哪一個公司,真正的發展仍是跟部門的方向和氛圍有關係,選擇的時候不要只看公司,作的業務部門方向和leader纔是該去了解和考慮的。做爲應屆生不少時候不那麼瞭解,這就要靠咱們(指面試官)多去了解你想發展的方向。而後聊了不少成長路徑和規劃的事。

    真正實習到如今一個多月,深深以爲面試就是面試,不少知識和題目都是能夠準備的,而工做中面對各類狀況解決問題的能力和方式纔是更重要的。爲了面試準備了不少,工做了發現要學的東西更多,咱們真的還有很長的路要走。

美團(123面)

1面 1hour 5.26

  • java基礎,從頭至尾問了個遍,都是你們準備的,可是也挺深的,包括:
  • hashMap,紅黑樹處理衝突,jdk7和jdk8有什麼區別
  • JUC相關的集合,ConcurrentHashMap jdk7和jdk8的區別,Collections.sort函數jdk7 和 jdk8 分別怎麼實現的。(總感受這個面試官在某段時間確定糾結過兩個版本)
  • CopyOnWriteList底層是什麼,適用的狀況,vector的特色,實現的是List接口嗎。
  • 併發的問題,線程間通訊三種方式
  • 鎖的膨脹過程,Synchronized和Lock的區別,底層的monitor實現和unsafe類的CAS函數,參數表示什麼,寄存器cpu如何作)
  • volatile cpu和寄存器層面是怎麼實現的。
  • 線程池構造函數參數,各類類型的預設池各自的特色,ForkJoinPool是怎麼實現的,多線程等等問了一個遍。
  • 爲何匿名內部類的變量必須用final修飾,編譯器爲何要這麼作,不然會出現什麼問題
    數據庫:
  • 索引的分類。
  • 主鍵索引和普通索引的區別,組合索引怎麼用會失效。
  • 索引的前綴匹配的原理,從B樹的結構上具體分析一下。
  • 彙集索引在底層怎麼實現的,數據和關鍵字是怎麼存的。
  • 組合索引和惟一性索引在底層實現上的區別(這個是整個一面感受答得很差的一個問題,不太明白麪試官想問啥)
  • sql的優化策略,慢查詢日誌怎麼操做,參數含義。
  • explain 每一個列表明什麼含義(關於優化級別 ref 和 all,何時應該用到index卻沒用到,關於extra列出現了usetempory 和 filesort分別的緣由和如何着手優化等)
  • show profile 怎麼使用。

2面 1hour 5.27 (由於這一面問得很深,因此到如今都記得很清楚)

  • 一個url到頁面全過程(讓我能說多詳細說多詳細,最好從OSI七層的每一層去擴展)
  • http的請求頭格式(這個真的記不太清了,只說了幾個有印象的標誌位)
  • getpost區別,post可不能夠用url的方式傳參。
  • 說到了url有最大長度,就問長度有限制是get的緣由仍是url的緣由,爲何長度會有限制,是http數據包的頭的字段緣由仍是內容字段的緣由,詳細說明。(在他一步步追問下答了個差很少)
  • 關於冪等性的詳細介紹。
  • 冪等性是http層面的問題嗎,仍是服務器要處理和解決的內容。(就是看你對冪等性的定性是怎麼理解的)
  • 後臺服務器對於一個請求是如何作負載均衡的,有哪些策略,會出現什麼樣的問題,怎麼解決。(說了一致性hash算法,分佈式hash的特性,具體的應用場景,又非要問我知不知道這個最先在哪一個公司使用的...我說這個真不知道。好像是amazon?)
  • 說說http的缺點,無狀態,明文傳輸。
  • 那https是怎麼作的,如何實現的?ca認證機構。
  • 而後問我https ssl tcp三者關係,其中哪些用到了對稱加密,哪些用到了非對稱加密,非對稱加密密鑰是如何實現的。(還好我項目中涉及到了一些加密)
  • 關於加密的私鑰和公鑰各自如何分配(客戶端拿公鑰,服務器拿私鑰)
  • 那客戶端是如何認證服務器的真實身份,詳細說明一下過程,包括公鑰如何申請,哪一層加密哪一層解密。
  • java的優先級隊列,若是讓你設計一個數據結構實現優先級隊列如何作?
  • 用TreeMap複雜度過高,有沒有更好的方法。
  • hash方法,可是隊列不是定長的,若是改變了大小要rehash代價太大,還有什麼方法?
  • 用堆實現,那每次get put複雜度是多少(lgN)
    (思想就是並不必定要按優先級排隊列的全部對象,複雜度過高,但每次保證能取最大的就行,剩下的順序不用保證,用堆調整最爲合適)
  • 在線編程題:敲一個字串匹配問題,寫了常規代碼。問kmp的代碼思想,最後問了下正則中用的改進後的BM算法。(還有個比較新奇的Sunday算法,有興趣的同窗也能夠看一下)

3面 hr

  • 其實寫了3面,感受根本不算面試了,就是隨便介紹了下部門,而後商量實習時間(大概補招都這樣吧)。由於已經決定去滴滴新銳了,就跟她說可能暑期不能實習,而後說能夠秋招再聯繫。
  • 另外美團這家要跟師弟師妹們說一聲,投簡歷必定仍是要選事業羣的,千萬不要選都喜歡,不然就算過了筆試,也會像我這樣等兩個月大概是補招纔會聯繫到你。


寫在最後

    其實你們能夠從這個過程當中看出來,隨着時間的推動,本身的知識儲備和各方面的經驗和能力都是上升的。

    總結幾句:

  • 對本身要有個定位
  • 準備永遠都不嫌早不嫌多
  • 心態差了及時調整
  • 面試掛了及時總結
  • 這麼多年也該逼本身一把了
    一兩次甚至一系列的失敗並不可拍,成功以後反而沒有失敗總結得透徹,收穫的多。 失敗的經歷會讓你不斷提高能力,成功的經歷會讓你不斷提高信心。而無論成功失敗都會提高你的經驗,都會有收穫。

    因此不要懼怕失敗,由於遲早會成功。
    願你們都能擁有滿意的結局。
相關文章
相關標籤/搜索