1. 程式人生 > 實用技巧 >走心的中級Android工程師跳槽經驗分享

走心的中級Android工程師跳槽經驗分享

這些經驗是我最近四個月,從準備面試到找到合適工作的汗水和淚水,希望對你們能有幫助!

  • define 跳槽
  • 跳槽前要思考的問題
    • 錢不到位怎麼辦
    • 心委屈怎麼辦
    • 離職前的思考
    • 確定要走時需要做的準備
    • 行情怎麼樣
  • 安卓跳槽需要複習的知識
    • 基礎知識
    • 進階知識
    • 不同公司側重內容不同

一、define 跳槽

首先請思考一個問題:在你眼中“跳槽”包括哪些內容?

/******** 華麗麗麗的分割線 begin ************/

/******** 先思考 3 秒再往下看 ************/

/******** 華麗麗麗的分割線 end ************/

最近是“金三銀四跳槽季”,很多朋友都想要跳槽,但是對“跳槽”的理解可能僅限於“寫簡歷、面試”。

在這次跳槽前,我也這麼認為的。

那時候工作不順利,正好在一個群裡看到有公司招聘,就發了簡歷過去,面完試自己感覺良好,結果卻打了臉,讓人家拒了,理由是我要的工資太高了。

仔細反省後,發現我準備的太倉促,或者說根本沒怎麼準備,只是寫了份簡歷,然後有面試機會就去了。面試過程中有些專案細節答不上來,很多知識點也答得不好,讓人家感覺水平一般。

痛定思痛,在後來的幾個月,我開始查閱各種跳槽、面試相關的資料,同時整理了重點複習知識點,按計劃一步步學習。

在兩週前,感覺自己學習的差不多了,公司的情況也基本看清楚了,就決定離開。

於是寫簡歷、投簡歷、面試,面了五家,拿到了五個 offer,最終選擇了對我目前來說最合適的一個。

在這個過程中,我對“跳槽”的認識逐漸加深。

咋一看“跳槽”就是寫簡歷、換工作,但要想得到滿意的 offer,其實需要思考、準備的內容很多,大概有這麼幾點:

  1. 跳槽前要思考清楚
  2. 掌握跳槽需要的知識點
  3. 寫一份高質量的簡歷
  4. 瞭解簡歷投遞的時機和方式
  5. 拿到面試邀請要做好功課
  6. 面試中要調整心態,努力表現
  7. 面試後及時思考總結
  8. 有多個 offer 如何選擇
  9. 優雅的離職
  10. 準備入職

這些應該是一次跳槽從開始到結束比較完整的流程了。接下來我們將詳細瞭解每一部分。

二、跳槽前要思考的問題

我的如意工作是一個蓋世英雄,有一天他會拿著高薪股權來迎娶我,我猜到了開頭,卻猜不到這結局...

每一份工作都是以希冀開始,我們心懷憧憬,希望在公司裡大展拳腳、做些成就。

然而是什麼讓我們走到今天這地步,即將與它分手?

一般離職有兩個原因:

  1. 錢不到位
  2. 心委屈了

1.錢不到位怎麼辦

業界一種普遍的觀念是“跳槽漲工資最快”,這也的確是現狀。

為什麼公司遲遲不給加薪,非得逼得我們跳槽呢?

答案很簡單:因為公司沒有意識到你價值的增長。

我們在入職時可能只是一個菜鳥,但是在工作一段時間後,由於個人的努力以及業務的鍛鍊,水平已經有了很大的不同,自己心裡覺得自己不再是菜鳥了,希望能拿更高的工資。

但你可能一直在做一個專案,沒有承擔更多的責任,公司無法瞭解到你現在能力到什麼程度了。

這個時候,如果領導比較好的話,你可以先主動要求承擔任務,積極完成(就是加班加點),然後在一段時間後找領導談加薪。這樣就有理有據,讓人信服,領導一般都會同意。這樣就不用跳槽了,省去準備面試題的繁瑣。Over。

如果領導不同意,那就沒轍了。

2.心裡委屈怎麼辦

員工離職的另外一種原因就是:待著不爽,心裡委屈了。

一些被動的原因比如領導更替、崗位調整、加班太多等,都會讓人心裡不舒服。

拿我來說,公司業務轉型,做的工作不是安卓應用開發,做久了心裡不踏實,就想離職了。

如果有條件的話,可以跟領導溝通能否恢復原樣,如果無望,那就只好跳槽了。

但在真正提出離職之前,還需要思考幾個問題。

3.離職前的思考

If you don't like something, change it. If you can't change it, change your attitude. Don't complain.

有的朋友可能會說:別廢話,趕緊講面試知識點,我乾的不爽就跳槽了,還想什麼想?

非也,每次跳槽的成本其實很大,除去面試來回的時間不說,新舊環境的適應、業務的熟悉、程式碼的掌握,都需要成本,如果兩次跳槽間隔太短,其實時間都花在了適應新環境上,真正學習、沉澱的內容不會太多,尤其在剛開始工作,更忌諱這樣子。

因此,在確定離職前,你需要先問自己 3 個問題:

  1. 現在的專案沒有我可以學習的內容了嗎?
  2. 離開這裡我會失去什麼?
  3. 到新環境可以得到什麼?

拿我自己來說,專案裡的程式碼我沒有掌握太紮實,框架層很多設計思路還搞不清楚,出去面試一問就問倒了。這時如果真的換了工作,恐怕又要接觸新專案、新程式碼,根本沒時間好好消化之前的程式碼。

除了程式碼,人際關係也需要沉澱,在這個公司待了那麼久,看到了一些同事的優秀品質,學習、借鑑他們也需要一定的時間,如果忙著換工作,可能就失去了和同事深入交流的機會。

因此在第一次面試失敗後,我把專案程式碼好好研究了一個多月,也跟同事請教很多學習、規劃上的知識,為後面的路做好鋪墊。

4.確定要走時需要做的準備

在確定要走後,儘量不要裸辭,現在的行情你懂得,沒有準備就裸辭,等於斷了自己後路。

有的網友問我:辭職在家好好複習一個多月怎麼樣。我勸他還是算了,都不是自覺的人,天天在家反而更學不進去。最好的狀態就是一邊工作,一邊蒐集要學習的知識點學習資料,下班路上、晚上、週末去學習,那樣精神壓力不會太大。

在開始複習知識點前,你需要確認以下 2 點:

  1. 定位
  2. 亮點

定位

“定位” 是指你要確定自己所處的階段和想要的目標。主要包括:

  • 目前是什麼水平
  • 有什麼積累
  • 工作專案裡有什麼難點
  • 想找什麼級別的工作

比如我,給自己的定位就是:現在是中級水平,常見應用開發需求基本都能解決,開源框架使用沒問題,部分讀了原始碼,工作專案裡主要是混合開發比較複雜,想找有利於自己成長的、大公司中高階安卓開發工作。

亮點

有的朋友可能對 “亮點” 的定義不是很明白。

“亮點” 其實就是能夠把你和眾多應聘者區分出來的優秀品質。

程式設計師面試主要考察這幾點:

  • 技能水平
  • 學習能力
  • 團隊合作
  • 工作心態等

如果你在其中任何一個方面都有自己的優勢,就趕緊找出來,寫到簡歷上,面試表達出來。

拿技能水平來說,根據做過專案的型別,確定自己當前擅長的點,比如你做的是電商應用,那可能就擅長混合開發、自定義 View;做的是電臺應用,那可能就擅長後臺程序保活;做的是大使用者量應用,那可能就擅長監控、效能優化等等。

找到自己已有的或者該有的亮點,然後去努力掌握、精通。

5.行情怎麼樣

有的網友說早就想跳槽了,但是聽說行情不好,不敢跳。

其實吧,價格取決於價值,影響價格波動的是供需關係。

20117 年創業公司的確死了很多,P2P、O2O 死了一大堆,但活下來的又融了很多錢,也成立了很多新公司,也需要招很多人。

這個時候,招聘的標準就比前幾年要高一些了,去招聘軟體上看也可以發現,大多要求 3 年以上經驗。這是因為現在安卓初級太多了,各種應屆生、培訓班湧入市場,前幾年會用 ListView 就可以找工作的日子一去不復還。不過真正的高階,或者有潛力的中級,還是很受企業歡迎的。

因此,我們在想要跳槽時,不要被所謂的“差行情”攔住,而是要審視自己的水平,確定自己的目標,究竟是要找初級崗、中級崗,還是高階崗。

面試前,面試官拿到你的簡歷,根據簡歷上的資訊會建立第一印象。因此你想要呈現給對方一個怎樣的定位,有什麼亮點,都需要事先思考清楚。

確定了方向後就要開始努力準備,下一節我們介紹安卓跳槽需要準備複習的知識。

三、安卓跳槽需要複習的知識

在介紹面試考察內容前,先來看看我認為的“中級安卓”需要掌握的知識點,這些是結合一些面經、自己實際面試以及請教前輩總結而來的,主要包括兩部分:

  1. 基礎知識
  2. 進階知識

面試中級及以下崗位時,在電話面試、一面、或者你簡歷沒有突出亮點時,一般都會先問基礎,目的是確定你基本功扎不紮實。

如果基礎知識有太多不會的就危險了,必須好好準備,這是躲不過的。

電話面試、一面考察基本功過關後,就會進入下一階段 --- 問些進階的,看看你最高水平在哪裡。

這個階段有不會的很正常,因為對方正在確定你的水平,但態度一定要積極主動,即使之前沒有研究過,也要結合一些經驗說出推測的結果,切忌直接說“我不會”。

下面的所有技術知識點詳細內容都整理在了開源專案【GitHub】,有需要的可以自取。

一、基礎知識

基礎知識主要包括以下幾點:

  1. Java 基礎
  2. 併發/非同步
  3. 安卓基礎
  4. 設計模式
  5. 常見的資料結構演算法
  6. 網路基礎

1.Java 基礎

雖然現在 Kotlin 挺火的,但我面了幾家大公司都沒問 Kotlin,問了很多 Java 。所以一定要保證當前知識掌握熟練了,再學習新知識,不然真成了狗熊掰苞米。

Java 基礎主要包括以下知識點:

  • 內部類、靜態內部類區別、使用場景
  • 抽象類、介面 實戰使用場景
  • 集合
    • 集合專欄
  • 註解
    • 什麼是註解以及執行時註解的使用
    • 使用編譯時註解簡單實現類似 ButterKnife 的效果
  • 反射
    • 深入理解 Java 反射:Class (反射的入口)
    • 深入理解 Java 反射:Field (成員變數)
    • 深入理解 Java 反射:Method (成員方法)
  • 泛型
    • 深入理解 Java 泛型
  • 異常
  • IO NIO

建議看 《Java 程式設計思想》,不僅解答了 What 還有探討 Why。

2.併發/非同步

主要包括兩部分:

  1. 安卓併發類
  2. Java 併發知識

安卓的主執行緒模型,要求我們必須將耗時操作放到執行緒非同步執行,否則會影響 app 的流暢甚至卡頓。

因此必須掌握安卓提供的Handler,HandlerThread,IntentService,AsyncTask,這是安卓為我們封裝好的非同步類,從使用到原理,都要理解,面試常客。

接著就需要了解 Java 的執行緒、記憶體模型和 Java 併發包下提供的類了,這也是大公司考察基礎的常客。

除了面試,如果你去看過開源框架,會發現裡面有很多ConcurrentHashMap,Lock,Condition,一開始看的你一臉懵逼,在掌握了 Java 併發知識後,再去看框架就會省力許多。

Java 併發主要知識點:

  • 同步鎖 synchronized與Lock區別
  • 什麼是可重入鎖
  • 執行緒通訊方法
  • wait 和 sleep區別
  • wait-notify 模型
  • 生產者消費者模型
  • 執行緒池

建議閱讀書籍:《Android 開發藝術探索》、《Java 併發程式設計藝術》、《Java 併發程式設計實戰》

我把所有遇到的Java面試題做了一個整理,均放在了開源專案【GitHub】,有需要的可以自取。

3.安卓基礎

安卓基礎愛問的來來回回就那些點:

  • 四大元件,生命週期啟動方式等常見問題
    • Android 進階1:Activity 的生命週期
    • Android 進階2:Activity 的 Task 與啟動模式
    • Android 進階3:Intent 與 IntentFilter 匹配規則
    • Android 進階4:Service 的一些細節
  • 自定義 View 相關
    • 繪製流程
    • 事件傳遞
    • 滑動衝突

這部分是常見的,應該大多數人都掌握差不多了,分享給大家我整理的Android基礎部分面試題,有需要的去我的【GitHub】自取。

4.設計模式

我這次找工作,筆試裡出現了兩次寫單例模式,記得幾年前校招的時候就因為單例失去過一次好機會,單例模式的重要性,你自己掂量一下。

設計模式考察的也不算太複雜,知道常用的幾種設計模式使用場景,會手寫單例的關鍵幾種(靜態內部類 double-check 知道區別)就可以了。

建議去看看《大話設計模式》、《Android 原始碼設計模式》。

5.資料結構演算法

我這次面試演算法問的比較少,隻手寫過插入排序,建議把冒泡、插入、歸併時間複雜度和實現熟悉熟悉,最好手寫下,不然現場手寫的時候容易出錯。

作為一個有追求的程式設計師,這些資料結構、演算法是需要掌握的:

  • 陣列連結串列區別
  • 連結串列插入刪除
  • 棧及使用場景
  • 佇列及使用場景(有可能拓展到阻塞佇列)

這些是基礎,學好才能掌握其他的。

紅黑樹、KMP、最短路徑、動態規劃、揹包問題這些都屬於進階了,問的比較少,瞭解下即可。

可以買本《劍指 offer》看看,鍛鍊下演算法題的常見解題思路。《演算法》就太科班化了,一般人也看不進去,有興趣的可以看看。

6.網路基礎

網路其實問的也不算多,因為畢竟不用我們自己去實現一個 HTTP Client,常見的網路問題大概以下內容:

  • 七層模型
  • HTTP 內容
  • 常見響應碼
  • 快取相關
  • TCP 三次握手、四次揮手
  • Socket 的使用
    • 程序通訊之 Socket (順便回顧 TCP UDP)

進階知識

在確定你的基礎夠用後,二三面就會考察你的進階能力。就應用開發來說,進階知識主要有以下內容:

  1. 框架原理:快取、網路、圖片
  2. 效能優化
  3. 架構模式
  4. JVM
  5. 外掛化

1.框架原理

作為有追求的安卓開發,怎麼可能只滿足使用框架而不知其原理呢?

在面試時也經常會被問到:你熟悉什麼框架的原始碼?

這個時候如果沒有準備就尷尬了,失去了給自己加分的機會。

現在主流框架是 RxJava Retrofit OkHttp Picasso/Glide EventBus3,你可以選擇其中兩個左右熟悉一下原始碼和大概流程,重要的是理解為什麼要有這個框架,解決的問題,如何解決的。

建議閱讀書籍:《Android 進階之光》

2.效能優化

效能優化又是另外一個高頻問題,一般主要問記憶體方面、UI 方面的優化。

常見問題:

  • 記憶體優化
    • 記憶體洩漏如何避免、檢測
    • 記憶體抖動怎麼辦
    • 有使用過什麼工具嗎?
    • 如何避免 OOM
  • UI 優化
    • 佈局卡頓怎麼辦
    • 如何判斷佈局是否需要優化
    • 有哪些工具

這些問題你都可以從官方的效能優化典範看到,如果無法翻過去,可以看胡凱的部落格,總結的也很棒。

另外也可以閱讀《高效能 Android 應用開發》。

3.架構模式

高階的安卓開發不僅需要完成一個模組,還需要負責整個專案的設計與開發。

常見的架構模式是按專案分層分,MVC MVP MVVM 這些,可以選其中兩個進行學習、實踐,對比了解優勢和劣勢就可以了,網上文章很多的。

另外就是設計思想,OOP 面向物件開發的思想一般都知道,繼承封裝多型,什麼時候用介面什麼時候用抽象類,其實和設計模式相輔相成的。

還有 AOP,面向切面程式設計,大型專案一般都會用到,在不入侵程式碼的同時新增功能,建議瞭解。

還有路由,現在都流行元件化,元件化的一個問題就是元件間如何依賴,如何通訊,這些都需要有良好的架構設計思想。我自己也在摸索中。

這部分的知識屬於個人經驗,不同的人不同的體會,沒有適合所有人的相關書籍,需要自己多寫、多總結出來。

4.JVM

在去一家公司面試時,隔壁屋也在面試一個後臺,在等待面試官時我偷偷聽了下他們的對話。其中有一段對話記憶深刻:

  • 請介紹下 CMS 垃圾收集器。
  • 額,對不起,我只畢業一年,這方面瞭解的比較少。

JVM 的知識究竟需要工作幾年再瞭解呢?

不同的人有不同的看法,我的看法是:儘可能早。

JVM 主要內容大概有這些(來自《深入理解 Java 虛擬機器》):

  • JMM(Java 記憶體模型)
  • GC(垃圾回收策略)
  • 虛擬機器效能監控、調優
  • 類檔案結構
  • 類載入機制
  • 程式編譯優化

這些內容可能聽起來比較遙遠,很多人覺得我就開發業務,需要了解這麼多嗎?看起來都沒什麼用。

理解這些內容,對我們日常的業務開發有極大地促進作用:

  • 瞭解 JMM 後,你對記憶體分配、OOM 的理解就不會只停留在表層
  • 瞭解 GC 後,對效能優化的理解也會更上一層
  • 熟悉類載入機制後,對你學習外掛化也會有很大幫助
  • 瞭解虛擬機器對程式的優化,就會明白一些併發原語的作用及意義

而這些也是面試時經常問的問題,知道的越多,對你的加分就越多。

建議閱讀:《深入理解 Java 虛擬機器》

5. 外掛化

外掛化這麼火,各大公司都在研發自己的外掛化,這不僅僅是對業務的支撐,同時也顯示出他們安卓研發的技術深厚。

有的朋友可能會說了:我現在的專案使用者這麼少,用這個有什麼用。

不說學了有沒有用,在學習的過程中,可以對你現有知識體系有極大的提升,要開發外掛化,需要掌握的內容大概有這些:

  • 類載入機制
  • 四大元件啟動流程
  • 資源載入
  • 動態代理

看到了吧,它是對一些疑難知識點的應用,通過有目的的學習,可以讓我們對基礎知識掌握的更加醇厚。

面試時如果你說自己有主動學習這方面的知識,還能說出一部分知識點,不僅顯示出你的技術能力,還體現了你的主動學習性和學習能力,大大的加分!

建議閱讀:田維術的部落格

進階知識是我自己經驗所得,如果有遺漏,歡迎補充。

不同公司側重內容不同

有朋友可能會問了: 基礎的內容太多了吧,我可不可以直接準備高階的。

首先你直接學高階很費勁,容易誤解不說,硬記下來沒多久也就忘記了;其次面試時的提問順序我上面也說了,都是從基礎開始的,基礎不紮實,活不過兩集。

這裡再嘮叨一句,如果一家公司靠投機取巧就可以進去,那進去的投機取巧者豈止你一個人,那樣的公司氛圍是你想要的嗎?如果想進入一個理想的大公司,還是踏踏實實地一步步走吧。

掌握了知識點後,接下來就要針對各公司側重內容重點複習了。

各大公司面試考察的知識點,網上相關的資料不少,我平時也在關注一些面經,做了一些蒐集整理,看看裡面有什麼是自己欠缺的,然後找時間補上,有需要的朋友可以去我的【GitHub】自取。

最後

如果你想去一家不錯的公司,但是目前的硬實力又不到,我覺得還是有必要去努力一下的,技術能力的高低能決定你走多遠,平臺的高低,能決定你的高度。

如果你通過努力成功進入到了心儀的公司,一定不要懈怠放鬆,職場成長和新技術學習一樣,不進則退。