背景
這篇文章來源於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 設計思路,作不到爲所欲爲的使用。但願你們有時間多琢磨,想作一個優秀的程序員,放大了說想成爲一個優秀的人,都是須要不斷學習,不斷成長的,你們加油吧!