現在的iOS開發者優勝劣汰,如何提高讓本身不被淘汰?

序言:

若是從 13 年移動客戶端大火開始算起,至今已經有五個年頭了。如今移動端的形勢也不須要太多的廢話來描述,一句話總結就是:「浪潮退去,誰在裸泳一看就清楚。」我但願藉助這篇文章來聊聊在我心目中,移動互聯網下一個五年的趨勢和機會,以及咱們 iOS 工程師能作哪些準備,實現自我提升。本文主觀性的見解比較多,文筆也比較激進,僅供參考。前端

咱們都知道價格會受到供需的影響,若是某項技能在市場上緊缺,那麼掌握這門技能的工做者工資就會相對高一些,好比 14 年前先後能寫好 UITableView 就能找到一個相對不錯的工做了。在我看來,將來幾年的移動互聯網,會出現「一個過剩,兩個不足」,我會逐個分析並試着給出一些建議git

做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:638302184,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!但願幫助開發者少走彎路。程序員

如下資料須要的能夠加羣領取。面試


 

(一)UI 工程師過剩shell

這一點是我老生常談的了編程

,首先要注意的是避免成爲 API 調用工程師,由於這些 UI 方面的知識對我的價值的增加不是線性的,若是你還記得高中數學,請回憶一下 y = ln(x) 這個函數的曲線。從零到寫好 UITableView 給一個工程師帶來的收益,遠遠不是從寫好 UITableView 到寫好 UIStackView 能比得上的。後端

就以 UIStackView 爲例吧,先不說它從 iOS 9 纔開始支持,而要想應用不支持 iOS 9,怕是要等到猴年馬月了。就說它提供的功能,雖然簡化了已有場景,但這個功能徹底能夠經過封裝已有的組件來實現,相信不少大型項目都有,爲何還要費力氣去兼容版本,以及再學習一個新的 API 呢?人的精力是有限的,若是你老是追着蘋果的腳步,每一年補 WWDC 上那些新坑和老債,那麼視野就永遠只能停留在 iOS 中了。網絡

(二)專業技能人才不足前端工程師

這裏的專業技能指的是移動端這個大話題中裏比較垂直的知識領域,大概包含如下幾個方面:數據結構

一、圖像/視頻處理

隨着網絡基礎設施的普及,以及流量費用的大幅度下降,4G 基本上已經全面商用了,若是說移動端前五年是文字爲主,圖片視頻爲輔的話,在接下來的幾年中,用戶對高質量圖片和視頻的要求會日益增加。

因爲我對這個領域並不瞭解,因此可以推薦的並很少,在我印象中,OpenGL 這種跨平臺的引擎,計算機圖形學的知識,視頻編碼與協議都是能夠花時間研究的,如今有不少優秀的創業公司也急需這類人才。嚴格來講這些知識都不算移動互聯網方面的知識了,因此門檻較高,但門檻這東西是個雙刃劍。它會增長你的學習難度,但一旦你掌握了這門知識,門檻又會變成你我的價值的護城河。

我格外想要聲明的是,CoreAnimation 這類的東西若是不是工做中強制要用,通常就別碰了,就像沒人會傻到用 SpriteKit/SceneKit 去寫遊戲同樣,這種 API 密集型,又不能跨端的庫是沒有前途的,真正有價值的動畫必定是用一套統一的 DSL(領域特定語言)去實現,而後導出到各個平臺上,因此開發者必定要多在動畫的原理上下功夫,好比了解矩陣變換,線性代數這些,而不是把時間浪費在閱讀官方文檔上。

二、逆向工程

研究逆向工程的做用不只僅是破解 app,在我看來更可能是學習底層的操做系統。在開發 app 的過程當中,咱們使用系統提供的庫,調用 API 就能夠實現需求,其中的過程徹底是黑盒。而逆向工程的目的就是要開盒子,利用一些工具從二進制層面入手,反過來推測應用開發者的代碼和邏輯。這其中會涉及到不少 C 語言,操做系統,編譯原理方面的東西,相對來講門檻很高。逆向工程對企業對價值也很大, 由於你們都不但願本身被競爭對手一眼看穿,又對競爭對手對祕密頗感興趣。

以上的內容均可以花時間研究的專業知識。這些知識大可能是自成體系的,沒有較長時間的積累,很難入門。這一點很是重要,由於不少知識看起來很是專業,門檻也很高,好比我下一節就會提到這樣的例子,但這些知識我並不鼓勵學習。區分的標準是,你學習的知識是一個知識點仍是一個體系,若是你學習的只是知識點, 那麼它只能是整個知識樹上的枝枝丫丫,邊邊角角,若是你學習的是知識體系,就具有了衍生知識點的能力,也就是我反覆強調的觸類旁通的能力。

上面舉的兩個例子都是我認爲不容易遭到時間的淘汰,比較值得研究的話題。在這些領域上的投入能夠理解爲線性的,也就是一分耕耘,一分收穫。

(三)全棧人才緊缺

這裏的全棧沒有明確的定義,並不是先後端通吃纔算是全棧。在個人理解中,只要是跨知識點的融合,都算是全棧,由於跨知識點的融合每每會產生 1 + 1 > 2 的效果。往小了說,全棧能夠減小大量浪費在溝通上的時間。往大了說,一我的瞭解的領域越多,他就越能把這些領域融合在一塊兒,既能站在更高的角度思考問題,也能做爲團隊的領導者和融合劑。這也就意味着,掌握全棧知識對我的價值的影響是指數形勢的,你瞭解的越多,價值就會越快的提升,職業天花板也會越高。

不少技術是與業務綁定的,有了核心知識,在業務需求的推進下,很容易就會誕生一個框架。好比應用組件化,不少公司都有本身的組件化庫,其實實現原理也就是兩大類,但發表到博客裏面之後,就會有很是多的業務背景干擾讀者的認知,若是讀者追着這類文章看,是很是難從框架中剝離業務的干擾,直接挖掘基本原理的。所以大公司搞出來的某些框架,真的沒有那麼神祕,早期都是一個簡陋的基礎框架,當面對業務業務需求時,運用一些合理的編程思想,逐步迭代,最後發佈了一個完善的版本,大可沒必要看得暈頭轉向之後妄自菲薄。

在以前面試的過程當中,我也注意到不少應聘者其實對技術很感興趣,常常刷微博上的文章,瞭解的也不少。但大多數狀況下只知其然,不知其因此然。這是由於這些技術偏離了你的應用場景。之前我總爲微博上的好技術沒法在項目中落地感到糾結,後來我忽然就明白了,這個思路就是錯的,我應該挖掘公司項目的痛點,去微博,Google 等平臺上的文章中尋找解決方案。因此我反對面向微博學習,應該要學一些更通用的技術,把技術與本身的項目結合起來,爭取能在項目中落地,這比看十篇似懂非懂的技術文章還管用。

(四)大公司所謂的基礎知識

爲何建議不要研究單獨的幾個底層知識點,除了這種知識,以及逆向工程這種自成體系的,求職者只要具有紮實的基礎,緊緊掌握一些基礎知識就能夠了。不少人都會以爲大公司對底層的基礎知識考察很嚴格,基礎知識不表示底層,也不必定就很簡單,它們一般是那些被框架作了一層封裝,以致於若是不用心思考,極可能就會忽略的知識,但不瞭解這些知識會對你的思考產生較大的影響,也很容易栽進某個坑裏。

除非是變態公司以偏題怪題刁難人爲樂,或者無能面試官只會問本身懂的東西之外,正常的大公司面試都會考察一些比較基礎的問題,若是你仍是以爲題目太底層,只能說明本身看問題的角度還不夠深入。

大公司着重考察基礎知識,在我看來有兩大緣由:首先,在比較大型的項目中,業務邏輯很是複雜,因此不多有人有精力去大量的檢查並提升你的代碼質量,這就要求工程師具有至關紮實的代碼功底,不管是代碼風格仍是語言的掌握都不能有太多問題。這樣 Code Review 的時候才能把精力放在業務檢查上,代碼風格一筆帶過,偶爾提醒一下就能夠了。

另外一方面,基礎知識決定一我的思考問題的深度和交流問題的角度。一個不懂計算機背景知識的程序員,看問題的方式常常是錯誤的,錯誤的思考方式也就決定了他很難走到正確的道路上,好比個人一個外行朋友曾經接手了一個用 C++ 實現的 GUI,他的第一個問題是「如何在 C++ 中把字符串加粗」,讀者大可沒必要感到荒謬,由於不少人思考問題的方式也不見得高明,在高水平,有經驗的程序員看來,也許一樣是不可理喻的。大公司複雜的業務邏輯一樣也意味着不多有人會耐心的給你講解每個名詞,好比哈希表,併發,並行,編譯,連接等等名詞,若是你聽不懂或者理解不正確,每每意味着交流上會存在一些障礙。

所以個人建議是:數據結構,操做系統,計算機網絡中的基礎知識必定要紮實,怎麼紮實都不爲過,由於它決定了你看問題時候的高度,深度和思路。

(五)讓腳本取代 GUI

腳本語言很是重要,絕對是提高工做效率的神器,我強烈建議每一個客戶端工程師都應該瞭解一些 Shell 腳本而且掌握 Python,Ruby 和 JS 中至少一門語言。

理論上來講沒有什麼是腳本語言作獲得,Java 作不到的,但腳本語言最大的特色就是快,快到極點的那種快。對於一些極度簡單的小需求,好比統計一個文件中某一列數字的平均數,我敢保證在我得出結果以前你確定還來不及打開 Java 編輯器。

腳本語言的另外一個特色是高度的自動化,只要 Unix 和 Linux 系統一天不死,shell 腳本就會永遠存活,你學習的知識就永遠不會過時,好比 awk 和 sed 這樣的神器,年齡比我大得多,至今還很是實用,將來的 20 年也絲毫看不出淘汰的跡象。試問一下,有什麼知識能比一個幾十年不會過時,並且天天都能用上的知識更值得學習呢?因爲 Shell 是距離操做系統最近的腳本,瞭解了它之後,不少複雜的操做均可以被自動化。好比想找到項目中無用的圖片,也就是一行命令的事。

考慮到腳本語言極高的開發效率,不少對性能不敏感的框架都會選擇用腳本語言來實現,好比 Node,Flask,Rails,mitmproxy 等等。做爲一個大前端工程師,不能老是依賴後端工程師,不然沒了後端就只能搞單機模式了。所以瞭解腳本語言還有助於咱們快速上手後端框架,這絕對是應聘時的加分項。

固然,不少人也會抱怨,咱們是 iOS 工程師,平時的工做也接觸不到腳本語言,該如何學習並投入使用呢。個人建議有三個:

一、整理本身的痛點, 並嘗試着用過腳本去解決,這對學習 Shell 有奇效

二、整理公司項目開發中的痛點,嘗試着用腳本去解決,適合練習 Python,Ruby 和 JS

三、拋棄 GUI

GUI 誕生的目的是爲了更好的顯示信息,而不是成爲技術殘疾者的柺杖。舉一個簡單的例子,我發現不少人都裝了不少編程效率方面的工具,好比 gitx,sourcetree,tower 之類的 git 工具,還有什麼快速打開模擬器目錄,Derived Data 目錄的小工具,我以爲這實在是太愚蠢了。放着大好的學習 Git 和 shell 的機會不要,把時間浪費在瞭解一個軟件的 GUI 上,我以爲是徹底不能接受的。尤爲是對於 git 來講,我建議多問問本身,學會的是 git 仍是 sourcetree 的按鈕,未來換一個 GUI 工具,畢生功力還剩幾成?至於某些小工具,這種絕佳的練手機會,怎麼能拱手相讓給別的軟件呢,尤爲是腳本能夠自動化,軟件就幾乎不可能了。

囉囉嗦嗦說了不少,其實總結下來沒幾點:

一、學習一個技術以前不妨先思考一下它在整個互聯網體系中目前的位置,有什麼樣的將來,會對我的價值有多大的提升

二、數據結構,操做系統,編譯原理,計算機網絡這些基礎知識不能丟,它決定了你看問題時候的高度,深度和思路

三、將來須要特定技術領域裏的專才,更須要全棧,歸根結底是須要最大化本身的價值。我我的的建議是掌握好腳本語言提升效率,打通先後端,這樣不管在外包,獨角獸創業公司仍是大公司,都能獨當一面

四、學習新技術時要避免好高騖遠或者盲目迷信大廠,轉發或艾特印象筆記提升不了本身,要結合實際場景,最重要的是要能落地!

做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:638302184,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!但願幫助開發者少走彎路。

文章來源於網絡,若有侵權,請聯繫小編刪除。