1. 程式人生 > >iOS初級開發工程師進階之路

iOS初級開發工程師進階之路

我覺得是時候,也有必要,承認一下自己的錯,壓制一下趾高氣揚的自己,在知乎上看到一個帖子,有點被打擊到了.帖子中涉及到的問題,我給貼出來,各位小夥伴們一起開探討一下,問題的答案,有知道的請在後面留言

首先帖子的地址:https://www.zhihu.com/question/39597307/answer/82285626

我從事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的工作原理,各種安全機制。