八年 Android 開發要20k?

最近,幫朋友面試了一個八年工作經驗的 Android 開發工程師,面試完我感覺五味雜陳,不知道對方的面試感受如何,這裏也不多加揣測了。話不多說,應聘者的大概履歷如下:

基本信息

姓名:xxx

年齡:32

性別:男

工作年限:8 年

求職意向:Android高級開發工程師

期望薪資:20k

個人描述:本人有 8 年Android實際開發經驗,先後待過 5 家公司,負責過各方面 Android 端項目,涉及電商、iot、直播、社交等領域。有獨立解決問題的能力,遇到問題儘量是一個人去解決的,具有較強的學習能力,經常關注和了解新技術。擁有良好的團隊協作能力和執行能力,喫苦耐勞,能夠保證項目進度的平穩進行和快速迭代。

技術專長

- 熟練掌握 Java,熟悉 Java 虛擬機原理
- 掌握常見的設計模式和數據結構算法
- 掌握Android基礎(四大組件、五大布局、多線程等)
- 熟悉Android主流框架(Glide、Retrofit、GreenDao、Logger、Gson等)
- 熟練掌握Android中的 MVP、MVVM 等架構
- 熟悉第三方登錄、支付、分享等功能開發
- ......

工作經歷

- xxx軟件公司(外包) | 一年 | Android 高級開發
  負責xxx iot核心模塊功能開發,負責xxx部分業務的協同開發,項目性能優化處理等
- xxx軟件公司(外包) | 兩年 | Android 開發組長
  負責多個電商產品的Android端研發,帶領Android團隊從項目搭建到核心功能開發再到項目最終上線,全程都有參與
- xxx軟件公司(外包) | 兩年 | Android 開發
  略...(類似,無亮點)
- xxx科技公司(創業) | 兩年 | Android 開發
  負責公司所有android端app的開發工作
- xxx軟件公司(外包) | 一年 | Android 開發
  負責公司Android應用開發工作

項目經驗

- xxx商城項目
  負責個人中心、訂單、退換貨和物流信息等模塊的開發;
  消息推送功能的實現;
  項目的性能優化和打包;
- 其他類似,此處略...


看到這裏,你有什麼想說的嗎?期望薪資20k,你覺得他要多了還是要少了呢?

從工作經歷來看,並不是說外包公司不好,只是覺得作爲技術人員不能只滿足於業務代碼的堆疊,雖然對各種業務瞭然於胸,對職業發展來說也是種寶貴財富,但更重要的不應該是自身的技術能力嗎?這纔是核心競爭力!我們經常會被問到的一個問題:你覺得你的項目有哪些亮點,可以選取一兩個來說一下嗎?如果每天純粹做業務開發,各種 CV 大法而不去思考技術的迭代創新或者可維護性,那麼三年和八年的工作經驗有什麼本質區別嗎?我看到最多的藉口就是:平時公司任務多,太忙了,沒時間去學習。難道是真的沒時間嗎?還是說每天回去沉浸在遊戲、短視頻等“紙醉金迷”中無法自拔呢?時間這東西,擠擠還是有的,哪怕是利用每天上下班路上的時間去看一篇技術文章,這對於我們個人來說,也是一種收穫。如果真的沒時間,那麼你有想過跳出這個舒適圈嗎?

你可能會說:簡歷並不能代表一切,有可能他是剛剛準備,還沒有來得及完善。好的👌,雖然機率很低,但的確也會發生這種情況,那麼我們來看看面試的大概過程吧。

PS: 👨🏻‍💻表示面試官;🙋‍♂️表示應聘者。

👨🏻‍💻:先來做個簡單的自我介紹吧!

🙋‍♂️:簡歷中的內容敘述了一遍,此處略…

👨🏻‍💻:爲什麼想來上海發展?

🙋‍♂️:安逸太久,想改變自己。

👨🏻‍💻:看你之前開發了這麼多項目,有哪個讓你收穫最大?能不能詳細介紹一下你在項目裏擔任的角色以及收穫?

🙋‍♂️:讓我印象最深刻的應該是xxx商城項目,因爲之前一般都是我獨立去完成整個app的項目開發。這項目裏,我主要負責一些核心功能開發,如訂單和個人中心,通過這項目,讓我個人在團隊協作方面有了進一步成長,另外技術框架的封裝和使用方面也得到了進一步提升。

👨🏻‍💻:說到訂單功能,你可以說說訂單超時的處理思路嗎?如果存在多個取消的訂單,你會怎麼處理?

🙋‍♂️:只要給每個超時的訂單設置一個定時器,時間到了之後就改變訂單狀態,並刷新列表就可以了。

👨🏻‍💻:除了給列表中的每個訂單設置一個定時器,還有其他實現思路嗎?

🙋‍♂️:暫時想不到了…

👨🏻‍💻:那麼你可以說說這個項目的技術棧組成是什麼樣子的嗎?

🙋‍♂️:大概是 MVP+Retrofit+Glide+Gson+RxJava+ButterKnife 這種,當然還有自定義View、事件分發機制、動畫和異步任務使用等。

👨🏻‍💻:你可以說一下 Android 中異步任務的實現方式有哪些嗎?

🙋‍♂️:一般是通過 Handler+Thread的形式,也可以使用Runnable,另外還提供了AsyncTask來實現,其他的就記不得了。

👨🏻‍💻:說到AsyncTask,你有了解過它的源碼嗎?它的實現原理是怎樣的?

🙋‍♂️:這個不太清楚,沒有看過它的源碼,但我用過它,知道它裏面常見的幾個方法,doInBackground用來處理耗時操作,處於異步線程,其他方法在UI線程執行。

👨🏻‍💻:有聽過 HandlerThread 和 IntentService 嗎?

🙋‍♂️:額…好像沒有聽過

👨🏻‍💻:那好吧,你可以說一下事件分發機制嗎?

🙋‍♂️:當點擊的時候,會先調用頂級 ViewGroup 的 dispatchTouchEvent,如果頂級的 ViewGroup 通過 onInterceptTouchEvent 攔截了此事件,則此事件序列由頂級 ViewGroup 處理。如果頂級 ViewGroup 設置setOnTouchListener,則會回調接口中的 onTouch,此時頂級的 ViewGroup 中的 onTouchEvent 不再回調,如果不設置 setOnTouchListener 則 onTouchEvent 會回調。如果頂級 ViewGroup 設置 setOnClickListener,則會回調接口中的 onClick 方法。如果頂級 ViewGroup 不攔截事件,事件就會向下傳遞給他的子 View,然後子View(ViewGroup)就會調用它的dispatchTouchEvent方法。

👨🏻‍💻:(終於能接得上話了)嗯,那麼你項目裏有處理過滑動衝突的情況嗎?如何處理的?

🙋‍♂️:有處理過 ListView 和 ScrollView 之間的滑動衝突問題,當時應該是通過重寫外層ScrollView的onInterceptTouchEvent方法來根據一些特定邏輯判斷是否需要攔截。

👨🏻‍💻:有了解過哪些第三方框架的源碼嗎?

🙋‍♂️:額,這個沒有看過源碼,只是簡單知道Retrofit對Okhttp進行了簡單封裝,Glide用了三級緩存。

👨🏻‍💻:你知道Activity的啓動流程是怎樣的嗎?

🙋‍♂️:點擊桌面 App 圖標,Launcher 進程採用 Binder IPC(具體爲ActivityManager.getService 獲取 AMS 實例) 向 system_server 的 AMS 發起 startActivity 請求,system_server 進程收到請求後,向 Zygote 進程發送創建進程的請求;Zygote 進程孵化出新的子進程,即 App 進程。App 進程通過 Binder IPC 向 system_server 進程的 AMS 發起 attachApplication 請求,system_server 進程的 AMS 在收到 attachApplication 請求後,做一系列操作後,通知 ApplicationThread bindApplication,然後發送 H.BIND_APPLICATION 消息,主線程收到 H.BIND_APPLICATION 消息,調用 handleBindApplication 處理後做一系列的初始化操作,初始化 Application 等。system_server 進程的 AMS 在 bindApplication 後,會調用 ActivityStackSupervisor.attachApplicationLocked,之後經過一系列操作,在 realStartActivityLocked 方法通過 Binder IPC 向 App 進程發送 scheduleLaunchActivity 請求;App進程的 binder 線程(ApplicationThread)在收到請求後,通過 handler 向主線程發送 LAUNCH_ACTIVITY 消息。主線程收到 message 後經過 handleLaunchActivity,performLaunchActivity 方法,然後通過反射機制創建目標 Activity。

👨🏻‍💻:嗯好,那麼你可以說一下Binder機制嗎?

🙋‍♂️:這個我瞭解的比較少,只是知道它是C/S結構,是跨進程通信的方式之一。

👨🏻‍💻:好的,那我們來聊點別的…

🙋‍♂️:…

👨🏻‍💻:…

🙋‍♂️:…


大概面試過程就是這樣,後面還問了他一些 Java 基礎和多線程,掌握情況不是很好。期間還問了他 synchronized 和 volatile 的區別有哪些,他只回答了三個字:不知道。八年開發,按理來說應該肯定遠遠不止這個水平,可結果也並不顯得差強人意。

另外,從面試者個人項目經驗來看,雖然接手過很多項目,而且業務種類也很多,但是並沒有喫透其中某一個業務。比如,同樣是做電商項目,你有將外面同類知名產品拿來與自己開發的項目進行比較嗎?這些產品經歷了長時間的市場和用戶驗證,一定有很多地方是值得學習和思考借鑑的,假如這個功能讓你去實現,你有什麼思路呢?如何進一步去優化呢?其實我們周圍有很多東西值得我們思考和學習,但很多時候我們可能選擇了無視。

現在,你覺得給他開多少薪資合適呢?所幸,他當前也已經意識到自己安逸太久,需要突破一下自己了,雖然有些遲,但只要能夠努力和自律,相信成長空間也是非常大的。畢竟成事在人,謀事在天。

通過這件事聯想到自己最近的裸辭,雖然很多人勸過我不要這麼果斷,先看看形勢,但所幸我做出的應該是正確的決定。如果想要在技術領域站穩腳跟,除了不斷汲取新知識,拓寬自己的知識面,更要緊的是挖掘自己的技術深度,這樣纔不會很容易就被後來人所取代。人不能在一個地方安逸太久,否則,這份安逸會成爲束縛自己的泥沼,想掙脫也並非容易了。趁我們還年輕,如果我們心中已作出決定,而苦於時機未成熟、無法實施的時候,倒不如斬斷自己的後路,破釜沉舟,背水一戰,未嘗不可。又或者,待十年之後,你鼓起勇氣想破釜沉舟,但是,前方還有多少彼岸任你停靠呢?

本文可能比較枯燥無味,但也點明瞭一些我們技術人員的現狀和挑戰 ,找工作不難,難的是找到真正符合我們職業發展規劃的那條路。有捷徑可以走嗎?有!最大的捷徑就是早日看清自己的現狀,跳出舒適圈,去追求自己真正想要的,併爲之奮鬥!


最後,給最近在找工作或者後續打算找工作的同學安利一份 Android 常見面試題的合集吧:

https://github.com/Moosphan/Android-Daily-Interview

也歡迎大家關注我的微信公衆號,近期不定時分享一些 Android 新技術、開發技巧以及面試指南等。

Android之道

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章