Android 築基導論

炸雞啤酒不可負發表於2020-11-04

前言

程式設計這條路能走多遠,能走多久,就看一點: 你學不學的明白。想學明白,就得看你 會不會學習,所以程式設計能幹多久,你值多少錢,最終看你 會不會學習
我們從小就學習,但是一旦離開了學校這種壓力環境,你還會學嗎?你還學的進去嗎?軟體行業從業者之間差距就是因為學習效率的不同拉開的
你是不是曾經這樣苦惱過,並且百思不得其解:
  • 為啥大廠校招比社招的人多?
  • 為啥大廠只要基礎好的畢業生?
  • 為啥矽谷面試只問資料結構和演算法?
  • 為啥大廠要給新人安排導師、引路人?
  • 為啥大廠新人成長這兒快,別人半年頂我3年?
  • 為啥我5年經驗不如大廠裡幹1年的小鮮肉?
這些問題曾經一直困擾著我,冥冥中有個聲音告訴我,你要是找到了答案,從此康莊大道、任你傲遊、你也能達到那令你羨慕、憧憬的高度!歷經多次思考,到今年我總算是差不多略順了前前後後,今天發出來大家鑑賞一下
今天分享一下,包括一些學習資料,但是更重要的是明明白白的告訴大家,你為什麼學不會、怎麼才能學的好、怎麼學習才是效率最高的。聽我之言,Android 2年高階不成問題

學習中常見問題

1. 進退無據,盲目追求最新技術

新技術月月有、日日出、年年新,出來一個你看一個,但是你真的著急學它嗎?你著急在專案中立馬使用嗎?真的讓你用你敢用、你有權利用嗎?
你想過沒有,我還有多少不會的、沒懂的、模糊的、專案急需的、遺留的,難倒那些欠下的技術債你都裝看不見嗎?
你應該清楚哪些是最優先的、哪些是可以放放的,就像專案開發一樣,列個燃盡圖出來,估計你會嚇死。當然能把這個圖列出來也是你的能力,好多人還都列不出來呢。但你若是對這些視而不見,那就是逃避。踏實、務實才應該是我們的日常

2. 胡亂學習,左學一點右學一點

軟體開發是個工程專案,技術也具備和工程專案一樣的特點,那就是技術之間高度融合、相互配合,整個專案是理論和實踐高度結合,技術之間高度融合後的產物
很多人平時怎麼學習?就是看部落格!今天A寫了這個,我就看這個;明天B又寫了那個,我又去看那個。先不說這短時間內來回切換學不同的技術點,你有時間能學明白嗎?單就說這左一下、右一下的,你怎麼形成知識體系?你的學識之間要是不能相互融會貫通,在軟體這個行業那是致命的。尤其是這種左學一點右學一點的方式那是真的會要你命的,這樣學下來1年,我敢說你最多就是學到幾個單獨的知識點罷了,於全域性無補
但恰恰太多的人都是這樣,你們天天喊學習、我學習、白天學、晚上學的,但還是學不會,你就不想想是哪裡出了問題嗎?

3. 不寫筆記,狗熊掰棒子全忘了

我曾經寫過一文 (  ),專門論述不寫部落格的後果,那就是狗熊掰棒子學了後面的忘了前面的。大家須知,沒有過目不忘,即便你當時學的再通透,過2月不用,一樣可以忘的一點不剩。你要是努力辛辛苦苦整天看、整天學、一年下來,年關的時候你回憶回憶你還記得多少?樣的學習真的有意義嗎?屬浪費時間罷了!這都算是一種基於焦慮的精神疾病了,是對自己的一種折磨 (>﹏<)
別人的文章是別人的,不代表你看了就是你的了,只能說你知道了有這麼一個知識點。你看為什麼大神們都寫部落格,因為大神們辛苦提煉出來的精華它也會忘,所以的寫部落格出來,一個是分享,一個是在寫文章過程中再提煉提煉,分享出來還能有名望

4. 基礎薄弱,原理、原始碼我就是學不會

很有朋友都看原理,看原始碼的吧:
  • OKHttp 原始碼看不懂,執行緒池、阻塞佇列我沒學過,網路程式設計的點也不懂,設計模式也只是聽過,我不理解為啥類要設計的這麼複雜,要有這麼多類
  • Glide 原始碼看不懂,設計模式忘了,不理解類結構為什麼這麼設計,都說好,但是我就是不理解好在哪
  • MMKV 根本就看不懂,到底怎麼實現的快速檔案儲存的?去看原理,虛擬記憶體、檔案對映、mmap 這都啥玩意,聽都沒聽過
  • AMS 怎麼執行的,系統服務都是怎麼跑起來的,Binder 通訊怎麼做的,看了很多文章就是不明白
  • 自定義 View 練了好些次了,怎麼就是還是不會呢,canvas,paint 怎麼就是不會使呢
  • 哎,這個效果好贊,怎麼畫出來的
  • 影片播放好高深呀,怎麼做的?看文章一點也看不懂哎,產品讓我在播放器頁面加點東西,但這個怎麼改,播放器樣式不都寫死的,我只會在上面好來加一個蒙版,但是我看大神們都是自己定製的播放器,好高深啊

5. 反推式學習

  1. 今天看 MMKV,完全看不懂。找部落格,看到有文章說用到虛擬記憶體。沒聽過,我去看虛擬記憶體,看了好些天,還是不怎麼理解。然後又有文章說用的是檔案對映的原理,看了好些資源終於多少明白點了。但是 mmap() 函式就是不理解。還有使用者空間、核心空間這些。一個月過去,總算是看的差不多了,雖然點看的差不多,但都是半懵不懂,整個知識點串起來也費勁
  1. 看 OKHttp 原始碼,裡面有執行緒池,還有 Socket,耗時大半個月,總算是把 OKHttp 原始碼囫圇看完了
最可怕的學習方式就是 反推式學習,你啥也不會的時候就去硬看 OKHttp 原始碼,一般大家都有一些理解力、經驗,淺層程式碼能看個大概,當看到不會的知識點再去看資料,然後再一點點深入,一般都是這麼學的,文章也都是這麼寫的
我個人強烈抨擊這種學習方式,OKHttp 是幹什麼的大家都知道吧,實現網路功能的,程式碼很多很複雜的吧,其中肯定會涉及到 網路程式設計、設計模式、多執行緒知識點,並且這些知識點會綜合應用。很多啥也不會、一點基礎都沒有的小白直接去看 OKHttp 原始碼,這不叫學習,這叫硬看。你一點基礎沒有,即便遇到不會你去查資料,你真的能看懂整個框架嗎?其中設計思路、思想精髓、技術策略你肯定吸收體會不到,這些才是最有價值的部分,面試高玩們也是側重想聽你說這部分
太多的人在啥也不會的時候直接去看程式碼成品,而不是先鞏固、學習涉及的基礎、底層知識,我管這種方式叫: 反推式學習。這種學習方式,及其低效率、難度極高、效果極低。你明明知道會涉及什麼基礎知識,你為什麼不先把這些基礎知識點都看懂了再來看 OKHttp,你沒有和作者相同高度的基礎認知,你是不可能看得懂作者的想法的,你是不會體會到作者感受、作者寫這個框架時的技術思路和決策

什麼才是好的學習方式

歷經3年、不停反覆思考、實踐之後的思路,希望對大家有所幫助

1. 學習要有優先順序

不要去管那些天天都出來的新技術,你先放著,就讓別人先趟坑去,你現在學那些令你寸步難行的知識點,這些才是你現在攔路石,時間不要浪費在別處

2. 夯實自己的基礎,先打好基礎再說

太多沒有結果的學習都是因為你基礎不行,既然看不懂那就不要勉強了,應該去看用到的基礎知識。以 OKHttp 為例,看不懂原始碼,那就去猜它用了什麼基礎知識。若是不會,就把  網路程式設計、設計模式、多執行緒 這些基都學會了,再回過頭來看 OKHttp 它不香嗎。有多少看不懂的、還有多少不理解的。你再去看網上那些 OKHttp 的文章,你會罵:這什麼文章、都寫的啥、垃圾、哦~原來是這樣啊、我知道了、我明白了...... 這才是正確的開啟方式

3. 集中時間辦大事

不要今天看這個明天看那個的,對於單個知識點,利用短期的集中的時間先把這個點搞定再去幹別的,再去休息。對於大塊的知識點,規劃好時間,集中時間一個個點的啃下來再看別的

4. 系統性學習

程式設計領域的知識點都是相互關聯的,不管是學習階段,還是使用階段都是一樣。割裂的、無法成體系、相互無法印證的散碎知識點對你來說是沒什麼幫助的,該不會的還是不會,你不會真的學明白。學習就必須把一個領域的知識點一次性全部學到位,這才是最正確的展開

我再強調下基礎的重要性

基礎不穩,地動山搖!
好比我們學習數學,大家都是先學:
  • 阿拉伯數字 -> 數學符號 -> 加減法 -> 乘除法 -> 九九乘法表 -> 方程式 -> 公式定理
從小我們學習,在學校裡就是從難到深,那為啥放到軟體領域,程式設計行業,我們就忘了呢,大家總是著眼於最頂層的東西,總也看不到技術基礎在哪裡呼喊你趕緊關注它 ┻━┻︵╰(‵□′)╯︵┻━┻
我們平時用的開源框架/庫,這些都是軟體領域最終的成品了,就好比是數學中的 公式定理,小白學習這些原始碼就是一個剝開 公式定理外皮一層層深入的過程,隨著學習的深入,這過程是這樣的:
  • 公式定理 -> 方程式 -> 九九乘法表 -> 乘除法 -> 加減法 -> 數學符號 -> 阿拉伯數字
這個過程就是我上面說的反向學習,在沒完全成熟、完善的、從頭到位的學習課程的技術領域,這個逆向的過程是不可避免的,但是我們必須知道這種逆向學習有多大威海
  • 當你越多很多技術文章,你忽然發展了一個技術點,這個好比你看到了一個新的 公式定理
  • 你打算深入去學習其中實現原理提升自己水平,那會發現這裡需要 方程式方面的知識,但是方程式方面的知識我沒學過,也不瞭解,我也不知道有多少知識點,於是我閱讀大量文章,囫圇吐棗的把2元1次方程式學會了,但我其實不知道還有3元1次方程式、3元2次方程式,所以我看著很費勁、費解,總覺得自己能力不行,殊不知其實這裡除了2元1次方程式,還需要3元1次方程式的知識點
  • 當我歷經千險終於把2元1次方程式、3元1次方程式的技能樹都點開了,我想再深入的看一下,我突然發展還有一個 九九乘法表的東西,還好這個東西比較好學,有規律,知識點都在一起很好學
  • 但是在我高興的時候,我發現九九乘法表裡還有大量的各種符號和簡單的計算公式,但是這些我都不瞭解哎,於是我一個個對著查詢baidu,又是一陣血雨腥風,終於,半斤八兩的我終於可以能勉強看懂這個符號和公式了
  • 但是最終我有對這些數字產生興趣了,沒辦法也不是我想看的,是因為大家都說面試要問,沒辦法只能硬著頭髮花時間查資料去看
以上就是反推式學習的過程,很多時候我們的確能研究到及其指令這一層,但是當我們翻回頭,我很難把這些知識點全部串起來搞清晰,最多我只能比較清晰的明白部分,這就是大多數人學習的常態: 耗費大量時間,總也學不明白,學不通透
但是大家再看, 阿拉伯數字 -> 數學符號 -> 加減法 -> 乘除法 -> 九九乘法表 -> 方程式 -> 公式定理這些東西就是基礎知識啊,當我們把這些基礎知識都掌握了(網路程式設計、設計模式、作業系統),你再去看這些框架, 你就會時不時大聲呼喊: 原來是這樣啊,我get到了,也沒有太複雜啊,我都大概都串起來了
在程式設計這條路上,逆時針比順時針困難10倍,10倍功1不是危言聳聽,那些學習進步很快的一定基礎都很紮實,再學習各種應用層思路時不會被基礎問題打斷,能完整吸收思想,不用重複多次、反覆學習一個點,這樣才來不快才怪
學習基礎知識還有一個非常NB的地方,就是當你把基礎知識都搞定的時候,一定形成自己的一套行之有效的學習方法,這會讓今後的學習、工作路程走上快車道
基礎紮實的最大現實意義在這裡:
一個網友說: 別人寫好的東西就像一塊糖,你不瞭解也可以吃!
  • 當有人問你,這糖甜不甜?你不知道,你只能看別人說甜,你也說甜
  • 當有人問你,這糖的成分如何,對人體有沒有傷害?你不知道
  • 當有人問你,這糖可以和別的糖一起吃嗎?你不知道
  • 當有人問你,這糖切碎了怎麼吃?你不知道
  • 當你看見別人給糖加了料,你吃起來覺得非常棒,怎麼做的你一點也看不出、猜不出其中關竅。其實就是加了點蜂蜜而已
  • 當你看見別人把好幾種糖切碎了、攪拌在一起,然後加蜂蜜、加檸檬,和蔬菜一起做成沙拉時,你還能說什麼...
現實是我們做的就是沙拉,在於這些原料你怎麼用、會不會用、能不能推陳出新做出新花樣~
隨緣更新!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983799/viewspace-2732048/,如需轉載,請註明出處,否則將追究法律責任。

相關文章