一位iOS開發者的進階之旅

背景

這篇文章來源於v2ex上的一個帖子:"iOS開發有什麼國人寫的比較好的書籍推薦?"(原文連接)。這裏彙總的基本都是lujie2012的回答,另外我還附帶了一些他與別人的討論內容。雖然帖子題目是推薦iOS書籍,但設計內容已經超出了這個題目,在我看來其中還迸發出不少有意思的觀點,因此就想把內容整理出來。在通過其本人贊成以後,有了以下內容,但願對你們有所幫助。前端

正文

推薦書籍

本人以前是從 Object-C 開始入門 iOS,所有自我學習寫項目找工做混飯吃。由於以前犯過大部分 iOS 開發者犯過的錯,沒有深刻學習知識,沒有得到長進。我決心從新在 iOS 方向深刻認真的投入一次,看本身能夠扎入的有多深。nginx

我開始沒有關注 Swift,如今 Swift 成熟了,因此決定從頭開始學習 iOS 的一切東西。後面 19 年開啓 Swift,二次學習 iOS 開發,也感受到突破了本身頭頂那塊天花板。我10個月看了10多本本身買的書,還爲業務補充了好多知識,有堅持不下去的時候,可是就想把項目上線。最後克服了困難,回過頭有收穫和總結,我如今愛上了看技術書籍,鑽的越細愈加現有趣,也想去看算法了。相似寫論文同樣,沒有祕密,直接分析到底。目前在模塊化接入 Flutter,React Native,兩端開發速度不同,某些功能由 H5 作,咱們就很閒了。如今的目標差很少就是把 Flutter 玩轉,基本是二次從頭學習 iOS 花了 1 年時間告一段落。程序員

期間啃的書,有些是objccn裏喵神的書,這些書對iOS開發幫助仍是挺大的,其他都是些比較經典的技術書。面試

這些書我都看過一遍。(如下是筆者對書籍彙總成的一個表格)算法

分類 書名
Objective-C Objective-C程序設計
Objective-C高級編程
Effective Objective-C 2.0
Swift Swift權威指南
Swifter 100個Swift2 開發必備Tip
Swift進階
Swift經常使用算法
函數式Swift
iOS iOS數據庫應用高級編程
iOS動畫核心技術與案例實戰
iOS Auto Layout 開發祕籍
高性能iOS應用開發
iOS測試指南
iOS應用逆向工程
LLVM COOKBOOK 中文版
AV Foundation開發祕籍
Core Data 應用開發實踐指南
Core Data
其餘計算機書籍 SQLITE權威指南
圖解數據結構與算法
數據結構與算法經典問題解析(Java語言描述)
數據結構教程
Java 9編程參考官方大全
Java併發編程實戰
深刻理解Java虛擬機
深刻理解Nginx
Tomcat內核設計剖析
C Primer Plus 中文版
音視頻開發進階指南

另外須要補充的內容還有,tomcat 源碼、nginx 源碼、關於 HTTP 協議後端相關的東西。不少東西,寫不成書,由於自己沒有多少內容,有些東西只有國外有,可是 400 塊,沒有翻譯版本。例如關於佈局,從frame-》 constriants-》 archor-》到 StackView 其實蘋果也是在不斷的提供解決方案,目前最好的佈局方案就是 stackview + anchor + constraint,可是沒有這麼一本介紹這些內容的書,我也是翻邊了官方文檔,在各自項目中看到蛛絲馬跡去思考對比的。spring

其餘學習途徑

老話長談,最好的資料是蘋果官方開發者文檔,官方的 WWDC Session。爲了更深刻理解蘋果產品,我把歷年的 WWDC 都看了一遍,從 2007 年 iOS6到2017年發佈iphoneX,每一年差很少 100 個介紹最新技術和解決方案的視頻,並且內容含金量還很是高。哈哈,學到了不少蘋果產品使用高級用法,體驗了好多產品介紹。sql

iOS 開發者必定要關注 boxue 網站,能夠的話買個終身會員,下載博主的 app,看看他的項目架構,裏面的視頻學起來。我 boxue 完成了 156 個 iOS 的視頻,終身會員。boxue 的視頻看一遍懂一點點,過段時間在看,又有一點點理解,例如 RxSwift,Protocol,Sequence 這些。另外能夠結合 objccn 裏喵神的那三本書,我是買了一塊兒看的,它會使你對 swift 的寫法和運用更高階,讓你的思想更接近 apple 官方或者大牛。例如序列化,持久化,函數編程,這些流行的概念能夠帶入項目中。數據庫

真心經驗分享,中文書籍的東西只能看到 30%的技術,英文書籍的東西能夠看到 50%,還有 50%在官方英文文檔,各位必定要學好英語,在官方找一手資料和解決方案。這樣就慢慢能夠成爲 Contributor,爲社區貢獻代碼和解決方案,成爲開拓者了。否則永遠只是旁觀者,玩技術,就但願把它玩到極致對吧,比如玩音樂,玩音樂的的境界能夠看 Vista 2002 年演唱會。編程

另外,以上學習最難的是什麼,是英語水平!!!! 我如今天天學習英語,英語水平上來了,感受發動機動力槓槓的。二手知識基本過期,想要成爲一流,那麼英語水平就得要一流,差很少雅思 7 分這個水平。寫代碼看資料,以爲不是一個等級哦。小程序

感謝公司提供的英語學習網站,https://english-bell.com.tw/default.aspx 。我大概充了 1 萬 8,堅持天天 25 分鐘的一節課學習 DME,如今學習了 300 天,學習英語推薦:購買朗文當代+DLL ebook + English bell,使用 SKype 上課,菲律賓老師 24 小時能夠學習。

更多的討論

若是學 iOS 都沒有用過 CoreData,或者 Sqlite 進行持久化,那麼幾乎不可能成爲高階程序員。CoreData 當然難用,難學,可是我我的認爲必須耐心學完,必須每一個項目都使用,裏面的設計思想和理論都頗有用,每一年的 WWDC 都有 session 講解這一塊。

iOS 自己知識的書籍不是不少,更多的是須要你去查閱官方文檔去理解學習。有不少內容是涉及視圖繪製技術,音頻,網絡這些,他們自己是最基礎的東西,可是蘋果沒有給你知識輔導,不自學這些,只會使用蘋果API,永遠都只懂皮毛。以爲 iOS 端沒有東西,其實東西多的很,例如 socket 編程,什麼語言均可以實現,什麼平臺都有,可是 iOS 沒有告訴你這個很重要,你就不學,不深刻,調用一下 API 就行了。其實這纔是真正的技術,再深挖就是 TCP/IP 協議,藍牙協議,學編程要不要學這個呢?學 iOS 要不要學這些呢,確定的,作程序員,不學這些就永遠停留在初中級水平,35歲等着被淘汰。

當你學了這些底層知識,例如7層網絡協議,就會明白什麼技術和語言都是起始於二進制。字節編碼,變成 Unicode,變成語言。那麼語言寫好的代碼,變成什麼呢?寫好的代碼變成彙編語言、command、再變成二進制,用戶安裝二進制,二進制再在運行環境變成 code,再執行邏輯。不懂編譯器原理,怎麼優化代碼,怎麼去作安全加固,反 hook ?

如此思考,HTTP 到數據的展現是最簡單的編程工做。最近我在想一切的數據通信,例如家裏的電視遙控器,怎麼作數據交互,轉換,傳播。光波,紅外線,wifi,5G,想象最底層的實現和全路徑思考纔有意思。因此,計算本科教育雖然水,可是如今想一想那時候用的濾波器和調制解調器,上模電不知道幹什麼,如今工做後,慢慢都明白了,這就是本科專業教育的本質和做用。系統的教育才是有意義的,爲何學高數,如今纔多少明白了些。

對了,你對加密瞭解清楚嗎? HTPPS 怎麼實現的知道嗎,看過源碼實現嗎?程序員對加密都不清楚,那真的不算高階程序員。openSSL 庫,均可以讓你玩好久。iOS 也好,Android 也好,只是各自技術封裝的一個平臺,用於解決必定的問題。當你看透本質瞭解一個平臺真正的東西,那麼你也將知道技術的發展都是有着類似的規律的。

有個題外話,iOS 有出路麼?你把他當成 HTTP + 頁面來玩天花板確實很低,但你以iOS爲出發點,研究整個系統體系,那天花板無限高。將來 20 年,領先技術和先進應用基本都會是移動領域帶領的變革。

不要以爲iOS開發上限很低,iOS 崗位也很細的,你能夠玩日誌系統,埋點系統,推送系統,crash 系統,socket 聊天系統,實時在線系統,視頻系統,相機系統,地理位置系統,三維繫統,AR 系統,聲音系統,安全系統。玩的東西多了呢!沒有飯吃?沒有前途?大部分人是崗位,是項目驅動,我也是,沒有事情沒有遇到難題就不會進步。但仍是要自我驅動,不斷往上拔,才能離那個最高處的天花板更近一些。

比如玩音樂,寫歌做曲,你能爲所欲爲組合,基本是就是高級人才了。寫代碼同樣,要玩它,玩技術,否則白費了那些年的教育。對於業務和技術,等你技術積累到必定程度,我我的傾向於先作技術專家靠譜一點。誰是榜樣呢? JSPatch 的做者就是榜樣,被挖到螞蟻 P8 !時間對每一個人都是公平的,記着不要重複勞動,要迭代你的技術,不斷思考。看最底層的書,思考最底層的原理,你就不會迷茫。

問答環節

問:CoreData 有什麼特別好的場景使用嗎,我作了五年了,都是用的 sqlite 。

答:CoreData 最大的好處是他們的設計思想和結構,能夠買來 《CoreData 應用開發與實踐》+ 《Core Data》 看看。我也是看了這兩本才明白 CoreData 真正的含義,但它也有個很大的缺陷:沒有加密!!!!! 大部分項目採用 Sqlite 是爲了加密!本質 CoreData 底層也是 Sqlite,它就是對Sqlite的一層封裝。你想一想手機相冊 1 萬多張照片,他們的存儲和檢索,不知相冊,官方不少APP應該都用了 CoreData 來實現。會玩 CoreData,確定會玩 Sqlite 。最好在項目裏使用,用着用着就熟練了。Sqlite 作版本管理和遷移更方便,直接 SQL 操做數據庫。個人建議是最好二者都學一下,都用起來。

問:我也一直在學習前端跟 iOS,爲之後作獨立開發者進行技術儲備。但我歷來不去研究背後深刻的技術原理,CSAPP(Computer Systems A Programmer's Perspective 中譯:深刻理解計算機系統) 包括操做系統相關的書我至少讀了 3 遍,但這些跟 IOS 開發基本上半毛錢關係都沒有,由於 APP 跟操做系統原理至少離了十萬八千里的距離,另外就是這些底層知識根本用不上,大部分獨立開發都是業務驅動的,有錢纔有技術研究的需求,除了音頻、視頻等特殊算法場景,大部分技術方面的需求都是業務驅動的 UI 交互跟業務計算。

答:不爭辯,我以前想說明通常程序員和高階程序員解決問題思路問題。學習 7 層協議,不是造輪子,是知道水的源頭。平臺語言個有喜好,蘿蔔白菜各有所愛,興趣是最好的老師,好奇心是最好的動力。小程序,Weex,React 不是不會寫,API 文檔看一下,組件模塊用一用,市面上什麼樣的 APP 搞不定?可是性能優化,高級特性,沒有足夠功力你能搞定?前端目前大量時間涉及 UI 開發,後端須要算法,若是不本身去補充知識,那麼所謂大前端天花板固然低。阿里前端高 P 多仍是後端高 P多,固然是後端高 P 多啊。But,無論哪一個方向,最重要是成爲專家。成爲專家只看到本身項目範圍內的知識確定不夠,前端不能看後端知識嗎?我把 tomcat,ngnix,spring 源碼都看過,固然也忘記了,可是我就是想知道數據通道怎麼創建,TCP 怎麼維護。google 牛皮就是發現目前協議不行,本身改協議、加密算法、HTTP2 通訊、消息協議、TCP 協議,它勇於創新和實踐。目前的我相對業務和賺錢,我更關注技術,只會應用技術是大部分人,but 要成爲專家只有極少數人才能夠作到,由於那要學好多東西哦。

再舉個例子吧,Rx 這個東西,Java 有 RxJava, JS 有 Rxjs,iOS 有 RxSwift。如今各個平臺都是把對方好的設計和輪子拿過來,編程思想和設計思想是同樣的。可是由於編程語言和平臺業務特性,沒有機會接觸更好的東西。那麼就須要突破官方提供的限制,用編程思想來設計和架構改造本身的項目。若是隻安於會基本使用語言,不精通語言,瞭解背後的邏輯,那麼永遠是入不了程序員門的。

移動互聯網熱的時候,培訓班培訓一下就能夠幹活,拿高薪。但高薪不該該是你作程序員的惟一緣由,互聯網發展的本質是技術結合業務,最後帶來經濟繁榮,技術永遠是第一驅動力。而程序員就正是創造技術,運用技術,推進互聯網繁榮最關鍵的一環,做爲這個時代的弄潮咱們應該很光榮纔對。

我我的計劃是學習英語+開發,在成爲高級開發的同時,不斷提升英語水平好,開闊本身的視野。東南亞,海外市場不是沒有機會。固然,在目前巨頭林立的環境下,你本身單幹,那確定一個浪花就沒了。

問:如今 APP 成本太高,中小公司基本都不重視這一塊了,並且目前一樣三年經驗的後端、前端、移動端,iOS 可能屬於比較沒有地位的了; 看你說的只會寫應用層就不行了?通常公司原本就是面向業務編程,能解決業務問題,移動端通常公司哪管你那麼多技術問題;還有一個更嚴重的問題,就是通常去面試 iOS 的公司,面試造輪船的風氣實在過重了,大部分進去不就是個 UI 仔嘛,認清現實吧,本人面過其餘技術,比 iOS好的多。

答:每一個公司開發 APP 都想造航母,如今的確這樣。就是大部分進去以後變成 UI 仔,因此我才建議若是從事 iOS 或者移動端開發,必定要自我學習,自我突破限制。我以前和一位同事一塊兒作 iOS 端,後面他轉了 JAVA 還升職了。But我始終認爲咱們項目的技術解決方案和技術不夠強,不是沒有業務,業務好的很,可是就是感受移動端開發節奏和技術體系太碎片,每一個人一個模塊,最後重複勞動,效率還不高。對於這樣的現實,確定須要提高自我去解決,而不是等待機會。也正所以,產生了 Weex,React Native,Flutter 這樣快速解決兩端,熱部署的技術,解放 UI 仔。

不討論了, 看 Flutter 文檔了。iOS 有沒有人要,確定要,前提你真正的熱愛寫代碼,能夠分析問題,解決問題,瞭解編程本質,精通OC、Swift語言,熟練前先後後一個 APP 的所有 API 和細節實現。比如相機,你只會 Github 上找一個高 Star 的庫用用是不行的,那你永遠不能體會蘋果原始 API 設計思路,作不到爲所欲爲的使用。但願你們有時間多琢磨,想作一個優秀的程序員,放大了說想成爲一個優秀的人,都是須要不斷學習,不斷成長的,你們加油吧!

相關文章
相關標籤/搜索