你好,我是微扰君。

不知不觉,我们的专栏就要暂时结束了。

不知道你在学习的时候有什么感觉,这个专栏对我来说算是一个很大的挑战,长达半年的写作可不轻松,甚至可以说是“痛苦”的。

说这个专栏挑战大,主要因为涉及的内容广泛,如果你从头到尾跟完专栏也一定会深有体会。从最基础的数据结构和算法原理,到操作系统、计算机网络这样的计算机基础知识,再到解决真实生产环境下不同系统所面临的各种不同问题的算法,我们都有所涉猎。

学习了这么多不同领域的算法,相信你也能充分感受到我们一直在强调的观点:学习算法绝不只是为了应付面试,事实上算法在真实的生产环境中是有很大用处的。只不过很多时候,这些真实的算法问题比较复杂,比起业务问题也更为通用,所以有很多前辈们把这些复杂性都封装了起来,给了我们普通业务开发工程师们一个看起来简单的编程世界。

但如果我们想在技术的世界里走得更远,那么,勇于揭开这层漂亮面纱,直面系统中的复杂性,就是我们必须要迈出的一步。

但是作为普通的工程师,选择直面并不意味着之后的困难减少了,我们在深入学习的过程中可能会更“困惑”。在写专栏的时候,我也尤其有这个感受。

在开始写课程目录的时候,实际上我列出了60多个算法主题,觉得很值得讲、很值得学。但是编辑提醒我说,学习这个活动,想要尽可能持续地进行,必须要考虑到时间和体量,后来和编辑一起来回好几轮才删减到40个左右。而好不容易等课程框架通过仔细的思考设计好了,本以为后面就一片坦途,结果挑战依旧远超想象。

最大的困难就是在实际落地写的时候,我经常发现有些问题想要讲清楚,需要的篇幅比当初想象中要大得多,必须不断地对内容做修剪,力求在篇幅内讲清楚每个核心问题是什么、为什么有这样的问题、大致的解法是怎样的,尽量删减掉一些不那么重要的技术细节。

当然,最后的成品我还是比较满意的。今天回看前面的每一讲,虽然并不算太深入,但应该还是足以开拓你的技术广度,如果你想深入研究某个相关技术,现在估计也有点线索了吧。

值得讲的算法远比在专栏中讲到的多,但是我们都是在学习的路上,又有谁能走到尽头呢。

毕竟,计算机和互联网发展了这么久,不同场景下的技术问题本来就层出不穷。直到现在很多问题也依旧会拿出来被反复讨论,不断有更好更新的解决方法被提出,而未来,也必然会有各种各样新的问题被提出

所谓,罗马不是一日建成的,整个计算机的世界正是这样演进了几十年。比如早期,计算机都是单机的,无论是计算能力还是存储能力都非常有限,我们依旧在这样的硬件基础上造出了非常复杂的系统,比如操作系统、文件系统、数据库等等,随便一个成熟的项目可能都有十几万行以上的代码;而现在,随着硬件能力的提升和数据爆发式的增长,在分布式环境下,我们面临的挑战当然会更大,除了要解决很多新问题,也要重新解决一些老的问题。

想解决这些问题,除了需要一些天才的想法,更大程度上需要程序员能对之前系统有深刻理解。但想一个人把这些问题全部涉猎是不切实际的,我们能做的、更应该花时间做的,就是通过了解和学习其中一部分经典问题,获得解决另一些问题的思路和方法

而学习这些问题的时候一定要注意溯本求源,这才是学习最好的捷径,只有先搞清楚“为什么”才能真正搞清楚“怎么做”;这样再碰到新的问题的时候,我们才能站在巨人的肩膀上继续前行。

那过去几十年里,无数不同国籍的工程师和科学家正是这么做的,他们通力协作,一起打造了我们如此繁荣的计算机世界。

总的来说,虽然没有办法把前人的智慧在专栏中全部展现给你,不过你可以把这个专栏作为一个简单的算法索引,帮助自己更快找到感兴趣领域内的一手资料,比如论文或者项目源码,后续进行更深入的研究。希望通过这个专栏的学习,你能多掌握一些前人们解决不同问题的思考角度,至少,希望他们能给你的工作带来一些启发和乐趣

在整个专栏的写作过程,除了“痛苦”和“困惑”,我也确实感受到了很大的快乐。

其中一部分快乐当然来自于完成专栏的成就感,无论是许多读者的订阅和留言,还是社群里大家的讨论,都让我感受到自己在做的事情是很有意义的。但更大的快乐还是来源于对知识的反复求证和探索(毕竟我更多时间在写:))。

专栏里很多主题的算法,我在工作中其实也没有太多机会使用,所以为了把问题讲清楚,在写的时候,我反复看了很多项目的源码、文档、博客,还有论文,力求将问题理解透彻。在这个过程里,我发现了很多以前没有注意到的细节,以及理解错误的地方,也对很多概念有了更系统的认知,可以说在欣赏前人的智慧之光中,我获得了无与伦比的快乐。

比如在讲字符串匹配的章节里,我第一次系统地梳理了各种求解字符串匹配的方法和思路,研读了 Boyer Moore 算法复杂度的证明,并自己做了实验对比了几种算法的效率,这让我对这个问题有了比以往深刻得多的理解,也更惊叹于Boyer Moore算法的巧妙和在实际生产环境下的高效性。不知道你在学习哪些章节的时候,有没有类似的感受。

在过去的工作中,我认识了许多不同的工程师,其中不乏优秀的同事,但也有很多同事对技术问题的理解不那么尽如人意,在他们身上,我观察到一个显著的区别:优秀的同事往往对技术本身有着更强烈的好奇,比如出现一些事故的时候,想办法快速解决问题之后,他们往往会做更深刻的复盘,去了解相关中间件或者代码背后的运行机制,甚至还会做一些分享;而技术一般的同事,往往懒于做更多的研究和探讨。

其实,对于大部分程序员来说,既然当初选择了编程这条道路,内心都是能找到对编程的兴趣,尤其是那些愿意投入时间主动学习的同学,没错,我说的就是在极客时间学习的你。

那如何能在日常工作中找到编程的乐趣呢?说实话,我个人觉得在日常的增删改查中找到乐趣还是比较难,因为这样的工作确实比较重复,这也是我自己花了很大的努力从前端转行基础组件开发的原因,但这个选择并不是适合任何人,毕竟大家的兴趣点不同。

但是我相信,对于大部分业务开发同学来说,只需要在日常开发中多多留心观察,

相信我,只要你坚持这样做,一定可以收获思维的乐趣,并且有一天你也一定会发现,自己对技术的理解进入了下一个层次,因为这些日积月累的知识,早就悄悄地融进你日常的代码和设计中了。

最后,谢谢你学习这个专栏,如果你在学习之后还根据思考题,自己做了一些相关的课外阅读或者动手实验,这些努力一定不会白费,这两件事在算法专栏的学习中其实起着更重要的作用。

专栏暂时结束了,但我们的技术之旅还在继续,这次的结束只是我们的新开始。我会继续更新若干篇更进阶的加餐和修订过去的章节(6讲高手番外会在接下来的一个半月内持续更新),还有很多评论我还没来得及一一回复,这些我都会在未来一段时间内抽时间完成。

在专栏要暂时结束的今天,我也非常希望能听到你的声音。

如果哪天你发现自己在工作中用到了相关知识点,也欢迎你常回来复习留言。未来,你一定会有更多的问题需要解决,希望有了这个专栏能让你解决那些问题时更加从容一些,也更加快乐一些。

在技术的世界里享受思维的乐趣,这是我对你最大的祝愿,希望这个专栏可以帮助你更快地实现这个目标。