Android 實習 | 如何在春招中拿到滿意的 offer
先說一下自己的情況,本人今年大四,雙非一本學校,計算機相關專業,從大一開始加入學院創業團隊的 Android 開發組。
去年過年後不久開始投簡歷,前後投了騰訊、阿里、美團、CVTE 這幾家公司,拿到了騰訊、阿里和 CVTE 的實習 offer,最終選擇了騰訊,也算是給自己的第一次找工作之旅畫上了圓滿的句號。
這篇文章是去年春招之後的總結,主要是分享我自己針對這次春招所做的準備工作以及在面試過程中的一些經驗和思考,因為今年的春招實習也開始了,所以分享出來,希望能對大家找實習有些幫助。
一、有計劃的系統複習
各大網際網路公司的春招的時間大概是 3 月到 5 月,如果是通過內推途徑的話,甚至 2 月份就會開始電話面試,也就意味著如果想拿到滿意的 offer,你必須在 2 月份之前就做好所有的複習工作。
先講下我自己之前的規劃,為了準備這次春招,我提前了半年開始準備複習,複習階段主要分為三部分:
- 學習「自己知道自己不會」的知識
- 全方位的學習,構建自己的「知識體系」
- 學習「自己不知道自己不會」的知識
1.1 學習「自己知道自己不會」的知識
其實在開發過程中,總有一些自己想學但是因為專案壓力或者其他原因,然後自己打算放在以後再學的東西,也就是所謂「自己知道自己不會」的知識。
例如:
- 比較常用的一些框架,比如客戶端的網路請求、圖片載入框架
- 常用的一些類和集合的原始碼,比如 ArrayList、LinkedList、HashMap(面試必問)
- 覺得自己無法清晰表達出來的概念,如「記憶體洩露」、「Java 併發」
這個階段是一個對自己當前知識體系查漏補缺的一個階段,你要做的,就是把自己不會的東西完整的列出來,然後逐個擊破。這個階段最好通過部落格的形式,將自己學到的東西「用自己的語言」表達出來,如果你能用自己的理解清晰、完整地說出來,甚至能讓別人聽懂你講的東西,那基本就沒問題了。但如果自己腦海裡沒法形成一個清晰的概念的話,只能證明你對這個知識點還不夠理解。
而且現在很多公司都將「寫部落格」作為一個加分點,一份簡歷其實並不能反映多少東西,但如果你有一個長期維護的部落格的話,面試官可以通過你的部落格更加清楚地瞭解你,而且堅持本身就是一件不容易的事情,面試官對於能夠堅持寫部落格的人也會更加有好感。
1.2 全方位的學習,構建自己的「知識體系」
其實很多人在平時學習技術和日常開發過程中,學了非常多的東西,但很少有人會去系統地複習,從而構建自己的知識體系,導致自己學到的很多知識點沒辦法更好的產生聯絡,而且可能會導致學了某個知識點沒過多久就忘了。
那如何構建我們的「知識體系」呢?
Android 裡面所謂的「知識體系」,我認為主要包含這幾個部分:
- Java 和 Anroid 基礎
- 計算機網路
- 作業系統
- 設計模式
- 資料結構和演算法
也就是說我們需要將這幾個部分逐步擊破,慢慢完善我們的知識體系,這個階段是最花時間和精力的,但是堅持下來會讓我們的基礎變得更加紮實,而且能最大限度的構建我們的知識體系。
在這裡我推薦一份非常好的資料: Android 校招面試指南

1.3 學習「自己不知道自己不會」的知識
這個標題可能會讓你們有點納悶,連自己都不知道自己不會的知識怎麼學?這時候面試題的作用就出來了,「面向面試題程式設計」其實是一個查漏補缺、增強自己程式設計基礎的非常好的方式。在做面試題的時候,你會遇到很多奇奇怪怪的問題,很多都是你「之前沒有接觸過」或者「有接觸過卻沒有往那方面想」的問題。
剛開始遇到這些面試題確實很讓人很不舒服,但是這些面試題也確實能夠最大限度地提升我們對知識之間聯絡的理解以及引發我們對一些具體使用場景的思考。當然更重要的是我們可以通過刷往年各大網際網路公司的面試題,讓我們對於公司面試題有一個大致的認識而且也能提前瞭解到面試官面試時候的一些套路和做法。
在這裡推薦一些我看過的,覺得很不錯的面試資料:
二、面試的一些建議和套路
首先,要強調一點,想拿到自己滿意的 offer,最重要的就是提升自己的程式設計能力,特別是計算機方面的基礎,這是每輪技術面試都必問的。沒有足夠的實力,再高的面試技巧也是沒用的。
不過,在面試中確實也有很多需要注意的地方,甚至存在一些通用的經驗和套路。掌握一些必要的面試技巧才能在面試官面前最大程度的展示我們自己真正的水平,甚至超常發揮,從而拿到滿意的 offer。
尋找自己的興趣點,並將其培養成自己的瑞士軍刀
在學 Android 的過程中,其實每個人都有著自己跟別人不一樣的興趣點,例如我自己對「Android 網路」、「圖片載入」這兩方面的知識就有很大的興趣。如果想要在 Android 面試中脫穎而出,拿到讓自己滿意的 offer,擁有某個「能超過絕大部分人」的技能是非常必要的,也就是所謂的你最出彩的地方。
在這次阿里技術二面的時候,面試官一上來就說:“上一輪的面試官已經問了很多關於專案的東西了,你給我講一下你覺得自己在 Android 中學的最好的東西吧。”當時聽到這個問題我心中一陣竊喜,因為之前花了很多的時間和精力在學習「Android 網路」和「圖片載入」這兩方面,對於這兩方面我還是很有把握的,最終也順利通過了阿里的技術面試。
上面舉的例子就是為了說明擁有某些技術特長的重要性,在面試中很多時候面試官關心的是你會什麼,而不是糾結你不會什麼。而且技術的深度也比廣度要重要的多,如果你在某方面研究的比較深,很有自己的心得和體會,甚至連面試官在這方面都沒辦法問倒你的話,通過這次面試的成功率就會大大增加。
將所有的知識點寫成對應的逐字稿
在日常的 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 裡面的知識點清晰地表達出你對程序和執行緒的理解的話,面試官肯定會很滿意的。
這裡附上我自己的逐字稿目錄,大家也可以按照這樣的分類,來對自己的「知識體系」建立不同的逐字稿。

遇到不懂的面試題直接回答不懂,但最好能將面試官的思路往我們會的東西帶
在面試的時候,切勿不懂裝懂。我們面試的是技術崗位,有幾斤幾兩,面試官問幾個問題就知道了,如果面試官問到的某個知識點,你只是有點印象或者沒多少了解的話,直接回答這個知識不是很熟就行了。不然被面試官針對這個知識點追加幾個問題的話,分分鐘打你臉。
當然,在說對這個知識不是很熟之後,可以試著將面試官的面試思路往我們會的東西帶,例如我在阿里二面的時候,面試官問我有沒有用過 B 樹,因為我對 B 樹不是很熟,所以我當時是這麼講的:“對於 B 樹不是很熟悉,但之前在看 HashMap 原始碼的時候,有研究過紅黑樹,對紅黑樹比較熟。” 然後成功地將面試官的問題轉向了我熟悉的紅黑樹和 HashMap 的原始碼上面。
有意識地鍛鍊自己的溝通和表達能力
如果想拿到滿意的 offer,除了自身的技術實力過硬之外,擁有良好的溝通和表達能力也是非常重要的。即使實力再強,你不能很好的表達出來的話,也是白費功夫。溝通和表達能力需要長時間的「刻意練習」,並沒有什麼捷徑。
其實在大一的時候,我的溝通和表達能力也是相當差的,但後來自己開始慢慢明白了這項能力的重要性,所以在很多場合都會「刻意練習」這項技能。而且自己後來當上了團隊的負責人,有很多場合都需要我上臺演講或者進行一些內部的分享,再加上自己後來很喜歡玩「狼人殺」,表達能力便在這兩年間有了很大的提升。
每一次面試完都要進行復盤,詳細記錄面試問到的題目
在每一輪面試結束之後,不要急著放鬆或者休息,先拿出備忘錄將面試中面試官問到的問題「全部」都詳細地記錄下來。而且找個安靜的地方慢慢的回憶自己在面試過程中有沒有哪些環節表現的不是很好或者是需要改進的。
每一次的面試都是一個很寶貴的經驗和財富,在面試過後都要對面試進行復盤,找出我們在面試中表現的不夠好的地方,然後針對性地進行改進,以及收集在面試過程中我們答不出來的面試題,有針對的進行復習,指不定下一輪面試問的就是你上一輪面試不會的問題,而且這個可能性是相當大的,因為面試官之間也是會進行交流的,你的面試表現也會傳到下個面試官的手中。
總結
想要拿到滿意的 offer,「堅持」是最重要的,拋開了努力和堅持,其他的一切方法論都毫無用處。任何一個行業都是不容易的,唯有持續的「有效」努力,才能走得更遠。
以上便是我這半年來對於面試的一些經驗和體會,希望能對大家有所幫助。