序言:
成都創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專(zhuān)注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開(kāi)發(fā),軟件開(kāi)發(fā),微信平臺(tái)小程序開(kāi)發(fā),十多年建站對(duì)報(bào)廢汽車(chē)回收等多個(gè)方面,擁有豐富的網(wǎng)站營(yíng)銷(xiāo)經(jīng)驗(yàn)。
如果從 13 年移動(dòng)客戶(hù)端大火開(kāi)始算起,至今已經(jīng)有五個(gè)年頭了。現(xiàn)在移動(dòng)端的形勢(shì)也不需要太多的廢話(huà)來(lái)描述,一句話(huà)總結(jié)就是:“浪潮退去,誰(shuí)在裸泳一看就清楚。”我希望借助這篇文章來(lái)聊聊在我心目中,移動(dòng)互聯(lián)網(wǎng)下一個(gè)五年的趨勢(shì)和機(jī)會(huì),以及我們 iOS 工程師能做哪些準(zhǔn)備,實(shí)現(xiàn)自我提高。本文主觀性的看法比較多,文筆也比較激進(jìn),僅供參考。
我們都知道價(jià)格會(huì)受到供需的影響,如果某項(xiàng)技能在市場(chǎng)上緊缺,那么掌握這門(mén)技能的工作者工資就會(huì)相對(duì)高一些,比如 14 年前前后能寫(xiě)好 UITableView 就能找到一個(gè)相對(duì)不錯(cuò)的工作了。在我看來(lái),未來(lái)幾年的移動(dòng)互聯(lián)網(wǎng),會(huì)出現(xiàn)“一個(gè)過(guò)剩,兩個(gè)不足”,我會(huì)逐個(gè)分析并試著給出一些建議
在這里小編附帶一些iOS開(kāi)發(fā)的學(xué)習(xí)資料和面試題,至于其他資料視頻我就不一一截圖了,需要的可以加我新群領(lǐng)取 711413569
(一)UI 工程師過(guò)剩
這一點(diǎn)是我老生常談的了,首先要注意的是避免成為 API 調(diào)用工程師,因?yàn)檫@些 UI 方面的知識(shí)對(duì)個(gè)人價(jià)值的增長(zhǎng)不是線性的,如果你還記得高中數(shù)學(xué),請(qǐng)回憶一下 y = ln(x) 這個(gè)函數(shù)的曲線。從零到寫(xiě)好 UITableView 給一個(gè)工程師帶來(lái)的收益,遠(yuǎn)遠(yuǎn)不是從寫(xiě)好 UITableView 到寫(xiě)好 UIStackView 能比得上的。
就以 UIStackView 為例吧,先不說(shuō)它從 iOS 9 才開(kāi)始支持,而要想應(yīng)用不支持 iOS 9,怕是要等到猴年馬月了。就說(shuō)它提供的功能,雖然簡(jiǎn)化了已有場(chǎng)景,但這個(gè)功能完全可以通過(guò)封裝已有的組件來(lái)實(shí)現(xiàn),相信很多大型項(xiàng)目都有,為什么還要費(fèi)力氣去兼容版本,以及再學(xué)習(xí)一個(gè)新的 API 呢?人的精力是有限的,如果你總是追著蘋(píng)果的腳步,每年補(bǔ) WWDC 上那些新坑和老債,那么視野就永遠(yuǎn)只能停留在 iOS 中了。
(二)專(zhuān)業(yè)技能人才不足
這里的專(zhuān)業(yè)技能指的是移動(dòng)端這個(gè)大話(huà)題中里比較垂直的知識(shí)領(lǐng)域,大概包含以下幾個(gè)方面:
1、圖像/視頻處理
隨著網(wǎng)絡(luò)基礎(chǔ)設(shè)施的普及,以及流量費(fèi)用的大幅度降低,4G 基本上已經(jīng)全面商用了,如果說(shuō)移動(dòng)端前五年是文字為主,圖片視頻為輔的話(huà),在接下來(lái)的幾年中,用戶(hù)對(duì)高質(zhì)量圖片和視頻的要求會(huì)日益增長(zhǎng)。
由于我對(duì)這個(gè)領(lǐng)域并不了解,所以能夠推薦的并不多,在我印象中,OpenGL 這種跨平臺(tái)的引擎,計(jì)算機(jī)圖形學(xué)的知識(shí),視頻編碼與協(xié)議都是可以花時(shí)間研究的,現(xiàn)在有很多優(yōu)秀的創(chuàng)業(yè)公司也急需這類(lèi)人才。嚴(yán)格來(lái)說(shuō)這些知識(shí)都不算移動(dòng)互聯(lián)網(wǎng)方面的知識(shí)了,所以門(mén)檻較高,但門(mén)檻這東西是個(gè)雙刃劍。它會(huì)增加你的學(xué)習(xí)難度,但一旦你掌握了這門(mén)知識(shí),門(mén)檻又會(huì)變成你個(gè)人價(jià)值的護(hù)城河。
我格外想要聲明的是,CoreAnimation 這類(lèi)的東西如果不是工作中強(qiáng)制要用,一般就別碰了,就像沒(méi)人會(huì)傻到用 SpriteKit/SceneKit 去寫(xiě)游戲一樣,這種 API 密集型,又不能跨端的庫(kù)是沒(méi)有前途的,真正有價(jià)值的動(dòng)畫(huà)一定是用一套統(tǒng)一的 DSL(領(lǐng)域特定語(yǔ)言)去實(shí)現(xiàn),然后導(dǎo)出到各個(gè)平臺(tái)上,所以開(kāi)發(fā)者一定要多在動(dòng)畫(huà)的原理上下功夫,比如了解矩陣變換,線性代數(shù)這些,而不是把時(shí)間浪費(fèi)在閱讀官方文檔上。
2、逆向工程
研究逆向工程的作用不僅僅是破解 app,在我看來(lái)更多是學(xué)習(xí)底層的操作系統(tǒng)。在開(kāi)發(fā) app 的過(guò)程中,我們使用系統(tǒng)提供的庫(kù),調(diào)用 API 就可以實(shí)現(xiàn)需求,其中的過(guò)程完全是黑盒。而逆向工程的目的就是要開(kāi)盒子,利用一些工具從二進(jìn)制層面入手,反過(guò)來(lái)推測(cè)應(yīng)用開(kāi)發(fā)者的代碼和邏輯。這其中會(huì)涉及到很多 C 語(yǔ)言,操作系統(tǒng),編譯原理方面的東西,相對(duì)來(lái)說(shuō)門(mén)檻很高。逆向工程對(duì)企業(yè)對(duì)價(jià)值也很大, 因?yàn)榇蠹叶疾幌M约罕桓?jìng)爭(zhēng)對(duì)手一眼看穿,又對(duì)競(jìng)爭(zhēng)對(duì)手對(duì)秘密頗感興趣。
以上的內(nèi)容都可以花時(shí)間研究的專(zhuān)業(yè)知識(shí)。這些知識(shí)大多是自成體系的,沒(méi)有較長(zhǎng)時(shí)間的積累,很難入門(mén)。這一點(diǎn)非常重要,因?yàn)楹芏嘀R(shí)看起來(lái)非常專(zhuān)業(yè),門(mén)檻也很高,比如我下一節(jié)就會(huì)提到這樣的例子,但這些知識(shí)我并不鼓勵(lì)學(xué)習(xí)。區(qū)分的標(biāo)準(zhǔn)是,你學(xué)習(xí)的知識(shí)是一個(gè)知識(shí)點(diǎn)還是一個(gè)體系,如果你學(xué)習(xí)的只是知識(shí)點(diǎn), 那么它只能是整個(gè)知識(shí)樹(shù)上的枝枝丫丫,邊邊角角,如果你學(xué)習(xí)的是知識(shí)體系,就具備了衍生知識(shí)點(diǎn)的能力,也就是我反復(fù)強(qiáng)調(diào)的舉一反三的能力。
上面舉的兩個(gè)例子都是我認(rèn)為不容易遭到時(shí)間的淘汰,比較值得研究的話(huà)題。在這些領(lǐng)域上的投入可以理解為線性的,也就是一分耕耘,一分收獲。
(三)全棧人才緊缺
這里的全棧沒(méi)有明確的定義,并非前后端通吃才算是全棧。在我的理解中,只要是跨知識(shí)點(diǎn)的融合,都算是全棧,因?yàn)榭缰R(shí)點(diǎn)的融合往往會(huì)產(chǎn)生 1 + 1 > 2 的效果。往小了說(shuō),全??梢詼p少大量浪費(fèi)在溝通上的時(shí)間。往大了說(shuō),一個(gè)人了解的領(lǐng)域越多,他就越能把這些領(lǐng)域融合在一起,既能站在更高的角度思考問(wèn)題,也能作為團(tuán)隊(duì)的領(lǐng)導(dǎo)者和融合劑。這也就意味著,掌握全棧知識(shí)對(duì)個(gè)人價(jià)值的影響是指數(shù)形勢(shì)的,你了解的越多,價(jià)值就會(huì)越快的提高,職業(yè)天花板也會(huì)越高。
很多技術(shù)是與業(yè)務(wù)綁定的,有了核心知識(shí),在業(yè)務(wù)需求的推動(dòng)下,很容易就會(huì)誕生一個(gè)框架。比如應(yīng)用組件化,很多公司都有自己的組件化庫(kù),其實(shí)實(shí)現(xiàn)原理也就是兩大類(lèi),但發(fā)表到博客里面以后,就會(huì)有非常多的業(yè)務(wù)背景干擾讀者的認(rèn)知,如果讀者追著這類(lèi)文章看,是非常難從框架中剝離業(yè)務(wù)的干擾,直接挖掘基本原理的。因此大公司搞出來(lái)的某些框架,真的沒(méi)有那么神秘,早期都是一個(gè)簡(jiǎn)陋的基礎(chǔ)框架,當(dāng)面對(duì)業(yè)務(wù)業(yè)務(wù)需求時(shí),運(yùn)用一些合理的編程思想,逐步迭代,最后發(fā)布了一個(gè)完善的版本,大可不必看得暈頭轉(zhuǎn)向以后妄自菲薄。
在之前面試的過(guò)程中,我也注意到很多應(yīng)聘者其實(shí)對(duì)技術(shù)很感興趣,經(jīng)常刷微博上的文章,了解的也很多。但大多數(shù)情況下只知其然,不知其所以然。這是因?yàn)檫@些技術(shù)偏離了你的應(yīng)用場(chǎng)景。以前我總為微博上的好技術(shù)無(wú)法在項(xiàng)目中落地感到糾結(jié),后來(lái)我突然就明白了,這個(gè)思路就是錯(cuò)的,我應(yīng)該挖掘公司項(xiàng)目的痛點(diǎn),去微博,Google 等平臺(tái)上的文章中尋找解決方案。所以我反對(duì)面向微博學(xué)習(xí),應(yīng)該要學(xué)一些更通用的技術(shù),把技術(shù)與自己的項(xiàng)目結(jié)合起來(lái),爭(zhēng)取能在項(xiàng)目中落地,這比看十篇似懂非懂的技術(shù)文章還管用。
(四)大公司所謂的基礎(chǔ)知識(shí)
為什么建議不要研究單獨(dú)的幾個(gè)底層知識(shí)點(diǎn),除了這種知識(shí),以及逆向工程這種自成體系的,求職者只要具備扎實(shí)的基礎(chǔ),牢牢掌握一些基礎(chǔ)知識(shí)就可以了。很多人都會(huì)覺(jué)得大公司對(duì)底層的基礎(chǔ)知識(shí)考察很?chē)?yán)格,基礎(chǔ)知識(shí)不表示底層,也不一定就很簡(jiǎn)單,它們通常是那些被框架做了一層封裝,以至于如果不用心思考,很可能就會(huì)忽略的知識(shí),但不了解這些知識(shí)會(huì)對(duì)你的思考產(chǎn)生較大的影響,也很容易栽進(jìn)某個(gè)坑里。
除非是變態(tài)公司以偏題怪題刁難人為樂(lè),或者無(wú)能面試官只會(huì)問(wèn)自己懂的東西以外,正常的大公司面試都會(huì)考察一些比較基礎(chǔ)的問(wèn)題,如果你還是覺(jué)得題目太底層,只能說(shuō)明自己看問(wèn)題的角度還不夠深刻。
大公司著重考察基礎(chǔ)知識(shí),在我看來(lái)有兩大原因:首先,在比較大型的項(xiàng)目中,業(yè)務(wù)邏輯非常復(fù)雜,所以很少有人有精力去大量的檢查并提高你的代碼質(zhì)量,這就要求工程師具備相當(dāng)扎實(shí)的代碼功底,無(wú)論是代碼風(fēng)格還是語(yǔ)言的掌握都不能有太多問(wèn)題。這樣 Code Review 的時(shí)候才能把精力放在業(yè)務(wù)檢查上,代碼風(fēng)格一筆帶過(guò),偶爾提醒一下就可以了。
另一方面,基礎(chǔ)知識(shí)決定一個(gè)人思考問(wèn)題的深度和交流問(wèn)題的角度。一個(gè)不懂計(jì)算機(jī)背景知識(shí)的程序員,看問(wèn)題的方式經(jīng)常是錯(cuò)誤的,錯(cuò)誤的思考方式也就決定了他很難走到正確的道路上,比如我的一個(gè)外行朋友曾經(jīng)接手了一個(gè)用 C++ 實(shí)現(xiàn)的 GUI,他的第一個(gè)問(wèn)題是“如何在 C++ 中把字符串加粗”,讀者大可不必感到荒謬,因?yàn)楹芏嗳怂伎紗?wèn)題的方式也不見(jiàn)得高明,在高水平,有經(jīng)驗(yàn)的程序員看來(lái),也許同樣是不可理喻的。大公司復(fù)雜的業(yè)務(wù)邏輯同樣也意味著很少有人會(huì)耐心的給你講解每一個(gè)名詞,比如哈希表,并發(fā),并行,編譯,鏈接等等名詞,如果你聽(tīng)不懂或者理解不正確,往往意味著交流上會(huì)存在一些障礙。
因此我的建議是:數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng),計(jì)算機(jī)網(wǎng)絡(luò)中的基礎(chǔ)知識(shí)一定要扎實(shí),怎么扎實(shí)都不為過(guò),因?yàn)樗鼪Q定了你看問(wèn)題時(shí)候的高度,深度和思路。
(五)讓腳本取代 GUI
腳本語(yǔ)言非常重要,絕對(duì)是提升工作效率的神器,我強(qiáng)烈建議每個(gè)客戶(hù)端工程師都應(yīng)該了解一些 Shell 腳本并且掌握 Python,Ruby 和 JS 中至少一門(mén)語(yǔ)言。
理論上來(lái)說(shuō)沒(méi)有什么是腳本語(yǔ)言做得到,Java 做不到的,但腳本語(yǔ)言最大的特點(diǎn)就是快,快到極點(diǎn)的那種快。對(duì)于一些極度簡(jiǎn)單的小需求,比如統(tǒng)計(jì)一個(gè)文件中某一列數(shù)字的平均數(shù),我敢保證在我得出結(jié)果之前你肯定還來(lái)不及打開(kāi) Java 編輯器。
腳本語(yǔ)言的另一個(gè)特點(diǎn)是高度的自動(dòng)化,只要 Unix 和 Linux 系統(tǒng)一天不死,shell 腳本就會(huì)永遠(yuǎn)存活,你學(xué)習(xí)的知識(shí)就永遠(yuǎn)不會(huì)過(guò)期,比如 awk 和 sed 這樣的神器,年齡比我大得多,至今還非常實(shí)用,未來(lái)的 20 年也絲毫看不出淘汰的跡象。試問(wèn)一下,有什么知識(shí)能比一個(gè)幾十年不會(huì)過(guò)期,而且每天都能用上的知識(shí)更值得學(xué)習(xí)呢?由于 Shell 是距離操作系統(tǒng)最近的腳本,了解了它以后,很多復(fù)雜的操作都可以被自動(dòng)化。比如想找到項(xiàng)目中無(wú)用的圖片,也就是一行命令的事。
考慮到腳本語(yǔ)言極高的開(kāi)發(fā)效率,很多對(duì)性能不敏感的框架都會(huì)選擇用腳本語(yǔ)言來(lái)實(shí)現(xiàn),比如 Node,F(xiàn)lask,Rails,mitmproxy 等等。作為一個(gè)大前端工程師,不能總是依賴(lài)后端工程師,否則沒(méi)了后端就只能搞單機(jī)模式了。因此了解腳本語(yǔ)言還有iOS助于我們快速上手后端框架,這絕對(duì)是應(yīng)聘時(shí)的加分項(xiàng)。
當(dāng)然,很多人也會(huì)抱怨,我們是 iOS 工程師,平時(shí)的工作也接觸不到腳本語(yǔ)言,該如何學(xué)習(xí)并投入使用呢。我的建議有三個(gè):
1、整理自己的痛點(diǎn), 并嘗試著用過(guò)腳本去解決,這對(duì)學(xué)習(xí) Shell 有奇效
2、整理公司項(xiàng)目開(kāi)發(fā)中的痛點(diǎn),嘗試著用腳本去解決,適合練習(xí) Python,Ruby 和 JS
3、拋棄 GUI
GUI 誕生的目的是為了更好的顯示信息,而不是成為技術(shù)殘疾者的拐杖。舉一個(gè)簡(jiǎn)單的例子,我發(fā)現(xiàn)很多人都裝了很多編程效率方面的工具,比如 gitx,sourcetree,tower 之類(lèi)的 git 工具,還有什么快速打開(kāi)模擬器目錄,Derived Data 目錄的小工具,我覺(jué)得這實(shí)在是太愚蠢了。放著大好的學(xué)習(xí) Git 和 shell 的機(jī)會(huì)不要,把時(shí)間浪費(fèi)在了解一個(gè)軟件的 GUI 上,我覺(jué)得是完全不能接受的。尤其是對(duì)于 git 來(lái)說(shuō),我建議多問(wèn)問(wèn)自己,學(xué)會(huì)的是 git 還是 sourcetree 的按鈕,將來(lái)?yè)Q一個(gè) GUI 工具,畢生功力還剩幾成?至于某些小工具,這種絕佳的練手機(jī)會(huì),怎么能拱手相讓給別的軟件呢,尤其是腳本可以自動(dòng)化,軟件就幾乎不可能了。
啰啰嗦嗦說(shuō)了很多,其實(shí)總結(jié)下來(lái)沒(méi)幾點(diǎn):
1、學(xué)習(xí)一個(gè)技術(shù)之前不妨先思考一下它在整個(gè)互聯(lián)網(wǎng)體系中目前的位置,有什么樣的未來(lái),會(huì)對(duì)個(gè)人價(jià)值有多大的提高
2、數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng),編譯原理,計(jì)算機(jī)網(wǎng)絡(luò)這些基礎(chǔ)知識(shí)不能丟,它決定了你看問(wèn)題時(shí)候的高度,深度和思路
3、未來(lái)需要特定技術(shù)領(lǐng)域里的專(zhuān)才,更需要全棧,歸根結(jié)底是需要最大化自己的價(jià)值。我個(gè)人的建議是掌握好腳本語(yǔ)言提高效率,打通前后端,這樣無(wú)論在外包,獨(dú)角獸創(chuàng)業(yè)公司還是大公司,都能獨(dú)當(dāng)一面
4、學(xué)習(xí)新技術(shù)時(shí)要避免好高騖遠(yuǎn)或者盲目迷信大廠,轉(zhuǎn)發(fā)或艾特印象筆記提高不了自己,要結(jié)合實(shí)際場(chǎng)景,最重要的是要能落地!
在這里小編附帶一些iOS開(kāi)發(fā)的學(xué)習(xí)資料和面試題,至于其他資料視頻我就不一一截圖了,需要的可以加我新群領(lǐng)取 711413569