轉載自:https://www.zhihu.com/question/39597307/answer/82285626
iOS進階工程師是怎麼進階的?
我從事iOS 兩年了,感覺隻會搭建view,用第三方庫,還有些機械代碼?真的迷茫了。求大神賜教。想進階,具體從什麼大點入手呢?跪謝!!
說實話,兩年時間隻會搭建view、使用第三方類庫,真的不能稱為一個合格的iOS開發工程師!
1. 先說OC部分
- 既然做了兩年了,對Objective-C足夠了解嗎?OC是如何基于C來進行的封裝?解釋一下這兩行代碼啥意思?
typedef __attribute__((NSObject)) CGGradientRef GradientObject; @property (nonatomic, strong) GradientObject storedGradient;
- protocol、category這樣的東西應該要手到擒來才是? 多線程部分的知識點掌握是否紮實?runtime這種黑魔法研究過沒?代碼足夠優雅、後續維護容易嗎?各種設計模式也得會吧?
2. 再說UI部分
- 既然寫了兩年的view,那麼能快速仿造市面上這些主流App的UI嗎?使用Reveal分析過微信、豆瓣、網易新聞、知乎、QQ、蘇甯、淘寶、支付寶的UI嗎?使用Charles去抓過他們的接口嗎?
- UI研究稍微深一點,比如側滑菜單這種要怎麼實作?如果你要做實作應該要了解UIView和UIViewController的關系了吧?我嘞個草,UIView一堆方法,UIViewController一堆方法,到底都是幹嘛的啊?你難道不好奇?這塊知識點一直是你的盲區,你能忍?我忍不了!
- UIView再往深了看,下面還有CALayer,你研究過沒?為什麼修改CALayer的某些property預設會有個動畫産生呢?
- 那麼Animation、UIKit Dynamics、Drawing、Graphics這些随便拎出來一個,夠你研究一陣了吧?你看看比如網易新聞,在新聞詳情頁面上拉,回到新聞清單頁面的這個動畫做的出來嗎?你看看QQ在電話通信頁面,點選右下角縮放圖示,縮放成一個頭像的這種動畫,你會做不?
3. 還有這些大的功能點
- 既然用了兩年第三方類庫,那麼比如圖檔緩存這類,看過源碼實作沒?如果自己來實作的話,有哪些Caching Algorithms?該怎麼取舍?各種常用的第三方類庫你研究過原理沒?
- 你的App在和伺服器交流資料的過程中安全性怎麼樣?你是不是要研究一下加解密?HTTP了解的夠清楚嗎?想沒想過自己來寫接口?或者更甚至一些自己來寫個簡易的HTTP伺服器?接口部分甚至用CGI來實作也可以啊!
- 要寫伺服器,那應該要了解一下網絡部分吧?TCP/IP 協定得熟悉吧?然後Wireshark各種抓包得會吧?
- 網絡這塊順帶過來之後,即時聊天類的App采用的什麼技術?選 xmpp 還是 mqtt 還是自己寫?正好可以順勢了解一下吧!
- iOS SDK裡面的各種API你掌握到了什麼程度?這些功能子產品排除地圖、通訊錄這種,說些進階的比如CloudKit、Extensions、TextKit、AirDrop、PassKit?覺得這些子產品在自家公司的項目中壓根沒用過?可是看看你手邊的App!
4. 其它專業化的方向
- 視音頻處理做過嗎?此類諸如豆瓣FM、蝦米音樂、喜馬拉雅、QPlayer這類的App你去研究過他們嗎?還有VoIP這類的,我實習的時候做過這種╮(╯_╰)╭
- 遊戲開發方向有沒有興趣?自己有沒有去研究過呢?(反正這個我是真沒有╮(╯_╰)╭)
5. 項目安全優化等
- 項目中寫單元測試嗎?UI Automation 自動化測試做的怎麼樣?持續內建平台諸如Jenkins等會用嗎?
- App的各種性能優化、Crash的統計分析等等你做了沒?
- App本地資料儲存夠安全嗎?你對逆向了解多少?敏感部分是否做了代碼混淆?
6. 知識體系要持續更新
- 官方的文檔、國外的相關書籍采用的語言都是Swift,難道你不準備學學?除了native的,現在的HTML5也很火啊,難道不準備學?
- 英文練習的怎麼樣了?官方所有的開發者文檔以及曆年的WWDC視訊看完了?這麼多書,這麼多大牛的部落格,你難道從中一無所獲?
官方1k多的文檔不說,發下我的部分書單給你看看吧:

頂着進階頭銜,但感覺我也隻能算一個中級吧。
1. 會熟練使用Profiler來調試應用性能。比如其中有一個很好的模闆叫Time Profiler,會告訴你應用當中哪行代碼花了最長時間,當你界面卡頓的時候,用這個可以很快找到優化點。
2. 寫測試,寫測試不僅僅可以幫助你找BUG,更重要的時會讓你去思考如何更好地架構你的應用,其實很多好的工程師,代碼架構能力都是很不錯的。同時也會用OS X Server和XCode配置 Continuous Integration。
3. 可以輕松編寫多線程代碼,熟悉NSOperation,GCD等
4. 熟知一些常用的系統類庫的原理和Best Practics,比如Core Data,這個玩意兒要玩得好,也是很花時間的。
5. iOS應用,UI占很重要的一部分,可能大部分時候你隻需要使用預設的UI元件就行,但是有些時候,你必須要自己去實作一些UI元件和動畫,這個時候Core Animation啊,UIDynamics啊都是很值得去學習的點。
我一般的路徑是,當要解決一個問題或實作一個功能的時候,我盡量自己去實作,但當自己寫的東西無法達到預期的時候(性能太差,實作不了或代碼邏輯過于複雜)我才會去找第三方庫。
還有就是,如果你做了兩年都覺得自己沒啥大進步的話,那問題可能是你手頭的項目并沒有什麼高的要求,沒有性能問題要你解決,公司也對很多細節問題無所謂,那作為有要求的工程師,你要麼自己有項目可以幫助自己提高(比如我總是會自己寫應用來學習一些新API和技術);要麼就換家公司吧。
1. 對計算機基礎知識的了解很全面。網絡協定TCP,UDP概念要懂伐...Base64不是加密要知道伐...線程和程序差別要知道伐...諸如此類
2. 對iOS開發的基礎知識了解的很紮實。Runtime大概幾個概念,msg_send怎麼找方法的流程,大概能比較清晰講一遍伐...多線程有幾種寫法、各個場景下的不同用法知道伐...hittest和respond chain的流程能講清楚伐...
3. 良好的溝通能力、需求了解能力,乃至對未來需求的修改的判斷能力。這個能省下N多因為了解不對或者改需求引起的加班時間。這個在大公司很重要,不過很多時候程式員的溝通能力取決于PD和互動的能力。
4. 學習能力很強,看一個技術文檔,很快能抓到重點,看一個bug,一分鐘内能找到stackoverflow,然後掃一遍就知道怎麼改。其實有時候一個老手遇到一個很簡單的問題不知道或者出錯太正常了,但很少會因為一個這樣的問題卡住。
憋鬧,高階人士說自己精通多線程GCD程式設計,你跟着去研究了一番,熟練掌握了dispatch_async的用法,覺得多線程也不過如此嘛……但之後你會發現,你除了知道了幾個新api,其實技能并沒有得到實際的提升,你還是不知道為什麼有的代碼在main_queue裡執行以及在worker queue裡執行會有不同的結果……
事實就是,很多問題你沒有親自遇到并解決,是沒辦法真正掌握的。
扯遠了,說回如何進階的問題。從操作性的層面,我覺得主要可以有以下幾個方向:
了解蘋果的新技術,絕大多數蘋果的新技術都是為了提高開發效率而服務的(雖然有的也有坑,比如@IBInspectable這玩意兒,但畢竟是少數。),總體絕對是成本效益很高的學習。
“那文檔,好長啊,看不完怎麼辦T_T”
請移步app store,搜尋WWDC。裡面有曆年WWDC技術會議的内容,近兩年的還配有字幕 以及demo project,學起來趣味性十足,比看Ray wenderlich的教程還簡單……
修煉基本功,http://oj.leetcode.com , 現在也支援Swift了。總體難度适中,不像ACM那麼刁鑽。非常适合當做了解語言特性以及鍛煉自己基本編碼能力的地方。 雖然算法沒有用……但能寫出算法的能力,很有用。這個訓練能夠潛移默化的提高你在平時寫代碼的速度。
了解FRP(FunctionalReactive Programming),對應架構就是ReativeCocoa和RxSwift,沒錯,這并不是必須的。但我還是忍不住要安利一下。這是能夠最直接,最顯而易見的提供你工作效率的架構。
學習别人造的輪子, github上有很多優秀的開發者的源碼,其中很大一部分都有極高的學習價值。matteocrippa/awesome-swift 這裡是一個集合的,你可以根據自己感興趣的庫進行學習。(記住是學習……是研究怎麼實作……是思考換你來做的話,你會如何做……不是pod install然後跟着readme使用一下就完了……),國内也有很多大神的架構值得學習,比如ibireme的YYKit。
造輪子。 學得差不多了,就該自己造了。當你第一次以架構/Api設計者而不是使用者的角度來思考問題,也能夠獲得很多的收獲。這一步能帶給你能力的提升是最明顯的,如果說1-4 ,都是在韬光養晦的積累階段。那造輪子,就是你在成為高階工程師之路的收獲階段。
@optional
貢獻你的知識,把你的心得,領悟的東西寫成部落格。或者把你看過優秀的英文文章翻譯成中文,友善後來的國内開發者們快速掌握。這并不是單純的做好事,分享的過程,你能讓你有新的感悟,學到新的知識。利人利己。
在我個人的概念裡面, 進階 iOS 工程師的定義,其中 iOS 隻占了一半,這一半是熟悉 Objective-C、Swift、Cocoa、Xcode、App Store 等等,其實就是 語言 + 工具鍊 + 生态
另一半,是 進階工程師,進階工程師是什麼樣的已經有很多的讨論了。
我算不上什麼進階工程師,但我在BAT在二線網際網路公司創業公司都呆過,見過一些算得上『進階iOS工程師』的人,我就先談談他們的共性吧。這些共性不是成為『進階』的充分條件,但肯定是必要條件。如果這些都做不到,那也算不上進階。
1. 對計算機基礎知識的了解很全面。網絡協定TCP,UDP概念要懂伐...Base64不是加密要知道伐...線程和程序差別要知道伐...諸如此類
2. 對iOS開發的基礎知識了解的很紮實。Runtime大概幾個概念,msg_send怎麼找方法的流程,大概能比較清晰講一遍伐...多線程有幾種寫法、各個場景下的不同用法知道伐...hittest和respond chain的流程能講清楚伐...
3. 良好的溝通能力、需求了解能力,乃至對未來需求的修改的判斷能力。這個能省下N多因為了解不對或者改需求引起的加班時間。這個在大公司很重要,不過很多時候程式員的溝通能力取決于PD和互動的能力。
4. 學習能力很強,看一個技術文檔,很快能抓到重點,看一個bug,一分鐘内能找到stackoverflow,然後掃一遍就知道怎麼改。其實有時候一個老手遇到一個很簡單的問題不知道或者出錯太正常了,但很少會因為一個這樣的問題卡住。
說句老實話,這幾點其實看上去要求都不高,沒有提到業界影響力,沒有提到懂算法,沒有提到會很多黑科技。但符合這幾點的人才,我接觸下來,其實并沒有那麼多。說道底,因為行業不算光鮮,國内程式員群體的平均能力良莠不齊導緻的。
為什麼很多大公司對學曆有要求,或者對在别的大公司工作過的人特别青睐。因為對他們來說,上面提到的1、3、4條,學曆好、待過大公司的人,會有更大的機率符合。
其實我沒有回答題主的問題,我說了『是什麼』,而沒有回答『怎麼做』,如果看到的人能有點啟發,那就可以了。
我一直認為最出色的移動端程式員(其實所有的程式員)應該是個全棧程式員,因為我認識的好多優秀的ios開發工程師都是有一定的服務端開發背景, 搭的了服務端架構,寫的了前端js,和産品撕的了逼,做設計有自己的理由,寫的了ppt,做的了演講,一個優秀的開發工程師,成為一個全棧,我在路上
瘋狂的造輪子。
基本來看,就是你對這個東西沒什麼興趣,2年時間,其實能玩出挺多花的了。我一個月大概才摸1-2天,也有2年多了,都研究出了如何讓矢量設計師以最小的工作量輸出全部界面元素,并且生成觸摸的代碼,剩下做好動畫和邏輯就好了。
嘗試用逆向工程分析APP,了解你寫的oc代碼最後都是怎樣程式設計彙編代碼的。
深入了解iOS作業系統,了解iOS的工作原理,各種安全機制。