不是要你給出每個問題的標準答案,而是要你給出這個問題的你的、本身的答案。
程序員
關於簡歷
面試
面試首先要提到的就是簡歷,簡歷這個東西真的是一個很深奧的事情,爲何深奧,實際上是對像和我這樣的人深奧:學歷很差、工做經歷很差。固然,這和目前技術研發人才需求的大環境也有關係,並且上述兩點會愈來愈影響簡歷的經過性。說一個真實的事情你們就有概念了,這是一個前同事私下告訴個人,他比我先一年多離開公司,而後到了一個大廠(一個大電商),他如今也負責招聘面試,若是社招簡歷不是碩士,都會日後排排,雖然這不是公司規定,可是他們實際就是這樣操做的。是否是很嚇人?他本身都以爲嚇人。說了這麼多,那怎麼辦呢?學歷很差、工做經歷很差就別期望找到好工做了?固然不是,其實面試仍是考的內功,簡歷只是一塊敲門磚,若是你的內功深厚,而且可以很好的體如今簡歷上,那麼簡歷真的只是一個簡歷而已。你們應該注意到了,上面提到了兩點:算法
如何將能力很好的體現到簡歷上其實不是一個理工科同窗擅長的技能,因此要多寫多改多請教,多找找有經驗的朋友幫你看看,即使是沒有這樣的朋友,相信你們也有能力和渠道去接觸到這樣的人。另外關於簡歷的格式網上有不少文章,前面專欄裏文章也有提到過,這點就再也不深刻了,有一點很重要的我以爲應該增強一下你們的警戒,就是用過,可是知道不深刻的技術點必定不要寫在簡歷上,通常大公司面試有一面必定是簡歷面,也就是按照你簡寫上寫的技術點問,若是發現你寫了,可是又說不出來很深的東西,那就至關減分了,因此這一點必定要注意。總之,簡歷不是你面試經過最關鍵的東西,最關鍵的是第二點:內功設計模式
一個怎樣的Android工程師才能進入到大廠呢?下面幾個方面每每是須要具有的緩存
要想拿到大廠的offer,基礎好是一個硬性條件,對於計算機相關專業畢業的同窗來講,這些基礎就是你大學所學的課程,若是不是計算機相關專業畢業的同窗,那麼就須要在基礎知識這個方面下足功夫了,具體來講下面的東西必須掌握:性能優化
若是你沒有掌握這些知識,或者以前學過,可是忘了怎麼辦?學啊!怎麼學呢?去網上找一些大學的公開課,我是看的清華的,至於哪個學校的適合你,就只有你本身判斷了。可能你們會有疑問,面試會問這些知識嗎?直接問的不多,可是隻有你瞭解了這些知識,才能更深刻的瞭解一些技術和知識。舉兩個例子吧,第一個,若是要作Android裏的網絡優化,你不知道網絡裏面的一些原理,你怎麼知道怎麼優化?若是你不知道UDP和TCP的詳細區別,技術選擇時,你怎麼知道選擇哪個做爲你通信的協議?關於網絡還有一個出現機率很高的問題就是TCP的三次握手和四次握手,其實它就是網絡原理裏面的知識。第二個,操做系統中,內存是發揮什麼做用的,又是怎麼工做的,知道這些,你再去了解Android的內存管理就信手拈來了。服務器
數據結構和算法實際上是分開的東西,咱們須要先掌握各類數據結構,再去加深算法,數據結構和算法其實也屬於基礎,可是它如今愈來愈重要,因此我就單獨拿出來講了。數據結構怎麼深刻一樣我也推薦你們去看清華或者浙大《數據結構》公開課,特別是清華的,值得反覆研究。至於算法,首先要作的就是動手,LeetCode上直接幹!第二階段就是要總結各類算法的思想和套路,像遞歸、動態規劃等這些算法都是有套路的,在LeetCode上也有按數據結構和算法分類的篩選,你們能夠針對性練習和總結。固然,對於一個Android程序員,能作到天天在LeetCode上刷題就很是不錯了,因此必定要堅持,等你堅持到必定的時間,你會發現你愈來愈遊刃有餘,我從15年末開始在LeetCode上刷題,目前已經刷了200多道了,小米的面試也很是注重算法,還要能寫。並且對一些特別注重算法的公司,算法這塊的考覈很是嚴苛,對,就是嚴苛,網絡
設計模式中包括了設計原則,其實對於Android開發人員來講,設計模式就那23種,知道並瞭解這些設計模式是第一個階段,僅僅是到這個階段是不夠的,通常面試也不會問你某個設計模式的概念,而會讓你具體的說說你對某一種設計模式的深刻了解和使用,它的優缺點,因此,第二階段就是要運用它們,其次要和Android源碼中運用到設計模式地方進行結合學習。例如建造者模式,Andoird中的Dialog建立就使用到了,還有像單例模式、適配器模式、觀察者模式等等都是在Android中很是經常使用的設計模式,也是在面試中出現頻率很高的。數據結構
Java我就來直接一點了,以下:多線程
你們可能以爲這些本身多多少少都瞭解,可是當問到細節就不知道了,因此對於上面的知識仍是須要系統的認知,項目中沒有機會深刻就本身一個一個突破,好比Java集合,首先對集合要有一個宏觀的認知。
從常見類的源碼開始動手,如HashMap,按部就班,逐個擊破。從這點也能夠看出,咱們對每一類知識必定要深刻的瞭解,而不是泛泛的知道,好比Android的一些熱修復框架,其中就是JVM中類加載和反射等技術。又好比並發中,線程池和ThreadLocal這些都是必要掌握和熟練使用的知識,也是面試常常會被問到的。
Android其實要說的很少,對於一個有工做經驗的Android程序員來講,基礎的一些Android技術你們都是掌握了的,而若是要作一個加分的Android程序員,下面的Android技術就須要深刻了解了:
一樣的,這些都是要系統的掌握和運用。
JNI其實屬於Android NDK中的一個技術點,可是它不像上面的知識須要系統的瞭解,JNI咱們只須要知道Java怎麼調用C或C++的代碼,C或C++怎麼調用Java的代碼,而且相互以前怎麼傳遞各類參數(對象),由於通常Android開會不會涉及到寫複雜的C或C++代碼,咱們使用NDK也更可能是爲了調用第三方的一些C或C++算法庫,如FFmpeg。固然,若是你能寫得一手好的C或C++代碼,那麼就更加分了。
在Android中會常用到一些第三方框架,這也是面試中會常常問到的,具體問題就是它們的原理或設計,像LeakCanary、OkHttp等,固然通常只會問你使用過的,在平時咱們使用第三方框架的時,就須要去了解他們,僅僅是爲了用而用,是面試官不想看到的現象,由於只會用,不懂原理,就不能控制,而是被框架控制。如何去了解呢,首先要知道這個框架怎麼用,而後在找入口,從入口一步一步去探索。本身作的項目也和第三方框架相似,你本身參與的項目的架構若是你都不清楚,那麼面試官也就知道你對技術的飢渴度了。好比我以前的公司就使用Netty作終端和服務器的通訊,在個人簡歷中也體現了這點,我有信心將它體現到簡歷上,是由於我花時間去詳細瞭解過Netty,從NIO到Netty,到Netty經常使用的類,再到一些慨唸的瞭解,如零拷貝、IO多路複用、粘包、拆包等等。因此當你在項目中使用過了,而且被問到時你能很好的說出來,那必定是加分的。
其餘都是能爲你的簡歷加分(好學歷和好工做背景就不說了):
這些也屬於一我的的內功,可是它和上面我要提到的還不同,由於它不是必須,但又有可能很重要。
你們看我一會就把Android研發人員須要具有的內功總結完了,可是若是你真的要把這些都真正的掌握、變成本身的東西真的不容易。每一個人都有本身的目標和夢想,在走向目標和夢想的道路上,確定有各類各樣的困難。只有克服困難,才能繼續前行,因此,堅持吧!
上面我總結的我怕你們仍是以爲太泛泛,沒有乾貨,因此再給你們補一個清單:
不斷地也聽見不少人在談作Android是否還有前途、Android研發在走下坡路了、Android的工做太難找了,對於這些其實個人見解很簡單,如今真的還沒到說Android開發已經無路可走的地步,固然將來怎樣我沒法預判。如今各大公司其實都很缺Android研發(中高級),不斷的在招人,就拿小米來講,別說來面試的人了,就簡歷都拿不到太多,須要花不少時間去找簡歷。因此,對於有Android開發經驗的同窗,更多應該想一想怎麼往深探索,而不是一味想着換方向,無論換到哪一個方向,都會面對從初級到高級到資深再到專家的時間點。因此我認爲正確的職業規劃應該是金字塔形,核心競爭力必定要紮實!如下我以前總結的一張關於Android集合的圖:
上面算是一個簡單面試前技術點的總結,東西不少,若是要從零開始掌握這些也是很是艱難的過程,惟有靠本身點點滴滴積累,別無他法。其實本身總結出這些東西並不難,難的是如何學、如何堅持、如何加固,每一個人的學習和積累方式都不一樣,必定要找到本身的方式,什麼是好的方式標準就是讓本身能夠牢記、快速記,牢記比快速記更重要,如何堅持是一種意志力上的考驗,每每咱們須要爲本身找一些長期和短時間的目標,激勵本身不斷的進步。包括我在內的大部分人都不是什麼天才,惟一能讓本身進步的方式就是腳踏實地的去幹,相信越努力、越幸運!