2018 个人技术进阶之路

窗外雨夹着雪,2018 的冬天彷佛格外寒冷。前端

国内经济下行,资金链断裂、人员优化、冻结 HC 等消息不绝于耳,2018 的冬天被一层阴霾笼罩,互联网从业人员一度人心惶惶。大潮退去,才知道谁在裸泳,这是说企业,也是说我的。git

毫无疑问的是,互联网从业人员的竞争更加激烈了,做为一名普通的开发者,在没有更好的机遇时,首先应该想的是如何让本身值钱,而不是如何挣钱。程序员

2018 对于我来讲是很重要的一年,有过迷茫,有过纠结,有过自我怀疑,有过欣喜若狂。本文是我对本身 2018 年的技术进阶总结,也是一个分享,不局限于技术栈。github

1、全能仍是专精

2018 年初的时候,我兴致勃勃的安装了 Android Studio、WebStorm,还买了两本书,想着把 Android、ReactNative、web前端都撸一遍,成为一个大前端工程师。学习新东西确实会带来不少成就感,而且以为挺有意思,后来和一位技术老铁交流事后,赶忙制止了本身的学习计划。web

就像此刻,我已经记不得那些各具特点的 API。算法

这些都是应用层的东西,基本上靠记忆和实践就能入门,经过一两个项目就能熟悉,然而要达到精通却很难作到。一是由于人的精力有限,二是由于精通所须要的东西并非这些应用层面的知识所能支持的。编程

因此,若是在一我的在编码生涯的开始就选择作全栈,那么很可能成为“全能废材”,知其然而不知其因此然的程序员叫作“码农”可能更为贴切。不多有公司会须要你会写各个技术栈的代码,博而不精的程序员只适合一个地方——外包公司。后端

那么,全栈真的没有意义么?设计模式

其实是有的,当一个工程师专业技能熟练,基础技术合格,思惟能力达到必定高度事后,为了寻求技术天花板的突破,颇有可能会去涉猎其余技术领域。而这个涉猎并非为了学那些表面的 API,而是去了解各个技术栈的区别和联系,注重的是思惟层面的东西,从而以更广阔的角度来理解技术。浏览器

当我深入的明白这些的时候,我决定以一种更有效的学习手段来从根本上提高本身,包括基础技术和思惟能力。

2、深刻专业基础

我花了些时间来梳理总结专业基础知识,好比 iOS 的 Runtime 基础、RunLoop、内存管理、Block 原理、KVC 等。实际上这些东西网络上有不少的学习资料,底层的东西也有现成的源码,学习这些东西仍是在温馨区中,只须要花费时间和精力就能有所收获。

因为涉及到底层,C 和 C++ 语言须要有所了解,对基本的语法要熟悉,否则会致使看底层代码像看天书的错觉。但个人观点是,底层源码的研究要适度,而且注重编程思惟,语言的不少奇淫技巧看不懂不要紧,等过些时间再来回顾,所谓温故而知新。

期间看了一本书叫《Objective-C编程全解》。有空的时候也看了看 Swift 语法,因为项目中并无实施,因此暂时只是了解其语法特性。

我写过几篇相关的应用博客:

3、算法

正如一位朋友所说,算法的最大意义就是提高一我的的思惟能力。

好在有这位算法很厉害的朋友的帮助,让我很快入了门。整个算法基础的学习可能也就一个月不到的业余时间,而后进行了两个月左右高密度的刷题练习(固然也是利用业余时间)。

在数据处理中算法的应用场景是最多的,因此说后端理论上比移动端和web前端更须要算法知识。当你听到有程序员说算法没用的时候,你也不用惊讶,只是不少人以很低端的方式处理了问题,殊不知道有更高效的处理方式。关键的是,可能他们并不知道怎么区别低端和优秀(时间复杂度和空间复杂度的权衡)。

算法对于软件工程师的重要性是不言而喻的,仁者见仁智者见智。

算法是靠数据结构支撑的,学习这些基础的数据结构是首要的任务,期间我看了一本《大话数据结构》,这本书是国产的,讲得很浅,做为没有数据结构基础的我来讲,也就花了几天时间,若是你有数据结构基础,那这本书基本上没有意义。

其后朋友推荐了一本书《挑战程序设计竞赛2》,买回来一看这本书确实不错,应该是大学 ACM 选手最喜欢的那类书,有以前数据结构的基础,看起来也不是很费力,只是要花时间去理解每个数据结构的优点、劣势,以后才能在应用中发挥它们的价值。这本书目前我都没有看完,后面比较深的东西接下来有时间会多去研究研究。

刷题是必要的,能够理解一个知识点去找对应的题来作,也能够把基础知识过完再去作题,平台固然首选 LeetCode,上面目前为止有近一千题了。刷题语言建议用 C 或 C++,由于它们足够通用且语法简洁。

在开始刷题的时候,尽可能都选 Easy 的,而后再过分到 Medium 和 Hard(你会发现有些 Hard 比 Easy 还简单😆)。

刷题必定不能心急,你要把它当作一个锻炼思惟的过程,不要一开始就去看 discuss,尽可能在思考至少一小时事后无果,再去需求帮助。工做忙的时候也不要紧,能够早上的时候看一道题,而后在坐轻轨、上厕所等不会因为走神而出现安全隐患的行为时思考,到晚上的时候进行总结并敲代码实现,实际上不少时候不到晚上可能就有思路了。

切记算法学习是以思考为主而不是记忆,必定要培养触类旁通的能力。

我前先后后刷了 100 题左右,因为目前有其它学习计划,就没有继续刷题了,不过过些时间我会恢复天天刷一题的习惯。软件工程能够说是数据结构和算法的组成,学习它们从根本上改变了个人思惟,在思考问题时将会更加的高效而且直切“要害”。

这也是性能优化的一个重要方面,即算法优化,经过更高效的算法来下降时间复杂度,从而下降 CPU 计算压力,比较典型的例子就是用“快排”等高等排序来替换暴力排序。

我也写过一篇简单的博客:算法思考:单链表的快排与归并

4、阅读优秀开源代码

阅读优秀的开源代码是提高专业能力的有效手段,学习源码的过程也是逐步从“码农”转向“工程师”的过程。

实际上开源项目会涉及不少东西,包括算法、操做系统等知识,因此在须要某些知识的时候,要优先去学习,这就致使了看懂一个代码不多的开源项目可能须要一个月。我以前是选择学习 YYKit,由于做者的代码写得优雅、高效、规范,看起来也赏心悦目,确实能够做为细度源码的首选。

后来,我发现不少东西都是有共性的,这个共性来自于为何要怎么作,而不是作了什么,好比 YYKit 里面不少的东西都是为了一点 —— 优化性能。而带着这个目的去思考就不难发现做者的代码意图,理解上也会事半功倍,这才能达到与做者思惟的共鸣。

因此阅读开源代码也和学习算法一个道理,应该注重思惟层面的东西,而不是记忆。看懂一份熟知技术栈的编程语言是多么容易的事情啊,可是要深入理解开源代码背后传达的思想却不是那么轻松。

最终我花了挺多时间去深刻阅读,期间也作了不少的调研和尝试,也巩固了一项技能:性能优化,而且产出了几篇博客:

后面我也去大概阅读了其余的源码,好比 SDWebImage,FDTemplateLayoutCell 等,从阅读的效率上确实大有提升,并且不少东西我也不想细看了,由于道理都是那个道理,须要时再去深究吧。

经过阅读开源代码,让我养成了一个习惯,在使用别人的代码库时,时间容许的状况时老是喜欢去看他的代码,经过代码就能够看出这个库的严谨程度和专业程度。若代码太差就 pass 掉,若通常就能够适当作一些优化。这是一个挺好的习惯,避免成为一个“COPY专家”。

阅读优秀代码还有一个好处,就是对代码质量的理解将会变深,这会让你在之后的编码中会更加严格的要求本身,造福你的队友😏。

固然,前提是你真的看懂了。

我写过的代码质量博客:何为代码质量?——用脑子写代码

5、操做系统和编译原理

操做系统和编译原理是很是基础的知识,它们在应用层业务开发中不多会涉及,可是在一些比较高级的需求中却发挥着相当重要的做用。

性能优化一般就是下降 CPU/GPU 的压力,须要对进程、线程等有深入的理解,同时空间换时间带来的内存压力也要考虑,读写 IO 设备时的效率也是须要关注的。至于一些操做系统理论的东西,知其然绝对是对思惟能力和架构能力的提高。

关于启动速度优化是一个比较深的课题,由于须要熟知编译和连接的整个过程,这不是一个普通工程师能作得好的事情。

固然还有不少场景,在应用层开发中操做系统和编译原理依然属于有技术壁垒的知识,学习它们将会和通常的开发者拉开距离。

买了一本操做系统的大部头《深刻理解计算机系统》,我大概看了一些事后发现有些晦涩了,因此就大体的浏览了一下,只细看了一部分目前我须要了解的东西。这本书我认为它是必要的,能够做为一个工具书,有须要的时候翻一翻。

编译原理看的是《程序员的自我修养——连接、装载与库》,这本书五星推荐,深刻浅出不过于晦涩也不过于简单,我目前看了一半左右,发现之前有些不理解的东西如今茅塞顿开了。这本书必定要精读,由于不少部分是有关联的,当你看到一些不懂的地方要及时的回顾前面的章节,多看几遍也是值得的。

写的一篇简单讲多线程的应用博客:iOS 如何高效的使用多线程

6、 设计模式

架构须要靠设计模式支撑,一个优秀的代码架构师必定是个设计模式专家,设计模式就是软件发展历史中对软件架构思想的总结,学习它们的重要性不言而喻,直接关系到一个软件系统的可维护性、可复用性、可拓展性等。

我看的一本书是《Objective-C编程之道 iOS设计模式解析》,经过这本书慢慢的将以前对设计模式的零散理解梳理起来,因为以前我就对某些设计模式有所了解和应用,因此看起来很快,值得注意的是,设计模式概念很简单,难的是具体业务中能灵活运用,而且熟知各类设计模式的优点和劣势。这本书讲得很仔细,每个设计模式都有案例分析。

有个技巧就是,学习设计模式不能去记概念,而应该记类图,结合类图去理解其适用场景和局限性。

7、计算机网络

计算机网络的原理每个工程师都应该了解,只要是软件开发几乎都要接触计算机网络,若对其原理一窍不通,当出现专业的网络问题或者须要作网络底层优化的时候会一筹莫展。

了解它并非要精通它,只是要大体清楚一个完整的网络架构是如何运做的。

我选择看两本书:《图解HTTP》《图解TCP/IP》。讲得很是通俗易懂,能基本创建起对计算机网络的知识架构。

8、开源项目

今年作了一个比较实用的开源项目:YBImageBrowser,写了两篇介绍其原理的文章: iOS图片浏览器(功能强大/性能优越) 打造高性能 iOS 图片浏览器 (支持视频) 第一篇是旧版,第二篇是新版。初版和第二版之间,恰巧是我学习算法和阅读开源代码的时间,技术提高事后对以前的垃圾代码确实忍受不了,因此进行了重写。

固然,如今回头一看,新版的代码仍是有些很差的地方,等有时间再来优化吧😆。

打造本身的开源项目确实是一个不错的体验,就像把本身的孩子养大而后给各位老板打工,而后老板们还喜欢提出一些要求,你又得去教育本身的孩子让 TA 变得更优秀。

经过开源社区的意见和建议,作出适当的优化和勘误,也是对自我能力的提高。

9、关于博客

文章已经贴了我大部分博客了,它们基本上都是学习过程的产出。写博客首先要考虑目的是什么,是为了单纯吸引粉丝仍是为了总结提高本身的技术。如果前者能够写一些基础简单的科普文章,如果后者就尽可能写一些有技术深度或思想深度的文章。

我写博客的宗旨很简单——有意义。

什么叫有意义呢?在搜索引擎一搜就能查到几乎同样的文章,没有思想层面的独到理解,也没有技术层面的深度,那就是没有意义的;而只要融合了本身的思想或者有必定的技术深度的文章就是有意义的。

固然这只是个人看法,无关他人。

总结

总的来讲 2018 年过得比较充实,技术获得长足的进步,代价就是压缩了不少娱乐时间。我也慢慢的习惯了这种生活方式,在保证适当娱乐的状况下,最大化发挥时间的最大价值。

一我的最舒服的生活方式就是将追求变成爱好,这或许是我坚持下去的最好保证。

共勉。

新年快乐。