iOS 高級工程師是怎麼進階的?

我從事 iOS 兩年了,感覺只會搭建 view,用第三方庫,還有些機械代碼?真的迷茫了。想進階,具體從什麼大點入手呢?


高票答案其實有點偏題,樓主問的是如何進階,並不是高階人士應該具備的哪些素質。

就像一個人問如何才能成功,如果你告訴他成功人士都是「永不放棄,艱苦樸素,吃苦耐勞,對事執行快准狠,對人溫良恭廉讓……」,他聽完懵逼一陣後估計會想打你……(開個玩笑…:D)

「那我照著高階人士的技能樹一條一條去學習,我不就也高階了么?」

憋鬧,高階人士說自己精通多線程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(Functional
Reactive Programming
,對應框架就是ReativeCocoa和RxSwift,沒錯,這並不是必須的。但我還是忍不住要安利一下。這是能夠最直接,最顯而易見的提供你工作效率的框架。

學習別人造的輪子 github上有很多優秀的開發者的源碼,其中很大一部分都有極高的學習價值。matteocrippa/awesome-swift 這裡是一個集合的,你可以根據自己感興趣的庫進行學習。(記住是學習……是研究怎麼實現……是思考換你來做的話,你會如何做……不是pod install然後跟著readme使用一下就完了……),國內也有很多大神的框架值得學習,比如ibireme的YYKit。

造輪子 學得差不多了,就該自己造了。當你第一次以框架/Api設計者而不是使用者的角度來思考問題,也能夠獲得很多的收穫。這一步能帶給你能力的提升是最明顯的,如果說1-4 ,都是在韜光養晦的積累階段。那造輪子,就是你在成為高階工程師之路的收穫階段。

@optional

貢獻你的知識,把你的心得,領悟的東西寫成博客。或者把你看過優秀的英文文章翻譯成中文,方便後來的國內開發者們快速掌握。這並不是單純的做好事,分享的過程,你能讓你有新的感悟,學到新的知識。利人利己。


說實話,兩年時間只會搭建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,UIViewController和UINavigationController的關係了吧?我嘞個草,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多的文檔不說,發下我的部分書單給你看看吧:

=====================================================================

更新時間:2016-01-20

統一回復下:

  1. 首先我不是大神。但是一堆呵呵著說臣妾做不到,這是有很多年工作經驗的人寫的,還什麼我語氣有問題,就是各種這樣冷嘲熱諷balabala的,我真是醉了。敢情我這心平氣和的寫個答案您還不樂意,還得要以低三下四一臉巴結相的語氣照顧各位爺的心情啊?麻煩你投個簡歷,去那些要求比較高的公司面個試好嗎?實在不行,你也可以看看人家那些招聘的需求啊,你不行有人行,傲嬌沒用。。
  2. 私信以及評論求書單的,還讓我打包發給你,別為難我好嘛?給也不是,不給也不是。我承認有些電子書是網上找的電子版的,可是也有好多電子書都是我花了大價錢買的。隨便舉個列子,比如matt大神的這本,$29買的:

    就算我批量打包發給你們,就這麼輕鬆得來了也沒什麼意義,你真的覺得你能一本本的看完?估計也就擱置那兒了,跟你買了書就扔一邊了一個道理。在下建議,你覺得你的知識點哪塊需要補充,查查有沒有相關的書籍或者文檔,去美亞或者豆瓣看看書的質量怎麼樣,然後再決定是買還是找盜版還是怎麼的都行。比你屯一大堆書強多了。。。

  3. 什麼英文不好的balabala,英文不是母語,誰都有一個從不好到好的階段。看書坐不住看不進去balabala,去健身房跑跑步,回來擼一發切入賢者模式再試試?
  4. 時間都是擠出來的,耐心也是一點點練出來的,我說熟悉網路,自己寫簡單的HTTP伺服器,說起來是輕鬆。可實際沒少吃苦頭啊,那大部頭的書自己看著都怕,可這還不是自己忙裡偷閒擠出來的時間,趁坐地鐵,趁餐館點飯,慢慢來,多給點耐心、壓力、動力,一定看的進去!通過實際的項目、看書、看文檔,能力肯定能不斷的提高。
  5. 還有, @aaaron7 這位兄台說高票答案有問題,他指的不是我這個答案,你們自己判斷^_^


謝邀,這題不敢妄言,畢竟在 BAT 裡面一些高級、資深啊什麼的,其實很水的,你懂的。

在我個人的概念裡面,高級 iOS 工程師的定義,其中 iOS 只佔了一半,這一半是熟悉 Objective-C、Swift、Cocoa、Xcode、App Store 等等,其實就是 語言 + 工具鏈 + 生態

另一半,是 高級工程師,高級工程師是什麼樣的已經有很多的討論了。


頂著高級頭銜,但感覺我也只能算一個中級吧。

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和技術);要麼就換家公司吧。


等你什麼時候基本可以寫出自己可控的代碼,不依賴調試時,就可以進階了。


在我看來無所謂ios高級工程師,只有軟體高級工程師。

我從08年第一代ios sdk開始開發,至今已做ios開發7年,越發感受到高級與初級的本質區別還在於計算機的基礎知識是否紮實,是否知其然且知其所以然。

舉個例子,你可能知道多線程怎麼調用,但當遇到一個線程同步的問題時,你會怎麼去解決和對待呢?高級工程師應該需要去深入多線程同步機制,理解有哪些鎖,每種鎖的適用場景是什麼,每種鎖的原理是什麼,挖的更深甚至可以去了解在硬體層級是如何處理多線程任務的。

從初級工程師逐步晉陞到高級工程師或者頂級工程師,關鍵看你對待問題的態度,如果你能將每個問題深入研究到計算機基礎層面,日積月累,成為高手指日可待。

ps:同意cyan同學的看法,bat的水貨高級工程師太多,切勿以頭銜論實力。


高級是多少級,技能樹點亮多少了?


針對樓主的情況,你很明顯還處在搬磚的階段,還不能算一個合格的iOS工程師。如果要進階,推薦你看以下兩本書。

1,圖靈程序設計叢書middot;Objective-C高級編程:iOS與OS X多線程和內存管理

2,Effective Objective-C 2.0:編寫高質量iOS與OS X代碼的52個有效方法

如果你把這兩本書看完基本上對objective-c這門語言已經到了登堂入室階段了,稱的上一個合格中級工程師,這兩本書唯一的遺憾是有幾個盲區沒有涉及到。

1,runloop,兩本書里都沒有講runloop,所以你得自己去研究runloop,建議你看先搞懂線程,再去研究runloop,最好是runloop的源碼

2,再就是ui的基本功了,不要說你懂ui,比如iOS 導航欄機制,傳遞鏈和相應鏈,等等這些都要去理解深入。

以上如果你都懂了,應該算一個高級工程師了。


我算不上什麼高級工程師,但我在BAT在二線互聯網公司創業公司都呆過,見過一些算得上『高級iOS工程師』的人,我就先談談他們的共性吧。這些共性不是成為『高級』的充分條件,但肯定是必要條件。如果這些都做不到,那也算不上高級。

1. 對計算機基礎知識的了解很全面。網路協議TCP,UDP概念要懂伐...Base64不是加密要知道伐...線程和進程區別要知道伐...諸如此類

2. 對iOS開發的基礎知識了解的很紮實。Runtime大概幾個概念,msg_send怎麼找方法的流程,大概能比較清晰講一遍伐...多線程有幾種寫法、各個場景下的不同用法知道伐...hittest和respond chain的流程能講清楚伐...

3. 良好的溝通能力、需求理解能力,乃至對未來需求的修改的判斷能力。這個能省下N多因為理解不對或者改需求引起的加班時間。這個在大公司很重要,不過很多時候程序員的溝通能力取決於PD和交互的能力。

4. 學習能力很強,看一個技術文檔,很快能抓到重點,看一個bug,一分鐘內能找到stackoverflow,然後掃一遍就知道怎麼改。其實有時候一個老手遇到一個很簡單的問題不知道或者出錯太正常了,但很少會因為一個這樣的問題卡住。

說句老實話,這幾點其實看上去要求都不高,沒有提到業界影響力,沒有提到懂演算法,沒有提到會很多黑科技。但符合這幾點的人才,我接觸下來,其實並沒有那麼多。說道底,因為行業不算光鮮,國內程序員群體的平均能力良莠不齊導致的。

為什麼很多大公司對學歷有要求,或者對在別的大公司工作過的人特別青睞。因為對他們來說,上面提到的1、3、4條,學歷好、待過大公司的人,會有更大的概率符合。

其實我沒有回答題主的問題,我說了『是什麼』,而沒有回答『怎麼做』,如果看到的人能有點啟發,那就可以了。


去掉iOS 這個問題還有點討論的價值

1.架構設計,優雅,擴展性強,避免過度設計

2.效率優化,切個圓角什麼的

3.測試工具,內存工具,抓包工具,使用分析

4.知道怎麼做,也要知道為什麼

5.演算法

個人認為高級就這麼走,包括伺服器等等


瘋狂的造輪子。


現在問題是有stackoverflow

很多大牛也是那找答案

勤奮的iOS小白幾個月+stackoverflow+github+有願意分享的老人帶領少走彎路

可以秒殺大部分ios架構師和大牛和高工

當然cocoa 框架很大 完全熟悉要2-3年 但是沒有陡峭的進階曲線

這個和c++ scala不同

時代不一樣了 不過見過很少用介面的架構師

吃驚

嘿嘿


我特么幹了三年只會面向github編程,越來越懶了


2年菜鳥來發一點感想。

首先我很菜,還不能算高級工程師。但是覺得自己有點感覺到一些進階的門道了。

為人處事第一條,考慮投入產出效益。花的時間超多,結果水平沒提高?

進階也是要考慮投資收益的,可能很多老司機給的建議都很對,但是投入沒有效果,我等浮躁凡人怎麼能忍。

我就說點自己的一些歪門邪道,說的不對的,希望大家批評指正。

1,要熟悉蘋果的API介面

一開始有不會的需求,就喜歡百度,google,stackoverflow。現在會嘗試到某個類的.h文件中先去看看,系統框架給我們提供了哪些方法。比如你想用UITextField做某個效果,那你就可以在UITextField.h中看看,然後還可以到UITextField的父類UIControl中看看。平時有空,也可以探索一下頭文件,特別是UIKit之類的常用框架,磨刀不誤砍柴工。

2,熟悉編程中遇到的概念,術語和基本的數據結構。

比如你們公司要做視頻直播了,先看看視頻直播環節涉及的概念就會有幫助。推流端 採集,編碼,傳輸等。然後經常在業務中遇到棧?那就看看百科咯。深入的學習呢,就涉及到投入和產出的問題了,需要自己衡量。簡單地了解一下概念,有個直觀的認識,會對編程很有幫助。遇到高難度的業務場景,雖然還是不一定能聽懂,但是我還能知道別人在說什麼。

3,可以看技術類的文章和蘋果的各種文檔。

站在巨人的肩膀上,當然可以更快的成長。cocoachina上面的文章其實就挺好的,找個專題,多線程,runloop,動畫之類的,很快就可以上手用這些功能了。不建議一開始就讀蘋果的文章,投入產出一般。

等你對相關的內容都比較熟悉了以後,讀讀蘋果的文檔也許是個不錯的選擇。畢竟iOS開發是一套閉源的系統,蘋果官方出品當然正規。一開始讀蘋果的文章可能有讀完以後不知所云的感覺。可能過幾天再讀一遍又會好一點。蘋果有一套入門的指南,打算按照那個順序進行研讀。

4,看專業書籍。

專業書籍和博客相比,優勢在於比較系統化。所以我一般是選自己平時接觸少的章節細細瀏覽。用的很熟的地方就略過了。

5,看github開源項目

開源項目有2方面吧,一種是會用。比如github star前100的OC項目,我會想辦法用一用,玩一玩。這樣就能保證自己能跟得上業內熱點技術。(目前還是設想,沒有完成)

還有一種是自己深入某個庫,了解其實現原理。這個可以在平時用的多的庫裡面選,比如SDWebImageView,這種第三方庫的實現會對初級開發者有很大的幫助,runloop沒見過嗎?NSOperation沒玩過嗎?磁碟緩存沒玩過?都能讓你長知識。

6,如果你是Objective C的開發者,你應該懂一些C和C++的語法。

玩過幾次

可以嘗試用clang命令行來將OC編譯成 C++的文件,比如main.m 裡面放個block,編譯好了以後,你就知道block在C++的代碼中是怎麼表示的,能有一個全新的思考問題的角度。

7,逆向業內高水平的app頭文件。

玩過幾次

class dump可以看到部分app的頭文件信息。既然你這麼有熱情,那就試試逆向業內的標杆應用吧(高能預警,可能會遇到上萬的.h文件)。國外的facebook,國內的支付寶,qq,微信。可以看看別人的頭文件怎麼設計的,雖然沒有看開源那麼爽,但是仍然可以管中窺豹,了解這些app的架構。

8,蘋果提供的開源代碼。

這個水平太差,沒有仔細閱讀過,也是考慮投入產出不成比例,暫時沒有涉獵。

路漫漫其修遠兮,吾將上下而求索。


The last programming book you"ll ever need


我一直認為最出色的移動端程序員(其實所有的程序員)應該是個全棧程序員,因為我認識的好多優秀的ios開發工程師都是有一定的服務端開發背景,搭的了服務端架構,寫的了前端js,和產品撕的了逼,做設計有自己的理由,寫的了ppt,做的了演講,一個優秀的開發工程師,成為一個全棧,我在路上


去看騰訊公開課,八點鐘學院,免費iOS進階課程。https://ke.qq.com/course/171725#tuin=79e49f2e


如果一些計算機的基礎知識欠缺的話還是要補一下,老三樣:數據結構,操作系統,編譯原理。

同時,嘗試寫一些不同類型的代碼,不同平台,不同語言的程序。然後回頭看看有哪些相同和不同的地方,多總結。

以進入一家比較心儀的公司為目標,不斷強化自己,適當自我催眠,保持信心和學習興趣。


了解蘋果的新技術,絕大多數蘋果的新技術都是為了提高開發效率而服務的(雖然有的也有坑,比如@IBInspectable這玩意兒,但畢竟是少數。),總體絕對是性價比很高的學習。


多看優秀的源碼,多思考。

往上學架構,學會抽象問題,往下學底層實現,學奇技淫巧。


推薦閱讀:

一個 iOS Universal 的 App 代碼結構要怎麼樣寫才算是一個好的代碼?
什麼是 Cocoa,和 Objective-C 有什麼關係?開發 iOS 應用這兩者都要學習嗎?
有開發ios的公司用storyboard寫程序的嗎?
開發者如何減少移動廣告平台價格或分賬比例調整等波動對自身收入帶來的影響?開發者自己應該做好什麼?希望廣告平台做好什麼?
寫十年程序是什麼感覺?

TAG:iOS應用 | iOS開發 | iOS工程師 | 移動開發 |