摘要
開篇之前,首先說一下,大神就別點進來了。博主只是塵世間一個迷途小開發,二流程式設計師。
這篇文章並不像其他面經一樣金光閃閃,只是一個二流Android攻城獅在市場的大潮之下,用一個月時間面試+複習+總結,最終拿到了自己喜歡公司offer(非一線大廠,但是薪資也漲了40%多,對我來說已經很滿意惹)的故事。
當然,大廠誰不想去呢?可是時間緊,生活壓力大,計劃趕不上變化。生活的真諦就是妥協而已。
前提
出來社會摸爬滾打三年多,不得不承認人是分三六九等的。即便是專注度、努力這些頗為客觀的因素,也是因人而異的。(沒辦法,我也知道客觀上應該努力啊555~~,可我主觀上只想躺著刷B站~~555)
First,先列一下博主目前的客觀情況:
- 雙非本科,非計算機專業。本專業是機械
- 工作三年,都是小廠,小組最多沒超過4個人
- 演算法基礎一丟丟(翻書‘馬冬梅’,合書‘什麼梅’)
- 英語水平半文盲
- 有一個自己常年維護的部落格,GitHub所有專案加起來有200多個star
- 懂一點應用層方面的音視訊編解碼知識
如何準備
我是從8月接近中旬開始面試的,一直到9月初結束,整個面試週期滿打滿算有一個月的時間(我是相當於裸辭找工作的)。這次面試採用的策略是以戰代練,就是邊面邊複習。面試的話,主要是朋友內推,Boss和拉勾。但Boss的話,初期不建議把簡歷可見,我就在這方面吃了苦頭(別提了都是淚)。
接下來我將這一個月內我接觸的知識點鋪展開來,也給大家一點參考。
書籍:《Android開發藝術探索》、《Android進階之光》、《Android進階解密》、《圖解Http》
書是不能不看的,以上這幾本,除了圖解Http之外,都要大致讀一遍。當然時間可能沒那麼充裕,所以要跟著目錄,挑一些自己的弱項好好複習一下。
Http這本書是因為有幾家公司面試問到了網路相關的知識,所以我才去閱讀的
演算法:LeetCode,把連結串列、排序、樹標籤裡所有簡單型別的題目練一下手。特別是排序,冒泡、快速、二分、選擇、歸併一定要達到手寫的水平!
資料結構:Java的HashMap——7和8的區別、ArrayList、LinkeList。Android的ArrayMap、SparseArray系列。還有阻塞佇列ArrayBlockingQueue、LinkedBlockingQueue。HashMap的結構和細節是遇到最多,建議仔細看一下原始碼,一定要有自己的理解(劃重點)。把HashMap如何儲存、如何查詢。hash碰撞,以及記憶體利用率這些問題理解一下
設計模式和架構:準備一些自己拿手的模式,在網上查一下資料。準備一些套話,關鍵詞耦合
,二次修改方便
,外部不用關心內部實現
等等。MVC、MVP、MVVM三種,起碼要了解兩種,並且能清晰明確的說出,兩種架構間的優缺點。
我本身經歷過一次MVC -> MVP的過渡,所以面試的時候就只提了這兩種。MVVM沒接觸過,就實話實說沒搞過,面試官也不會再問。千萬不要打腫臉充胖子,沒接觸過就說不會就可以了。
關鍵詞:UI邏輯
、業務邏輯
、不影響對方的前提下修改
、邏輯清晰,方便定位
簡歷:這個就8用提了,面試的敲門磚。我的簡歷也寫的不是很好,但因為會一點音視訊的知識,所以還是有一點加分項的。簡歷要注意簡潔明瞭,star法則;諸如:我做了A工作,將效率提高200%、我優化了xxx,把速度優化了10~20倍。1 ~ 2頁最佳
最開始寫簡歷的時候,實在不知道該如何動筆。磨磨蹭蹭憋了好幾天沒整出來。其實這個時候就要平心靜氣,把自己的思維拔高一點。站在整個專案的角度去細細檢視,這個時候就會發現專案中還是有不少亮點的。
Android基礎:這個就很重要了,當然涉及面也相當廣。四大元件,生命週期這個啥都不說了,直接衝就是了,基本都會問到
。Handler、View繪製流程、事件分發,這些都是老生常談。
Android框架基礎:AMS,Activity的啟動過程。Android繪製流程(這個看個人了,因為我簡歷上寫了熟悉Canvas哭,手動狗頭
)
Java基礎:多執行緒、執行緒池、鎖機制,這兩個知識點問到的還挺多的。其他的包括,記憶體區域、記憶體洩漏、垃圾回收。。。(這些懂個概念即可,不深究)
面試
以上是一些複習的知識點,因為要準備的東西還是蠻多的。所以時間上的安排一定要靈活,我是早上覆習Java基礎,中午看Android,晚上覆習演算法和資料結構。有面試的話,就提前去了解一下公司的產品,去官網上衝一衝浪,下個APP玩一下。也算提前給自己一個心理準備。
以下是一些面試題,供給大家參考:
- RecycleView複用機制
- RecyclerView的LayoutManager如何佈局
- 設計模式:觀察者模式
- APP啟動優化
- 註解原理
- java記憶體模型
- 記憶體洩漏處理;可能出現的記憶體洩漏問題
- 效能優化如何做——
這是一個比較泛的問題,主要從佈局分析、繪製分析、記憶體優化幾個大的方面去延伸,如何定位、如何解決,說出自己的理解和經驗即可
- 連結串列和陣列比較
- 死鎖和多執行緒——
因為自己說禿嚕嘴了,提了一句死鎖。就被問到了555,好慘。所以千萬別裝,不會就別提
- 自定義view。要具體到在onMeasure裡怎麼處理,onLayout怎麼處理
- 矩陣原理,因為我說了我熟悉Canvas
- 事件處理,事件分發。
同學們,這道題基本必問。敲黑板!
- 差值器原理
- 執行緒池原理,涉及到阻塞佇列
- Kotlin,apply和let區別
- AS如何檢查記憶體洩漏——考察你的工具使用熟練度
- canvas的繪製是如何實現的——
硬繪和軟繪
- 遇到的印象最深一次的記憶體問題
- 如何寫一套圖片載入庫——
考驗你的綜合能力
- Bitmap的快取,軟引用、Lrucache。recycle如何實現
- view的post如何實現
- Fragment和View的區別
- Http的請求方式,RestFul熟悉嗎——
網路我基本只知道一些概念
- linearlayou 和relativelayou效能比較
- MessageQueue 和message 的建立
- 手寫快速排序,手寫二分查詢
好了,以上就是遇到的一些問題。還有些問題涉及到音視訊這方面,因為不具有通用性,我就不提了。
還是那句老話,面試是一個雙向考察的過程,面試官考察你,同時你也要考察考察公司。要真是不喜歡的話,工作做得也不開心,當然也不會長久。工作畢竟還是佔據了生活中的大部分時間,找一個自己喜歡並願意投入的工作對自己的成長也好一點。
同時,面試也是一個考察綜合能力的地方。不要以為技術上準備的很充分了就萬事大吉。在面試的時候,態度、分析問題的能力、自信度、人品這些都決定了你能否拿到offer。
其他細節
面試一般的時間是在兩三個小時左右,作為求職者。我們要在這段時間內,將我們的價值展現給面試官和HR。就像推銷產品一樣,你得站在旁觀者的角度思考一下,這個人值不值得我們買入(發offer),他(她)的性格怎麼樣,人品值得信任嗎等等。
站在這個角度想一下的話,有很多問題你自己就想通了。當然你考慮這些問題的前提是你的技術準備已經挺充分的了。
- 自我介紹;準備一段兩三分鐘的自我介紹,挑一些有亮點的東西說一下。面試官也是人,你長篇大論五六分鐘,他記住的點也不會太多。所以要精簡,要學會提煉關鍵字。譬如:
工作上偏重架構設計
,技術上偏重技術實現(實現了什麼牛逼的技術)
- 語氣腔調:這個也有必要練習一下(不要笑,這個很重要),你可以自己錄音聽一下,試試有沒有一個合適的語速讓別人能聽清楚你說的話。還有說話要自信,不要結結巴巴,不會的東西就直接說沒接觸過就行了,切忌扭扭捏捏~~還有回答問題的時候,不要等面試官問完就立馬回答。停頓個幾秒鐘
作思考狀(手動狗頭)
,如果是特別特別熟的問題,就稍微頓一下,不要太流利。有些點可以適度說想不起來這個程度自己把握,挑一些不太重要的點
,留給面試官補充,不然你各個問題回答如流,只會加速面試流程。說不定碰到一個軸一點的,就丟擲一個史詩大問題給你。當然這個小技巧面試用一次就最多了,千萬別亂用。。。 - 離職原因:這個有的技術官不會問,有的會問。HR會比較看重這個問題,這個就自己斟酌吧。反正不要給人留下
這個人很浮躁,不會在我們這裡久留
的印象就好了。 - 技術思考:這也是一個很泛的點,要具象的話。就是你在專案中如何寫你的程式碼,有的面試官會看重這個問題。這個嘛,就純是看個人了~~~
總結
2019的面試總結下來,比前兩年要難上許多當然大廠還是一如既往的難~~~
。如今的面試官經驗也豐富很多,很多問題並不會直接問你,而是丟擲一個具體的問題由你去分析。有的還是考察你在產品和開發之間的專案協調問題,比如出了一個客觀上無法解決的問題,你該如何去協調。還比如會考察你一些對產品的思考。
現如今而言,工程師尤其是Android工程師是遠不如前兩年火爆了。現在更考察的是一個工程師的綜合能力,你的基礎、交流能力、問題組織能力、有沒有過對產品的思考。
攻城獅!時代在進步,工程師們也要進步,不僅僅是技術。工程師更是一個綜合能力的結合,涉及到演技,口才,交流能力,技術基礎,產品思維等等~~