如果您是一名計算機科學專業的畢業生,或者正在考慮投身于軟體開發領域,抑或是經驗豐富且正在考慮跳槽的程式員,那麼恭喜各位——這篇文章絕對能帶來一些有益的啟發。
在本文中,我們将共同了解目前技術行業中薪酬最高的 13 個開發崗位。
這些崗位門檻也不算太高。大家隻要具有一定的程式設計經驗再加上旺盛的學習熱情,就完全可以在其中一試身手。另外,機器學習與資料科學領域尤其适合初學者以及經驗豐富的程式員,前途光明啊各位!
平均來講,機器學習專家與資料科學家的年薪在 11 萬美元到 12 萬美元之間,而且市場仍對相關人才擁有旺盛的需求。如果大家願意投身其中以解決現實問題,相信會有不少企業提供令人興奮的機會。
這是我印象深刻的一道題,很明顯它是我的第一次,那時我去一家公司(暫時叫它T公司吧)面試外派到南韓三星的工作機會。T公司的面試官是一個叫Bely架構師,顯然那個時候Android開發是稀缺資源,知道Service那都不得了了,當然Bely也沒打算為難我(必竟也工作4年多了,人長得也不錯),我輕松對答:
Service是一個專門在背景處理長時間任務的Android元件,它沒有UI。它有兩種啟動方式,startService和bindService。
你猜得沒錯,Bely緊接着問我:這兩種啟動方式的差別。
startService隻是啟動Service,啟動它的元件(如Activity)和Service并沒有關聯,隻有當Service調用stopSelf或者其他元件調用stopService服務才會終止。 bindService方法啟動Service,其他元件可以通過回調擷取Service的代理對象和Service互動,而這兩方也進行了綁定,當啟動方銷毀時,Service也會自動進行unBind操作,當發現所有綁定都進行了unBind時才會銷毀Service。
這應該是比較關鍵的差別了,在面試前我剛剛用Serivce做過一個音樂播放器。幾年後,我在深圳面試過很多人,他們中有60-70%的人沒有使用Service的經驗,讓我一度感覺得深圳這座城市做Android開發的比較浮躁。因為這兒工作機會太多了,初級的開發者都比較急功近利,不需要在自己身上下太多的功夫也可以找到工作(當然這是片面的認識)。
當然還有其他的差別,如兩種調用對Service生命周期函數影響,面試官也可以就這個問題展開一下。

當我遇到面試者知道怎麼使用Service,也如多年前的我可以自如的答出startService和bindService的差別時,我一般會多問一句:
Service的onCreate回調函數可以做耗時的操作嗎?
很多人都會說:可以。
原形畢露,他前面的回答隻是在面試前預習了一下面試題而已。如果知道Service的onCreate是在主線程(ActivityThread)中調用的,耗時操作會阻塞UI,我一般再接着問:
如果需要做耗時的操作,你會怎麼做?
問題便這樣展開了,一個人是否真正懂得原理會靈活運用,一下子便能看出來。 當面試者回答到線程和Handler方式時,我會再問一下對方:
是否知道IntentService,在什麼場景下使用IntentService?
這也是面試官要看的點,真正的項目需要一個開發人員對某個問題有一定的深度,也需要對整個Android的知識點有一定的廣度。深度代表這個人對問題認真對待有鑽研的精神,廣度代表這個人在面對同一個問題時,會更容易從多種可行的方案中選出最合适的一種。
Service的實際項目中一直被很多人忽略,為什麼我一再強調Service很重要,我們來看看,如果對Service完全無知會在工作中遇到什麼問題。
場景:如果一個應用要從網絡上下載下傳MP3檔案,并在Activity上展示進度條,這個Activity要求是可以轉屏的。那麼在轉屏時Actvitiy會重新開機,如何保證下載下傳的進度條能正确展示進度呢?
沒有Service概念的人,一般想出來的方案如下:
在轉屏前将進度緩存,轉屏後再讀出來。
使用android:configChanges設定,讓轉屏時Activity不銷毀和重建。
針對第1個方案,我會繼續問他将進度值存在哪裡? 轉屏的過程中,我們知道Activity的重建算是比較耗時的,會可能會有幾百毫秒以上,那麼這時候下載下傳線程仍然在工作,進度肯定和儲存時的進度不一緻了,如何處理這個問題呢?
第2個方案,大家可以自己展開思考,實際的項目中可能會需要額外做一些事情來處理ContentView的橫豎布局的問題。
如果使用Service來解決這個問題,看似是比較完美的,不過就會涉及Activity(UI)和Service的互動問題,這個我們以後再讨論。
下面是有幾位Android行業大佬對應上方技術點整理的一些進階資料。
進階進階篇——進階UI,自定義View(部分展示)
UI這塊知識是現今使用者最多的。當年火爆一時的Android入門教育訓練,學會這小塊知識就能随便找到不錯的工作了。不過很顯然現在遠遠不夠了,拒絕無休止的CV,親自去項目實戰,讀源碼,研究原理吧!
面試題部分合集