前言
集中学习数据结构与算法有一段时间,计划花一段时间专门记录一下学习笔记。这篇文章想分享下自己在学习数据结构预算法前的初衷,为什么要学习数据结构预算法?我要说明一下,我也是在学习阶段,有表述错误的地方希望看到文章的朋友可以指出来。
是因为那次,我深刻意识到了数据结构与算法的重要性。算法同事对我数据结构做出微小的调整+简单的算法实现,结果相比我之前的实现方式,在性能上高出数百倍,听着一定觉得很夸张,到现在我还记得当时我惊讶的状态。那一刻深刻意识到它的重要性。
为什么要学习数据结构预算法
可能很多同学会认为数据结构与算法,跟操作系统、计算机网络一样,是脱离实际工作的知识,可能出了面试,这辈子也用不着?
尽管计算机专业的同学在大学期间都学习多这门课程,甚至很多培训机构也会培训这方面的知识,但是据我了解,有很多像我这样的程序员对数据结构和算法依旧一窍不通。还有一些人也只是听说过数组、链表、快排这些最基本的数据结构和算法,稍微复杂一点的就完全没概念了。
当然,也有很多人说,自己实际工作中根本用不到数据结构和算法。所以,就算不懂这块知识,只要Java API、开发框架用的熟练,照样可以吧代码写的“飞”起。事实真的这样吗?
今天我来谈谈自己的想法,或者说学习过一段时间之后的一些心得。
想要通关大肠面试,千万别让数据结构和算法拖了后腿
听说很多大公司,比如BAT、滴滴、美团、小米、Vivo等等,面试的时候都喜欢考算法,让人现场写代码。很多人虽然技术不错,但每次面试都会“跪”在算法上,很是可惜。那我们思考一下,为什么这些大公司都喜欢考算法呢?
还记得校招的时候,参加面试的时候,我们基本上都没啥项目经验,公司只能考察我们的基础知识是否牢固。社招更不用说了,越是厉害的公司,越是注重考察数据结构与算法这类基础知识。我想是因为相比短期能力,他们更看重我们应聘人的长期潜力。
可能你会说,我不懂数据结构与算法,照样找到了好工作啊。那我是不是就不用学习数据结构与算法呢?当然不是了,我们学习任何知识都是为了“用”的,是为了解决实际工作问题的,学习数据结构和算法自然也不例外。
不愿做一辈子CRID
如果你和我一样只是一名业务开发工程师,可能会觉得每天主要做的就是数据库CRID,哪里用的到数据结构与算法。是的,对于大部分的业务开发来说,我们平时可能更多的是利用已经封装好的接口、类库来堆砌、翻译业务逻辑,很少需要自己实现数据结构和算法。但是,不需要自己实现并不代表我们什么都不需要了解。
如果不知道这些类库背后的原理,不懂得时间、空间复杂度分析,我们如何用好、用对他们?存储某个业务数据的时候后,如何知道应该用ArrayList还是LinkedList?调用了某个函数之后,又改如何评估代码的性能和资源的消耗呢?
作为业务开发,我们会用到各种框架、中间件和底层系统,比如Spring、RPC框架、消息中间件、Redis等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。
比如,我们常用的Key—Value数据库Redis中,里面的有序集合是什么数据结构来实现的呢?为什么要用跳表来实现呢?为什么不用二叉树呢?
如果我们能弄明白这些底层原理,就能更好的使用他们。即便出现问题,也能够快速的定位。因此,掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,也都是非常有用的。
在平时的工作中,数据结构和算法的应用到处可见。再来举个很常见的例子:如何实时地统计业务接口的99%响应时间?可能你最先想到的是每次查询时,从小到大排序所有的限行时间,如果总共有100个数据,那第99个便是99%的相应时间。很显然,每次用这个方法查询的话都要排序,效率是非常低下的。但是,如果知道“堆”这个数据结构的话,用连个堆可以非常高效地解决这个问题。
对于基础结构研发工程师,写出开源水平的架构才是他们的目标
现在互联网上的技术文章、架构分享、开源项目满天飞,照猫画虎做一套基础架构框架并不难。就拿RPC框架来看。
不同的公司、不同的人做出的RPC框架,架构设计思路都差不多,最后实现的功能也差不多。但是有的人做出来的框架,Bug很多、性能一般、扩展性也不好,只能在自己公司仅有的几个项目里面用一下。而有的人做的框架可以开源道GitHub上给更多的人用,甚至被Apache收录,就好比阿里的Dubbo RPC框架。为什么会有这么大的差距呢?
我认为,那些高手之间的竞争其实就在细节。这些细节包含:你用的算法是不是够优化,数据存取的效率是不是够高,内存是不是够节省等等。这些积累起来,决定了一个框架是不是优秀。所以,如果你和我一样还不懂数据结构和算法,对大O复杂度分析还不是很熟练,不知道怎么分析代码的时间复杂度和空间复杂度,这个很是说不过去,也应该赶紧补一补。
对编程有追求,不想被行业淘汰
什么是编程能力强,是代码的可读性好、健壮?还是扩展性好?我觉得没办法给出一个明确的标准,也列不全,因为可以衡量的指标是在是太多了。但是,在我看来,性能好坏起码是其中一个非常重要的评判标准。但是,如果我们连代码的时间复杂度、空间复杂度都不知道怎么分析,又怎么能写出高性能的代码呢?
可能有人和我之前想法差不多,我现在的业务,用户量很少,需要处理的数据量也很少,开发中不需要考虑那么多性能的问题,完成功能是最主要的,用什么数据结构和算法,差别不是很大。但是当我接触到千万级数据处理,甚至亿级数据的时候我傻眼了。内存溢出等问题接踵而来的时候,我慌了,当时我完全拿他没办法,因为我的知识储备有限。我记得很清楚,当时找了一个专门做算法的同事,请求他的支援,他在了解了我的需求后给出了一套自己的算法实现方案,我试过了,结果让我很难受,问题解决了,而且结果完全超出我的预期,甚至是惊讶,但我还是很难过,难过的是我自己之前忽视数据结构这块。他给的方案其实都是我熟悉的几种常用数据结构,只是在先后顺序上做了调整,和算法思路上给出了一点提示,结果性能好不夸张的说,高出我之前的百倍。也是那次事情时候,我才下定决心要集中的学习数据结构与算法,并且要高度重视它。
其实做业务开发的同学几年下来都会有这样的感觉,一样事情做久了,一个公司待久了,会发现我们每天做的都是重复的事情。可能让你写一份自己的简历,都可以写七八个项目,但明显能看的出来项目之间的技术架构、实现技术方案都大同小异,或者说我们的能力并没有跟着项目经验的增加而出现大的提升。所以我觉得数据结构与算法这个东西我们不去学,可能真的一辈子都哟弄不到,也感受不到它的好,它的强大之处。但是一旦掌握,你就会常常被他的强大威力所折服。
内容总结
其实写这篇文章,单纯为了分享一下自己的想法,希望对跟我一样的程序员们对数据结构与算法的认识能够引起高度重视。我们的目的是建立时间复杂度、空间复杂度意识,写出高质量的代码,能够设计基础加固,提成编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现我们的价值。
更多个人文章:RelaxHeart网 - Tec博客