不是怎么喜歡寫開發類的文章,始終認為這些東西不應該由程序員來寫,更加傾向于寫一些感受以及想法可是慢慢的發現有些東西,你不寫是不行的,好吧,那我就跟隨大局也來談談我的面試經驗以及各方面的看法吧。
以下的面試經驗主要針對于3年~5年左右android開發經驗中所遇到的問題,這些是我自身面試中的經驗以及所遇到的坑,可能下面的內容不適合于所有人,不過還是希望能給正在面試中的你有所啟發吧。
背景介紹:
今年可能是互聯網情形最差的一年(明年更加不好說),往年都有個習慣,每到年底都要出去試試,于是就跟往年一樣出去試試,可惜結果并沒有想象中的那么理想,告誡下所有從業者,如果是迫于無奈,一定要騎驢找馬,現在對于崗位的技能要求是越來越高,同樣的能力薪資方面卻給的的越來越低,公司更傾向于招一個更頂尖的人才。
正文內容:
好啦,開始講正文了,大致描述下近期三段面試經歷,一個是某度,一個是某醫療公司,一個是某 上市公司。
某度,去了以后才發現是做基于各類SDK的開發,用于行業國際化,后期拓展到整個產品線上的;能力方面:是想找一個架構能力非常強,或者源碼分析能力非常強,或者coding能力非常強的一個工程師,第二家公司是想找一個資深架構師或者是項目leader;第三家,朋友所在的公司,同樣也是想找個資深程序員......
某度面試知識點整理,(以下只是整理個大致方向,具體內容請自己自行查找):
1、主要是對象創建,堆內存、棧內存,數據引用地址是否發生變化等問題。
2、以及Gc Root的相關概念,以及回收機制內存泄露的檢測,考察了內存泄露的所有相關原理,里面包括,單例、內部類、匿名內部類,靜態內部類,造成內存泄露的原因和解決方案;內存泄露的檢測方案,主要是MAT,以及查看等,另外像圖片、網絡優化處理方面的優化問題等等;
3、同時還考察了有線程池的ThreadPoolExecutor,底層實現機制,以及在引用線程池,如何實現線程之間的調度機制。
4、java方面考察的比較多的還有hashmap,比如hash碰撞,產生碰撞的原因,如何避免hash碰撞;數組和鏈表之間的關系,如何實現存儲等操作。
5、同時還考察的有Handler實現機制,不是簡單的那些被市面問爛的輪詢方面內容,包含貫穿整個生命周期的啟動機制,至于復雜的內容,自行查找;
6、常用的設計模式,以及設計模式在實戰中的應用也是少不了的。
7、另外還有動畫的相關內容,主要是view動畫以及屬性動畫的比較,以及動畫所引起的泄露問題;還有事件分發機制在實際中的問題等;
8、多線程問題,線程同步問題,以及多線程直接的調度問題;進程直接的通訊方式。
9、項目的架構思路,以及分析解決機制。
10、另外還有常用的三方庫,以及三方庫的實現機制以及原理。
11、應用的啟動機制,activitythread等...
第一家公司
因為個人時間緊急,申請不進行筆試答題,但是手寫代碼、思路等都是必不可少的,某度前前后后差不多面了兩個半小時,除了ThreadPoolExecutor底層實現機制實在是想不起來其他都答出來了,整體來講沒有毛病,不過最后再攀談的時候,如之前所說的那樣,想要一個非常非常突出的人,而不是一個什么都懂,又什么都不精通的人,所以深度是非常的重要,畢竟是面一個高級研發做SDK方面的;一般的能力還是不符合,在面試過程中面試官反復問我你有什么非常擅長的領域沒有,也足以看出是想多給我些機會,可惜自己沒有把握住,而且這些只是一面,二輪面試是基于sdk架構層面的,更多的是牽涉到架構思路,整個項目的搭建思路、以及各類設計模式的運用方面了,這里就不再訴說了,有興趣的自行研究下。
第二家公司,回答的內容就比較有趣了,
基本上可以這么說,我把我所能說的都說了,比如我用的最新的Rxjava,retrofit,okhttp,以及現在比較火的,Reactnative,databinding,性能優化,開源架構思路,以及各類開發的模式,mvp,mvc,mvvm等,比較實現等思路,而且自認為深度廣度還好,只是在問道內存泄露問題上,關于內部類,靜態內部類,匿名內部類造成的內存泄露忽略了;而且最后犯了一個比較重大的嚴重問題,算法一般的我竟然夸大海口說,算法就是找到規律、找出原理然后用代碼表現出來,面試管當場出了一個算法,思考半天,給了一個解答思路,但是效果一般;而且還提問了一些關于gc回收的調度算法,沒接觸過只能作罷;最后感覺自身能力有限,后面要求再去面試,感覺自身駕馭不了,最后也就不了了之了。
第三家公司
哎,工作這么久,這是最被動的一次;怎么說呢,問的知識很多都是java基礎,可能一直沉浸于android的世界,反而把一些基礎性知識給忽略了,只知道有這個東西,具體原理都忘記了,而且在面試的時候還發現一個問題,就是一定一定要把你寫的知識點一定要講明白了,我們公司的消息部分是自己做的,但是這部分代碼我并沒有仔細看過,于是面試管問了消息部分的某個細節問題,當時猛然沒有想出來,結果可想而知;還有就是你實現的功能,你單純會做是不行的,一定要把原理性的內容說出來;
面試官有時候問的一些問題如果跟你的思路不太一樣的話,一定要據理力爭,不過前提是你要把功能和原理想明白了,保證能夠實現的了才可以,不然最后坑爹的肯定是你自己。其中還問的有surfaceview實現機制,因為寫過的代碼間隔好久了,突然被問起來,竟然大腦短路了...面完后已經知道不行了,基本功不能丟,原理性的東西一定要勤于總結...
綜述
上面所說的內容都只是一面,某度面了兩個半小時,第二家一個半小時,第三家一個多小時;總的來說,某度的面試官技術實力確實最給力;現在的面試內容確實是比之前要難了好多,無論是架構能力,還是底層實現能力,甚至是基本能力,現在面試單純知道原理是不太行的,一定要答得非常有深度,非常了解才行;而且基本功這東西可能在日常開發中感覺不出來,不過這些都是潛移默化影響著你,忘記的話一定要補習上來的,就像最后一個面試官問我,一些最常用的基礎性的東西怎么可能忘記呢;事實證明當你在面的級別越高時,越是這種最最基本的東西要熟爛于心,與此同時一定要提升自己的深度以及廣度,幾次面試都是在沒有怎么準備的情況進行的,其實,機會就那么多次,你不珍惜,只能怪你自己,要珍惜自己的每一次機會,不能太大意了,這年頭你單純會敲代碼是不行的,需要你把原理性的東西,揉碎了,記在自己的腦海里才行。
有人可能會說,我要是面試管,我也能把對方問倒,確實是這樣,不過現在你是一個普通的面試者,就不要想太多了。
小建議
最后幾個建議,JNI/NDK,這個有興趣的好好學習學習,好多公司已經開始重視這個,跳槽不要太頻繁,通過好多獵頭的了解,13年以后畢業的研發工程師,跳槽的頻率不是一般的高,而且技術實力跟11年之前的相比,差了不是一兩個數量級,還有一個是關于現在的React native,或者是react這只是一個小的方向,不會影響安卓原生大的趨勢,就如同一個小語種一樣,需要學會,不過不建議投入太大的精力;深度和廣度兩個都不能丟棄,基礎更加是重中之重,設計模式,算法,數據結構也不能丟棄,android的路還很長,還需要好好努力.....
回來復習的時候,猛然發現一個網站,無論是最新的開源技術,還是數據結構算法,已經最新的市場行情分析,都感覺蠻不錯的,同時也有很多開源項目,對我后來的提升有很大幫助;好東西不敢私藏,在這里分享給大家。
HOHO,上面是廣告內容,具體地址在下面,不過拍胸脯保證,內容還是非常非常贊的。
好東西一:Android Blog 周刊?
好東西二:開源項目