春招收獲阿里騰訊實(shí)習(xí)offer,學(xué)習(xí)、面試經(jīng)驗(yàn)分享
先說一下自己的情況,本人今年大四,雙非一本學(xué)校,計算機(jī)相關(guān)專業(yè),從大一開始加入學(xué)院創(chuàng)業(yè)團(tuán)隊(duì)的 Android 開發(fā)組。
去年過年后不久開始投簡歷,前后投了騰訊、阿里、美團(tuán)、CVTE 這幾家公司,拿到了騰訊、阿里和 CVTE 的實(shí)習(xí)offer,最終選擇了騰訊,也算是給自己的第一次找工作之旅畫上了圓滿的句號。
去年9月從實(shí)習(xí)轉(zhuǎn)為正式員工。
這篇文章是去年春招之后的總結(jié),主要是分享我自己針對這次春招所做的準(zhǔn)備工作以及在面試過程中的一些經(jīng)驗(yàn)和思考,因?yàn)榻衲甑拇赫袑?shí)習(xí)也要開始了,所以分享出來,希望能對大家找實(shí)習(xí) 有些幫助。
一、有計劃的系統(tǒng)復(fù)習(xí)
各大互聯(lián)網(wǎng)公司的春招的時間大概是 3 月到 6 月,如果是通過內(nèi)推途徑的話,甚至 2 月份就會開 始電話面試,也就意味著如果想拿到滿意的 offer,你必須在 2 月份之前就做好所有的復(fù)習(xí)工 作。
先講下我自己之前的規(guī)劃,為了準(zhǔn)備這次春招,我提前了半年開始準(zhǔn)備復(fù)習(xí),復(fù)習(xí)階段主要分為三部分:
- 學(xué)習(xí)「自己知道自己不會」的知識
- 全方位的學(xué)習(xí),構(gòu)建自己的「知識體系」
- 學(xué)習(xí)「自己不知道自己不會」的知識
1.1 學(xué)習(xí)「自己知道自己不會」的知識
其實(shí)在開發(fā)過程中,總有一些自己想學(xué)但是因?yàn)轫?xiàng)目壓力或者其他原因,然后自己打算放在以后 再學(xué)的東西,也就是所謂「自己知道自己不會」的知識。
例如:
- 比較常用的一些框架,比如客戶端的網(wǎng)絡(luò)請求、圖片加載框架
- 常用的一些類和集合的源碼,比如 ArrayList、LinkedList、HashMap(面試必問)
- 覺得自己無法清晰表達(dá)出來的概念,如「內(nèi)存泄露」、「Java 并發(fā)」
這個階段是一個對自己當(dāng)前知識體系查漏補(bǔ)缺的一個階段,你要做的,就是把自己不會的東西完 整的列出來,然后逐個擊破。
這個階段最好通過博客的形式,將自己學(xué)到的東西「用自己的語言」表達(dá)出來,如果你能用自己的理解清晰、完整地說出來,甚至能讓別人聽懂你講的東西,那基本就沒問題了。
但如果自己腦海里沒法形成一個清晰的概念的話,只能證明你對這個知識點(diǎn)還不夠理解。
而且現(xiàn)在很多公司都將「寫博客」作為一個加分點(diǎn),一份簡歷其實(shí)并不能反映多少東西,但如果你有一個長期維護(hù)的博客的話,面試官可以通過你的博客更加清楚地了解你,而且堅持本身就是 一件不容易的事情,面試官對于能夠堅持寫博客的人也會更加有好感。
1.2 全方位的學(xué)習(xí),構(gòu)建自己的「知識體系」
其實(shí)很多人在平時學(xué)習(xí)技術(shù)和日常開發(fā)過程中,學(xué)了非常多的東西,但很少有人會去系統(tǒng)地復(fù) 習(xí),從而構(gòu)建自己的知識體系,導(dǎo)致自己學(xué)到的很多知識點(diǎn)沒辦法更好的產(chǎn)生聯(lián)系,而且可能會 導(dǎo)致學(xué)了某個知識點(diǎn)沒過多久就忘了。
那如何構(gòu)建我們的「知識體系」呢?
Android 里面所謂的「知識體系」,我認(rèn)為主要包含這幾個部分:
- Java 和 Anroid 基礎(chǔ)
- 計算機(jī)網(wǎng)絡(luò)
- 操作系統(tǒng)
- 設(shè)計模式
- 數(shù)據(jù)結(jié)構(gòu)和算法
也就是說我們需要將這幾個部分逐步擊破,慢慢完善我們的知識體系,這個階段是最花時間和精力的,但是堅持下來會讓我們的基礎(chǔ)變得更加扎實(shí),而且能最大限度的構(gòu)建我們的知識體系。
在這里我推薦一份非常好的資料:Android 校招面試指南
https://lrh1993.gitbooks.io/android_interview_guide/content/
1.3 學(xué)習(xí)「自己不知道自己不會」的知識
這個標(biāo)題可能會讓你們有點(diǎn)納悶,連自己都不知道自己不會的知識怎么學(xué)?
這時候面試題的作用就出來了,「面向面試題編程」其實(shí)是一個查漏補(bǔ)缺、增強(qiáng)自己編程基礎(chǔ)的非常好的方式。
在做 面試題的時候,你會遇到很多奇奇怪怪的問題,很多都是你「之前沒有接觸過」或者「有接觸過卻沒有往那方面想」的問題。
剛開始遇到這些面試題確實(shí)很讓人很不舒服,但是這些面試題也確實(shí)能夠最大限度地提升我們對知識之間聯(lián)系的理解以及引發(fā)我們對一些具體使用場景的思考。
當(dāng)然更重要的是我們可以通過刷往年各大互聯(lián)網(wǎng)公司的面試題,讓我們對于公司面試題有一個大致的認(rèn)識而且也能提前了解到面試官面試時候的一些套路和做法。
在這里推薦一些我看過的,覺得很不錯的面試資料:
Android 面試指南
https://xiaozhuanlan.com/android-interview
AndroidInterview-Q-A
https://github.com/JackyAndroid/AndroidInterview-Q-A
Android LearningNotes
https://github.com/francistao/LearningNotes
Android 面試
https://www.jianshu.com/nb/3450453
二、面試的一些建議和套路
首先,要強(qiáng)調(diào)一點(diǎn),想拿到自己滿意的 offer,最重要的就是提升自己的編程能力,特別是計算機(jī)方面的基礎(chǔ),這是每輪技術(shù)面試都必問的。沒有足夠的實(shí)力,再高的面試技巧也是沒用的。
不過,在面試中確實(shí)也有很多需要注意的地方,甚至存在一些通用的經(jīng)驗(yàn)和套路。
掌握一些必要的面試技巧才能在面試官面前最大程度的展示我們自己真正的水平,甚至超常發(fā)揮,從而拿到滿意的offer。
2.1 尋找自己的興趣點(diǎn),并將其培養(yǎng)成自己的瑞士軍刀
在學(xué) Android 的過程中,其實(shí)每個人都有著自己跟別人不一樣的興趣點(diǎn),例如我自己對 「Android 網(wǎng)絡(luò)」、「圖片加載」這兩方面的知識就有很大的興趣。
如果想要在 Android 面試中脫穎而出,拿到讓自己滿意的 offer,擁有某個「能超過絕大部分人」的技能是非常必要的,也就是所謂的你最出彩的地方。
在這次阿里技術(shù)二面的時候,面試官一上來就說:“上一輪的面試官已經(jīng)問了很多關(guān)于項(xiàng)目的東 西了,你給我講一下你覺得自己在 Android 中學(xué)的最好的東西吧。”
當(dāng)時聽到這個問題我心中一陣竊喜,因?yàn)橹盎撕芏嗟臅r間和精力在學(xué)習(xí)「Android 網(wǎng)絡(luò)」和「圖片加載」這兩方面,對 于這兩方面我還是很有把握的,最終也順利通過了阿里的技術(shù)面試。
上面舉的例子就是為了說明擁有某些技術(shù)特長的重要性,在面試中很多時候面試官關(guān)心的是你會什么,而不是糾結(jié)你不會什么。
而且技術(shù)的深度也比廣度要重要的多,如果你在某方面研究的比 較深,很有自己的心得和體會,甚至連面試官在這方面都沒辦法問倒你的話,通過這次面試的成功率就會大大增加。
2.2 將所有的知識點(diǎn)寫成對應(yīng)的逐字稿
在日常的 Android 開發(fā)和學(xué)習(xí)過程中,相信很多人會覺得我們學(xué)過的東西自己都已經(jīng)明白了,但是真正在面試官面前,被面試官問到問題的時候卻不知道怎么「完整」、「清晰」地表達(dá)出來。
針對這個問題,我自己的解決方法是將我們在面試中可能會遇到的所有的知識點(diǎn)「全部」都寫成 對應(yīng)的逐字稿。
這里的逐字稿有三個要點(diǎn):
- 必須是自己的總結(jié)和體會
- 結(jié)合你自己的開發(fā)和項(xiàng)目經(jīng)歷
- 能夠流暢的朗讀出來
寫逐字稿的目的是讓我們在面試官面前能夠「完整」、「清晰」地表達(dá)出我們對知識的把握和理解,所以必須用「自己的語言」將自己的總結(jié)和體會寫出來,只有這樣我們才能記得更牢。
在寫完逐字稿之后,我們可以試著朗讀一下,看看能不能流暢的朗讀出來,如果中間有一些拗口或別扭的句子,就把它逐漸改進(jìn)。
在這里,我用「講講你對進(jìn)程和線程的理解」這個問題來詳細(xì)講一下,如果我們在事先沒有準(zhǔn)備好相應(yīng)的逐字稿的話,我們可能就會直接講:
線程是 CPU 調(diào)度的最小單元,同時線程也是一種有限的資源。而進(jìn)程相當(dāng)于線程的“容器”,在PC 和移動設(shè)備上指一個程序或者一個應(yīng)用。一個進(jìn)程可以包含多個線程。
然后就這么完了,完了,了。20 秒解決問題,接著面試官估計也會回你一句,今天就這么結(jié)束吧。
在這里分享一下我自己對于「進(jìn)程與線程」的部分逐字稿,大家可以參考一下。
進(jìn)程與線程
按照操作系統(tǒng)中的描述。線程是 CPU 調(diào)度的最小單元,同時線程也是一種有限的資源。而進(jìn)程相當(dāng)于線程的“容器”,在 PC 和移動設(shè)備上指一個程序或者一個應(yīng)用。一個進(jìn)程可以包含多個線程。
進(jìn)程
當(dāng)一個程序第一次啟動的時候,Android 會啟動一個 Linux 進(jìn)程和一個主線程。
默認(rèn)情況下, 同一應(yīng)用的所有組件均在相同的進(jìn)程中運(yùn)行。如果我們需要控制某個組件所屬的進(jìn)程,則可在 AndroidManifest 文件中執(zhí)行此操作。
組件運(yùn)行在哪個進(jìn)程中,是在 AndroidManifest 文件中進(jìn)行設(shè)置的,activity、service、 receiver 和 provider 均支持 android:process 屬性,此屬性可以指定該組件應(yīng)在哪個進(jìn)程運(yùn)行。我們可以設(shè)置此屬性,使每個組件均在各自的進(jìn)程中運(yùn)行。
進(jìn)程的優(yōu)先級
Android 系統(tǒng)將盡量長時間地保持應(yīng)用進(jìn)程,但為了新建進(jìn)程或運(yùn)行更重要的進(jìn)程,最終需要移除舊進(jìn)程來回收內(nèi)存。為了確定保留或終止哪些進(jìn)程,系統(tǒng)會根據(jù)進(jìn)程中正在運(yùn)行的組件以 及這些組件的狀態(tài),將每個進(jìn)程放入 “重要性層次結(jié)構(gòu)” 中。必要時,系統(tǒng)會首先消除重要性最低的進(jìn)程,然后是重要性相對較高的進(jìn)程,以此類推,以回收進(jìn)程。
重要性層次結(jié)構(gòu)一共有 5 級
1、前臺進(jìn)程 — Foreground process
2、可見進(jìn)程 — Visible process
3、服務(wù)進(jìn)程 — Service process
4、后臺進(jìn)程 — Background process
5、空進(jìn)程 — Empty process
線程
線程在 Android 中是一個很重要的概念,從用途上來說,線程分為主線程和子線程,主線程的 作用是「運(yùn)行四大組件以及處理它們和用戶的交互」,而子線程的作用則是「執(zhí)行耗時任務(wù), 比如網(wǎng)絡(luò)請求、I/O 操作等」,由于 Android 的特性,如果在主線程中執(zhí)行耗時操作那么就會 導(dǎo)致程序無法及時地響應(yīng)。因此耗時操作必須放在子線程中執(zhí)行。
Android 中的線程形態(tài)
除了 Thread 本身以外,在 Android 中可以扮演線程角色的還有很多,比如 AsyncTask 和 IntentService,同時 HandlerThread 也是一種特殊的線程。
盡管 AsyncTask、IntentService 以及 HandlerThread 的「表現(xiàn)形式」都有別于傳統(tǒng)的線程,但是它們的本質(zhì)仍然是傳統(tǒng)的線程。
我相信,如果你能像我上面的逐字稿這樣,結(jié)合 Android 里面的知識點(diǎn)清晰地表達(dá)出你對進(jìn)程和線程的理解的話,面試官肯定會很滿意的。
這里附上我自己的逐字稿目錄,大家也可以按照這樣的分類,來對自己的「知識體系」建立不同的逐字稿。
2.3 遇到不懂的面試題直接回答不懂,但最好能將面試官的思路往我們會的東西帶
在面試的時候,切勿不懂裝懂。
我們面試的是技術(shù)崗位,有幾斤幾兩,面試官問幾個問題就知道 了,如果面試官問到的某個知識點(diǎn),你只是有點(diǎn)印象或者沒多少了解的話,直接回答這個知識不是很熟就行了。不然被面試官針對這個知識點(diǎn)追加幾個問題的話,分分鐘打你臉。
當(dāng)然,在說對這個知識不是很熟之后,可以試著將面試官的面試思路往我們會的東西帶,例如我 在阿里二面的時候,面試官問我有沒有用過 B 樹,因?yàn)槲覍?B 樹不是很熟,所以我當(dāng)時是這么講 的:“對于 B 樹不是很熟悉,但之前在看 HashMap 源碼的時候,有研究過紅黑樹,對紅黑樹比較熟。” 然后成功地將面試官的問題轉(zhuǎn)向了我熟悉的紅黑樹和 HashMap 的源碼上面。
2.4 有意識地鍛煉自己的溝通和表達(dá)能力
如果想拿到滿意的 offer,除了自身的技術(shù)實(shí)力過硬之外,擁有良好的溝通和表達(dá)能力也是非常重要的。
即使實(shí)力再強(qiáng),你不能很好的表達(dá)出來的話,也是白費(fèi)功夫。溝通和表達(dá)能力需要長時間的「刻意練習(xí)」,并沒有什么捷徑。
其實(shí)在大一的時候,我的溝通和表達(dá)能力也是相當(dāng)差的,但后來自己開始慢慢明白了這項(xiàng)能力的重要性,所以在很多場合都會「刻意練習(xí)」這項(xiàng)技能。
而且自己后來當(dāng)上了團(tuán)隊(duì)的負(fù)責(zé)人,有很多場合都需要我上臺演講或者進(jìn)行一些內(nèi)部的分享,再加上自己后來很喜歡玩「狼人殺」,表達(dá)能力便在這兩年間有了很大的提升。
2.5 每一次面試完都要進(jìn)行復(fù)盤,詳細(xì)記錄面試問到的題目
在每一輪面試結(jié)束之后,不要急著放松或者休息,先拿出備忘錄將面試中面試官問到的問題「全部」都詳細(xì)地記錄下來。而且找個安靜的地方慢慢的回憶自己在面試過程中有沒有哪些環(huán)節(jié)表現(xiàn)得不是很好或者是需要改進(jìn)的。
每一次的面試都是一個很寶貴的經(jīng)驗(yàn)和財富,在面試過后都要對面試進(jìn)行復(fù)盤,找出我們在面試中表現(xiàn)的不夠好的地方,然后針對性地進(jìn)行改進(jìn),以及收集在面試過程中我們答不出來的面試題,有針對的進(jìn)行復(fù)習(xí),指不定下一輪面試問的就是你上一輪面試不會的問題,而且這個可能性是相當(dāng)大的,因?yàn)槊嬖嚬僦g也是會進(jìn)行交流的,你的面試表現(xiàn)也會傳到下個面試官的手中。
三、總結(jié)
想要拿到滿意的 offer,「堅持」是最重要的,拋開了努力和堅持,其他的一切方法論都毫無用處。
任何一個行業(yè)都是不容易的,唯有持續(xù)的「有效」努力,才能走得更遠(yuǎn)。 以上便是我對于春招面試的一些經(jīng)驗(yàn)和體會,希望能對大家有所幫助。
【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】