您好,登錄后才能下訂單哦!
序言:
如果從 13 年移動客戶端大火開始算起,至今已經有五個年頭了。現在移動端的形勢也不需要太多的廢話來描述,一句話總結就是:“浪潮退去,誰在裸泳一看就清楚。”我希望借助這篇文章來聊聊在我心目中,移動互聯網下一個五年的趨勢和機會,以及我們 iOS 工程師能做哪些準備,實現自我提高。本文主觀性的看法比較多,文筆也比較激進,僅供參考。
我們都知道價格會受到供需的影響,如果某項技能在市場上緊缺,那么掌握這門技能的工作者工資就會相對高一些,比如 14 年前前后能寫好 UITableView 就能找到一個相對不錯的工作了。在我看來,未來幾年的移動互聯網,會出現“一個過剩,兩個不足”,我會逐個分析并試著給出一些建議
在這里小編附帶一些iOS開發的學習資料和面試題,至于其他資料視頻我就不一一截圖了,需要的可以加我新群領取 711413569
(一)UI 工程師過剩
這一點是我老生常談的了,首先要注意的是避免成為 API 調用工程師,因為這些 UI 方面的知識對個人價值的增長不是線性的,如果你還記得高中數學,請回憶一下 y = ln(x) 這個函數的曲線。從零到寫好 UITableView 給一個工程師帶來的收益,遠遠不是從寫好 UITableView 到寫好 UIStackView 能比得上的。
就以 UIStackView 為例吧,先不說它從 iOS 9 才開始支持,而要想應用不支持 iOS 9,怕是要等到猴年馬月了。就說它提供的功能,雖然簡化了已有場景,但這個功能完全可以通過封裝已有的組件來實現,相信很多大型項目都有,為什么還要費力氣去兼容版本,以及再學習一個新的 API 呢?人的精力是有限的,如果你總是追著蘋果的腳步,每年補 WWDC 上那些新坑和老債,那么視野就永遠只能停留在 iOS 中了。
(二)專業技能人才不足
這里的專業技能指的是移動端這個大話題中里比較垂直的知識領域,大概包含以下幾個方面:
1、圖像/視頻處理
隨著網絡基礎設施的普及,以及流量費用的大幅度降低,4G 基本上已經全面商用了,如果說移動端前五年是文字為主,圖片視頻為輔的話,在接下來的幾年中,用戶對高質量圖片和視頻的要求會日益增長。
由于我對這個領域并不了解,所以能夠推薦的并不多,在我印象中,OpenGL 這種跨平臺的引擎,計算機圖形學的知識,視頻編碼與協議都是可以花時間研究的,現在有很多優秀的創業公司也急需這類人才。嚴格來說這些知識都不算移動互聯網方面的知識了,所以門檻較高,但門檻這東西是個雙刃劍。它會增加你的學習難度,但一旦你掌握了這門知識,門檻又會變成你個人價值的護城河。
我格外想要聲明的是,CoreAnimation 這類的東西如果不是工作中強制要用,一般就別碰了,就像沒人會傻到用 SpriteKit/SceneKit 去寫游戲一樣,這種 API 密集型,又不能跨端的庫是沒有前途的,真正有價值的動畫一定是用一套統一的 DSL(領域特定語言)去實現,然后導出到各個平臺上,所以開發者一定要多在動畫的原理上下功夫,比如了解矩陣變換,線性代數這些,而不是把時間浪費在閱讀官方文檔上。
2、逆向工程
研究逆向工程的作用不僅僅是破解 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助于我們快速上手后端框架,這絕對是應聘時的加分項。
當然,很多人也會抱怨,我們是 iOS 工程師,平時的工作也接觸不到腳本語言,該如何學習并投入使用呢。我的建議有三個:
1、整理自己的痛點, 并嘗試著用過腳本去解決,這對學習 Shell 有奇效
2、整理公司項目開發中的痛點,嘗試著用腳本去解決,適合練習 Python,Ruby 和 JS
3、拋棄 GUI
GUI 誕生的目的是為了更好的顯示信息,而不是成為技術殘疾者的拐杖。舉一個簡單的例子,我發現很多人都裝了很多編程效率方面的工具,比如 gitx,sourcetree,tower 之類的 git 工具,還有什么快速打開模擬器目錄,Derived Data 目錄的小工具,我覺得這實在是太愚蠢了。放著大好的學習 Git 和 shell 的機會不要,把時間浪費在了解一個軟件的 GUI 上,我覺得是完全不能接受的。尤其是對于 git 來說,我建議多問問自己,學會的是 git 還是 sourcetree 的按鈕,將來換一個 GUI 工具,畢生功力還剩幾成?至于某些小工具,這種絕佳的練手機會,怎么能拱手相讓給別的軟件呢,尤其是腳本可以自動化,軟件就幾乎不可能了。
啰啰嗦嗦說了很多,其實總結下來沒幾點:
1、學習一個技術之前不妨先思考一下它在整個互聯網體系中目前的位置,有什么樣的未來,會對個人價值有多大的提高
2、數據結構,操作系統,編譯原理,計算機網絡這些基礎知識不能丟,它決定了你看問題時候的高度,深度和思路
3、未來需要特定技術領域里的專才,更需要全棧,歸根結底是需要最大化自己的價值。我個人的建議是掌握好腳本語言提高效率,打通前后端,這樣無論在外包,獨角獸創業公司還是大公司,都能獨當一面
4、學習新技術時要避免好高騖遠或者盲目迷信大廠,轉發或艾特印象筆記提高不了自己,要結合實際場景,最重要的是要能落地!
在這里小編附帶一些iOS開發的學習資料和面試題,至于其他資料視頻我就不一一截圖了,需要的可以加我新群領取 711413569
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。