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