標籤:思考 迭代 應聘 沒有 code TE 例子 進位 images
序言:
如果從 13 年移動用戶端大火開始算起,至今已經有五個年頭了。現在移動端的形勢也不需要太多的廢話來描述,一句話總結就是:“浪潮退去,誰在裸泳一看就清楚。”我希望藉助這篇文章來聊聊在我心目中,移動互連網下一個五年的趨勢和機會,以及我們 iOS 工程師能做哪些準備,實現自我提高。本文主觀性的看法比較多,文筆也比較激進,僅供參考。
我們都知道價格會受到供需的影響,如果某項技能在市場上緊缺,那麼掌握這門技能的工作者工資就會相對高一些,比如 14 年前前後能寫好 UITableView 就能找到一個相對不錯的工作了。在我看來,未來幾年的移動互連網,會出現“一個過剩,兩個不足”,我會逐個分析並試著給出一些建議
作為一個開發人員,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:638302184,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!希望協助開發人員少走彎路。以下資料需要的可以加群領取。
iOS進階進階資料
(一)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 工程師,平時的工作也接觸不到指令碼語言,該如何學習並投入使用呢。我的建議有三個:
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交流群:638302184,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!希望協助開發人員少走彎路。
文章來源於網路,如有侵權,請聯絡小編刪除。
如今的iOS開發人員優勝劣汰,如何提升讓自己不被淘汰?(附資料)