源码

2018 我的技术进阶之路

窗外雨夹着雪,2018 的冬天似乎格外寒冷。

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

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

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

一、全能还是专精

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

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

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

所以,如果在一个人在编码生涯的开始就选择做全栈,那么极可能成为“全能废材”,知其然而不知其所以然的程序员叫做“码农”可能更为贴切。很少有公司会需要你会写各个技术栈的代码,博而不精的程序员只适合一个地方——外包公司。

那么,全栈真的没有意义么?

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

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

二、深入专业基础

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

由于涉及到底层,C 和 C++ 语言需要有所了解,对基本的语法要熟悉,不然会导致看底层代码像看天书的错觉。但我的观点是,底层源码的研究要适度,并且注重编程思维,语言的很多奇淫技巧看不懂没关系,等过些时间再来回顾,所谓温故而知新。

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

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

透彻理解 NSNotificationCenter 通知(附实现代码)
透彻理解 KVO 观察者模式(附基于runtime实现代码)
iOS架构:Proxy实现局部模块化(附Demo)
iOS 架构组件:让你的 TableView 优雅起来
设计一个简单的 iOS 架构

三、算法

正如一位朋友所说,算法的最大意义就是提升一个人的思维能力。

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

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

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

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

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

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

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

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

切记算法学习是以思考为主而不是记忆,一定要培养举一反三的能力。

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

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

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

四、阅读优秀开源代码

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

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

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

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

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

YYCache 源码剖析:一览亮点
YYModel 源码剖析:关注性能
YYAsyncLayer 源码剖析:异步绘制
YYImage 源码剖析:图片处理技巧
YYWebImage 源码剖析:线程处理与缓存策略

后面我也去大概阅读了其他的源码,比如 SDWebImage,FDTemplateLayoutCell 等,从阅读的效率上确实大有提高,而且很多东西我也不想细看了,因为道理都是那个道理,需要时再去深究吧。

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

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

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

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

五、操作系统和编译原理

操作系统和编译原理是非常基础的知识,它们在应用层业务开发中很少会涉及,但是在一些比较高级的需求中却发挥着至关重要的作用。

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

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

当然还有很多场景,在应用层开发中操作系统和编译原理依然属于有技术壁垒的知识,学习它们将会和一般的开发者拉开距离。

买了一本操作系统的大部头《深入理解计算机系统》,我大概看了一些过后发现有些晦涩了,所以就大致的浏览了一下,只细看了一部分目前我需要了解的东西。这本书我认为它是必要的,可以作为一个工具书,有需要的时候翻一翻。

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

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

六、 设计模式

架构需要靠设计模式支撑,一个优秀的代码架构师一定是个设计模式专家,设计模式就是软件发展历史中对软件思想的总结,学习它们的重要性不言而喻。

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

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

七、开源项目

今年做了一个比较实用的开源项目,写了两篇介绍其原理的文章:

iOS图片浏览器(功能强大/性能优越)—— 重大更新
打造开源第一 iOS 图片浏览器 (支持视频)

第一篇是旧版,第二篇是新版,题目取得有点狂不要介意,这是对自我的一种激励。第一版和第二版之间,恰巧是我学习算法和阅读开源代码的时间,技术提升过后对之前的垃圾代码确实忍受不了,所以进行了重写。

当然,现在回头一看,新版的代码还是有些不好的地方,等有时间再来优化吧。

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

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

八、关于博客

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

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

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

当然这只是我的见解,无关他人。

总结

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

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

共勉。

新年快乐。

作者:indulge_in

链接:https://www.jianshu.com/p/c291b76540c2

(0)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/2018-wodejishujinjiezhilu.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:12月 29, 2018 at 11:00 下午

热评文章

发表评论

[必填]

看不清?

提交后请等待三秒以免造成未提交成功和重复