1. 为什么学习算法
简介: 学习数据结构和算法,并非为了死记硬背几个知识点。而是为建立时间复杂度、空间复杂度意识,写出高质量代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。掌握数据结构与算法,看待问题的深度,解决问题的角度就会完全不同。
是不是觉得数据结构和算法,跟os、计网一样,属于脱离实际工作的屠龙术?
除了面试,其实这辈子也用不着?
尽管计算机专业同学在大学都学过这些课程,甚至很多培训机构也会培训,但很多程序员对数据结构和算法依旧一窍不通。绝大多数人只听说过数组、链表、快排这些最简单的数据结构和算法,稍微复杂一点的就完全没概念。
很多人说实际工作中根本用不到数据结构和算法。所以,就算不懂这块知识,只要Java API、开发框架用得熟练,照样可以把代码写得“飞”起来。
事实真的是这样吗?
想要通关大厂面试,数据结构和算法是开胃菜
BAT字节、Google、微软,面试都喜欢考算法、手写代码并运行。有些人虽然技术八股文不错,但每次去面试都会“跪”在算法上,很可惜。
那你可曾想过,为何这些大公司喜欢考察算法?
校招时,学生一般都没有实际项目经验,公司只能考察他们的基础知识是否牢固。
社招更不用说,越注重技术的公司,越会重点考察数据结构与算法这类基础知识。
因为相比短期能力,他们更看中候选人的长期潜力。
我不懂算法,照样找到了高薪大厂工作啊。我是不是就不用研究算法了?
要以发展的眼光看待,我们学任何知识都是为了解决实际问题,学习算法自然有用处。难道你真愿意一直做个crud boy?
可我整天工作就是crud 啊,哪里用到过算法?
诚然,大部分业务开发都是利用封装好的API堆砌、转译业务逻辑,几乎无需自行实现算法。
但不需要自己实现≠什么都不需要了解。
若不知道这些类库背后的原理,不懂得时间、空间复杂度分析,你如何能用好、用对它们?
存储某业务数据时,你如何知道应该用ArrayList,还是LinkedList?
调用某方法后,你如何评估代码的性能和资源消耗?
业务开发用到的各种框架、中间件和底层系统,如MySQL、Spring、MQ和Redis等。这些基础组件中,其实都内置了很多基础算法思想。
如Redis中,有序集合用什么数据结构实现?为什么要用跳表?为什么不用二叉树?
若能清晰这些底层原理,就能更好利用它们。即便出现问题,也方便定位。
实际工作中的算法应用到处可见,如何实时地统计业务接口的99%响应时间?
你可能想,每次查询时,从小到大排序所有的响应时间,若总共有1200个数据,那第1188个数据就是99%的响应时间。
每次用这个方法查询的话都要排序,效率太低。但若你知道“堆”数据结构,用两个堆即可高效解决。
现在开源的技术文章、架构、项目很多,照猫画虎做一套基础框架并不难。我就拿RPC框架举例。
不同人做出的RPC框架,架构设计思路其实都差不多,所实现的功能也相差无几。但就是有人做的框架,Bug很多、性能一般、扩展性也不好,只能在自己公司仅有的几个项目里面玩一下。
而有人的框架就能开源到GitHub,甚至被Apache收录。
为什么会有这么大差距?
编程高手竞争就在细节:算法是不是足够优化,数据存取的效率是不是足够高,内存是不是够节省等等。
所以细节决定成败!
对编程还有追求?不想被35优化?那就不要只会写只是能run的代码!
何为编程高手?不同人可能观点不同。但在我看来,性能好坏至少算一项关键指标。若你连代码时间复杂度、空间复杂度都会分析,怎么可能写出高性能代码?
我在小公司工作的呀,非互联网,用户量少,处理数据量也小,qps几乎0,开发不需要考虑那些性能问题,完成功能就下班了,用不用数据结构和算法,无足轻重。
那你就甘愿“十年如一日”重复 crud 了吗?
大家都知道这行35岁后容易被行业淘汰,原因其实就在此。有人写代码,从不考虑非功能性需求,只是完成功能,能run就行;做事情的时候,也从无长远规划,只顾眼前三分利。
这样即使十年业务积累,跟应届生一年积累没有本质区别。怎么不会被淘汰呢?
大公司里性能几乎是时刻都要考虑的。一个简单的ArrayList、Linked List的选择问题,就可能会产生成千上万倍的性能差别。
数据结构和算法的意义就彰显了。
数据结构和算法这个东西,如果你不去学,可能真的这辈子都用不到,也感受不到它的好。但一旦掌握,你就会常常被它的强大威力所折服。
之前你可能需要费很大劲儿来优化的代码,需要花很多心思来设计的架构,用了数据结构和算法之后,很容易就能解决。
总结
学习数据结构和算法,并非为了死记硬背几个知识点。而是为建立时间复杂度、空间复杂度意识,写出高质量代码,能够设计基础架构,提升编程技能,训练逻辑思维,积攒人生经验,以此获得工作回报,实现你的价值,完善你的人生。
掌握数据结构与算法,看待问题的深度,解决问题的角度就会完全不同。