1. 程式人生 > >Android開發2017秋招總結+面經

Android開發2017秋招總結+面經

背景

在經歷了春招沉重的打擊(0offer)之後,我終於明白了自身實力與現實的巨大差距。但很不幸的是,我依然沒有拿出百分之百的努力,一堆瑣事和懶惰的心態阻止了我的步伐,導致我在8月初才開始認真的準備秋招。

ps.
1. 面經放在了最後,不想看總結的可以直接跳過。
2. 腳註是我對於秋招的各種心得體會,為了不影響閱讀全部放在文章結尾。

準備

首先我需要對我自身進行一個分析,尋找最適合我的準備方法。

個人條件

先說一下秋招開始時的個人的條件吧,畢竟我的方法可能不是每個人都適合的,只能作為參考。

  • 211本科,計算機專業。
  • 有一兩個獨立完成的個人專案/demo(Android)。
  • 沒有獲獎經歷
  • 沒有實習經歷。
  • 計算機基礎的深度一般,但廣度湊合(就是平常上課都有聽過,但都不認真)。
  • 很少刷題。
  • 在學校的模擬機器人實驗室呆過兩年,擔任 隊長。

優勢

  1. 個人專案均是自己認真做完的,可以仔細聊聊,在專案上可以拓展各種知識點。
  2. 在實驗室付出了很多心血,對整套架構瞭如指掌,可以仔細聊聊實驗室的經歷和收穫。

劣勢

  1. 學歷不夠,非985本科或研究生。
  2. 沒有實習經歷,無法瞭解到真實的業務場景。
  3. 刷題不夠,手撕演算法能力不夠強。
  4. 計算機基礎深度不足,容易被問死。
  5. 專案難度不足,沒有太多亮點。
  6. 缺少重量級獎項(acm之類的)。

分析

  • 由於劣勢1,2,6,我的簡歷很難寫的出彩,也很難走內推通道。
  • 由於劣勢3,4,5,在面試時缺少亮點和深度,無法讓面試官留下太深的印象。
  • 由於優勢1,2,我在聊個人經歷時有很多可以說的內容,可以充分展現我的業務能力和開發基礎。

需要做的事

  1. 提高刷題量,增強演算法能力。
  2. 在Android方面加深基礎,多看面經。
  3. 持續的修改簡歷,突出亮點。
  4. 增加獲獎經歷。
  5. 複習科班基礎。

過程

  • 為了提高演算法能力,我刷完《劍指offer》,瞭解面試官出題的套路;還在LeetCode上AC了20多道Hard難度的題,在牛客上AC20多道低通過率程式設計題,加強手撕程式碼的能力。
  • 為了加強Android基礎,我看了以下書目1
    • 《深入理解Java虛擬機器:JVM的高階特性與最佳實踐》
    • 《Android開發藝術探索》
    • 《Android原始碼設計模式解析與實戰》
    • 《深入理解Android核心設計思想》
    • 《Android開發進階 : 從小工到專家》
  • 為了提高計算機基礎,我複習了以下科目2
    • 計算機網路
    • 作業系統
    • 計算機組成原理
    • 編譯原理
  • 在網路上搜集相關面經,主要是BAT TMD NJ的Android崗位的面經,在看面經的時候我會嘗試回答每個問題,看看自身掌握如何,不會的及時找到答案並弄懂。
  • 由於對內推不抱希望,我在牛客網上刷大量的筆試題。希望通過提高筆試能力,能儘量拿到參加面試的機會。
  • 關注相關的內推與秋招訊息。經常刷牛客、V2EX、知乎、脈脈和各種技術交流群,不放過各種內推或者補錄的通知。
  • 拿獎,增加簡歷亮點。在秋招期間,拿到了國賽三等獎,省賽一等獎,還有普通程式設計大賽的獎項。雖說獎項的含金量不高,但起碼提高了在簡歷篩選關的通過率。
  • 反覆修改簡歷,不斷的試錯3
  • 熟悉專案,仔細發掘專案相關的知識點與技術點並掌握它們4。比如我的一個專案VectorMap用到了自定義View,我就仔細瞭解並記住自定義View的相關知識點,像是觸控事件分發的原理,View的繪製流程,Window Activity View之間的關係等等。
  • 通過大量的面試鍛鍊心態,增強面試穩定性5。儘量做到和麵試官談笑風生,會的講得清,不會的(心態)穩的住。

結果

線下宣講會

  • 投了簡歷
    • 中興
    • 用友
    • 北京華宇
    • 福建頂點
    • 百度外賣
  • 參加筆試
    • 用友
    • 北京華宇
    • 福建頂點
    • 百度外賣
  • 參加面試
    • 中興
    • 用友
    • 北京華宇
    • 福建頂點
  • 拿到offer
    • 中興
    • 用友
    • 北京華宇
    • 福建頂點

內推

  • 投了簡歷
    • 阿里
    • 騰訊
    • 網易
    • 今日頭條
    • 美團
    • 科大訊飛
    • 蘇寧
    • 攜程
    • 迅雷
    • 滴滴
    • 搜狗
    • 愛奇藝
    • 鏈家
    • 餓了麼
    • 58
    • 歡聚時代
  • 參加筆試
    • 攜程
    • 鏈家
    • 網易
    • 58
    • 滴滴
    • 搜狗
    • 愛奇藝
    • 今日頭條
    • 歡聚時代
  • 參加面試
    • 網易
    • 今日頭條

未拿到offer

校招

  • 投了簡歷
    • 阿里
    • 騰訊
    • 網易
    • 京東
    • 美團
    • 小米
    • 拼多多
    • CVTE
    • 招商銀行信用卡中心
    • 微策略
    • 猿輔導
    • 獵豹移動
    • 好未來
  • 參加筆試
    • 阿里
    • 騰訊
    • 網易
    • 京東
    • 美團
    • 小米
    • 拼多多
    • 招商銀行信用卡中心
    • CVTE
    • 微策略
    • 獵豹移動
    • 好未來
  • 參加面試
    • 美團
    • 騰訊
    • 小米
  • 拿到offer
    • 小米
    • 美團

補錄

  • 投了簡歷
    • 騰訊
  • 參加面試
    • 騰訊
  • 拿到offer
    • 騰訊

心路歷程

整個秋招過程還是很戲劇性的。
1. 首先,花了一個多月的時間參加了大量內推卻一無所獲,開始懷疑人生,心態爆炸,壓力驟增。
2. 接下來,為了調整心態參加線下宣講會,拿到了多個小offer,熟悉了面試的環境,增強了自信心,為之後的offer奠定了基礎。
3. 參加校招,頂住壓力在大量的筆試之後終於拿到幾個面試機會,接著奇蹟般地獲得了小米sp和美團的白菜,但掛掉了最想去的騰訊。
4. 最後,發現了補錄機會,抱著試一試的想法投了簡歷,機緣巧合之下參加了線下面試,最後竟然成功拿到騰訊的offer。

經歷了秋招之後,發現心態是最為關鍵的因素。擁有一顆強大的心臟是成功的基礎。經歷失敗後的反思與總結,多次失敗後心態的調整與恢復,成功後不驕不躁的心態,都是未來繼續發展不可或缺的元素。

ps.
在秋招的三個月,總有許多灰暗的日子,在最痛苦的時刻,我的女朋友給予了我支援和鼓勵,真的非常感謝她。

面經

均只有技術面

騰訊

一面 四十分鐘

聊專案,問問題
看過哪些android原始碼
asynctask原理
intentservice原理
service預設執行在哪個執行緒
演算法 一個數組中有兩個數只出現了一次,其他都出現了兩次,找出那兩個數

二面 一個小時

程式設計 使用純c對一段話進行詞頻統計
物理上儲存一個空檔案是否佔據裝置空間
一個100B的檔案儲存到物理裝置上佔用物理空間大小會是多少
平衡二叉樹是什麼
https的作用與原理,證書的作用與包含的內容
客戶端向伺服器傳送3000位元組資料tcp包的流程
說一個專案難點
說一個你提高自己的過程
說一個如何制定計劃的過程

加面 25分鐘

問專案,專案細節
圖片檔案有哪幾種格式
jni函式呼叫的具體實現
程序執行緒區別,執行緒切換的具體實現
演算法 現有一系列區號和對應的地區名稱,如何最高效率的識別某個電話的區號所代表的地區,時間複雜度多少
路由器轉發資料包的具體實現
智力題 三個框,兩個紅球一個白球,隨機放球到框中。求第二框至少有一個紅球的概率

小米

一面 1個小時出頭

個人介紹
聊專案,展示專案,問問題
介紹binder,如何控制binder的訪問
i++是否執行緒安全,如何保證執行緒安全,volatile是否可以
hashmap實現,是否執行緒安全,如果多執行緒進行操作會發生什麼
如何使一個執行緒進入destroy態
程式設計 判斷某個數的各位平方和是否收斂,意思就是最後變成1 收斂,最後迴圈到之前的一個數 不收斂
對未來的發展規劃
拿到哪些offer了,如何給你發offer怎麼選擇
死鎖的發生條件
JNI
是否下載過android原始碼

二面 半個多小時

自我介紹
程式設計 二叉樹兩節點的最近公共父結點
學過哪些專業課,根據專業課問了些問題
資料庫ACID是什麼,原子性的體現
虛存是什麼
虛電路與儲存轉發的區別
TCP協議可以在虛電路上執行麼
路由選擇協議有哪些(我竟然忘了……)
ps.面試官應該不是做安卓的

加面 一個小時

自我介紹
四大元件
service使用場景
後臺service和後臺執行緒的區別,service如何實現跨程序通訊
描述一下AIDL和binder工作原理
binder如何做到資料的跨程序傳遞
核心空間與使用者空間的區別
程序與執行緒的區別
執行緒的排程由誰實現
聽說過協程麼
死鎖的發生情景
handler的工作原理,handler物件在哪個執行緒存活
如何實現blockingqueue
synchronized和Lock的區別
volatile的實現原理
介紹http
http如何保持狀態
cookie的工作原理,存放位置,cookie可以被修改麼,如何驗證cookie有效未被篡改
http相對於https有什麼問題
介紹https工作原理
MVP與MVC區別
聊實驗室專案
工作意願
演算法 最長遞增非連續子序列長度
程式設計 逆時針列印遞增矩陣

美團

一面 一個半小時

自我介紹
介紹專案(聊了不少,最後說 你這個專案還挺有難度的啊……)
專案問題
如何解決OOM的問題
自定義view如何繪製旋轉移動
matrix如何使用
xml解析器有哪些,各有什麼特點
rxjava的特點與優缺點
retrofit為什麼使用介面,底層使用什麼實現的

java的多型
sleep wait方法的區別
synchronized關鍵字的具體特點,可以修飾哪些東西
synchronized修飾靜態方法和非靜態方法的區別
Lock的特點,和synchronized的區別
專案中有關於鎖的優秀實現麼(沒有……)
handler的原理
looper的工作原理
asynctask的原理,同個程序中有多個asynctask例項會互相影響麼
程式設計 判斷二叉樹對稱
四大元件
activity啟動模式
元件的註冊方式
broadcastreceiver動態註冊和靜態註冊的區別
listview效能優化
http狀態碼
如何優化一個演算法

二面 一個小時

自我介紹
列舉一下各種排序演算法
快排的時間複雜度以及計算方法
如何看待排序演算法的穩定性
冒泡是穩定的麼?快排呢?
程序和執行緒的區別
linux跨程序通訊的方法
有哪些GC演算法,各有什麼特點
android的service的實現描述
serverservice幹什麼的
binder的實現
binder使用的基礎技術是什麼
ams幹什麼的,如何使用
四大元件
啟動多個activity,如何直接退回到最底層activity,會回撥什麼方法
觸控事件傳遞,當view在ontouchevent中接受到down事件同時返回false會發生什麼
資料庫事務的特點
虛存的原理
LRUCache的原理
hashmap的原理,hashmap連結串列太長的處理
tcp/ip結構
如何學習(個人經歷)
rxjava的特點,subscribeon和observeon是幹什麼的
註解的作用與特點
0 1揹包和完全0 1揹包問題的區別
程式設計 實現迴圈佇列
程式設計 遍歷viewtree

三面 一個小時

個人介紹
一個app點選一個按鈕請求資料後會做哪些事,畫圖演示
後臺介面與客戶端不一致如何解決
專案中遇到的最難的問題,為此做出的努力
http版本
http長連線在哪個版本強制啟用,如何關閉
http狀態碼分類,各個具體狀態碼的含義
jdk7 相對於jdk6改變
jdk8相對於jdk7改變,包括jvm
jdk7 記憶體分割槽,回收器
cms回收器
程式設計 求陣列交集
對美團的看法
對美團APP的建議

網易

一面 40分鐘

個人介紹
專案介紹
專案如何進行網路通訊,HTTPUrlConnection如何實現輸入輸出流?
Retrofit的原理
Https的原理與作用
LruCache的原理與底層實現方法
HashMap的資料結構
HashMap與HashTable的區別
如何處理多執行緒的資料同步
synchronized和lock的區別
實現一個單例模式
Activity生命週期介紹,按Home之後的生命週期如何變化
是否使用過service,介紹其作用
聊專案,問問題
如何實現listview的拖拽
是否使用過圖片載入開源框架
如何讀取超大圖
如何自定義view
遇到的專案難點
聊實驗室經歷
為什麼要從事Android開發

二面 35分鐘

聊專案
Handler的原理與實現
為什麼有些Handler不能更新UI
MainLooper在哪裡進行初始化的
如何啟動執行緒
如何結束執行緒
interrupt方法一定能中斷執行緒麼
AsyncTask的實現
你覺得使用架構最難的地方是什麼
Android sqllite 資料庫併發如何實現
Activity按Home鍵到後臺再返回時的生命週期
當Activity按Home鍵到後臺時如何儲存資料,具體會呼叫哪些方法
如何保證在橫豎屏切換時生命週期不變
SparseArray和HashMap的區別,SparseArray是否執行緒安全
HashMap與HashTable的區別
Service是否用過
sqllite 事務是否瞭解
Android如何呼叫c++程式碼
Java物件與C++物件如何轉換
最複雜的專案是什麼
自定義view如何實現
view如何處理繪製的內容縮放
專案的難點在哪
如何處理資料回撥顯示在頁面上
如何從A程序知道B程序的Activity是否存活
rxjava和retrofit的底層實現
如何編寫程式碼比較兩個物件
==和equals的區別與使用場景
覺得自己在java還有哪些方面需要提升
java和c++面向物件的區別
專案中如何做記憶體調優
專案中如何控制記憶體洩漏
有沒有使用過第三方工具除錯記憶體洩漏
匿名內部類會導致記憶體洩漏麼,為什麼
如何學習Android
覺得自己是否適合做Android開發
有沒有改造過Android事件分發機制
如何解決滑動衝突

今日頭條

一面 一個小時

專案介紹
自定義view相關
如何繪製大於父view的子view
點選事件流程
傳送網路請求的過程
網路連線失敗的原因
http&https
網路劫持
java類載入過程
android.view由誰載入
程式設計 字典序第k大的數
MVP設計模式
retrofit的瞭解

二面 一個小時不到

專案介紹
view的事件傳遞機制
activity的生命週期
restart方法的呼叫時機,按home鍵的呼叫時機,恢復的呼叫時機,銷燬的呼叫時機
on save/restore instate的時機,誰呼叫,怎麼呼叫,當view沒有設定id還有沒有效果
bundle的資料結構,如何儲存
listview內點選buttom並移動的事件流完整攔截過程
多點觸控如何傳遞
service的意義
android的IPC通訊方式,是否使用過
service如何實現跨程序通訊
android的多執行緒機制
asynctask的原理
handler原理
app啟動後是怎樣執行的(我答的是mainlooper死迴圈)
java的容器種類和原理
hashcode的機制與實現
執行緒池的種類,有沒有用過
http的版本有幾種
http請求包結構,有幾種contenttype
http返回碼的分類,400和500的區別
程式設計 按格式列印view和它的子view

  1. 前兩本都是相當重要的,面試官非常喜歡問上面的知識點。為此我花了幾天的時候從頭到尾看了一遍,並在之後不斷的複習;設計模式也是一個很重要的知識點,第三本書結合了Android原始碼分析了相關的設計模式,非常適合瞭解Android元件的工作原理同時補充設計模式的知識點;後面兩本我個人看的不多,沒有太多建議,想要衝擊Android底層原理的我推薦可以看看第四本。
  2. 前兩門非常重要,在我面試了的那幾場看來,當面試官覺得專案或者其他個人經歷沒有亮點的時候,就會主要考察科班的基礎知識。網路和作業系統則是最關注的兩個點。面試官有時候為了考察面試者的潛力,會問的很深,所以需要吃透相關知識。後兩門可能有些大廠為了更加高效的刷人會問,問的難度也不會太高。
  3. 我一直在研究在基礎不足的情況下如何寫出更有亮點的簡歷,有幾點心得:保證寫在簡歷上的東西和一定要和麵試的崗位有關;一定要突出專案獲得的成績和難點;專案的相關技術知識點一定要爛熟於心;在保證乾貨的情況下儘量縮減字數。
  4. 我認為,如果能熟練掌握專案相關的技術點做到怎麼問都問不倒的時候,會極大提升面試官的評價,而如果被問得左支右絀無法招架的話,可能離面試掛掉也不遠了。
  5. 心態非常重要!沒有好的心態就會出現筆試都過,面試全掛的情況。出現這樣的問題時不要一門心思盯著大廠,很多小公司或傳統軟體企業的校內宣講會都是鍛鍊心態的好機會。大廠被刷心態很容易崩,最後自暴自棄。而小公司或傳統軟體企業不僅難度低,而且主場優勢心態也更平和。在0offer的時候,拿到一個offer心裡也會更有底氣。