1. 程式人生 > >突破自己的技術瓶頸,Android程式設計師高階進階,危機感

突破自己的技術瓶頸,Android程式設計師高階進階,危機感

>  突破自己的技術瓶頸,個人的技術輸入與輸出
1、技術瓶頸 ; 2、工作上瓶頸 ; 3、收入上瓶頸
如何突破技術發展瓶頸?- http://www.sohu.com/a/246164204_100066886
如何持續進步,突破技術瓶頸?- http://www.sohu.com/a/134134698_355140
多年經驗的大廠程式設計師,如何突破技術瓶頸?- https://blog.csdn.net/qq_39627461/article/details/80488482
  -- 面臨幾個問題:
  技術學習的困惑:當達到一個瓶頸時,可以學習的參考系越來越少,首先是因為高階技術人才呈現倒金字塔形態,身邊缺少能引領你的人生導師;其次,業內的技術交流,大多數在做科普以及刷存在感,到達一定階段後對個人提升作用越來越小(甚至用一天時間參加技術大會效果還不如用一天的時間在咖啡館看書學習);再次,國內的文化導致技術人專家逐漸轉向管理崗位,技術缺少積累,特別容易出現斷層和繼承。
  技術深度與廣度的選擇的困惑:技術深度的進一步提升,可以逐步做到業界大牛,專業技能越來越強,廣度的延伸也更容易變成全棧技術人才,兩者各有利弊,個人時間和精力有限,如何抉擇?
  技術方向的困惑:大型網際網路公司的技術框架基本都在最初選型時確立,與當時的業務規劃、業界當時的技術趨勢、個人的過往經驗積累相關,成熟規模大的業務從穩定性考慮,一般技術選型落後新技術2、3年,對於技術人員來說,從實際工作考慮需要使用老技術,但是業界的趨勢又是在朝著新技術的方向發展。

  技術管理型人員需要更加關注整個知識體系的構建,其中包括重要的軟技能。這類人員的重點是總體規劃和設計,能夠對問題進行分解。對於分解後的技術問題和細節則可以轉交到細分崗位的專業人員去做。要做到這點我們仍然需要有大量的技術積累,因為這是你和專業技術人員溝通的橋樑和通用詞彙。業務和問題驅動IT和技術,是從單純技術思維開始轉變的一個重點。
  原始碼閱讀,我覺得最核心有三點:技術基礎+強烈的求知慾+耐心。

-- 從技術,到參考書,到行業資訊。
1、工作不是學術,企業也不是學校,需要的是投入與產出,所以從學習的優先順序上,專案需求>公司願景>個人愛好:專案需求是最根本的需求,也是保證你工資、績效的基礎;在專案的基礎上,我們的技術要結合公司的發展與技術願景,也只有與公司的發展上一致了,你才有機會能夠爬上管理層;最後才是個人的興趣愛好。

2、在關注技術的同時不要忽略了業務和管理。對於大多數人來說,技術是吃不了一輩子飯的,走到一定程度,需要做轉型,所以在這個過程中你需要做相關知識的儲備,不過也不排除一些天賦異稟的人,可以不用走平常路。時間來說,以5年為期:第一個5年,需要進入管理這個角色,第二個5年,是你業務積累的時間。

3、除了關注技術發展的同時,也多關注行業的動態。我可以不懂大家怎麼做,但你不能不知道大家在做什麼,技術的行業的需求和發展方向又是什麼,這些對於你的技術沒有太多的幫助與提升,卻對你的發展大有幫助。

4、多學習。學習的方式可以分為兩種:自己看書、查資料學習和跟別人溝通、請教學習。兩種方式沒有優劣,收穫的內容也大不相同。我們常說常說:讀萬卷書不如行萬里路,行萬里路不如高人指路,所以,只要有機會,多約出來聊聊,一起吃吃飯,聊聊天,是大有好處的。

> 程式設計師高階進階
從菜鳥到Android資深工程師的進階之路- https://blog.csdn.net/mary_ml/article/details/50539521
-- Android開發者已經度過了初級、中級,如何成為一個Android高手呢? 
 一、初級
    1. 擁有嫻熟的Java基礎,理解設計模式,比如OOP語言的工廠模式要懂得。
    2. 掌握Android UI控制元件、Android Java層API相關使用。
    邁向中級,最好再次更新下Java技術,掌握Java concurrent庫、nio庫,精通xml、json解析,做過socket c/s端的程式。
 二、中級
    1. 熟練掌握NDK JNI方式的開發,對Android framework十分了解。
    2. 移植一些開源專案,比如FFmpeg、Mplayer到Android上執行。
    邁向高階,熟悉android開原始碼的結構,中介軟體下層的庫,比如webkit、opencore、opengl。
 三、高階
    1. 熟練的Linux驅動開發,精通Linux核心結構。
    2. 掌握Android移植,比如常見的TI OMAP、Qualcomm MSM的硬體移植。
    邁向頂級,發現Android系統中的0day漏洞,可以輕鬆的找出Root系統的10種方法,幫助Google改進Android作業系統。

投入大量的業餘時間在Android開發上,並且習慣去思考問題、總結問題並將其融會貫通

-- 中級工程師的水平:
技術要求: 
- 基本知識點 
比如四大元件如何使用、如何建立Service、如何進行佈局、簡單的自定義View、動畫等常見技術 
- 書籍推薦 
《第一行程式碼 Android》、《瘋狂Android》

中級工程師
  小明經過一年的努力學習終於成為Android中級工程師了,月薪變成了17k。到了中級工程師,已經可以在公司裡幹很多體力活了,但是一些很重要的任務小明還不能一個人承擔起來,這個時候小明需要學習的內容就很多了,如下所示: 
- AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的區別; 
- Binder:從Java層大概理解Binder的工作原理,懂Parcel物件的使用; 
- 多程序:熟練掌握多程序的執行機制,懂Messenger、Socket等; 
- 事件分發:彈性滑動、滑動衝突等; 
- 玩轉View:View的繪製原理、各種自定義View; 
- 動畫系列:熟悉View動畫和屬性動畫的不同點,懂屬性動畫的工作原理; 
- 懂效能優化、熟悉mat等工具 
- 懂點常見的設計模式

為了成為Android資深工程師,需要學習的東西就更多了,並且有些並不是那麼具體了,如下所示: 
- 繼續加深理解”稍微深入的知識點“中所定義的內容 
- 瞭解系統核心機制: 
1. 瞭解SystemServer的啟動過程 
2. 瞭解主執行緒的訊息迴圈模型 
3. 瞭解AMS和PMS的工作原理 
4. 能夠回答問題”一個應用存在多少個Window?“ 
5. 瞭解四大元件的大概工作流程 
6. … 
- 基本知識點的細節 
1. Activity的啟動模式以及異常情況下不同Activity的表現 
2. Service的onBind和onReBind的關聯 
3. onServiceDisconnected(ComponentName className)和binderDied()的區別 
4. AsyncTask在不同版本上的表現細節 
5. 執行緒池的細節和引數配置 
6. … 
- 熟悉設計模式,有架構意識

-- 1.紮實的java基礎,尤其是多執行緒和java中的資料結構。2.精通java中常用的基礎演算法。3.開發基礎良好,深入理
解設計模式,能夠根據實際設計較好的應用架構。4.熟悉網路通訊協議,對tcp/Ip和Http有較深刻的理解和經驗。
5.對Android 系統的原理了解深刻,熟悉Android系統中的常見的service 模組(ActivityManagerService,
WindowManagerService,PacketManager,ResourceManager)6.熟悉app的啟動流程,和Android系統的啟動流程。
7.對記憶體優化,效能優化,電量優化等有豐富經驗,,熟悉主流手機平臺下的高效能程式設計及效能調優。?8.數次跨
程序通訊的底層實現原理。(AIDL ,binder,)9.對虛擬機器執行原理和記憶體分配和回收機制理解透徹。10.掌握UI
的繪製原理,能夠自定義一些高效能的Ui框架。

Android高階工程師所要達到的技術要求- https://blog.csdn.net/qq_33923079/article/details/71307997
高階工程師所要達到的技術的要求:

 1.Android的基本知識四大元件、Fragment、自定義控制元件、動畫、元件之間的訊息傳遞等等,這些都是基本知識也
是開發過程中所必須掌握的,同時也是為今後的發展所打的基礎,在這個基礎上我們還要掌握組建的生命週期呀,
activity啟動模式的區別和場景應用、scheme跳轉協議、元件之間訊息傳遞的機制、動畫的種類和區別、屬性動畫的特點和作用等
 2.Android的技術難點AIDL、Binder、多程序、View的繪製流程、事件分發、訊息佇列等。這類知識對於定位自己
為高階Android工程師的人來說是必須掌握的,同時他也是能鑑別高階和初中級工程師的一塊試金石,其中binder
是Android系統程序間通訊最重要的手段之一,現階段app的發展離不開多程序的運用,經常會啟動例如定位、推送
等需要在後臺開啟動的程序來來保證主程序的記憶體執行;所以合理的使用多程序也是十分必要的;view的繪製是我
們自定義控制元件的理論基礎,只有掌握了view是如何繪製的才能個性化的自定義控制元件;事件分發一直是Android開發
的難點之一,也是必須掌握的,後期我也會在部落格上推出這個系列;關於handler機制也是android的一塊難點,因
為包括Asynctask、系統啟動、Intentservice等底層都是通過handler來實現的,所以掌握後handler機制不僅能提
高你的實戰開發能力,更能讓你係統的瞭解整個android系統運作的情況。
 3.網路框架的理解
現如今Android的網路框架可謂紛繁雜亂,但不外乎這三類:網路請求框架、圖片載入框架、事
件處理框架、IOC框架,其中的代表分別是Retrofit/volley/Okhttp,fresco/glide/picasso,eventbus/
rxjava,butterknife/dagger/dagger2,平時應該多看下這些的原始碼的設計理念,不僅可以糾正我們的一些程式碼
漏洞,我們要知道這些成熟的開源框架在github上已經經過了無數次的檢驗,所以學習這些框架能快速提高我們的
程式碼能力,畢竟在大家還沒有轉型前寫程式碼的能力是我們工程師的根本。

 4.Android系統的一些核心機制的運作:
在Android原始碼中最重要的三個類:ActivityManagerService/
PackageManagerService/View,推薦大家週末的時候可以去閱讀下這部分的原始碼,閱讀原始碼能提高我們今後設計
架構自己程式碼的能力,同時也能從底層瞭解整個android系統的執行原理,其他一些比如主執行緒的訊息迴圈、主線
程如何和AMS如何跨程序互動、SystemServer程序中的各種Service的工作方式、AsyncTask的工作原理等。這些知
識也是作為一個Android高階開發工程師必須掌握的,不能整天沉溺於ui和四大元件的互動,要站在更高的角度去
考慮Android的有些問題。

 5.android編譯構建
構建編譯打包是我們開發過程中的最後一環,但是也是最容易被很多人忽視的一個知識點,現
在的大型app開發團隊都有自己的自動化構建工具,比如常用的jenkins,在這個基礎上大家要對一些常用的工具有
深入的瞭解:比如git的使用和它的內部原理,gradle如何加快我們編譯apk的時間以及它的一些基本語法,
proguard的作用和混淆的內部原理,lint是如何來檢測我們程式碼中的問題的和如何自定義lint配置等。
 
  (C++)大部分有特色的功能都需要底層做支撐,遊戲引擎,播放引擎,影象引擎。
入門後如果想有更好和更長遠的發展,必須開始崇尚內功一族,瞭解內部技術細節,修煉好內功。不要流於形式,
浮於表面,依賴工具,而是要深鑽進去,瞭解得越深越透徹越好。最好是能自己瞭解各種引擎的底層原理,甚至是
寫出自己的引擎來,這樣才是更高的境界(當然這只是極少部分的頂尖高手能達到的境界)。
  因為,我們通常認為你是專業的,一旦你表現不專業,就會大打折扣。所以如果持續深入做技術,就要對自己狠
。不然以後,機會對你來說,很多,但是你一個都抓不住。從而慢慢轉向普通大眾。我們並不是說支援完全去從頭
造輪子,而是你理解的越深,就可以收放自如,做個有選擇權的強者。當沒有合適你的輪子的時候,當遇到技術瓶
頸的時候,你自己完全可以製造個更好的,前所未有的輪子,而不是懵在那邊,等待你所謂的巨人們心情好後的施
舍,造一個合適的輪子給你用,或者因為長久以來的太依賴工具而喪失了本來的能力。
  但如果已經在某個領域花了10年甚至更長的時間,還沒能有所突破,那就得反省自己,是不是方法問題了,是不
是方向問題了,是不是之前研習的時候,或進度太慢,還是走了很多彎路。我們都清楚,並不是每個人都能有很好
的技術天賦與底子,當然也不是每個做開發的人都要去理解和實現底層,要量力而行,要有所側重,要找到自己最
合適的角度。我們只是從長遠來看提倡將知識挖深,讓自己開啟眼界,不做井底之蛙,不隨波逐流,讓自己因為站
得高看得遠,而有更多更廣選擇的權利。