溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

鵝廠6年在職架構(gòu)師告訴你如何成為iOS大牛開發(fā)者【進(jìn)階篇】

發(fā)布時(shí)間:2020-08-01 09:27:55 來源:網(wǎng)絡(luò) 閱讀:9340 作者:python牧塵 欄目:移動(dòng)開發(fā)

序言:

如果從 13 年移動(dòng)客戶端大火開始算起,至今已經(jīng)有五個(gè)年頭了?,F(xiàn)在移動(dòng)端的形勢也不需要太多的廢話來描述,一句話總結(jié)就是:“浪潮退去,誰在裸泳一看就清楚。”我希望借助這篇文章來聊聊在我心目中,移動(dòng)互聯(lián)網(wǎng)下一個(gè)五年的趨勢和機(jī)會(huì),以及我們 iOS 工程師能做哪些準(zhǔn)備,實(shí)現(xiàn)自我提高。本文主觀性的看法比較多,文筆也比較激進(jìn),僅供參考。

我們都知道價(jià)格會(huì)受到供需的影響,如果某項(xiàng)技能在市場上緊缺,那么掌握這門技能的工作者工資就會(huì)相對(duì)高一些,比如 14 年前前后能寫好 UITableView 就能找到一個(gè)相對(duì)不錯(cuò)的工作了。在我看來,未來幾年的移動(dòng)互聯(lián)網(wǎng),會(huì)出現(xiàn)“一個(gè)過剩,兩個(gè)不足”,我會(huì)逐個(gè)分析并試著給出一些建議

在這里小編附帶一些iOS開發(fā)的學(xué)習(xí)資料和面試題,至于其他資料視頻我就不一一截圖了,需要的可以加我新群領(lǐng)取 711413569
鵝廠6年在職架構(gòu)師告訴你如何成為iOS大牛開發(fā)者【進(jìn)階篇】

(一)UI 工程師過剩

這一點(diǎn)是我老生常談的了,首先要注意的是避免成為 API 調(diào)用工程師,因?yàn)檫@些 UI 方面的知識(shí)對(duì)個(gè)人價(jià)值的增長不是線性的,如果你還記得高中數(shù)學(xué),請(qǐng)回憶一下 y = ln(x) 這個(gè)函數(shù)的曲線。從零到寫好 UITableView 給一個(gè)工程師帶來的收益,遠(yuǎn)遠(yuǎn)不是從寫好 UITableView 到寫好 UIStackView 能比得上的。

就以 UIStackView 為例吧,先不說它從 iOS 9 才開始支持,而要想應(yīng)用不支持 iOS 9,怕是要等到猴年馬月了。就說它提供的功能,雖然簡化了已有場景,但這個(gè)功能完全可以通過封裝已有的組件來實(shí)現(xiàn),相信很多大型項(xiàng)目都有,為什么還要費(fèi)力氣去兼容版本,以及再學(xué)習(xí)一個(gè)新的 API 呢?人的精力是有限的,如果你總是追著蘋果的腳步,每年補(bǔ) WWDC 上那些新坑和老債,那么視野就永遠(yuǎn)只能停留在 iOS 中了。

(二)專業(yè)技能人才不足

這里的專業(yè)技能指的是移動(dòng)端這個(gè)大話題中里比較垂直的知識(shí)領(lǐng)域,大概包含以下幾個(gè)方面:

1、圖像/視頻處理

隨著網(wǎng)絡(luò)基礎(chǔ)設(shè)施的普及,以及流量費(fèi)用的大幅度降低,4G 基本上已經(jīng)全面商用了,如果說移動(dòng)端前五年是文字為主,圖片視頻為輔的話,在接下來的幾年中,用戶對(duì)高質(zhì)量圖片和視頻的要求會(huì)日益增長。

由于我對(duì)這個(gè)領(lǐng)域并不了解,所以能夠推薦的并不多,在我印象中,OpenGL 這種跨平臺(tái)的引擎,計(jì)算機(jī)圖形學(xué)的知識(shí),視頻編碼與協(xié)議都是可以花時(shí)間研究的,現(xiàn)在有很多優(yōu)秀的創(chuàng)業(yè)公司也急需這類人才。嚴(yán)格來說這些知識(shí)都不算移動(dòng)互聯(lián)網(wǎng)方面的知識(shí)了,所以門檻較高,但門檻這東西是個(gè)雙刃劍。它會(huì)增加你的學(xué)習(xí)難度,但一旦你掌握了這門知識(shí),門檻又會(huì)變成你個(gè)人價(jià)值的護(hù)城河。

我格外想要聲明的是,CoreAnimation 這類的東西如果不是工作中強(qiáng)制要用,一般就別碰了,就像沒人會(huì)傻到用 SpriteKit/SceneKit 去寫游戲一樣,這種 API 密集型,又不能跨端的庫是沒有前途的,真正有價(jià)值的動(dòng)畫一定是用一套統(tǒng)一的 DSL(領(lǐng)域特定語言)去實(shí)現(xiàn),然后導(dǎo)出到各個(gè)平臺(tái)上,所以開發(fā)者一定要多在動(dòng)畫的原理上下功夫,比如了解矩陣變換,線性代數(shù)這些,而不是把時(shí)間浪費(fèi)在閱讀官方文檔上。

2、逆向工程

研究逆向工程的作用不僅僅是破解 app,在我看來更多是學(xué)習(xí)底層的操作系統(tǒng)。在開發(fā) app 的過程中,我們使用系統(tǒng)提供的庫,調(diào)用 API 就可以實(shí)現(xiàn)需求,其中的過程完全是黑盒。而逆向工程的目的就是要開盒子,利用一些工具從二進(jìn)制層面入手,反過來推測應(yīng)用開發(fā)者的代碼和邏輯。這其中會(huì)涉及到很多 C 語言,操作系統(tǒng),編譯原理方面的東西,相對(duì)來說門檻很高。逆向工程對(duì)企業(yè)對(duì)價(jià)值也很大, 因?yàn)榇蠹叶疾幌M约罕桓偁帉?duì)手一眼看穿,又對(duì)競爭對(duì)手對(duì)秘密頗感興趣。

以上的內(nèi)容都可以花時(shí)間研究的專業(yè)知識(shí)。這些知識(shí)大多是自成體系的,沒有較長時(shí)間的積累,很難入門。這一點(diǎn)非常重要,因?yàn)楹芏嘀R(shí)看起來非常專業(yè),門檻也很高,比如我下一節(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í)樹上的枝枝丫丫,邊邊角角,如果你學(xué)習(xí)的是知識(shí)體系,就具備了衍生知識(shí)點(diǎn)的能力,也就是我反復(fù)強(qiáng)調(diào)的舉一反三的能力。

上面舉的兩個(gè)例子都是我認(rèn)為不容易遭到時(shí)間的淘汰,比較值得研究的話題。在這些領(lǐng)域上的投入可以理解為線性的,也就是一分耕耘,一分收獲。

(三)全棧人才緊缺

這里的全棧沒有明確的定義,并非前后端通吃才算是全棧。在我的理解中,只要是跨知識(shí)點(diǎn)的融合,都算是全棧,因?yàn)榭缰R(shí)點(diǎn)的融合往往會(huì)產(chǎn)生 1 + 1 > 2 的效果。往小了說,全??梢詼p少大量浪費(fèi)在溝通上的時(shí)間。往大了說,一個(gè)人了解的領(lǐng)域越多,他就越能把這些領(lǐng)域融合在一起,既能站在更高的角度思考問題,也能作為團(tuán)隊(duì)的領(lǐng)導(dǎo)者和融合劑。這也就意味著,掌握全棧知識(shí)對(duì)個(gè)人價(jià)值的影響是指數(shù)形勢的,你了解的越多,價(jià)值就會(huì)越快的提高,職業(yè)天花板也會(huì)越高。

很多技術(shù)是與業(yè)務(wù)綁定的,有了核心知識(shí),在業(yè)務(wù)需求的推動(dòng)下,很容易就會(huì)誕生一個(gè)框架。比如應(yīng)用組件化,很多公司都有自己的組件化庫,其實(shí)實(shí)現(xiàn)原理也就是兩大類,但發(fā)表到博客里面以后,就會(huì)有非常多的業(yè)務(wù)背景干擾讀者的認(rèn)知,如果讀者追著這類文章看,是非常難從框架中剝離業(yè)務(wù)的干擾,直接挖掘基本原理的。因此大公司搞出來的某些框架,真的沒有那么神秘,早期都是一個(gè)簡陋的基礎(chǔ)框架,當(dāng)面對(duì)業(yè)務(wù)業(yè)務(wù)需求時(shí),運(yùn)用一些合理的編程思想,逐步迭代,最后發(fā)布了一個(gè)完善的版本,大可不必看得暈頭轉(zhuǎn)向以后妄自菲薄。

在之前面試的過程中,我也注意到很多應(yīng)聘者其實(shí)對(duì)技術(shù)很感興趣,經(jīng)常刷微博上的文章,了解的也很多。但大多數(shù)情況下只知其然,不知其所以然。這是因?yàn)檫@些技術(shù)偏離了你的應(yīng)用場景。以前我總為微博上的好技術(shù)無法在項(xiàng)目中落地感到糾結(jié),后來我突然就明白了,這個(gè)思路就是錯(cuò)的,我應(yīng)該挖掘公司項(xiàng)目的痛點(diǎn),去微博,Google 等平臺(tái)上的文章中尋找解決方案。所以我反對(duì)面向微博學(xué)習(xí),應(yīng)該要學(xué)一些更通用的技術(shù),把技術(shù)與自己的項(xiàng)目結(jié)合起來,爭取能在項(xiàng)目中落地,這比看十篇似懂非懂的技術(shù)文章還管用。

(四)大公司所謂的基礎(chǔ)知識(shí)

為什么建議不要研究單獨(dú)的幾個(gè)底層知識(shí)點(diǎn),除了這種知識(shí),以及逆向工程這種自成體系的,求職者只要具備扎實(shí)的基礎(chǔ),牢牢掌握一些基礎(chǔ)知識(shí)就可以了。很多人都會(huì)覺得大公司對(duì)底層的基礎(chǔ)知識(shí)考察很嚴(yán)格,基礎(chǔ)知識(shí)不表示底層,也不一定就很簡單,它們通常是那些被框架做了一層封裝,以至于如果不用心思考,很可能就會(huì)忽略的知識(shí),但不了解這些知識(shí)會(huì)對(duì)你的思考產(chǎn)生較大的影響,也很容易栽進(jìn)某個(gè)坑里。

除非是變態(tài)公司以偏題怪題刁難人為樂,或者無能面試官只會(huì)問自己懂的東西以外,正常的大公司面試都會(huì)考察一些比較基礎(chǔ)的問題,如果你還是覺得題目太底層,只能說明自己看問題的角度還不夠深刻。

大公司著重考察基礎(chǔ)知識(shí),在我看來有兩大原因:首先,在比較大型的項(xiàng)目中,業(yè)務(wù)邏輯非常復(fù)雜,所以很少有人有精力去大量的檢查并提高你的代碼質(zhì)量,這就要求工程師具備相當(dāng)扎實(shí)的代碼功底,無論是代碼風(fēng)格還是語言的掌握都不能有太多問題。這樣 Code Review 的時(shí)候才能把精力放在業(yè)務(wù)檢查上,代碼風(fēng)格一筆帶過,偶爾提醒一下就可以了。

另一方面,基礎(chǔ)知識(shí)決定一個(gè)人思考問題的深度和交流問題的角度。一個(gè)不懂計(jì)算機(jī)背景知識(shí)的程序員,看問題的方式經(jīng)常是錯(cuò)誤的,錯(cuò)誤的思考方式也就決定了他很難走到正確的道路上,比如我的一個(gè)外行朋友曾經(jīng)接手了一個(gè)用 C++ 實(shí)現(xiàn)的 GUI,他的第一個(gè)問題是“如何在 C++ 中把字符串加粗”,讀者大可不必感到荒謬,因?yàn)楹芏嗳怂伎紗栴}的方式也不見得高明,在高水平,有經(jīng)驗(yàn)的程序員看來,也許同樣是不可理喻的。大公司復(fù)雜的業(yè)務(wù)邏輯同樣也意味著很少有人會(huì)耐心的給你講解每一個(gè)名詞,比如哈希表,并發(fā),并行,編譯,鏈接等等名詞,如果你聽不懂或者理解不正確,往往意味著交流上會(huì)存在一些障礙。

因此我的建議是:數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng),計(jì)算機(jī)網(wǎng)絡(luò)中的基礎(chǔ)知識(shí)一定要扎實(shí),怎么扎實(shí)都不為過,因?yàn)樗鼪Q定了你看問題時(shí)候的高度,深度和思路。

(五)讓腳本取代 GUI

腳本語言非常重要,絕對(duì)是提升工作效率的神器,我強(qiáng)烈建議每個(gè)客戶端工程師都應(yīng)該了解一些 Shell 腳本并且掌握 Python,Ruby 和 JS 中至少一門語言。

理論上來說沒有什么是腳本語言做得到,Java 做不到的,但腳本語言最大的特點(diǎn)就是快,快到極點(diǎn)的那種快。對(duì)于一些極度簡單的小需求,比如統(tǒng)計(jì)一個(gè)文件中某一列數(shù)字的平均數(shù),我敢保證在我得出結(jié)果之前你肯定還來不及打開 Java 編輯器。

腳本語言的另一個(gè)特點(diǎn)是高度的自動(dòng)化,只要 Unix 和 Linux 系統(tǒng)一天不死,shell 腳本就會(huì)永遠(yuǎn)存活,你學(xué)習(xí)的知識(shí)就永遠(yuǎn)不會(huì)過期,比如 awk 和 sed 這樣的神器,年齡比我大得多,至今還非常實(shí)用,未來的 20 年也絲毫看不出淘汰的跡象。試問一下,有什么知識(shí)能比一個(gè)幾十年不會(huì)過期,而且每天都能用上的知識(shí)更值得學(xué)習(xí)呢?由于 Shell 是距離操作系統(tǒng)最近的腳本,了解了它以后,很多復(fù)雜的操作都可以被自動(dòng)化。比如想找到項(xiàng)目中無用的圖片,也就是一行命令的事。

考慮到腳本語言極高的開發(fā)效率,很多對(duì)性能不敏感的框架都會(huì)選擇用腳本語言來實(shí)現(xiàn),比如 Node,F(xiàn)lask,Rails,mitmproxy 等等。作為一個(gè)大前端工程師,不能總是依賴后端工程師,否則沒了后端就只能搞單機(jī)模式了。因此了解腳本語言還有iOS助于我們快速上手后端框架,這絕對(duì)是應(yīng)聘時(shí)的加分項(xiàng)。

當(dāng)然,很多人也會(huì)抱怨,我們是 iOS 工程師,平時(shí)的工作也接觸不到腳本語言,該如何學(xué)習(xí)并投入使用呢。我的建議有三個(gè):

1、整理自己的痛點(diǎn), 并嘗試著用過腳本去解決,這對(duì)學(xué)習(xí) Shell 有奇效

2、整理公司項(xiàng)目開發(fā)中的痛點(diǎn),嘗試著用腳本去解決,適合練習(xí) Python,Ruby 和 JS

3、拋棄 GUI

GUI 誕生的目的是為了更好的顯示信息,而不是成為技術(shù)殘疾者的拐杖。舉一個(gè)簡單的例子,我發(fā)現(xiàn)很多人都裝了很多編程效率方面的工具,比如 gitx,sourcetree,tower 之類的 git 工具,還有什么快速打開模擬器目錄,Derived Data 目錄的小工具,我覺得這實(shí)在是太愚蠢了。放著大好的學(xué)習(xí) Git 和 shell 的機(jī)會(huì)不要,把時(shí)間浪費(fèi)在了解一個(gè)軟件的 GUI 上,我覺得是完全不能接受的。尤其是對(duì)于 git 來說,我建議多問問自己,學(xué)會(huì)的是 git 還是 sourcetree 的按鈕,將來換一個(gè) GUI 工具,畢生功力還剩幾成?至于某些小工具,這種絕佳的練手機(jī)會(huì),怎么能拱手相讓給別的軟件呢,尤其是腳本可以自動(dòng)化,軟件就幾乎不可能了。

啰啰嗦嗦說了很多,其實(shí)總結(jié)下來沒幾點(diǎn):

1、學(xué)習(xí)一個(gè)技術(shù)之前不妨先思考一下它在整個(gè)互聯(lián)網(wǎng)體系中目前的位置,有什么樣的未來,會(huì)對(duì)個(gè)人價(jià)值有多大的提高

2、數(shù)據(jù)結(jié)構(gòu),操作系統(tǒng),編譯原理,計(jì)算機(jī)網(wǎng)絡(luò)這些基礎(chǔ)知識(shí)不能丟,它決定了你看問題時(shí)候的高度,深度和思路

3、未來需要特定技術(shù)領(lǐng)域里的專才,更需要全棧,歸根結(jié)底是需要最大化自己的價(jià)值。我個(gè)人的建議是掌握好腳本語言提高效率,打通前后端,這樣無論在外包,獨(dú)角獸創(chuàng)業(yè)公司還是大公司,都能獨(dú)當(dāng)一面

4、學(xué)習(xí)新技術(shù)時(shí)要避免好高騖遠(yuǎn)或者盲目迷信大廠,轉(zhuǎn)發(fā)或艾特印象筆記提高不了自己,要結(jié)合實(shí)際場景,最重要的是要能落地!

在這里小編附帶一些iOS開發(fā)的學(xué)習(xí)資料和面試題,至于其他資料視頻我就不一一截圖了,需要的可以加我新群領(lǐng)取 711413569

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI