專訪鄧凡平:Android開發路上的快速學習之道

鄧凡平(網名innost),畢業於中科院研究生院,資深Android開發工程師,熱衷於Android源代碼的研究,對Android的架構設計和實現原理有非常深刻的認識和理解。現任Tieto信息技術有限公司高級軟件架構師,主要負責Android系統方面的研發工作。《深入理解Android 卷I/II》作者,華章公司《深入理解Android》系列書籍總策劃。此外,他對Linux內核、C/C++/Python相關的技術,以及高性能網絡服務器和多核並行開發等也有一定的研究。

  • 我的學習方法是以點帶面,建立自己的知識結構

CSDN請和大家介紹下你及所從事的工作?

鄧凡平:大家好,我叫鄧凡平,來自湖南。2000年進入華中科技大學水電系,所學專業是水利水電與自動化。2004年進入中科院電工研究所讀碩士,研究方向是超導磁體。2007年畢業後,進入中科大洋公司。從此跨入軟件開發行業,至今已經6年。目前就職於Tieto公司,職位是高級軟件架構師,主要負責Android系統方面的研發工作。

CSDN:回顧你的學生經歷,能和大家分享一些有趣的事情嗎?

鄧凡平:從本科到研究生,我一直不喜歡所學專業,水電和超導都不喜歡。但是我並沒有另起爐竈,而是希望在這些大專業裏邊找到自己的興趣愛好點(我的網名innost就是國內一家超導技術公司的英文名)碩士期間,因爲要計算電磁場,發現Ansys是一個不錯的工具,所以我就研究了它的用法。一個偶然的機會,我得以編寫《ANSYS 10.0有限元自學分析手冊》一書。該書已重印了十幾次,至今仍是ANSYS入門書籍中最好的一本。(這裏要說明一下,《ANSYS 12有限元自學分析手冊》一書並非我寫,只是出版社誤用了我的名字而已。當時在寫《深入理解Android卷I》,也就沒時間理會這個事情,他們答應後續不會再用我的名字。)

從水電到超導,再到ANSYS,中間還搞過一段時間低溫光纖傳感。較多專業的轉換,逼着自己掌握了一種能力,即快速學習所需知識的能力。這種能力對我日後的工作幫助非常大。

CSDN:你在大學本科專業是水利水電,而在碩士研究生的時候學習超導磁體,並非計算機出身,後來爲什麼轉爲一名職業的IT從業人員?

鄧凡平:碩士畢業後,在北京沒法找到專業對口的工作,後來機緣巧合去了中科大洋。記得當時大洋的領導問我:是想搞軟件還是搞硬件?我想了半天,覺得研一還學過VHDL(一門硬件電路設計語言),就想去硬件部門。領導介紹說大洋的核心部門是軟件,我就說那就做軟件吧。就這樣,我跨入了軟件行業。

這個選擇可能比較倉促,我的同學也覺得比較奇怪,畢竟當時在電力行業也有一些積累了。不過我一直對軟件行業有如此多可學的東西而感到高興。另外,軟件開發是一個聽起來比較光鮮的行業。

作爲一個軟件開發的新手,壓力可想而知有多大了。幸好中科大洋是國內技術實力非常雄厚的公司,而且研發部工作氣氛很好。那三年我很努力(沒熬過夜,但是每天回家都讀書、學習、做筆記),因爲我知道自己屬於零基礎入門(從另外一個角度來看,這同時也是件好事,因爲心中沒有任何條條框框,很多東西都想去嘗試)。在這樣的環境下,我的技術水平在這三年中提升非常快,很快就成爲公司的核心開發人員了。另外,大概一年半的時候,項目組的幾個前輩跳槽,結果,開發重任只能放到我們這些小輩身上。這段時間技術成長非常快。回想這段經歷,感觸很深,一定要給新人機會正是這個道理。所以,現在的工作過程中,我也特別注意把機會給新人,幫助他們成長。

CSDN:你出版了目前唯一以情景方式深入Framework源碼進行分析的書《深入理解Android卷I/II》,什麼原因促使你寫了這本書?可以分享一下寫書過程中印象深刻的故事麼?接下來還有著書的計劃嗎?

鄧凡平:很高興的是,這兩本書現在已經不是唯一關於Android源碼分析的書籍了。

它們的出版還是和個人經歷有關。在大洋工作三年合同期滿後,我跳槽到中科創達。原因很簡單,因爲它做手機、平板等這些我個人比較感興趣、看起來很酷的東西。

當Android剛出來不久,中科創達就投入了幾乎全部力量到這個平臺中。爲了配合公司的發展方向,當時我就想着一定要把Android中那些不會的東西都學會。大家都知道“好記性不如爛筆頭”這句話,在學習過程中,我就把自己的學習心得記錄下來。再加上工作中又需要這些知識,二者相互促進,使得自己在Android這塊有機會、有動力去學習和積累。

寫書其實都對自己的挑戰非常大,尤其是在技術層面。當書寫完後,整個知識結構就相應搭建起來了。

我個人感覺在工作中很少能學到系統性知識,所以在此也鼓勵讀者一定要抽出整段時間來學習系統性知識。

另外,學習過程一定要總結,現在雲筆記是一個好東西。在工作時記下的東西,回家可以接着做。大家可以看我用Wiz做筆記時的示意圖。這是2年下來的積累:


雲筆記示意圖

隨着對Android的瞭解,我發現這兩本書的內容還遠不能包括Android的內容。所以我後來和華章公司高級策劃編輯楊福川先生共同規劃了一個《深入理解Android》系列書籍的發展路線圖。它囊括了Android的重要模塊。目前,Framework部分的卷I、卷II,專題部分的Telephony都已經完成,其他的部分我們希望能邀請正直、有鑽研精神、樂於分享、志同道合的朋友一起來寫,歡迎與我聯繫。


《深入理解Android》規劃

另外,我個人覺得國內科研環境仍然很浮躁,所以每一本書我們都會請專家審稿,把好質量關,真真切切幫助開發者學到東西。

CSDN:你對Linux內核、C/C++/Python相關的技術,以及高性能網絡服務器和多核並行開發等也有一定的研究,在學習上有什麼心得可分享?

鄧凡平:我的學習方法是以點帶面,建立自己的知識結構。例如,工作中,往往只需要集中全力解決一點或幾點問題就可以了。但這些點背後一定有一個較完整和深入的知識結構。所以,工作做完後,還需要繼續學習背後的知識結構。以多核並行開發爲例,09年做了一個FTP服務器,用到了多線程網絡開發的技術,工作內容很快就定型了。但我覺得多核並行開發是一門新興的技術,而我不想停留在僅會熟練使用多線程API這種程度,所以後續還花了不少時間去研讀多核並行方面的專著。

所以,我覺得不管讀者是在開發自己的產品也好,還是在修改bug也好,一定要努力從工作中提煉、積累出一個完整的知識框架。

這個方法說起來簡單,做起來還是有點困難。因爲它要求工作之後還得投入大量時間學習,把知識點串成面。而且,學這些知識的好處一時半會很難體現,需要耐心。

CSDN:你是怎麼組建、管理好一個團隊的?你覺得一個團隊最重要的是什麼?

鄧凡平:這個問題很難回答,因爲它要隨環境、人而定。從目前我所在的Tieto公司來說,大家爲之努力的就是要組建一個學習型團隊。團隊成員的技術素養很好,氛圍也很民主和開放。另外,我們都有一種對知識追求的願望(求知慾應該是人類都具有的原始且長久的衝動)。剛好學習型組織的核心理念也包括這些東西。

具體的管理手段有很多,比如時間管理、敏捷開發等。這些方法都有很多資料可以參考。不過大家一定要結合實際情況來因地制宜。

我個人覺得團隊最重要的是要做到大家心中都有同一個目標,即華爲所說的“力出一孔”。這一點比較難做到,決定於成員素質、公司文化等。另外,團隊成員之間經常交流、統一對目標的認識也很重要。

CSDN:技術出生的人能做好管理者嗎?兩個身份之間如何協調?

鄧凡平:我在管理崗位的時間並不長,所以對管理的認識還比較膚淺。從現在的職責來看,隨着個人技術能力的增加,公司需要我發揮更大的作用,所以就安排一個團隊一起爲一個更大的目標而工作。當然,一個人單幹和一個團隊一起幹活肯定有不同,所以我也需要培養技術團隊管理方面的意識。

身份協調的話,要結合具體情況。我們每天都有Scrum Meeting。在Meeting中大家介紹自己的工作情況。然後還要制定中短期工作計劃,並設置Check Point和負責人。如果中間有偏差,我們就要分析原因,及時調整。

我讀碩士的時候,導師除了管理學生外,也在鑽研技術,甚至做得比我們深入很多。這種方式我覺得可以在工作中採用。而且,它還符合Tieto公司的研發管理文化。

  • 沒有“速成”的架構師

CSDN:你作爲一名高級架構師,談談對軟件架構師的認識?

鄧凡平:軟件架構師只是一個職位,但具體職責每個公司都不相同。我現在的職責主要有兩個:一個是培養和增強團隊的Android技術實力,另一個是組織一個高效靈活、能征善戰的技術團隊。

CSDN:軟件架構師必須具備哪些技能或素質?哪項技能(素質)是你認爲最重要的?

鄧凡平:雖然每個公司定義架構師的職責都不相同,但架構師也需要具備一些基本技能:

  1. 較爲廣博的知識面。這項技能對團隊組建尤爲重要,因爲你得知道哪個模塊是短板、哪個模塊是核心。
  2. 要有不斷學習和改進的慾望。
  3. 某個時間、某個階段要能迅速明確目標。知道要做什麼,比知道怎麼做有時候更重要。

CSDN:要成爲一個架構師,是否存在快速成長的捷徑?普通程序員如何一步步向架構師的目標靠近?

鄧凡平:我比較反對速成之類的說法。架構師只是一個職位,而沒有放之四海都一樣的職責。所以,普適的速成方法很難找到。從個人成長的角度來看,我倒是有幾點建議:

  1. 工作前3年求知識的廣度。這三年對任何一個職場新人來說都很重要,所以要拋開語言之見(例如C/C++孰優孰劣)、平臺之見(Linux好還是windows好)。大家只要抱着一個問題來學習。即,這項知識你都清楚嗎?不清楚就去學,而不要把其他觀點牽扯進來。
  2. 三年之後可以根據自己的興趣愛好選擇一個合適的平臺進行深耕細作。這個階段求深度,並保持一定的廣度。在這裏,深度和廣度並不矛盾,二者是相輔相成,互相促進的關係。
  3. 任何事情都要把握度。求深度、廣度,什麼時候纔算完了呢?我建議一定要結合工作情況來調整。例如工作中是搞Android App開發,空閒時間拓展一下Android framework的知識是不錯的選擇。但如果去研究iPhone或雲計算等與工作毫無關係的內容,這種做法就值得商榷了。
  • Android是開源世界的集大成者,是一個完整的系統

CSDN:隨着智能終端的發展,安全問題日益凸顯。而開放的Android平臺也成了惡意軟件攻擊的頭號目標。研究人員已發現Android上的流行軟件普遍存在安全陷阱與安全漏洞,那麼,目前有哪些安全問題需要重視?從技術上應該如何減少這些漏洞呢?

鄧凡平:我對安全方面的問題沒有太多研究,不過可以向大家推薦一本書《Enhanced Security Solution in Android》。另外,華章公司即將上市的Android安全機制解析與應用實踐》也請大家多關注。

CSDN:你能談談Android Framework是什麼,以及Android NDK和Framework和NDK之間是什麼關係?另外,什麼是Android內核?

鄧凡平:Android分爲幾個層次,首先是Kernel層,它用得是Linux Kernel。然後是用戶空間中的Framework層。最後是Application層。Android的核心內容大部分集中在Framework層,我個人又把它劃分成兩個層次:

  1. 以Native語言編寫的模塊,包括負責顯示的SurfaceFlinger、負責音頻I/O的AudioFlinger、負責媒體播放的MediaPlayerService、負責Wi-Fi的wpa_supplicant、負責藍牙的Bluez。我稱之爲Native Framework
  2. 以Java編寫的模塊,包括和App緊密交互的ActivityManagerService、WindowManagerService等。我稱之爲Java Framework

從App角度來看,Android內核就是framework。而從framework角度來看,linux kernel是內核。

對App來說,Android盡力嚮應用層避免其他OS上的進程及進程間交互手段,取而代之的是四大組件及把它們相互連接起來的Intent。這是一種內涵遠高於其技術實現的設計理念。所以,我覺得把APP層以下的內容稱之爲Android內核更能體現Android的特點。注意,官方並未有這種劃分,所以讀者也大可有自己的劃分方法。

Android提供的開發工具有SDK和NDK之分。其實兩個都是傳統意義上的SDK,只不過SDK提供的是Java API,而NDK提供Native語言的API罷了。NDK出現的目的是因爲Android App是一個Java應用程序,它有時候需要調用Native庫來做一些事情,而Native庫就用Native語言的API來實現。

CSDN:你有這麼些年的Android開發經歷和對Framework源碼的分析經驗,能分享一下Android Framework工作方式及原理?Android應用開發者和系統開發者怎麼高效的學習Framework呢?需要掌握哪些技能?

鄧凡平:Android Framework各個模塊之間以及Framework各模塊和上層APP之間基本上都是基於C/S方式來交互的,交互手段有Binder、Socket、Pipe、共享內存等。這是Android Framework的核心工作機制。

Android Framework包含的知識點非常多,讀者應根據需要進行廣度和深度的拓展,例如:

  1. 如果工作中涉及到播放器開發,則可以深入研究Framework中MultiMedia模塊,包括播放引擎、編解碼、OMX等。
  2. 如果工作和Wi-Fi相關,則可以研究wpa_supplicant、802.11協議等。
  3. 如果對Activity切換、Provider工作原理感興趣,可以研究Java Framework。

一個基本原則是:由點及面,努力構造完整的知識結構。

Android是開源世界的集大成者,是一個完整的系統。我相信大家只要在這個系統中鑽研1-2年一定會受益匪淺。

CSDN:去年阿里雲OS推出時就因修改Android代碼而受Google責難,最後取消了與Acer的新品發佈會。現在阿里雲OS回來了,並表示將會力爭成爲第五大移動OS,大有與安卓劃界的架勢。阿里雲OS和Android有什麼關係?能否從技術層面分析一下。

鄧凡平:討論這個問題先得基於一個前提:根據已有的消息,雲OS最核心的內容是自主實現了一個Java虛擬機。我們假設這個前提是正確的。

那麼,現在來討論Java虛擬機在Android OS中的位置。

Android Framework包括Java層和Native層。以Java層而言:

  1. 毫無異議的一點是:Java層最終會運行在一個或多個Java虛擬機上。當然,這個Java虛擬機最終會以進程的形態運行在Linux之中。
  2. 現在問題就出來了:Google花了大量心血用Java語言編寫的ActivityManagerService、WindowManagerService、PackageManagerService等模塊,不光能運行在雲OS的虛擬機上,也能跑在dalvik自己實現的虛擬上。在這種情況下,java虛擬機的作用就好比PC機中的CPU。當你把CPU從Intel的換成了AMD後,就把運行在上面的Linux叫做自主OS。個人認爲這種說法有誇大之嫌。
  3. 另外還有一個關鍵點:除了Java模塊,Framework還包括Native模塊,這些東西和虛擬機幾乎沒有關係。它們也屬於雲OS中的重要一部分。

僅從技術的角度來推測,雲OS現在並將一直會參考Android。

那麼,什麼時候雲OS可以被稱作是自主OS了呢?

我個人覺得一個很簡單的標誌就是雲OS有自己的SDK。阿里似乎並不比微軟差錢。微軟能搞一個獨立的WinPhone,並且有自己的SDK。相信雲OS或其他OS能拿出讓國人爲之真正振奮的東西。

不過,OS這個東西,需要長期積累、埋頭苦幹。另外,Redhat、Ubuntu對Linux所做的修改絕不亞於雲OS,但它們還只是Linux的一個發行版本。所以,雲OS和國內各種OS還將任重而道遠。

CSDN:縱觀Android的發展歷程,你認爲哪些因素是成功的關鍵?

鄧凡平:Android的高速發展和芯片廠商尤其是高通的大力支持有直接且重要關係。我覺得可以組織人力調查一下這方面的內容。

另外,技術只是Android成功的一部分因素,還有很多商務、市場方面的因素。我對這部分內容研究較少,所以就不詳述了。

  • 移動互聯網時代,需要不同的平臺

CSDN:你關注移動互聯網領域,你認爲移動互聯網現在處於一個什麼階段?

鄧凡平:移動互聯網現在還處於一個不穩定的快速發展時期,而且百家爭鳴、百花齊放,讓人看得眼花繚亂。移動互聯網時代對程序員的要求除了在技術上要緊緊跟上外,另外還需要程序員們培養一些市場、商務、甚至產品設計、人文上的素養和技能。

所以,我個人一直反對將編程作爲一種技能從小就來教育。編程僅是人們在計算機上實現一些事情的手段。就好比音樂家在電腦上譜曲,最重要的是這個音樂家的音樂天賦,而不是他會用甚至能開發譜曲軟件。所以,我覺得應該要着力培養人文、音樂、哲學、美學方面的知識。

CSDN:有人說,多年來,Android一直是Linux的一個變體,你覺得Android和Linux之間有何關係?

鄧凡平:Android Framework運行在Linux內核之上。從理論上來說,這個Framework也可以運行在Window內核之上。我的這篇博客曾記錄了一位博友將Android移植到Win7的視頻。我見過那段視頻,它是直接將一個APK跑在win7上,而不是跑在模擬器或虛擬機上。

Android和Linux關係密切,這是事實。但它是不是變體,我覺得沒有必要爲此爭論不休。這本來就是一個仁者見仁智者見智的問題。

CSDN:你是怎麼看待iOS和Android這兩大陣營的?你認爲封閉和開放誰會最終勝出?

鄧凡平:我花了很長時間才理解一個基本事實就是“蘿蔔白菜,各有所愛”。就好像我喜歡不鏽鋼餐具,而很多人喜歡瓷器餐具一樣。我希望這兩個OS,甚至Windows Phone都能長久生存下去。移動互聯網需要不同的東西,不同的設計理念,而這對廣大開發人員以及用戶來說都是一件幸事。

CSDN:在移動互聯網時代,Android佔據一席之地,Android未來的發展趨勢如何?

鄧凡平:Android在Google及其它合作伙伴的齊心協力下應該會保持穩健發展的勢頭。而更多、更先進的硬件(如更多傳感器、更強勁的電池)、軟件技術(例如Miracast也會通過Android手機和其他智能設備讓千家萬戶真真切切體會到技術改變世界的力量)。

CSDN:你從事開發多年了,這一路走來,最大的感悟是什麼?

鄧凡平:求知慾是人的本能,很高興自己一直保持了這種本能。另外,做好時間管理、明確自己的目標也非常重要。

對於一些初學者我有一些以及和我一樣仍在努力的人,有幾點建議:

  1. 在工作初期,先求廣度,再求深度;只有見識面廣,纔有可能融會貫通;要努力接觸新事物;Be Active。
  2. 工作三年後,要選擇適合自己的。這個時候,知道自己要做什麼,比知道怎麼做更重要。
  3. 要有團隊精神。覆巢之下無完卵。團隊不好,個人也不會好到哪裏去。大家要齊心協力把事情做好,不要過多考慮個人得失。
  4. 要有定力和鑽研精神。在知識學習上,高投入纔可能有好產出。
  5. 注意身體健康。活得越久,才能學得更多嘛。這是硬件,沒有它,任何軟件都跑不動。身體健康與否作爲一個人最重要的風險因素,相信軟件工程師們一定會重視並加強控制的。

CSDN:你現在是如何分配自己的時間?是否還堅持在一線,這能給你帶來什麼樂趣?

鄧凡平:除了工作和必要的休閒鍛鍊外,我大部分時間都花在看書或寫書。不論技術、管理、歷史等書籍,只要感興趣都會去看。另外,工作中如果有些知識點很重要,回家後也會趕緊補習相關的知識結構。

學習可以滿足求知慾。從可預計的未來3-5年來看,我還將工作在技術第一線。當然,我們團隊成員技術實力都很高,團隊意識也非常強,這也使得自己有時間和精力來鑽研Android中還有那麼多不瞭解的模塊。同時,也希望能及時和大家分享自己的學習成果,獨樂樂不如衆樂樂嘛。

CSDN你對CSDN有什麼建議?對未來有什麼期待?

鄧凡平:希望CSDN能推出電子版的程序員雜誌,可通過多看或京東電子書提供付費下載。

另外,我一直希望CSDN能打造一個獨立、公正的技術社區,使得各方意見、各種聲音都能在此表達並能被聽到,給這個喧囂、略顯浮躁的移動互聯網世界帶來一股清新之風。

希望自己能一直保持喬布斯所說的“Stay foolish, Stay hungry”的狀態。

發佈了41 篇原創文章 · 獲贊 18 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章