在市場緊縮以及大前端的趨勢下,移動端程序員如何進行職業規劃,保持競爭力?今天 100offer 邀請到了在愛奇藝負責移動端金融產品研發工作的孔濤,他將在文中與你分享大前端的發展趨勢、Android 開發進階所需技能,以及移動端程序員的職業發展路徑。

作者簡介:

孔濤,目前在愛奇藝技術產品中心負責金融產品的移動端研發。具備 7 年 Android 開發經驗,曾在新浪、百度等大型互聯網公司擔任 Android 工程師,負責新聞、地圖類等 App 研發工作。熟悉 Android 系統原理及大型 App 的模塊化、組件化、插件化架構設計方案。

移動互聯網時代到來之後,移動 App 成為新主流,需要開發 Android、iOS 端,曾經還有 Windows Phone 等不同版本,早期以 PhoneGap 等為代表的 Hybrid 形式和內嵌在 App 中的 WebView 開發為主,非常浪費人力物力。

從 2015 年 React Native 開始,Weex、Flutter、Kotlin-Native 等跨平臺框架相繼出現,加上微信小程序以及手機廠商聯合推動的快應用,前端技術在移動端有了越來越多的使用場景。因此,越來越多的公司也在組織架構上做出相應調整來適應這種大前端趨勢。以前的團隊構成以移動端程序員為主,如今除了 Android / iOS 開發之外,還有 RN / H5 / 小程序等開發人員。

那麼,大前端趨勢是否意味著傳統 Native Android 程序員需要轉型?

如今移動端主流操作系統只剩下 Android 和 iOS。以前者為例,目前 Android 已被廣泛應用於手機、平板、汽車網絡、物聯網、智能電視等領域,是名副其實的終端霸主,另外 Android 端在國內手機市場佔有 80% 以上的市場份額,短期內被其他 OS 所取代的可能性非常低,所以 native 程序員還是有非常大的市場。

現在的技術分工越來越細,這也意味著大部分企業需要專精的人才,最好是精一門、通多門。去大公司面試 Android,如果你的 Android 技術不深,剩下的前端、後端、python 技術,面試官也沒興趣瞭解了。所以並不是會得越多越好,一定要做好減法,先專精一門,再去學別的技術。

在大前端時代下,一個合格的開發者應該是 JS + iOS / Android。可以是一個熟練的前端,學習一點 native,或者是 native 程序員會 JS。如果公司是以 App 為主且注重用戶交互體驗,一個合理的路線是 native app 開發者堅持把 native 部分做精,然後學習 JS 前端知識、拓寬技術棧。

一. 從初中級到高級,移動端程序員的進階寶典

下面我們就以 Android 開發為例,從硬技能和軟技能兩方面,梳理大前端趨勢下移動端程序員從初級到高級進階所需的技能點,並且推薦一些實用的書籍資料。

(一) 硬技能:專業的技術知識

  1. Java / Kotlin開發語言

(1) Java

常用數據結構:ArrayList、Vector、CopyOnWriteArrayList、HaspMap、ConcurrentHashMap、HashTable 等使用場景。

JVM 虛擬機包括 Java 內存管理,GC 垃圾回收機制,類加載機制。推薦書籍:《深入理解 Java 虛擬機 JVM 高級特性與最佳實踐》。

多線程編程,包括線程池,鎖機制,線程同步 。推薦書籍:《Java 併發編程實戰》和《Java 多線程編程核心技術》。

AOP 編程實現,包括 JDK 動態代理實現,ASM 直接操作字節碼、CGLIB 實現,其原理封裝了 ASM,使用更方便。

Javassist:在字節碼加載前直接修改需要切入的方法,以及註解處理器 APT,這在 Android 中開源的庫應用較多,比如 DataBinding , ButterKnife, EventBus3 等等。

異常處理 Exception,包括檢查性異常、運行時異常處理。

IO 流相關,包括堵塞型 IO 和非堵塞型 IO。

Java 的一些高性特級,比如反射、代理、泛型、枚舉、正則表達式等等;同時瞭解一下 jdk1.8,1.9,1.10 等新特性。相關書籍比較多,推薦《Thinking in Java》《Effective Java》

(2) Kotlin

Kotlin 是一個基於 JVM 的新編程語言,在 Google IO 2017 中被 Google 宣佈成為 Android 官方開發語言。

Kotlin 有哪些優點?

①簡潔性: 提供了很多標準函數,大大減少樣板代碼的數量。

②安全性:避免空指針異常等錯誤。

③互操作性:充分利用 JVM、Android 和瀏覽器的現有庫。

④工具友好: 可用任何 Java IDE 或者使用命令行構建。

在 Kotlin 中要樹立函數式編程思想。把函數理解為一個值到另一個值的映射關係,以函數作為單元來處理各個業務邏輯,函數既可以做參數,也可以作為返回值。多使用 Kotlin 提供的標準函數,比如 let、run、with、apply、also、 Lambda 表達式。儘量使用閉包和高階函數。

Kotlin 的另一個突出特點是協程,為設計異步、非阻塞的程序提供了強大的範式。協程是一種輕量級的線程,它提供避免阻塞且更廉價可控的操作: 協程掛起。將複雜異步操作放入底層庫中,程序邏輯可順序表達,以此簡化異步編程。

最後簡單說下 Kotlin/Native,它的設計初衷是支持在非 JVM 虛擬機平臺環境的編程,如 iOS、嵌入式平臺等,同時支持與 C 互操作。推薦書籍:《Kotlin 實戰》

2. Android 進階技術點

進程相關,包括 App 進程原理以及 AIDL 原理。

性能優化,包括:內存,cpu,耗電量、網絡請求、UI 佈局、線程、數據庫等優化方法以及優化工具的使用。

Android 源碼相關,包括:Binder 機制,Activity 啟動流程,Handler 原理,AMS ,PMS,WMS 原理,View 的繪製流程,Touch 事件傳遞機制等等。

編譯打包流程,從 java/kotlin 源碼到最終形成 APK 的過程。

熱修復的實現原理,目前熱修復框架的種類繁多,常見的包括底層替換、類加載和 Instant Run 方案。

逆向工程原理,主要是為了防止 apk 被反編譯破解,以及瞭解 apk 加固方案。

插件化,目前方案同樣很多,主流的技術實現是 Hook 方式,註冊 Activity 進行佔坑,使用佔坑 Activity 通過 AMS 驗證,還原插件 Activity,其他組件的原理也大致類似。

NDK 開發,調用 JNI 以及回調 Java 的方式。

自定義控件,需要注意 onMeasure,onLayout,onDraw 的調用時機,以及 Touch 事件分發機制。

動畫 View Animation,視圖動畫在很早的 Android 版本系統中就已經提供了,只能被用來設置 View 的動畫。

屬性動畫 Property Animation,只對 3.0 以上版本,可以設置給任何 Object,包括還沒有渲染到屏幕上的對象。這種動畫是可擴展的,可自定義任何類型和屬性的動畫。

Webview 中 Native JS 交互,常用的 JSBridge 等。

Gradle 的特性以及 DSL 語法,比如 Gradle Transform API 的使用,它允許第三方插件在 class 文件轉為 dex 文件前操作編譯好的 class 文件。利用這一特性,我們可以在代碼編譯階段實現代碼注入或者代碼修改,這也是很多埋點技術和熱修復技術的基礎。

安全性:HTTPS 通信原理,數據加密方式,包括 MD5,RSA 等,webview 安全性,代碼混淆,數據驗籤,組件通信安全,服務器通信。

CI 持續集成:Jenkins ,Gitlab CI 等搭建持續集成開發工具。

Sersor 傳感器:包括陀螺儀,加速傳感器,方向傳感器,重力傳感器,光線傳感器等。

Android 開發國際化

ART 和 Dalvik 虛擬機的區別,主要是 AOT,Ahead-Of-Time 預編譯。

熟悉 DEX 文件結構。

單元測試:JUnit4,AndroidJUnitRunner,Mockito 框架的使用。

自動化測試:Monkey / Monkey Runner ,Espresso ,UI Automator 等。

掌握模塊化開發方式:主要注意分好層、模塊間跳轉通信。

代碼重構能力,推薦書籍:《重構改善既有代碼的設計》、《重構與模式》

Google 動態化框架 App Bundles

Jetpack,Google 推出的新一代組件、工具和架構指導,旨在加快 Android 應用開發速度。Jetpack 主要分為 4 部分:

大前端趨勢下移動端程序員要涼?這些進階技能助你逆襲

Android開發常用的第三方庫:

響應式編程:RxJava、RxAndroid,Google 的Agera

網絡庫:包括Retrofit,OkHttp,Volley

圖片:Fresco,Gilde,Picasso

依賴注入:Dagger2

數據庫:Realm,ORMLite,GreenDAO,ObjectBox

數據總線:EventBus,otto

內存洩漏檢測工具 LeakCanary 等

各個技能點如果詳細拓展開,會形成相當龐雜的一張知識圖譜,建議大家自行梳理總結消化。

3. OOAD 和設計模式

在架構設計方面,首先要掌握的就是面向對象的開發和設計。具體知識點包括:

面向對象三大特性:封裝,繼承,多態。

五大基本原則(SOLID 原則),單一職責原則,開放封閉原則,里氏替換原則,依賴倒置原則,接口分離原則。

23 種設計模式:常用的有工廠、單例、適配器、橋接、組合、代理、命令、觀察者、策略、狀態模式等等。

4. APP架構設計

包括 MVC、MVP、MVVM、MVI、VIPER、Clean Architecture、Flux。目前除了 MVC 外 MVP 和MVVM 用得比較多,具體的架構設計還要結合業務去考慮。

(二) 軟技能

人在職場,行走江湖,想進階高級程序員光有技術深度是不夠的,還需要掌握眾多軟技能,注意綜合職業素養的磨練。有很多人一開始重視程度不足,在職場後半段的上升過程中,容易遇到瓶頸。

下面是我個人總結出的高級程序員必備軟技能,供大家參考。

1. 快速學習能力:包括技術深度和廣度,能夠不斷探究新技術,不斷學習。

2. 溝通能力:加強表達、閱讀、編寫能力,即使在技術發達的今天也絕不會過時。因為任何方式的溝通在企業內部都是非常有必要的。

3. 團隊協作能力:開發人員很容易陷入孤立的人際交往狀態,但開發工作永遠都不可能是一個人完成,只有成員真正能融入團隊內,順利與其他同事溝通合作,才能體現出其真正的價值,被列為未來職位晉升候選人的機率也更大。

4. 時間管理能力:可以參考時間管理「四象限法則」,有重點地把精力和時間集中用於處理重要但不緊急的工作,這樣可以做到未雨綢繆。

大前端趨勢下移動端程序員要涼?這些進階技能助你逆襲

5. 影響力:一方面是業務影響力,另一方面是技術影響力。其中,提高技術影響力的方式包括:多參與技術分享,把積累的知識進行總結和傳播;參加技術方案評審,把技術經驗分享出去;幫助新同學解決技術問題;在博客、Github、StackOverflow 等平臺上對外分享。

6. 文檔編寫能力:

代碼註釋。很多程序員很少寫註釋,或者註釋過多,都是不合適的。多參考開源項目的註釋規範。

編寫技術設計文檔。包括流程圖,類圖,功能時序圖等等。

此外推薦一本書:《軟技能——代碼之外的生存指南》

大前端趨勢下移動端程序員要涼?這些進階技能助你逆襲

二. 技術專家VS管理,哪條路更適合你?

工作 3-5 年後已經進階到高級程序員了,很多人開始面臨一個問題:未來發展方向是技術專家還是技術管理,哪一條職業發展路徑更適合自己?

選擇哪條路線,首先要明確自己想要什麼。想做技術還是管理,都跟目標和職業規劃有關,每個人的實際情況不同,目標就不同,建議儘量做和自己的性格相符合的選擇,並且堅持。哪怕一時半會看不出效果,長期總是能夠看到效果的。

1. 怎樣的程序員適合做技術專家?

技術專家的核心就是深入而精通。對某個技術領域很熟悉、對代碼編寫保持熱情、持續學習新的技術、能夠靜下心來做技術,而不是急功近利。性格相對內向、不擅長溝通協調、不希望花大量時間帶團隊、主要負責把關鍵技術做到專業和極致,這樣的人更適合往技術路線發展,比如技術專家,架構師。

2. 怎樣的程序員適合轉型技術管理?

首先要明確,通常所說的技術管理者都需要做哪些事?

  • 團隊建設:人員激勵、團隊文化、梯隊建設。
  • 任務管理:任務分工、任務協作。
  • 管理規劃:新技術調研,支撐新業務的重構等。

相應地,需要的能力包括:向上彙報向下傳達能力、團隊管理能力、人員培養能力、上下游部門合作把控能力、業務需求溝通能力、重大問題的決斷能力、長遠目標規劃能力、執行力等等。

綜合來看,管理能力和技術能力的要求差別較大。作為技術管理者首先應該有角色認知的改變,不能以程序員的角度去看待問題,需要站在更高角度,從全局思考問題。推薦有志走管理路線的移動端程序員參考這本書:《成為技術領導者》

3. 兩種發展路徑的異同點

(1) 不同點:技術專家更依賴個人技術能力,需要結合業務做好技術規劃,框架設計,性能優化以及技術創新;技術管理者是協助團隊一起把產品做出來,負責團隊內外的組織溝通和相互協調。

(2) 相同點:終究需要面對管理,只是管理工作的多和少之分。即使你是架構師,也需要 lead 一個技術團隊。

因此,不論你未來是走純技術路線還是非技術路線,都需要增長自己的管理技能,因為到最後總歸是需要管理溝通的。當你級別非常高,卻還不跟任何人打交道,完全靠個人能力來貢獻的情況是很少見的。

4. 如果選擇錯誤,是否還有二次選擇機會?

我認為需要先把職業目標和職業規劃想好,經常改變對職業影響較大。

(1) 技術轉向管理:要提前掌握相關管理知識並在角色認知上做出改變,以團隊為出發點去思考問題,對業務瞭解更多,提高部門內的影響力,有合適的晉升機會可進行轉型。

(2) 管理轉回技術:如果你面對諸多跨部門溝通,在性格等因素上感覺不合適,需要儘快做出決策,轉回技術開發。

三. 大前端趨勢下,移動端程序員如何保持競爭力?

我從招聘網站上摘錄了某些一線公司的職位描述要求:

3 年以上工作經驗、深入瞭解移動端的底層和原理、獨立主導或開發過一款以上產品的核心項目、豐富的項目經驗或管理能力、有 React Native 或者Weex 的實戰經驗、掌握一些前端開發技術,HTML / JavaScript / CSS 等。前後端開發經歷是加分項。

可以看到,市場對 Android 程序員的要求越來越高,除了深入掌握 Android 底層原理,對前端 JS 等技術也有要求。

今天我們已經進入了終端碎片化的時代。從 2007 年 iPhone 第一代發佈至今的 12 年裡,智能手機並沒有被取代的跡象。但創新仍在繼續,比如智能手錶、TV、眼鏡、頭戴 VR 等等,可以想象這樣的設備仍會繼續增多。

這些新設備也是新平臺,與智能手機類似,可以安裝第三方應用,且這些平臺基本都支持瀏覽器或內嵌瀏覽器引擎。早期 Hybrid 和後來 React Native 等探索,在顯示終端應用的開發上,前端開發已成為必備技術。

因此,大前端趨勢對移動端程序員而言,最大的影響就是新的移動開發技術棧。

移動設備作為主流終端,其應用開發技術也應該是大前端最關注的技術。以前移動開發技術棧以原生開發為主,現在的趨勢是跨平臺技術愈演愈烈。

那麼,在如今技術快速變化的環境下,移動端程序員該如何保持競爭力?

首先,加強 Android / iOS 技術深度儲備,深入理解系統底層原理,對新技術持續投入。

其次,逐步完善前端技術棧,廣度擴充,熟悉前端 JS,以及 RN,flutter 等跨平臺框架。

最後,選擇 Android 細分領域並提高,比如應用開發、逆向安全、音視頻、車聯網、物聯網、手機開發、SDK 開發和智能電視盒子開發等等,在其中選擇一個並不斷深入。

四. Q & A

(Q代表網友提問,A代表孔濤回答)

Q: 您是從什麼時候開始帶團隊的?剛開始從純技術轉向管理崗會遇到什麼困難?如何克服?

A: 我從4年前左右開始帶團隊,由一個人獨立貢獻到多個人的團隊開發貢獻,一個人能力有限,驅動大家解決問題,這其中有心態的變化是需要克服的。有一種決策認知的改變。

Q: 我一直在中小型公司做小團隊管理者,後續發展突破口在哪裡,是否可以進入大廠轉技術路線?

A: 你的突破點在於技術上的提高,這是一條不錯的路線,在大廠裡做技術是沒有問題的。但如果你想繼續做管理的話,就要先提升一些大廠的經驗,做技術,再慢慢轉到管理

Q: 在創業公司帶大團隊和在大廠帶小團隊,哪條路更有優勢?

A: 這沒有絕對答案。如果你之前在大公司裡帶過小團隊,積累了經驗,去創業公司帶大團隊是沒有問題的。但是反過來,如果你經驗不足,且缺乏一些對新事物的認識的話,去小廠帶大團隊可能會遇到一些瓶頸。所以個人建議先去大廠鍛鍊鍛鍊。


想突破職場瓶頸?點擊「瞭解更多」來100offer看看工作機會!

相關推薦

推薦中...