關(guān)于Android學(xué)習(xí)的三個(gè)終極問題

?作者:鄧凡平
授權(quán)轉(zhuǎn)載于公眾號(hào)神農(nóng)和朋友們的雜文集
緣起
讀研的時(shí)候,有一次和同學(xué)一起上自習(xí)。我在學(xué)習(xí),他也在學(xué)習(xí)。我想,大家每天都一起上課,記筆記,上自習(xí),完成作業(yè),智商也差不多,為何考試的時(shí)候有時(shí)候差距會(huì)很大呢?這個(gè)問題我直到今天也沒有答案,這幾天和朋友閑聊說到這個(gè)事情。他們有得說是智商有差距,有得說是學(xué)習(xí)的時(shí)候心不在焉——看著在學(xué)習(xí),其實(shí)已神游大千世界。.....,不過,我自己從來沒有下過類似的結(jié)論。我武斷的猜測(cè),這個(gè)問題應(yīng)該是沒有讓人心服口服的答案。
?
從事軟件開發(fā)行業(yè)后,發(fā)現(xiàn)要學(xué)的東西越來越多。尤其是近幾年,發(fā)現(xiàn)未知的知識(shí)實(shí)在是太多??峙翴T人活到老學(xué)到老的壓力是絕無逃避的可能性了。那么,關(guān)于學(xué)習(xí),我們需要注意什么呢?2015年google開發(fā)者社區(qū)一個(gè)集會(huì)上,我曾經(jīng)分享過一些思考。4年過去了,又積累了不少經(jīng)驗(yàn)教訓(xùn)(其實(shí)就是老了不少),現(xiàn)在想總結(jié)這些年的觀察,做一個(gè)總結(jié)。我感覺可能需要至少兩篇文章才能說完。一個(gè)是本篇的關(guān)于Android學(xué)習(xí)的三個(gè)終極問題,另外一個(gè)是對(duì)一專多能的思考。
?
去年我在周愛明老師的《大道至簡》一書里看到對(duì)“反思”一詞的定義,深有感觸。書里說,反思,既不是設(shè)問,也不是反問,而是對(duì)一個(gè)問題的持續(xù)關(guān)注。這么來看,十余年來我對(duì)考試成績好壞原因的思考就是一種反思。
?
在繼續(xù)本文之前,我想說,我這個(gè)人講不出什么大道理,能講的東西都是自己想過、嘗試過、甚至在周圍朋友,同事身上一起試驗(yàn)過的。即使不能從中學(xué)到什么有價(jià)值的東西,但看到像我這樣的一個(gè)圓臉中老禿胖其實(shí)一年也沒多少天是無憂無慮得,你也可以開心一下了。
?
關(guān)于學(xué)習(xí)的三個(gè)終極問題
?
關(guān)于學(xué)習(xí),我認(rèn)為有三個(gè)終極問題:

?
這三個(gè)終極問題是:
?
1.? 學(xué)什么?2015年時(shí)還沒有flutter,RN我記得剛起。不知道在那個(gè)時(shí)候意氣風(fēng)發(fā)的Android紅人們現(xiàn)在是不是會(huì)有點(diǎn)感觸了。過了4年了,現(xiàn)在該學(xué)什么?Flutter?AI、區(qū)塊鏈?是為了興趣愛好而學(xué),還是為了保家衛(wèi)國光宗耀祖揚(yáng)眉吐氣世界更美好而學(xué)?
?
2.? 怎么學(xué)?這是在你剛千思萬考解決第一個(gè)問題的時(shí)候接下來的另一個(gè)大難題。是ALL IN新知識(shí)?還是新舊知識(shí)兩手都要抓?不論哪種選擇,你都很難和長江后浪比精力,比速度。對(duì)待新知識(shí)、新技術(shù),長江后浪是光腳不怕穿鞋的,靠試錯(cuò)來成長。
?
3.? 學(xué)到什么程度為止?最后,你開始學(xué)了,也知道怎么學(xué)了。然后呢?鉆研技術(shù)是無止境的,你要學(xué)到什么程度為止?夠用就行嗎?夠用是在哪個(gè)范圍夠用?我自學(xué)完寫個(gè)demo叫夠用嗎?還是說學(xué)完后要給公司創(chuàng)造多少多少價(jià)值才行?我公眾號(hào)的首篇文章“深入理解的目標(biāo)是什么?”和這個(gè)問題有一點(diǎn)關(guān)聯(lián)。
?
很多時(shí)候,很多人并不會(huì)意識(shí)到學(xué)個(gè)知識(shí)還有什么三個(gè)終極問題。比如,周圍人都學(xué)某某技術(shù),所以我要學(xué)?;蛘撸瑢W(xué)某某技術(shù)有前途和錢途,那我也學(xué)。坦白來講,我很羨慕這些人。在和平、穩(wěn)定的年代,隨大流是穩(wěn)妥的選擇。我很后悔讀研的最后不該聽了中科院某老師的授課。2007年,他“深度思考”了中國經(jīng)濟(jì),得出了一個(gè)結(jié)論,說咱們的經(jīng)濟(jì)列車高速開了這么久了,肯定會(huì)下降的,然后房價(jià)會(huì)跌。所以,工作后的前3年我看著房價(jià)飛漲的時(shí)候依然堅(jiān)信這個(gè)結(jié)論。幸好父母親果斷,舉債買房。當(dāng)時(shí)我加班夜里回來后聽說自己背負(fù)了100多萬的房貸還很不開心。沒想再過幾年我發(fā)現(xiàn)自己居然少背了幾百萬的房貸。
?
所以,要是你沒有意識(shí)到有這三個(gè)問題,你是幸福和幸運(yùn)的——如果環(huán)境沒有發(fā)生變化,你也無須改變。
?
上面三個(gè)問題是我自己在學(xué)習(xí)問題上的反思——反思的潛意思是我也沒有答案。我覺得也很少有人能給出明確的、普適的答案。我有一種強(qiáng)烈的預(yù)感,在關(guān)于學(xué)習(xí)的這三個(gè)終極問題上,每個(gè)人一定都是在自己的無人區(qū)里探索。
?
承認(rèn)無人區(qū)的存在是有百利而無一害的。我以前每次換工作都要找機(jī)工的楊總編等朋友請(qǐng)教,但發(fā)現(xiàn)他們的意見總是不理想。終于有一天我明白了,原來我在自己的無人區(qū)中,里邊只有我一個(gè)人。我的家人,朋友都不能真正理解我,他們解決不了我的困惑。 不過,當(dāng)在無人區(qū)里掙扎的我知道還有那么多親人、朋友是支持我的,勇氣就會(huì)更足。堅(jiān)信總會(huì)有一天,我會(huì)短暫得從無人區(qū)出來,然后再走入下一個(gè)更高級(jí)的,更有挑戰(zhàn)的無人區(qū)。
?
?
對(duì)了,去年我才發(fā)現(xiàn)溫伯格原來早在《技術(shù)領(lǐng)導(dǎo)之路》一書里就曾提到過類似的情況,那一章的中文名叫“領(lǐng)導(dǎo)的成長”。
?
接下來,我要把這幾年從事Android開發(fā)相關(guān)工作中看到的東西結(jié)合自己的認(rèn)識(shí)講一講。我覺得它們一定能幫助到在Android技術(shù)領(lǐng)域里謀生的一些兄弟姐妹們。
?
關(guān)于Android學(xué)習(xí)方面的一些探討
?
根據(jù)我的經(jīng)歷和認(rèn)識(shí),Android技術(shù)領(lǐng)域劃分按從下到上可分為三個(gè)大的層次:
?
1.? Android底層開發(fā)。這個(gè)領(lǐng)域的開發(fā)工作主要集中在設(shè)備廠商(比如華米OV)、芯片廠商(華為高通)等。最近這兩年,伴隨IoT技術(shù)的發(fā)展,一些有能力的互聯(lián)網(wǎng)公司也需要這方面的人才。
?
2.? Android系統(tǒng)層開發(fā)。這個(gè)領(lǐng)域的開發(fā)也是集中在設(shè)備廠商。但我最近發(fā)現(xiàn)頭條這樣的互聯(lián)網(wǎng)公司也大量招聘懂Android Framework的工程師。另外,新興的車聯(lián)網(wǎng)、車企也對(duì)這方面人才有大量需求。
?
3.? Android應(yīng)用層開發(fā)。這個(gè)就不用說了,競(jìng)爭非常激烈,技術(shù)迭代的速度飛快。
?
接下來,我會(huì)從知識(shí)范圍和主要工作內(nèi)容、學(xué)習(xí)路線以及需要注意培養(yǎng)的專業(yè)素養(yǎng)這三個(gè)方面來考察下上述三個(gè)Android技術(shù)領(lǐng)域。
?
?
Android底層開發(fā)
?
Android底層開發(fā)涉及到的知識(shí)范圍和主要工作內(nèi)容如下:

? ?
從事底層開發(fā)的碼農(nóng)們叫BSP或驅(qū)動(dòng)開發(fā)工程師。涉及的專業(yè)知識(shí)集中在Linux Kernel或驅(qū)動(dòng)方面。
Linux Kernel是無數(shù)人為之傾倒的知識(shí)金礦。當(dāng)年我也認(rèn)認(rèn)真真讀過毛德操老師的《Linux內(nèi)核情景分析》這樣的源碼分析書籍。這本書對(duì)我的影響非常深,以至于我策劃的深入理解Android系列的幾本書可看做是毛老師的手法在Android系統(tǒng)上的復(fù)制。
?
底層開發(fā)的工作內(nèi)容主要是移植和Bug Fix。在某些公司的日常工作中,只要找到解決bug的patch,打上去就好了。為什么會(huì)這樣?因?yàn)镵ernel是一個(gè)比較穩(wěn)定的軟件。在這里,穩(wěn)定壓倒一切。當(dāng)然,其中也有非常具有挑戰(zhàn)性的工作,比如優(yōu)化相關(guān)的工作等。
?
如果你想從事Android底層開發(fā),下面是這個(gè)領(lǐng)域的學(xué)習(xí)路線:

?
在這個(gè)領(lǐng)域里工作,請(qǐng)牢記“吃虧是?!边@句話。吃虧意味著積攢經(jīng)驗(yàn)。這個(gè)領(lǐng)域里的經(jīng)驗(yàn)是至關(guān)重要的。所以,我在下面的基本素養(yǎng)里還會(huì)提到它:

?
Android系統(tǒng)層開發(fā)
?
接著來看Android系統(tǒng)層開發(fā)。它涉及的知識(shí)范圍和主要工作內(nèi)容如下:

Android系統(tǒng)層開發(fā)的主要工作有因Android系統(tǒng)升級(jí)帶來的移植工作、或者是諸如華米OV各家系統(tǒng)的產(chǎn)品特性(因?yàn)樵鶤ndroid系統(tǒng)沒有,所以需要自己開發(fā))。
?
最后,隨著除手機(jī)外的智能設(shè)備興起(如智能POS、智能汽車),這些特定設(shè)備上也有許多在系統(tǒng)層需要開發(fā)的工作。
?
相比底層開發(fā),系統(tǒng)層開發(fā)有更多的個(gè)性發(fā)揮空間。MIUI、EMUI、color OS等等就是系統(tǒng)層個(gè)性發(fā)揮的結(jié)果。簡單點(diǎn)說,如果可以把從事底層開發(fā)的公司看做是硬件公司,那么從事系統(tǒng)層開發(fā)的就可以看做是軟件公司了。
?
我這個(gè)說法肯定是不對(duì)的,但這里想說的是這兩個(gè)領(lǐng)域的思維方式不太一樣,因?yàn)橐鉀Q的問題也不一樣。
?
Android系統(tǒng)層的學(xué)習(xí)路線如下:

? ?
從編程語言上來說,Android系統(tǒng)層有很大一部分是用Java開發(fā)的。另外還有一大部分是用Native(C/C++)語言開發(fā)的,
?
所以,要想在這個(gè)領(lǐng)域做到游刃有余,對(duì)Java和C++語言要了解。題外話,還沒了解C++的同學(xué)可以直接上C++11。它和C++98/03不同(C++之父BjarneStroustrup甚至說過“C++11看起來像一門新的語言”)。
?
關(guān)于C++11的知識(shí),我在CSDN博客上"C++11學(xué)習(xí)"一文(也是《深入理解Android JVM ART》一書的第五章,因?yàn)锳RT JVM幾乎都是C++11寫的)做過一個(gè)較為全面的介紹(地址在文后列出)。
Android系統(tǒng)層是相當(dāng)吸引廣大開發(fā)者的一個(gè)領(lǐng)域。比如很多知名Android技術(shù)公眾號(hào)都會(huì)時(shí)不時(shí)講一講Handler的實(shí)現(xiàn)、UI繪制的流程、Binder的工作原理、消息傳遞機(jī)制等這樣的知識(shí)。 這些內(nèi)容早在《深入理解Android》系列的卷1、卷2和卷3都覆蓋了。只不過時(shí)過境遷,年輕的人現(xiàn)在更適應(yīng)新的傳播方式。
?
除了這些通用知識(shí),Android系統(tǒng)層還有相當(dāng)一部分屬于專業(yè)領(lǐng)域知識(shí)。比如,藍(lán)牙、Wi-Fi、NFC、Telephoney(其中的雙卡雙待功能算是中國特色的功能)。如果你從事類似這樣的專業(yè)領(lǐng)域的工作,請(qǐng)注意把精力放在專業(yè)知識(shí)本身,而不是Android里的代碼。比如,Wi-Fi、NFC、GPS、藍(lán)牙技術(shù)出現(xiàn)得遠(yuǎn)比Android早。它們各自有非常深厚的專業(yè)、理論知識(shí)。
?
在Android中,你看到的相關(guān)代碼無非是它們?cè)谔囟ㄏ到y(tǒng)上的實(shí)現(xiàn)罷了。你務(wù)必要先了解這些專業(yè)、理論知識(shí),才能看懂Android上的代碼實(shí)現(xiàn)。更未雨綢繆的說法是,如果將來沒有Android系統(tǒng)的話,你一樣可以靠著對(duì)專業(yè)理論知識(shí)的了解另起爐灶。
?
這也是我說“基于Android、高于Android”的意思。一個(gè)最近發(fā)生的例子是,有個(gè)幫我審稿JVM ART一書的審稿專家現(xiàn)在研究Flutter里的虛擬機(jī)。我相信他會(huì)比別人走得更快,更輕松一點(diǎn)。
?
Andriod系統(tǒng)層開發(fā)的基本素養(yǎng):

?
系統(tǒng)層這幾年發(fā)展也很快(想想Android的發(fā)版速度),靠個(gè)人力量來追蹤這么一個(gè)復(fù)雜系統(tǒng)已經(jīng)很困難了,需要大家一起來知識(shí)共享。
?
雖然很多公眾號(hào)會(huì)寫一些文章來介紹Android某個(gè)新系統(tǒng)的特點(diǎn),但其實(shí)在設(shè)備廠商里是有不同的團(tuán)隊(duì)來跟蹤新系統(tǒng)里不同模塊的變化得。比如,除了Google I/O外,谷歌給設(shè)備廠商還組織了一個(gè)叫Android Bootcamp這樣的類似培訓(xùn)一樣的集會(huì),里邊會(huì)比較詳細(xì)的、按功能、模塊來介紹新系統(tǒng)的特點(diǎn)。不過,參加Bootcamp所獲得的資料往往要保密。
?
Android應(yīng)用層開發(fā)
?
接著來看最后一層——Android應(yīng)用層開發(fā)的知識(shí)范圍和主要工作內(nèi)容:

? ?
應(yīng)用層開發(fā)的特點(diǎn)就是知識(shí)點(diǎn)多、更新速度極快。相信大家都有感覺。針對(duì)這個(gè)層面的開發(fā)者,我想,就不要拘泥于什么門派了,需要什么就學(xué)什么(注意,不是有什么就學(xué)什么)。相比其它兩個(gè)領(lǐng)域, 應(yīng)用層開發(fā)是為業(yè)務(wù)需求服務(wù)的。所以,為了更好得服務(wù)業(yè)務(wù)需求,該學(xué)什么就學(xué)什么。
?
比如,我最近的方向轉(zhuǎn)到應(yīng)用層開發(fā)了,但我所在行業(yè)的應(yīng)用主要用H5+webview來承載業(yè)務(wù)邏輯,那么我就重點(diǎn)花時(shí)間學(xué)習(xí)了這塊的內(nèi)容。
?

?
我個(gè)人認(rèn)為從事應(yīng)用層開發(fā)同學(xué)的比例最大,也是最能體會(huì)“跟不上知識(shí)更新步伐”感受的人。這一領(lǐng)域中有沒有什么基礎(chǔ)關(guān)鍵技術(shù)?我多年觀察下來覺得在應(yīng)用層開發(fā)領(lǐng)域,多線程編程、網(wǎng)絡(luò)編程、設(shè)計(jì)模式等幾個(gè)是基礎(chǔ)關(guān)鍵知識(shí),無論如何要想辦法抓在手里。
?
還有,軟件開發(fā)的方法論、甚至產(chǎn)品開發(fā)、項(xiàng)目管理都是這個(gè)領(lǐng)域里需要了解的。
?
另外,在某股技術(shù)“風(fēng)”起的時(shí)候,要判斷下它是為了解決什么問題而產(chǎn)生的,你的業(yè)務(wù)需不需要這種技術(shù)?我對(duì)曾經(jīng)一起干活的小伙伴們說過,寧愿你閑著沒事干,也不要亂學(xué),瞎學(xué)。在這個(gè)領(lǐng)域,功利、目的性強(qiáng)一點(diǎn)好。不要為了學(xué)習(xí)而學(xué)習(xí),也不要為了KPI去github上重復(fù)造輪子。這也是該領(lǐng)域的基本素養(yǎng)。

?
頓悟及其它
?
前幾年我一直在系統(tǒng)層和靠近底層的領(lǐng)域里搞事情,有時(shí)候也會(huì)做一些應(yīng)用層的開發(fā)。近來我在轉(zhuǎn)入應(yīng)用層開發(fā)的時(shí)候,花了一些時(shí)間研究應(yīng)用層開發(fā)和系統(tǒng)層開發(fā)的一些區(qū)別:
?
1.? 不得不說,底層和系統(tǒng)層是存在和需要個(gè)人英雄主義的。最常見的情況就是誰改bug最厲害誰就是英雄。所以,“深入理解的目標(biāo)是什么”一文里提到的手撕鬼子一幕在這兩個(gè)領(lǐng)域里是有可能存在的。
?
2.? 應(yīng)用層技術(shù)的難度在于工程化。一個(gè)好的想法在demo上實(shí)驗(yàn)成功了,要推廣并大規(guī)模使用并創(chuàng)造真正的價(jià)值一定是要工程化該想法的。而工程化的過程中,就需要業(yè)務(wù)、產(chǎn)品、前后端、測(cè)試等多個(gè)團(tuán)隊(duì)配合?!吧钊肜斫獾哪繕?biāo)是什么”提到的虛竹如果沒有王語嫣、或者沒有很好的團(tuán)隊(duì)支撐的話,是很難在這個(gè)地方發(fā)展起來的。
?
?
3.? 另外,應(yīng)用層開發(fā)如果找到現(xiàn)成的已經(jīng)有工程化實(shí)踐經(jīng)歷的開源庫,我建議能使用的話還是使用它們吧。不過,要用好人家的開源庫也不是一件容易的事情。因?yàn)槿思宜媾R的問題肯定和你的問題不一樣。
?
不知道你有沒有這樣的感覺。學(xué)習(xí)過程中,如果碰到一個(gè)問題,如果反反復(fù)復(fù)、長時(shí)間去思考它的話,總有一天會(huì)明白。這其中,有極少數(shù)的幾次會(huì)讓你有一種頓悟的感覺。到目前為止,我職業(yè)生涯里談得上頓悟的時(shí)候應(yīng)該不超過3次。
?
最早一次是反復(fù)回顧用MFC開發(fā)一個(gè)自定義樹形控件總是有內(nèi)存崩潰的bug從而頓悟到內(nèi)存操作到底是在干什么。
?
另外一次是做DLNA的時(shí)候根據(jù)文檔協(xié)議編寫對(duì)應(yīng)軟件的頓悟——很多時(shí)候編程只不過是把想法翻譯成計(jì)算機(jī)語言而已。而交流想法的形式可以是口述、規(guī)范文檔。所以,想法是本。
?
最后一次談得上頓悟的事情是在看完《信息簡史》后。此后我在開發(fā)軟件的時(shí)候仿佛能看到信息在流動(dòng)。用戶從界面上輸入信息,流經(jīng)網(wǎng)絡(luò),后臺(tái)接收并處理信息,直到存儲(chǔ)信息。甚至當(dāng)我看到領(lǐng)導(dǎo)在耳提面命下屬某個(gè)問題的具體處理細(xì)節(jié)時(shí),我也深刻感受到他在“編程”——我們都是在處理信息罷了,領(lǐng)導(dǎo)對(duì)我們編程,我們對(duì)計(jì)算機(jī)編程。
?
最后
?
1.?? 深入理解Android系列有好幾本書已經(jīng)不再出版了,我在CSDN上提供全文電子版下載https://blog.csdn.net/Innost/article/details/43342087
?
2.? C++11的學(xué)習(xí)可參考CSDN博文https://blog.csdn.net/Innost/article/details/52583732
?
3.? “深入理解的目標(biāo)是什么”見https://mp.weixin.qq.com/s/hZrTlo3sSENtOQVbJ_h2Dg
?
4.? 看到太多同學(xué)在追求技術(shù)上所付出的努力以及所碰到的困惑。我自己總結(jié)過很多有價(jià)值的東西,但我覺得對(duì)具體知識(shí)的掌握并不是關(guān)鍵,更重要的是思考問題的方式和方法——這也是我在本篇開頭會(huì)提到我對(duì)考試成績好壞的思考。另外,我還想學(xué)習(xí)一些新的東西。這些,我都想通過某種方式分享給感興趣的朋友們。
?
在《深入理解Android JVM ART》這本厚達(dá)1000頁書籍寫完后,我給自己說,絕不要再寫這樣需要“操刀自宮"才能練成的書了。我應(yīng)該把復(fù)雜的知識(shí)用簡單明白的方式表達(dá)出來,然后大家再結(jié)合自己的認(rèn)知和經(jīng)歷去體會(huì)、去利用這些知識(shí)就行。
?
最后的最后,我期望的結(jié)果不是朋友們從我的書、文章、博客后學(xué)會(huì)了什么知識(shí),干成了什么,而應(yīng)該是說,神農(nóng),我可是踩在你的肩膀上得喔。
---------
學(xué)習(xí)更多干貨文章請(qǐng)關(guān)注微信公眾號(hào)百問科技
?技術(shù)討論請(qǐng)加個(gè)人微信13266630429