這個春招估計也要介紹了吧,自己投的公司也不多吧,投簡歷的時候,如果你提前批和正常網申都投的話,可能會獲得兩次筆試/面試的機會,我投了兩次騰訊,不過,兩次都在二面掛了,特別是第二次二面,我真的決定自己太他媽傻了。作為一個新人,談談我面試過程中犯過的一些錯吧,或許對你也有點收獲。
提前批筆試
騰訊提前批的面試應該是一個月前就開始的,我第一個投的公司就是騰訊了,人生的第一次筆試和面試也獻給了騰訊。先說下筆試吧,筆試是 5 道編程題,個人覺得,騰訊的筆試題比較簡單吧,也就是說,獲得騰訊的面試機會應該算是不難的吧,5 道我好像是做出了 3道 + 一道90%測試用例通過 + 一道也是百分之幾十來着的,忘了。
最后的結論就是,個人感覺騰訊筆試不怎么難,投了之后獲得面試的機會應該非常大,我的簡歷背景是沒有任何亮點的,沒有啥比賽,沒拿過啥獎,非211/985,普普通通。這里建議秋招有興趣的一定要投一下,萬一面試也過了呢,好像我聽說騰訊技術研發是 2輪技術 + 一輪HR面,萬一2輪技術面過了拿offer機會還是挺大。
當然,我聽說前端的 HR 面是綜合面,聽說比比前面的兩輪還難還難過。
提前批一面
一面是視頻面,人生第一次面試,可以說我是很緊張的,一面我完全就是個小白啥套路也不懂,面試官問啥我答啥,完全不會引導,面試完后我感覺自己是真的傻,主要是問了一下問題:
1、瀏覽器輸入一個地址回車之后都發生了啥?
這個可以說是非常高頻的面試題了,我覺得自己這方面還可以,壓抑自己的緊張,好好詳細秀一波,然而,由於我事先並沒有去准備過這個問題,而這個問題又涉及到很多步驟,所以我在邏輯上講非非常非常不好,卡住了好幾下,最后不管三七二十一,就說關鍵詞了:有DNS轉換啊,ip網絡尋址啊,三次揮手啊,可能還有NAT地址轉換啊,還有ARP啊。
可能平時看我文章的人會發現,我是喜歡把這些技術一點點推出來,有邏輯着連起來的,這樣說出來會特別舒服,不過我這次面試的時候,連不起來的,歸根到底就是,沒有准備,頭腦覺得自己都懂,但是不意味着講的出來,所以我在這里是建議各位,對於那些高頻的面試題,自己最后嘗試着口頭去表述一下,或者文字書寫一下,要是你來回答,你會怎么說?
2、TCP 和 UTP 有什么區別?
我在回答這道題的時候,也是非常簡單着回答他們的區別,例如一個面向連接一個非面向連接,一個可靠一個非可靠,非常簡單就答完的。
不過這道題是一個高頻題目,按上面的那個回答,就算回答出來,我覺得也是一點優勢都沒有。因為這些簡單的區別,99%的人都懂,我覺得我們應該再往深入回答,例如TCP有流量控制,擁塞控制,面向流以及基於這些區別,他們的使用場景等等。
不過我並沒有回答,不是我不知道,而是我想假裝不說,等着他來問,因為我聽說面試官都會一直往深問到你不會為止,然而現實是他並沒有問,換話題了。感覺自己錯過了一些表現的機會。
這里我想說的就是:如果你知道,你可以多說一點,千萬別像我這么傻,等着別人來問。
3、寫個快速排序
和算法有關的,我覺得自己還好,寫的雖然不是特別快,但感覺自己寫的還好,無論是從代碼的排版(因為這個一般都是在筆記本寫的,不可能給你IDE),以及代碼的簡便程度,我覺得都不錯,這里我想說的就是,自己平時寫代碼的時候,一定要注意排版,別老是依靠IDE給你一鍵排版。
雖然我已經寫出來了,不過他之后讓我說下快速排序的步驟,我老實說了,不過我覺得,這些題都太簡單,如果面試官的很基礎,你也答的很基礎,我覺得沒啥優勢,對於快速排序,我本來想補充的,例如對中軸的選擇問題,與其他排序算法的一些比較,應用場景等,不過,我是想着等他來問我......
按照我這樣寫文章的話,估計得上萬字,我下面簡便說下就行了。如果你們感興趣我這么啰嗦的話,下次我再來吐槽說說我回答的不夠好的地方。
4、一條SQL執行的很慢的原因?(之前寫過文章,建議看看)
5、MySQL有哪些存儲引擎以及他們之間的區別(我其他引擎忘了名字叫啥)
6、如何查看SQL語句的執行狀態,知道這條命令嗎?(我當時MySQL其實幾乎沒學,很多都不知道)
7、qq用的是tcp還是udp(兩種都有涉及)
8、說說jvm內存模型(其實並沒有JVM內存模型,只有Java內存模型以及JVM內存結構,你要問清楚是哪個再答)
9、JVM內存結構中有棧堆等,為啥要用棧這種數據結構?(主要是操作簡便,快速)
10、說說垃圾回收?(老年代,新生代,永生代的區別等,各自使用的回收算法,新生代又分eden和survivor區等)
11、說說aop和ioc
12、大致看過哪些書?有逛技術論壇的習慣嗎?說幾個你常見的技術博客平台?有去逛過國外的技術博客嗎?看的懂文檔嗎?
總體上一面比較簡單,面試官沒有深入問,不過問的很廣,這里問一些,那里問一下。感覺自己答的還好,也順利過了。第一次面試收獲還是挺大。
1、對於懂的一定要多說,可以延伸,只要面試官不打斷你的回答。
2、對於高頻面試題,一定要自己模擬說一下,而且這些題一般不難,一定要多延伸,不然沒啥優勢。
3、感覺以后面試不那么緊張了,也就這么回事。
提前提二面
幾天后收到復試通知,二面是電話面,二面操作系統和Linux問的有點多,我二面感覺自己就掛在Linux上,我Linux不大懂,被問了好幾個個基礎的問題都不懂,自己也是醉了,感覺自己應該和面試官說一下我Linux還沒學😹。操作系統很多細節也忘了,說說二面的面試題吧。
1、說下四次揮手,什么時候會出現time_wait狀態?(我扯了一下,面試結束后,發現自己弄錯了,真想給自己一巴掌,主要是,其實我對三次握手和四次揮手沒去准備過,雖然看過挺多文章,但是具體的沒記住,涼涼)
2、紅黑樹知道嗎?說說,為啥有了平衡樹還需要紅黑樹?(平衡樹太嚴格,插入很容易打破平衡,經常需要調整,而紅黑樹是一種折中方案......)
3、紅黑樹是如何保證查找效率不會太低下的?(我后面再寫一篇關於紅黑樹,B+樹,平衡樹這些的文章吧,現在先給出這些遇到過的面試題)
4、紅黑樹在調整的時候,不是會用到左旋右旋嗎?說說會不會出現無限左旋右旋的情況,如果不會,那最多旋轉幾次?
5、為什么索引能加快查找效率?
6、說說B+樹是怎么分裂、合並的,知道具體步驟邏輯嗎?
7、你項目用到redis,知道跳躍表嗎?說說他是怎么實現的,查找時間復雜度?
數據結構這部分我覺得自己答的還行,幾乎都答出來的,不過下面的Linux和操作系統有點慘,怪自己沒准備,不過面試就是一個查漏補缺的過程吧。
8、Linux的proc目錄有啥用?(忘了,,,,)
9、怎么查看端口的狀態?(有條啥命令來着的,忘了)
10、怎么查看某個進程的狀態?(也忘了,呵呵,,,,,)
我簡歷上是寫着熟悉Linux常用命令,然而一個也沒答出來,尷尬啊,其實我會用的是那些 ls, cp, mkdir, tar等常用命令,對於線程、網絡相關的都不會,感覺危險了,這么基礎的問題都不會。
11、說說什么是進程,進程包括哪些數據?進程切換的過程是怎么樣的?
12、如果想要讓多個線程執行到某個點,都達到之后再繼續執行,可以用java的那些類來實現?(CountDownLatch和CyclicBarrier這兩個)
13、什么是反射?反射有啥用?
14、說說垃圾回收,jvm是如何知道這個對象可以回收的?計數法有啥問題?如果我們想要指定某種垃圾回收算法,該怎么設置?
15說說aop(這個問的刁難了,我該說的都說),他說,那我也可以通過自己配置文件來實現這種切面啊,為啥就要用AOP呢?(他問的問題就相當於,我用servlet也能使用實現一個網站啊,為啥要用spring這些框架呢?我當時應該要吹一波spring中AOP帶來的好處的,不過我沒說,感覺自己應該吹一下的)
15、接着是問了我那個高並發秒殺系統的項目,說了里面的線程安全問題,然后我這個項目早忘光了,自己也沒准備,代碼我不是自己敲的,直接看視頻的。自己沒做過什么項目,就充當了,結果面試官問了一下線程的問題,我一直沒get到點,搞的自己也好懵,最后才知道他說的是啥,不過項目這塊答的也不好,主要自己也沒動手弄過,又是去年快速看視頻學的。
總體上,二面除了Linux答的非常非常不好,還有四次揮手說錯了,線程包括哪些數據說的也不全之外,以及項目感覺有點被認識不是我做的之后,其它感覺還好。不過。一個多星期后,結果出來,掛了。
不過我也不意外,知道自己有很多需要補的,面試有時運氣不好,可能連續問到好幾個不好的,估計就得掛了,不過這沒方法,最好的做法就是面試過后把自己不足的補上來。
常規網申一面
常規網申的筆試題中是20道選擇題+3道編程題,過幾天就收到面試通知了,有了前面兩次之后的面試經驗之后,也了解到騰訊是特別喜歡問操作系統+計算機網絡+Linux的,於是我把這方面的高頻面試題都好好准備了,Linux 進程等相關都准備了,操作系統也大致准備了,下面說說這次涉及到的面試題。
1、說說網絡建立連接之后是怎么關閉的(其實就是四次揮手,我詳細說了,之前寫過文章)。如果出現大量time_wait 狀態的連接是怎么回事?(我說了第四次揮手出現了丟包、超時等),假如不會出現丟包、超時等,網絡非常流暢呢?(說了短連接導致的)那怎么解決?(我說了限制最大連接,用隊列來緩沖),問我還有其他方法嗎?(我不大知道,好像面試官不大滿意我的回答。不過最好的做法應該是修改 time_wait 等待的最大之間,把時間改小一點)。
2、說說IO阻塞與非阻塞是什么?各自有啥好處?知道多路復用嗎?了解過 select 嗎?說說他與 epoll 的區別。
我知道的也不是很深入,就常規答法,他問啥就答啥。這里我要說一下,我覺得很多人可能混淆了阻塞、非阻塞與異步、同步的概念。我實話,我覺得自己已經理解了,結果我看了好幾篇文章,發現自己反而不懂了,懵了,總覺得缺了點什么影響我對阻塞非阻塞與異步同步的理解,說實話,我看了大概有10篇文章,有80%我覺得都沒有說清楚阻塞非阻塞與異步同步的本質區別。這會影響你對同步阻塞,同步非阻塞,異步阻塞,異步非阻塞的理解。有時間我再來寫一篇文章說說他們的區別,相信看了你就一定懂了。
3、知道樂觀鎖嗎?說說他們適合應用的情景。
4、說說自適應鎖,與其他鎖相比,他的優缺點,什么情況下你覺得可以用自適應鎖?(之前寫過幾種鎖的文章,不懂的建議看)
5、你平時開發是在Linux上開發的嗎?(我靠,Linux上開發??那不是得對Linux上很熟悉?我雖然准備了Linux面試相關,可是這Linux上開發壓根沒體驗過啊,我馬上慫了,馬上說沒有,並且還加了我對Linux不熟,這門課剛學沒幾天。之后他就不問了Linux了,然后接下來我就扎心了)
6、那你平時就是在windows下開發了,那如果你平時項目要上線,這個項目的性能突然很差,你是怎么定位問題的?(我靠,在下從來沒有上線過項目,連用心寫過項目都沒有,這下完,我遲疑了一會),他補充說,例如你可以通過觀察你電腦的cup, 內存,IO 的指標來進行行定位,可以分析下嗎?(可以打開任務管理器來查看cup等的運行情況,然后.....其實我沒有上線過項目,也沒有這樣的經歷),他說沒事,假如遇到這種情況你會怎么分析?(我下面說一下我是怎么扯的)
心想,扎心了,其實我不大知道究竟要分析啥,好吧不管三七二十一了,然后我開始扯了:
1、如果cup一直很高而其他地方內存,IO很低的話,那很有可能項目里面有某些東西在瘋狂運行,但卻沒啥用,很有可能就是自己設計了樂觀鎖,但競爭的線程太多,導致一直做無用功。
2、如果磁盤操作很高,但cup很低,這是意味着項目一直在做IO操作,很有可能是SQL語句寫的不好,導致掃描了大量的磁盤,然后我就針對SQL語句的問題開始扯了,例如沒有用上索引啊,選錯索引啊,扯了一大堆,哈哈。(心想,舒服,剛好寫過sql語句執行的很慢的原因有哪些)。
7、說說進程與線程的區別?進程有哪些通信方式,(我說了共享內存,消息隊列,管道,信號量,套接字,信號驅動),他問還有嗎?(我說其他的不知道了),描述下這些具體的通信方式(我有些具體的給忘了,大致描述了幾個)
8、說說快速排序的思想,刪除單鏈表倒數第二個節點,你會怎么做?
9、了解MySQL事務嗎?說說ACID是啥(我靠,我對事務的隔離理解還強,研究過隔離是如何實現的,然而,,,我突然短路,ACID的D忘了啥,就像你高中那會對一首古詩背的很熟,然后突然就忘了哪句,心里有點扎心),那你具體說說ACID是啥(原子性是,,,隔離性是,,,,一致性?????,我靠,我覺得自己對這四大特性很理解,感覺看名字就知道是啥了,然后說到一致性的時候,我自己的心中產生了疑問,感覺自己並沒有真正意義上理解了一致性,然后我沒說出來)
心中那個苦,一致性都沒說出來,其實我是可以說出來的,但是我總覺得缺了點什么,就像你看了幾篇文章覺得自己懂了,結果讓你在看幾篇文章,你感覺自己有點醒悟了,然后突然發現自己並沒有真正意義上的懂,我查了好多篇文章,呵呵,千篇一律,都不能解答我的疑惑,說實話,別覺得自己懂了,其實你根本就沒有懂,最后是懵逼了好久,才覺得自己應該是懂了,有時間也要寫一篇事務的四大特性的文章。
說實話,網上的很多文章,真的是千篇一律,當你產生了疑惑,很難找到解答,因為你會發現,這幾篇說的都是一樣的,那個你感覺特別重要的疑惑都沒有說到。好吧,不吐槽了,等下要被大佬門懟我寫的文章了。
一面大致說了這么多,有些忘了。比起提前批一面,我覺得自己在表述上好多了,也會扯了,這里我想跟大家說的就是,問題就那些,一定要搞懂,延伸,要理解,該背的要背,例如進程有哪些通信方式。如果要面試騰訊的時候,計算機網絡、操作系統,Linux這些底層的,要學好,盡管你是面試 java 崗位的,可能他一個 Java 的問題都不問的。
想殺了自己的二面
二面我應該就是個傻逼吧,自己給自己挖坑了,最近這些題一直在刷題,復習基礎,對於數據結構,算法題,Java,操作系統什么的,自己也想看看有哪些不足,然后他一開始就叫我介紹項目。
1、說說你做的項目。
其實這期間我為了應付以后的面試弄過做過一個項目,不過還沒弄好。然后我之前不是說了自己有個很水的高並發秒殺系統項目嗎?我自己也沒啥項目經驗,然后我覺得高並發也是很牛逼的樣子,就打算用它了,簡歷上也寫了。不過這個項目我自己沒實操過,看視頻的,很短,幾個小時而已,用到了redis等,不過我已經准備了很多redis相關的知識了,怎么優化的也准備好了。
現實是,呵呵,我被懟的體無完膚。
優化之一就是通過減少事務持有鎖的時間來優化的,例如我們秒殺一個物品的話,如果減庫存和插入訂單兩個操作都成功的話,代表秒殺成功,這兩個操作會在一個事務里完成。問題來了,是先減庫存呢?還是先插入訂單呢?
我說了先插入訂單在減庫存能夠減少事務鎖的持有時間,然后我就被面試官懟死了,如下:
面試官:你覺得你這個優化有用嗎?
我:有啊,可以減少鎖的持有時間(確實可以減少鎖的持有時間)
面試官:那你說說提高了多少並發量?
我:這個,,沒測試過(我是看視頻的,自己也沒有這樣的測試工具,有點尷尬,連測試過都沒有??)
面試官:那你說說這條事務執行需要多少時間
我:我,,好像忘了具體數據,大概是0.00幾秒吧。
面試官:你自己都說0.00幾秒了,這么短時間,你覺得你的這個優化,用處大嗎?有數據來支撐下嗎?
我:,,,,,(真的自己給自己挖坑了,早知道隨便介紹下就好了,不主動說自己的優化了過程了,畢竟自己沒實操過)
面試官:你這個系統能扛多少並發量?
我:...沒測試過(我覺得,面試官覺得這個項目是假的了,可能覺得我是從網上隨便找的,然后來應付面試的,我覺得自己涼了,欺騙可是非常嚴重的)。
面試官:那你說說,完成一條請求用了多少時間(測試最大的並發量可能需要相應的工具,他可能為了再次確認我的真偽,故意是一條請求的?這樣就不需要工具了)
我:.....沒測試過(好吧,我的心已涼)
面試官:好吧,就說到這里,你用過lowJS嗎?
我:啊??lowJS,什么鬼東西?而且他的聲音有點小,我再次確認,是指lowJS嗎?他說是,我說沒聽說過(后來才知道,他說的是Node.js,,,,,,麻痹,,,)。
面試官:你還有啥問題要問的?
呵呵,,,已經涼了,這次面試真的是自己給自己挖坑,面試官肯定是知道我項目是偽造的,這是非常嚴重的事情,然后這個面試大概是持續了10幾分鍾,其他的面試官的也沒問了。想找給人吐槽下自己。
然后,明天就查到掛的信息了,之前二面是一個星期多才查到掛了,這次是十二個小時之后就收到掛了,我也知道10000%掛的了。此刻需要一波安慰!!
總結
總結就是一首涼涼送給自己,還有就是有一些建議,當然,這也是我自己給自己的建義。
1、高頻面試題,別停留於表面,大家都懂,說的很表面沒啥優勢。
2、別以為自己懂了,如果可以,最好自己嘗試描述一下,你可能會描述的很沒有邏輯。
3、好好准備一個項目吧,一定要自己腳踏實地做一下, 別像我,被懟的體無完膚。
4、框架真的問的很少,好好打基礎,數據結構與算法,計算機網絡,操作系統,Linux 進程等相關的命令。
5、面試的第一關是筆試,一般都是編程題,建議要刷刷題,不然面試的機會都沒有。
先寫到這里了,后面會寫一下面試相關的題,建議最后看,雖然你看過相關文章了,但看我的,可能你也能夠有新的收獲!還有就是祝各位大佬面試順序,不好的運氣我來幫你們包攬就行了(留下了委屈的眼淚)
最后推薦下我的公眾號:苦逼的碼農,主要分享一下技術文章、面試題、算法題,各種工具、視頻資源等,里面已有100多篇原創文章,期待各路英雄來交流。(歡迎掃右上角的二維碼關注哦)