窗外雨夾着雪,2018 的冬天彷佛格外寒冷。前端
國內經濟下行,資金鍊斷裂、人員優化、凍結 HC 等消息不絕於耳,2018 的冬天被一層陰霾籠罩,互聯網從業人員一度人心惶惶。大潮退去,才知道誰在裸泳,這是說企業,也是說我的。git
毫無疑問的是,互聯網從業人員的競爭更加激烈了,做爲一名普通的開發者,在沒有更好的機遇時,首先應該想的是如何讓本身值錢,而不是如何掙錢。程序員
2018 對於我來講是很重要的一年,有過迷茫,有過糾結,有過自我懷疑,有過欣喜若狂。本文是我對本身 2018 年的技術進階總結,也是一個分享,不侷限於技術棧。github
2018 年初的時候,我興致勃勃的安裝了 Android Studio、WebStorm,還買了兩本書,想着把 Android、ReactNative、web前端都擼一遍,成爲一個大前端工程師。學習新東西確實會帶來不少成就感,而且以爲挺有意思,後來和一位技術老鐵交流事後,趕忙制止了本身的學習計劃。web
就像此刻,我已經記不得那些各具特點的 API。算法
這些都是應用層的東西,基本上靠記憶和實踐就能入門,經過一兩個項目就能熟悉,然而要達到精通卻很難作到。一是由於人的精力有限,二是由於精通所須要的東西並非這些應用層面的知識所能支持的。編程
因此,若是在一我的在編碼生涯的開始就選擇作全棧,那麼很可能成爲「全能廢材」,知其然而不知其因此然的程序員叫作「碼農」可能更爲貼切。不多有公司會須要你會寫各個技術棧的代碼,博而不精的程序員只適合一個地方——外包公司。後端
那麼,全棧真的沒有意義麼?設計模式
其實是有的,當一個工程師專業技能熟練,基礎技術合格,思惟能力達到必定高度事後,爲了尋求技術天花板的突破,頗有可能會去涉獵其餘技術領域。而這個涉獵並非爲了學那些表面的 API,而是去了解各個技術棧的區別和聯繫,注重的是思惟層面的東西,從而以更廣闊的角度來理解技術。瀏覽器
當我深入的明白這些的時候,我決定以一種更有效的學習手段來從根本上提高本身,包括基礎技術和思惟能力。
我花了些時間來梳理總結專業基礎知識,好比 iOS 的 Runtime 基礎、RunLoop、內存管理、Block 原理、KVC 等。實際上這些東西網絡上有不少的學習資料,底層的東西也有現成的源碼,學習這些東西仍是在溫馨區中,只須要花費時間和精力就能有所收穫。
因爲涉及到底層,C 和 C++ 語言須要有所瞭解,對基本的語法要熟悉,否則會致使看底層代碼像看天書的錯覺。但個人觀點是,底層源碼的研究要適度,而且注重編程思惟,語言的不少奇淫技巧看不懂不要緊,等過些時間再來回顧,所謂溫故而知新。
期間看了一本書叫《Objective-C編程全解》。有空的時候也看了看 Swift 語法,因爲項目中並無實施,因此暫時只是瞭解其語法特性。
我寫過幾篇相關的應用博客:
正如一位朋友所說,算法的最大意義就是提高一我的的思惟能力。
好在有這位算法很厲害的朋友的幫助,讓我很快入了門。整個算法基礎的學習可能也就一個月不到的業餘時間,而後進行了兩個月左右高密度的刷題練習(固然也是利用業餘時間)。
在數據處理中算法的應用場景是最多的,因此說後端理論上比移動端和web前端更須要算法知識。當你聽到有程序員說算法沒用的時候,你也不用驚訝,只是不少人以很低端的方式處理了問題,殊不知道有更高效的處理方式。關鍵的是,可能他們並不知道怎麼區別低端和優秀(時間複雜度和空間複雜度的權衡)。
算法對於軟件工程師的重要性是不言而喻的,仁者見仁智者見智。
算法是靠數據結構支撐的,學習這些基礎的數據結構是首要的任務,期間我看了一本《大話數據結構》,這本書是國產的,講得很淺,做爲沒有數據結構基礎的我來講,也就花了幾天時間,若是你有數據結構基礎,那這本書基本上沒有意義。
其後朋友推薦了一本書《挑戰程序設計競賽2》,買回來一看這本書確實不錯,應該是大學 ACM 選手最喜歡的那類書,有以前數據結構的基礎,看起來也不是很費力,只是要花時間去理解每個數據結構的優點、劣勢,以後才能在應用中發揮它們的價值。這本書目前我都沒有看完,後面比較深的東西接下來有時間會多去研究研究。
刷題是必要的,能夠理解一個知識點去找對應的題來作,也能夠把基礎知識過完再去作題,平臺固然首選 LeetCode,上面目前爲止有近一千題了。刷題語言建議用 C 或 C++,由於它們足夠通用且語法簡潔。
在開始刷題的時候,儘可能都選 Easy 的,而後再過分到 Medium 和 Hard(你會發現有些 Hard 比 Easy 還簡單😆)。
刷題必定不能心急,你要把它當作一個鍛鍊思惟的過程,不要一開始就去看 discuss,儘可能在思考至少一小時事後無果,再去需求幫助。工做忙的時候也不要緊,能夠早上的時候看一道題,而後在坐輕軌、上廁所等不會因爲走神而出現安全隱患的行爲時思考,到晚上的時候進行總結並敲代碼實現,實際上不少時候不到晚上可能就有思路了。
切記算法學習是以思考爲主而不是記憶,必定要培養觸類旁通的能力。
我前先後後刷了 100 題左右,因爲目前有其它學習計劃,就沒有繼續刷題了,不過過些時間我會恢復天天刷一題的習慣。軟件工程能夠說是數據結構和算法的組成,學習它們從根本上改變了個人思惟,在思考問題時將會更加的高效而且直切「要害」。
這也是性能優化的一個重要方面,即算法優化,經過更高效的算法來下降時間複雜度,從而下降 CPU 計算壓力,比較典型的例子就是用「快排」等高等排序來替換暴力排序。
我也寫過一篇簡單的博客:算法思考:單鏈表的快排與歸併
閱讀優秀的開源代碼是提高專業能力的有效手段,學習源碼的過程也是逐步從「碼農」轉向「工程師」的過程。
實際上開源項目會涉及不少東西,包括算法、操做系統等知識,因此在須要某些知識的時候,要優先去學習,這就致使了看懂一個代碼不多的開源項目可能須要一個月。我以前是選擇學習 YYKit,由於做者的代碼寫得優雅、高效、規範,看起來也賞心悅目,確實能夠做爲細度源碼的首選。
後來,我發現不少東西都是有共性的,這個共性來自於爲何要怎麼作,而不是作了什麼,好比 YYKit 裏面不少的東西都是爲了一點 —— 優化性能。而帶着這個目的去思考就不難發現做者的代碼意圖,理解上也會事半功倍,這才能達到與做者思惟的共鳴。
因此閱讀開源代碼也和學習算法一個道理,應該注重思惟層面的東西,而不是記憶。看懂一份熟知技術棧的編程語言是多麼容易的事情啊,可是要深入理解開源代碼背後傳達的思想卻不是那麼輕鬆。
最終我花了挺多時間去深刻閱讀,期間也作了不少的調研和嘗試,也鞏固了一項技能:性能優化,而且產出了幾篇博客:
後面我也去大概閱讀了其餘的源碼,好比 SDWebImage,FDTemplateLayoutCell 等,從閱讀的效率上確實大有提升,並且不少東西我也不想細看了,由於道理都是那個道理,須要時再去深究吧。
經過閱讀開源代碼,讓我養成了一個習慣,在使用別人的代碼庫時,時間容許的狀況時老是喜歡去看他的代碼,經過代碼就能夠看出這個庫的嚴謹程度和專業程度。若代碼太差就 pass 掉,若通常就能夠適當作一些優化。這是一個挺好的習慣,避免成爲一個「COPY專家」。
閱讀優秀代碼還有一個好處,就是對代碼質量的理解將會變深,這會讓你在之後的編碼中會更加嚴格的要求本身,造福你的隊友😏。
固然,前提是你真的看懂了。
我寫過的代碼質量博客:何爲代碼質量?——用腦子寫代碼
操做系統和編譯原理是很是基礎的知識,它們在應用層業務開發中不多會涉及,可是在一些比較高級的需求中卻發揮着相當重要的做用。
性能優化一般就是下降 CPU/GPU 的壓力,須要對進程、線程等有深入的理解,同時空間換時間帶來的內存壓力也要考慮,讀寫 IO 設備時的效率也是須要關注的。至於一些操做系統理論的東西,知其然絕對是對思惟能力和架構能力的提高。
關於啓動速度優化是一個比較深的課題,由於須要熟知編譯和連接的整個過程,這不是一個普通工程師能作得好的事情。
固然還有不少場景,在應用層開發中操做系統和編譯原理依然屬於有技術壁壘的知識,學習它們將會和通常的開發者拉開距離。
買了一本操做系統的大部頭《深刻理解計算機系統》,我大概看了一些事後發現有些晦澀了,因此就大體的瀏覽了一下,只細看了一部分目前我須要瞭解的東西。這本書我認爲它是必要的,能夠做爲一個工具書,有須要的時候翻一翻。
編譯原理看的是《程序員的自我修養——連接、裝載與庫》,這本書五星推薦,深刻淺出不過於晦澀也不過於簡單,我目前看了一半左右,發現之前有些不理解的東西如今茅塞頓開了。這本書必定要精讀,由於不少部分是有關聯的,當你看到一些不懂的地方要及時的回顧前面的章節,多看幾遍也是值得的。
寫的一篇簡單講多線程的應用博客:iOS 如何高效的使用多線程
架構須要靠設計模式支撐,一個優秀的代碼架構師必定是個設計模式專家,設計模式就是軟件發展歷史中對軟件架構思想的總結,學習它們的重要性不言而喻,直接關係到一個軟件系統的可維護性、可複用性、可拓展性等。
我看的一本書是《Objective-C編程之道 iOS設計模式解析》,經過這本書慢慢的將以前對設計模式的零散理解梳理起來,因爲以前我就對某些設計模式有所瞭解和應用,因此看起來很快,值得注意的是,設計模式概念很簡單,難的是具體業務中能靈活運用,而且熟知各類設計模式的優點和劣勢。這本書講得很仔細,每個設計模式都有案例分析。
有個技巧就是,學習設計模式不能去記概念,而應該記類圖,結合類圖去理解其適用場景和侷限性。
計算機網絡的原理每個工程師都應該瞭解,只要是軟件開發幾乎都要接觸計算機網絡,若對其原理一竅不通,當出現專業的網絡問題或者須要作網絡底層優化的時候會一籌莫展。
瞭解它並非要精通它,只是要大體清楚一個完整的網絡架構是如何運做的。
我選擇看兩本書:《圖解HTTP》《圖解TCP/IP》。講得很是通俗易懂,能基本創建起對計算機網絡的知識架構。
今年作了一個比較實用的開源項目:YBImageBrowser,寫了兩篇介紹其原理的文章: iOS圖片瀏覽器(功能強大/性能優越) 打造高性能 iOS 圖片瀏覽器 (支持視頻) 第一篇是舊版,第二篇是新版。初版和第二版之間,恰巧是我學習算法和閱讀開源代碼的時間,技術提高事後對以前的垃圾代碼確實忍受不了,因此進行了重寫。
固然,如今回頭一看,新版的代碼仍是有些很差的地方,等有時間再來優化吧😆。
打造本身的開源項目確實是一個不錯的體驗,就像把本身的孩子養大而後給各位老闆打工,而後老闆們還喜歡提出一些要求,你又得去教育本身的孩子讓 TA 變得更優秀。
經過開源社區的意見和建議,作出適當的優化和勘誤,也是對自我能力的提高。
文章已經貼了我大部分博客了,它們基本上都是學習過程的產出。寫博客首先要考慮目的是什麼,是爲了單純吸引粉絲仍是爲了總結提高本身的技術。如果前者能夠寫一些基礎簡單的科普文章,如果後者就儘可能寫一些有技術深度或思想深度的文章。
我寫博客的宗旨很簡單——有意義。
什麼叫有意義呢?在搜索引擎一搜就能查到幾乎同樣的文章,沒有思想層面的獨到理解,也沒有技術層面的深度,那就是沒有意義的;而只要融合了本身的思想或者有必定的技術深度的文章就是有意義的。
固然這只是個人看法,無關他人。
總的來講 2018 年過得比較充實,技術獲得長足的進步,代價就是壓縮了不少娛樂時間。我也慢慢的習慣了這種生活方式,在保證適當娛樂的狀況下,最大化發揮時間的最大價值。
一我的最舒服的生活方式就是將追求變成愛好,這或許是我堅持下去的最好保證。
共勉。
新年快樂。