最近,幫朋友面試了一個八年作業經驗的 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://www.uj5u.com/yidong/339190.html
標籤:其他
