Android開發的現狀貌似已經是一個老生常談的問題了。但今天不想寫Android開發的現狀,什麼Android前景如何、Android涼涼之類被別人寫爛了的話題。
今天我們來聊聊我們自己,我們Android程式設計師的現狀。
各位朋友也都是從標題看起點進來的。確實,標題很扎心,也很真實。架構師是程式設計師晉升的頂點,誰不想成為一名架構師呢?為什麼大部分程式設計師從入行到轉行,自始至終還是一個碼農呢?我們帶著思考看下去。
大部分程式設計師都是從小公司、小團隊做起。特別是非科班出身的程式設計師,除非技術過硬,不然很難進到大公司或BAT之類的大廠。小團隊一般 10個 人左右,其中常常是技術最好的做架構師(或CTO)。所以,架構師在廣大碼農中的佔比平均不到 10%。
而架構師也可以分為初級、中級、高階,江湖上真正高水平的軟體架構師就更少了。
所以,可以說90%以上碼農肝了幾年、甚至十幾年,還是做不了架構師,這是什麼原因造成的呢?
什麼是架構師?架構( Architecture)這個詞,來自於建築領域。我們經常將程式設計比喻成造建築。工地上分工明確,各有等級,按照一所建築的流程來看:首先是開發商提出需求(公司客戶)到承包商攔下專案(公司本身)總工程師畫出建築圖紙,這一步最為關鍵,房子的總體框架,模型,建好後長什麼樣子,鋼筋水泥瓷磚地板裝修用料都要給出明確的流程和步驟(架構師)工頭領隊施工(TL)和水泥的和水泥,砌磚師傅砌磚等等(碼農,業務程式碼)
可以說,建房子和程式設計開發的流程,完美的契合。
插一個自己的小故事要明白一點:寫業務程式碼和做架構是兩個完全不同的事情。
剛踏進大學入門Android開發的時候,對架構師這個詞並沒有太多的概念,就覺得肯定很牛13,我以後工作了也肯定是個架構師。
後來開始寫程式碼,從Java學起,然後四大元件,寫Activity,然後學UI,學佈局等等等。
學校畢業出來,我已經能獨立開發自己的APP,雖然就是些什麼圖書借還APP,桌布下載APP。但我依舊覺得自己很牛13。但是這份資歷加上科班出身,畢業後我還是輕鬆得到了一家小公司的offer。工作一年後,我已經能基本上獨立解決自己開發崗位上的問題了。
我賊牛逼。但是我不會口頭上說出來,我要跳槽,這家小公司的舞臺已經不夠我發揮了,但我不會說出來,先找好下家,再提辭職,剛步入社會的我,就有如此遠見,佩服自己。
於是我拿著自己1年工作經驗的簡歷,投給了阿里巴巴,Android研發工程師。淦,面試都沒收到。然後我又投了當時如日中天的位元組跳動,號稱年輕人的天下。淦,又沒收到面試。是我眼高手低了?投了一家上市公司,金融行業,程式設計師最賺錢的行業,我**,又不給面試。
???
最後終於面到了一家中大型的企業,嗯...中級Android工程師。自我介紹完,說了一下我做過的專案後,leader臉上一副:就這?就這?的表情。當然,作為成年人的他,還是有著該有的涵養和禮貌,並沒有打斷我說話之類的。然後到面試問題環節leader一上來就問:看你簡歷上寫熟悉 AIDL,說一說 oneway 吧我:啊?oneway 是什麼?跟 AIDL 沒關係吧,我熟悉 AIDL 指的是使用 AIDL 介面進行跨程序通訊。面試官:...
啊哈,接下來的15分鐘我羞恥的恨不得立馬破門而出!binder通訊原理是什麼?說不清。子執行緒可以建立Handler嗎?母雞啊。activity啟動流程總能說一說吧?哈哈哈,忘記了....
我人生中的第一次跳槽就這樣羞辱的結束了。。。。。。。
這件事過後,我如夢方醒。光會砌磚(寫業務程式碼)就想當總工頭(架構師)?不可能。
這也是大部分碼農無法成為架構師的一個原因。一直停留在業務層面,把磚砌的再好,終究只是砌磚師傅。
怎樣能成為一名架構師?我們依舊比喻成造房子,也就是說,從一個砌磚師傅怎麼才能一步步成為總工頭呢?
一、把磚砌好程式碼是寫給別人看的,寫好業務程式碼是成為架構師的第一步。
沒有哪一個架構師不是從寫業務程式碼成長過來的。沒有不懂業務的架構師,所有的架構,都依賴於業務。所有的架構師,也必須要去寫業務程式碼,不把自己設計的東西,用在真正的專案裡,恐怕他們自己都不會知道,這種架構設計的合理性在哪裡。
這裡我想表達的程式碼品質優化,並不單指日常程式設計。
我想表達的是一種架構思想:面向未來程式設計
一個好的工程師,在聽到需求的時候,可以根據自己的業務能力,判斷出來這些需求中,哪些是有可能變化的,哪些是不太可能變化的。
針對這些變化的內容,在編寫的過程中,不會寫死,而反覆確認不可能會變化的需求,會寫的簡單一些,防止過度設計引起的複雜度。
簡單說,當他拿到需求時,並不單純是考慮這個需求怎麼實現,還會考慮,自己設計的架構體系,擴充套件性在哪裡,在他的眼裡,看到的需求會被分解,折分,然後自己的技術方案,會挨個分解,分配。
在完成設計之後,他會很清楚的知道 ,自己設計的系統裡,哪些變化是支援的,隨便你改,我只需要改動一個很簡單的內容,哪些是你絕對不能改的,你要改,我就必須花很大的代價,特別是在已經有線上資料的時候。
而且會拿著自己的架構體系跟 PM 溝通,講清楚。
如果你程式設計時已經有了這種思想,說明你已經具備了一名架構師的基本素養。
二、清楚磚頭鋼筋水泥的成分房子要建好,必定要選用好的材料。這些便是房子的底層、基礎。
在程式設計中,我們所用的語言便是磚頭,各種工具類便是水泥,各種框架便是鋼筋。
光會用當然不行,必然要“知其然,知其所以然”,“所以然”便是各種方法、工具類、應用框架的底層原始碼以及他的實現原理。
對於絕大多數程式設計從業開發者而言都面臨一個普遍的問題:廣度與深度難以兼顧。
每個企業的業務方向都不一樣,用的技術也不一樣。運氣好,面試的時候甲方公司用的技術剛好跟你學的一樣,結果技術面一問,你只答的出四大元件有哪些,生命週期支支吾吾也說不太清楚,view的繪製流程模稜兩可,垃圾回收演算法一知半解,效能優化一竅不通。這要是能找到offer,那就見鬼了。
很多人在開發過程中只是浮在表面,忽略底層原始碼分析,面試求職的簡歷也沒有進行修繕和突出重點,自然求職不順,加薪無望。
所以解決這個問題的最好辦法就是:抓住不變數。要知道,底層知識永遠都不過時。演算法資料結構永遠都不過時。基本的程式設計理論永遠都不過時。良好的編碼習慣永遠都不過時。分析問題和解決問題的能力永遠都不過時。強大的學習能力和旺盛的求知慾永遠都不過時。你大腦的思維方式永遠都不過時。
舉個栗子
大家應該知道也懂得效能優化的重要性,可工作中由於對整個知識掌握不夠,所以會在效能優化上沒有自己的理解。比如,Glide,這個是我們經常用的技術,相信大家都會用:
Glide.with(context).load("圖片url").into(imageView)
但是大家誰知道這個裡面有效能上面的坑啊?
如果我們不能體系的去掌握activity,fragment,application的生命週期,而且也不了解glide原始碼,因而我們可能是直接在context的地方傳this,或者,直接給application的context,那麼此時Glide的生命週期就和this,或者application綁定了,那麼結果大家可想而知,在巢狀的fragment+viewPager的程式碼結構中,生命週期的管理不到位,就會帶來生命週期問題的記憶體碎片。自然大家就知道,類似的情況多了效能就會一點一點的損失,最後導致app的執行過程中偶現的OOM,結果可想而知。
底層知識學紮實了,上層的東西像風箏一般千變萬化,而你是在底下扯線的那個人,順著線往下拉,便能輕鬆看清楚這個風箏長什麼樣。
三、房子要漂亮,裝修少不了這個點相信大家很容易就能想到我接下來要說什麼了。沒錯,就是Android開發少不了的—效能優化。
效能優化絕對是一個老Android必修的課題,沒有過效能優化的經驗,去哪裡找工作都免不了碰壁。
一名Android架構師,必定要掌控整個APP的總體構成,使用者體驗,是最為重要的一點。
作為Android開發,大部分朋友可能會對效能優化這個Topic如數家珍,Google官方在幾年前也有“Android效能最佳實踐系列”(Android Performance Patterns),當然,其中大部分的Tips都是需要大家遵循的規範,但是無論理論上怎麼說,我們所做的工作最終還是需要為業務服務,不管你是為了提高下載量、優化使用者評價、還是提高業務的轉化率,都需要給出效能優化的ROI。
經過近十年的發展,Android技術優化日新月異,現在Android 10.0 已經發布,Android系統性能也已經非常流暢,可以在體驗上完全媲美iOS。到了各大廠商手裡,改原始碼、自定義系統,使得Android原生系統變得魚龍混雜,然後到了不同層次的開發工程師手裡,因為技術水平的參差不齊,即使很多手機在跑分軟體效能非常高,開啟應用依然存在卡頓現象。
APP進行效能優化已成為開發者該有的一種綜合素質,也是開發者能夠完成高品質應用程式作品的保證。
小結一下從Android小白到架構師的職業規劃到底是怎樣的?
我們初入這行是可能出於興趣,可能出於前景。入行這個職業就代表著你需要不斷的學習、學習,進階、進階。
在我們入行之初,為了就業,我們不得不讓自己的知識體系更具有“廣度”
入職後,你發現並不是之前所學的知識都需要用到,你開始需要進階某一知識模組的“深度”此時你具備初級開發的:知識點
工作了幾年後,你發現你需要更大的舞臺,你需要好幾個連起來模組的深度進修。此時你具備了中級工程師的:知識面
又過了幾年,你已是職場老鳥,你幾乎能解決工作中所有日常問題。你具有許多的知識面,你將你所有的知識面串聯,形成了一套完整的知識體系。此時你是一名高階工程師:知識體系
可是,你已經到了30+,快要退休的年紀,你身後有無數的高階工程師隨時可取代你的位置。
此時,你需要探索程式碼更深處的奧妙,你不再是隻會建房子的“砌磚師傅”
你懂得每塊磚頭的組成、結構,你知道一所房子哪個地方需要這塊“磚頭”,哪個地方適合另一種“磚頭”。你知道這所房子需要怎樣建造,怎樣設計更堅固、合理且美觀。
此時,你是一名架構師。
最後為什麼很多程式設計師做不了架構師。1、良好健康的職業規劃很重要,但大多數人都忽略了2、學習的習慣很重要,持之以恆才是正解。3、程式設計思維沒能提升一個臺階,侷限在了編碼,業務,沒考慮過選型、擴充套件4、身邊沒有好的架構師引導、培養。所處的圈子對程式設計師的成長影響巨大。
本文你收穫到什麼?大多數程式設計師每天都是疲於加班、趕專案。連家人朋友都陪的少,可以花在學習上面的時間就更少了,但這些主流技術不學,就難以提升技能、難以升職加薪。相信大部分人都跟我以前一樣,也就是上班敲程式碼空閒的時間,在網上看看部落格“劃劃水”,偶爾能淘到點自己需要的東西。
對於很多初中級Android工程師而言,想要提升技能,往往是自己摸索成長,在網上收集各種零散、碎片的知識點,不成體系的學習效果低效漫長且無助。
所以在此將我十年載,從萌新小白一步步成長為Android移動開發架構師的學習筆記,系統的整理成了一份3000頁的Android開發者進階架構師核心知識筆記,從Android四大元件到手寫實現一個APP架構設計,我都有一一的對應筆記為你講解。
當然我也為你們整理好了百度、阿里、騰訊、位元組跳動等等網際網路超級大廠的歷年面試真題集錦。這也是我這些年來養成的習慣,一定要學會把好的東西,歸納整理,然後系統的消化吸收,這樣才能極大的提高學習效率和成長進階。碎片、零散化的東西,我覺得最沒有價值的。就好比你給我一張撲克牌,我只會覺得它是一張廢紙,但如果你給我一副撲克牌,它便有了它的價值。這和我們收集資料就要收集那些系統化的,是一個道理。