天天看點

優秀的(Android)軟體工程師是如何練成的

優秀的(Android)軟體工程師是如何練成的

過去的五年裡我一直在從事 android 開發工作。這段時間裡我和各種背景不同、經驗級别不同的工程師一起工作過,有些人來自大企業,擁有多年的一線開發經驗;有些人剛剛從高校畢業,簡單具備一些學校裡業餘開發 app 的經驗;也有一些人并非 cs 專業,而是通過自學的方式進入這一行.

如果你正在為你的公司招聘所謂的:android software engineer。我建議你來讀一下這篇文章,為什麼?

很多人總覺得移動端開發非常簡單,他們認為移動應用隻不過是把從 server 擷取回來的資料展示在不同的前端頁面而已。真的嗎?我認為遠遠不是。實際上,如果你去看一圈 playstore 上的各種 app 的品質,你會發現這些 app 的品質呈現高斯分布:小部分很爛的 app,小部分非常優秀的 app,和超級多平庸的 app。

我來解釋下這裡平庸的意思:

基本而言,平庸的 app 是指那些不怎麼考慮作業系統及運作平台的 app。第一,它并不去遵守作業系統的視覺語言,這其實在很多細節上讓使用者感到困惑。第二,它忽視了自己是運作在一個資源有限的環境上(記憶體,cpu,網絡帶寬,電量),這直接損害了整個裝置上的使用者體驗。第三,它在某些特定環境下無法工作(比如糟糕的網絡環境等),這一點也是全世界大部分 app 都存在的問題。

上面三點是一款優秀的 app 無法避免的挑戰。

是以,如果我需要去招聘一個 software engineer 來應對上面這些挑戰,我會着重考察下面幾點:

作為軟體工程師的基礎能力,包括:solid 原則,clean code,應用程式架構,測試。資料結構和算法同樣很重要,但是我不會因為候選人不會平衡 bst 就拒掉他。我更看重的是候選人是否了解了基礎資料結構(lists, queues, trees, hash maps…),了解 big-o 說明并能夠講解時間複雜度和空間複雜度的權衡。看到沒?就是這些基礎知識。

熟練 java。當然,如果他非常出色,熟悉其他語言,當然更好。

了解并發。為了讓 app 能夠快速響應使用者的操作,是以一定不能在主線程執行耗時任務。也就是說,很多任務需要去獨立的線程去執行。如果候選人不懂并發,那遲早會在未來的工作中,甚至生産環境下掉坑。

分析問題與解決問題的能力。考察候選人是否能夠深入思考一個問題,搞清楚所有未知的設定,發現所有可用的解決方案,比較這些方案的優劣,最終形成一個有效的解決辦法。

能夠描述出他們所在公司的技術棧。這一點很重要,雇傭的人必須對技術背後的原理有好奇心,而且要能對答題架構有一個清晰的認知。

好的溝通和寫作能力。在科技行業,溝通能力是關鍵。候選人必須要能夠清晰的闡述他們的想法,并準确的以文檔形式記錄他們的工作。而且,好的寫作能力往往也能反映不差的 coding 能力。

最終,我并不關注候選人對于 sdk 本身的了解,隻要候選人具備了上面大部分能力,那他一定能成為一個 fast learner。不過,如果你想考察一個候選人在 android 方面的了解程度,你可以考察以下幾個方面:

能夠在白紙上畫出 android 的大體架構圖;

能夠大體描述清點選 android studio 的 build 按鈕後發生了什麼;

能夠大體說清一個應用程式安裝到手機上時發生了什麼;

對 dalvik、art 虛拟機有基本的了解;

android 上的 inter-process-communication 跨程序通信時如何工作的;

app 是如何沙箱化,為什麼要這麼做;

權限管理系統(底層的權限是如何進行 grant 的);

程序和 application 的生命周期;

還有一個好的方法就是深入地探究候選人擅長的一個領域,比如他擅長 ui,那就多問一些 ui 方面的問題

是以說重點就是通過看候選人如何快速應對你所提問題,來了解他們對核心基礎的熟悉程度。而且要特别提出的一點:不要雇用隻會使用 library 的人,而應該要招聘那些既能在需要的時候利用開源庫(當然可以的話最好不要自造輪子),又要能夠進一步,分析目前環境,預見可能會發生的問題并能提出針對性的解決方案的人。

再強調一遍,不要因為某些候選人隻會使用某幾個開源庫就招聘。

正如 montaigne 所說:“i prefer a sharp mind over a full one”。

當然,上面我說描述的候選人是指 senior。當然,你也能夠,而且應該去招聘 junior 工程師,不過要注意在 team 内部維持一個好的 junior 和 senior 的比例。如果你的 team 有太多的 junior 工程師,那你的 team 将會非常熱鬧了,因為他們将在工作中學習到很多東西,修複一個又一個的 live bug,不斷的進行疊代直到形成一個較為穩定且可測試的 code base。

如果你是一個建構 android app 的軟體工程師并想要提高上文中提到的一些能力,這裡有一些閱讀的書籍或文章推薦:

software engineering and craftmanship:

《clean code》 by uncle bob martin

《程式員修煉之道 the pragmatic programmer》 by andy hunt and dave thomas

《重構 refactoring》  by martin fowler

《head first design patterns》 by elisabeth freeman, eric freeman, bert bates and kathy sierra

java:

《effective java 第二版》 — by joshua bloch

并發:

《java 并發實戰 java concurrency in practice》by brian goetz

資料結構和算法:

《introduction to algorithms (a.k.a the cormen book)》 by charles e. leiserson, clifford stein, ronald rivest and thomas h. cormen.

《the algorithm design manual》 by steven skienna

problem solving skills:

《how to solve it》 by g. polya and john h. conway

writing skills:

《on writing well》by william zinsser