寫給所有Android工程師:沒有技術深度的苦惱

前言

最近有一位讀者去今日頭條面試Android開發,這位讀者師出名門(BAT中的一家公司),是有十年的軟件開發經驗的高級Android工程師,但今日頭條卻以沒有技術深度拒絕了他。

昨天早上,我在給他做模擬面試的時候也發現了這個問題,因為從簡歷上看他的出身,呆過兩家知名的互聯網公司,面試官一定會不自覺的提升對他的期望。他雖然有豐富的項目經驗,但真正交流下來又發現雖然在知名公司工作卻沒有掌握“核心科技”,他的優勢一下就變成了劣勢。

隨著年齡的增長,你原來的優勢都在慢慢變成你的劣勢。


寫給所有Android工程師:沒有技術深度的苦惱


寫給資深或即將資深的Android工程師

當我們是初級工程師的時候,最希望的就是有豐富的項目經驗,好把自己蒼白乾癟的簡歷填的炫麗飽滿。然而隨著時間的積累,簡歷上的項目是挺“飽滿”的了,但我們只看“外表”的行為造成了自己另一個困境:看似很資深,其實又沒有做過什麼有難度的事情,工作了十年可能只是1年的工作經驗用了9次。

正如這位去面試的讀者,從簡歷上看確實是能看到他輝煌的項目經歷,在經歷之下會發現簡歷中沒有深入的地方。有些雖然寫的很有技術,但是確實只是在使用API的程度而已;有些解決問題的方式很有技巧,但還不成體系。

可惜沒有多走兩步,沒有去研究和擴展。

那麼如何改變呢?

對方也在問我這個問題,而且很迫切,迫切到希望我今天說明白之後他明天面試就可以變得深入。

我很無奈且直接的說明了這個多半不可能。如果是可能的話,別人也可以很快掌握核心技術變得很深入。但長期的話我認為是可能的,比如給自己半年的時間,對以前項目中的某一項技術框架進行學習擴展和實踐。最好能利用一下你目前所在公司的資源,比如做這個框架的項目組,和他們搞好關係,向他們學習、和他們討論你遇到的每一個問題。

但是絕對沒有其他的方式,可以讓你通過看一下或者臨時準備一下就提升到有深度的地步。如果你能做到,必然是已經在某方面是個很精深的高手了,自然可以忽略我說的話。

沒有深度的原因

我們沒有技術深度,最重要的原因有兩個:第一是迴避問題,第二是沒有興趣。

當我們在工作中遇到問題的時候,第一選擇往往是迴避它,不管是從設計上還是從技術上,或者找到其他的替代方案,如可使用別人的開源庫,使用別人造出來的輪子。這樣做無可厚非,但如果我們想有更深一步的提升或者更有技術深度的話,我們一定要把這個問題搞明白,至少把別人是怎麼能解決這個問題的思路和方式搞明白。

第二關於興趣,很多人沒有往更深入的地方多走兩步,很重要的一點就是沒有興趣,一點都不好奇。如果我們遇到一些很有意思的解決方案、框架或者一些詭異的問題,但我們完全不想去“招惹”它們,唯恐避之而不及,自然,我們也失去了在這些點上有突破與深入的機會。

如何提升自己的技術深度呢?

1. Java語言進階與Android相關技術內核

Android應用是由Java語言進行開發的,SDK也是由Java語言編寫,所以我們要學習java語言。另外,雖說kotlin語言得到了Android官方的熱推,但是kotlin也是編譯成了java語言再運行的。對於Android來說,只要SDK沒有用kotlin重寫,那麼Java語言是都需要學習的。而且Android apk的後臺服務器程序大概率是java語言構建,所以學習java也是一種必然。那麼Java中哪些東西是我們Android程序員需要學習的呢?由於Android程序員習慣了 C V 代碼塊,所以與Android中比較相關的稍微比較難的Java基礎幾乎都是一個門檻,像 泛型,多線程,反射,JVM,Java IO,註解,序列化等,都是被 CV 的對象,而程序員是不懂原理的,具體內容如大綱所示。


寫給所有Android工程師:沒有技術深度的苦惱

Java語言進階與Android相關技術內核


2. App開發框架知識體系(APP亦對象)

這塊知識是現今使用者最多的,我們稱之為Android 2013~2016年的技術,但是,即使是這樣的技術,Android開發者也往往因為網上Copy代碼習慣了而導致對這塊經常“使用”的代碼熟悉而又陌生:熟悉的是幾乎天天在和它們打交道,天天在複製這些代碼;陌生的是雖然天天和這些代碼打交道,但是並沒有深入研究過這些代碼的原理,代碼深處的內涵。所以我們需要從新的角度去分析這些知識點,深入研究他們,要學習源碼,模仿源碼,然後再hook源碼,這樣才能說自己懂這塊的知識。這些都是做Android開發,做高級工程師的基礎。


寫給所有Android工程師:沒有技術深度的苦惱

App開發框架知識體系(APP亦對象)


3.Android App全方位性能調優

一個app的性能好不好我們需要從兩個層面努力。第一個層面:從寫代碼的時候就需要注意,讓自己的代碼是高性能高可用的代碼,這個過程是書寫高性能代碼;第二個層面:對已經成型的代碼通過工具檢查代碼的問題,通過檢查到的問題來指導我們進行代碼的刪改,這個過程被稱為調優。

如何寫出高性能的代碼呢?那就需要我們具備深厚的代碼功底,這就是代碼的基礎,如:數據結構達到可以根據應用場景寫出符合當前場景的特殊結構,比如google針對Android平臺特徵研發了sparseArray替代HashMap。另外,對常用的算法有自己獨到的見解,leetcode上有刷個上百道題,這樣差不多可以達到精通最常用的排序查找動態規劃等算法的能力。再者,高效的算法以及節省內存的數據結構如果配合優秀的符合應用場景的設計模式,那麼,這些就為高性能的代碼提供了實現依據。

另外一個就是對寫好的代碼進行調優,那麼調優的方向就是使用Profiler工具進行測試和檢查,看哪裡有性能消耗大的操作,然後分析對於代碼的問題。調優的方向就變成了如何對內存調優,對耗電調優,對網絡流量調優,當然,還有對啟動速度,頁面切換效果與速度,開機白屏體驗,閃屏方面的原因等進行分析和調優。最後再加上一個屏幕適配相機適配。


寫給所有Android工程師:沒有技術深度的苦惱

Android App全方位性能調優


4.NDK模塊開發

音視頻/高清大圖片/人工智能/直播/抖音等等這年與用戶最緊密,與我們生活最相關的技術一直都在尋找最終的技術落地平臺,以前是windows系統,而現在則是移動系統了,移動系統中又是以Android佔比絕大部分為前提,所以Android NDK技術已經是我們必備技能了。要學習好NDK,其中的關於C/C++,jni,Linux基礎都是需要學習的,除此之外,音視頻的編解碼技術,流媒體協議,ffmpeg這些都是音視頻開發必備技能,而且OpenCV/OpenGl/ 這些又是圖像處理必備知識,這些都是原理級的實戰項目。


寫給所有Android工程師:沒有技術深度的苦惱

NDK模塊開發


由於篇幅原因,還有很多點需要大家提升的像混合開發、小程序開發、架構專題等,在這邊就不進行贅述了

如果需要上面思維腦圖的朋友可以私信回覆我【學習】獲取!

自己該在哪個點上深入呢?

我們工作了很多年之後,技術一定是需要具有一定的深度和廣度的,廣度自然不必說,你也會明白它的必要性。深度最好是跟自己的興趣或者比較接近的工作模塊相關,如果你在公司相關的模塊深入,你可以利用更多的資源。或者是你感興趣的模塊的話,即使沒有資源,由於你很有興趣,你也會有辦法去找到你需要用的東西的。

我們永遠不缺方法。

帶領和被帶領

技術的深度是一個帶領和被帶領的關係。

關於這點我本身就有一個深刻的體會,在我剛開始做Android開發的時候,我的工作是去維護Android自帶的系統應用,客戶提的問題或者進行二次開發,我都能很好的解決。然後就會有一些空閒的時間,反正也是閒著,我就找了個系統應用裡面最簡單的一個應用(記事本)練練手。

我想既然這麼簡單,那我就自己照著寫一個吧,就從零開始實現一個記事本應用。當我開始寫時,顛覆了我對安卓應用的理解,我發現以前認為懂的地方自己都沒懂,我遇到了很多毫無頭緒的問題,就這麼一個簡單的應用,我要靠不停的對照原版的代碼實現才能發現自己的問題所在,然後才確信真正的做和看中間的差距有多大。

如果你只是在別人的基礎上去做事情解決問題,哪怕你覺得自己想出了很好的點子,好像靈光一閃,很巧妙的解決了客戶的問題,但其實這只是一種技巧,在怎麼建造這個應用、構架和設計組織這種大的方向上,你並沒有多大的實質進步。

這個時候你只是一個跟隨者,你是被別人的源碼帶領著的。

即使你看過和使用過很多應用框架,但紙上得來終覺淺,只是添加了些許紙上談兵的資本。你始終是一個被帶領的人,帶領者給你定好了框架,給你定好了一條大路,然後你在他定好的道路上耍了一下滑頭,卻生出一種假象:覺得自己很厲害,很有技巧。

而你自己寫一個這樣的框架,或者去設計一個思路,去指定一個方向和路徑的話,你會發現它沒有你想象中的那麼簡單。

你是要做帶領別人的人?還是要做一個被帶領的人呢?

小結

沒有技術深度是大多程序員的一種常態。

並不能說這是一種壞的或者好的現象,這只是一種合理的狀態,因為很多工作,很多人從事的項目並不需要有多少技術深度。即使你有深度,你也可能發現用不上。對於大多數人,合乎理性的做法不是去追求技術深度而是夠用就可以了。

但轉到個人的話就不一樣了,在技術上你需要夠用,但是在某方面上你需要有一定的深度,以突出你自己的學習理解和運用的能力,而且這個能力是要有成功案例來背書。

特別是當你成為一個資深的工程師的時候,很多公司並不希望你還是那樣平庸,沒有深度。雖然你會納悶,我就算有深度你們也不一定用得上呀?然而到了這個級別的人需求量並不像初中級開發那麼多,公司更理性和穩妥的做法是選擇有深度的人,不是嗎?

最後

很多朋友不知道該如何提升自己的技術深度,我憑自己多年的開發經驗和做面試官的經驗,總結了一些知識,在網上也蒐集了很多資料做成了文檔和架構視頻資料免費分享給大家【包括高級UI、性能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料

】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。

關注+私信回覆【學習】獲取以下學習資料

寫給所有Android工程師:沒有技術深度的苦惱

資料大全



分享到:


相關文章: