You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
9.0 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 结束语|在技术的世界里享受思维的乐趣
你好,我是微扰君。
不知不觉,我们的专栏就要暂时结束了。
不知道你在学习的时候有什么感觉,这个专栏对我来说算是一个很大的挑战,长达半年的写作可不轻松,甚至可以说是“痛苦”的。
说这个专栏挑战大,主要因为涉及的内容广泛,如果你从头到尾跟完专栏也一定会深有体会。从最基础的数据结构和算法原理,到操作系统、计算机网络这样的计算机基础知识,再到解决真实生产环境下不同系统所面临的各种不同问题的算法,我们都有所涉猎。
学习了这么多不同领域的算法,相信你也能充分感受到我们一直在强调的观点:学习算法绝不只是为了应付面试,事实上算法在真实的生产环境中是有很大用处的。**只不过很多时候,这些真实的算法问题比较复杂,比起业务问题也更为通用,所以有很多前辈们把这些复杂性都封装了起来**,给了我们普通业务开发工程师们一个看起来简单的编程世界。
但如果我们想在技术的世界里走得更远,那么,勇于揭开这层漂亮面纱,直面系统中的复杂性,就是我们必须要迈出的一步。
但是作为普通的工程师,选择直面并不意味着之后的困难减少了,我们在深入学习的过程中可能会更“困惑”。在写专栏的时候,我也尤其有这个感受。
在开始写课程目录的时候实际上我列出了60多个算法主题觉得很值得讲、很值得学。但是编辑提醒我说学习这个活动想要尽可能持续地进行必须要考虑到时间和体量后来和编辑一起来回好几轮才删减到40个左右。而好不容易等课程框架通过仔细的思考设计好了本以为后面就一片坦途结果挑战依旧远超想象。
最大的困难就是在实际落地写的时候,我经常发现有些问题想要讲清楚,需要的篇幅比当初想象中要大得多,必须不断地对内容做修剪,力求在篇幅内讲清楚每个核心问题是什么、为什么有这样的问题、大致的解法是怎样的,尽量删减掉一些不那么重要的技术细节。
当然,最后的成品我还是比较满意的。今天回看前面的每一讲,虽然并不算太深入,但应该还是足以开拓你的技术广度,如果你想深入研究某个相关技术,现在估计也有点线索了吧。
值得讲的算法远比在专栏中讲到的多,但是我们都是在学习的路上,又有谁能走到尽头呢。
毕竟,计算机和互联网发展了这么久,不同场景下的技术问题本来就层出不穷。**直到现在很多问题也依旧会拿出来被反复讨论,不断有更好更新的解决方法被提出,而未来,也必然会有各种各样新的问题被提出**。
所谓,罗马不是一日建成的,整个计算机的世界正是这样演进了几十年。比如早期,计算机都是单机的,无论是计算能力还是存储能力都非常有限,我们依旧在这样的硬件基础上造出了非常复杂的系统,比如操作系统、文件系统、数据库等等,随便一个成熟的项目可能都有十几万行以上的代码;而现在,随着硬件能力的提升和数据爆发式的增长,在分布式环境下,我们面临的挑战当然会更大,除了要解决很多新问题,也要重新解决一些老的问题。
想解决这些问题,除了需要一些天才的想法,更大程度上需要程序员能对之前系统有深刻理解。但想一个人把这些问题全部涉猎是不切实际的,**我们能做的、更应该花时间做的,就是通过了解和学习其中一部分经典问题,获得解决另一些问题的思路和方法**。
而学习这些问题的时候一定要注意溯本求源,这才是学习最好的捷径,只有先搞清楚“为什么”才能真正搞清楚“怎么做”;这样再碰到新的问题的时候,我们才能站在巨人的肩膀上继续前行。
那过去几十年里,无数不同国籍的工程师和科学家正是这么做的,他们通力协作,一起打造了我们如此繁荣的计算机世界。
总的来说,虽然没有办法把前人的智慧在专栏中全部展现给你,不过你可以把这个专栏作为一个简单的算法索引,帮助自己更快找到感兴趣领域内的一手资料,比如论文或者项目源码,后续进行更深入的研究。**希望通过这个专栏的学习,你能多掌握一些前人们解决不同问题的思考角度,至少,希望他们能给你的工作带来一些启发和乐趣**。
在整个专栏的写作过程,除了“痛苦”和“困惑”,我也确实感受到了很大的快乐。
其中一部分快乐当然来自于完成专栏的成就感,无论是许多读者的订阅和留言,还是社群里大家的讨论,都让我感受到自己在做的事情是很有意义的。但更大的快乐还是来源于对知识的反复求证和探索(毕竟我更多时间在写:))。
专栏里很多主题的算法,我在工作中其实也没有太多机会使用,所以为了把问题讲清楚,在写的时候,我反复看了很多项目的源码、文档、博客,还有论文,力求将问题理解透彻。在这个过程里,我发现了很多以前没有注意到的细节,以及理解错误的地方,也对很多概念有了更系统的认知,可以说在欣赏前人的智慧之光中,我获得了无与伦比的快乐。
比如在讲字符串匹配的章节里,我第一次系统地梳理了各种求解字符串匹配的方法和思路,研读了 Boyer Moore 算法复杂度的证明并自己做了实验对比了几种算法的效率这让我对这个问题有了比以往深刻得多的理解也更惊叹于Boyer Moore算法的巧妙和在实际生产环境下的高效性。不知道你在学习哪些章节的时候有没有类似的感受。
在过去的工作中,我认识了许多不同的工程师,其中不乏优秀的同事,但也有很多同事对技术问题的理解不那么尽如人意,在他们身上,我观察到一个显著的区别:**优秀的同事往往对技术本身有着更强烈的好奇,比如出现一些事故的时候,想办法快速解决问题之后,他们往往会做更深刻的复盘,去了解相关中间件或者代码背后的运行机制,甚至还会做一些分享**;而技术一般的同事,往往懒于做更多的研究和探讨。
其实,对于大部分程序员来说,既然当初选择了编程这条道路,内心都是能找到对编程的兴趣,尤其是那些愿意投入时间主动学习的同学,没错,我说的就是在极客时间学习的你。
那如何能在日常工作中找到编程的乐趣呢?说实话,我个人觉得在日常的增删改查中找到乐趣还是比较难,因为这样的工作确实比较重复,这也是我自己花了很大的努力从前端转行基础组件开发的原因,但这个选择并不是适合任何人,毕竟大家的兴趣点不同。
但是我相信,对于大部分业务开发同学来说,只需要在日常开发中多多留心观察,
* 在碰到的坑的时候,多走一步,研究一下所用组件、框架或者语言背后的一些机制,很快你就会发现这些日常工作中能接触到的程序,其实设计得都非常巧妙;
* 然后,你再想一想如果由你来设计相关的组件又会怎么做,或者,对比一下以前见过的类似组件的工作原理有没有什么差异;
* 最后,和身边的同事一起讨论分享一下。
相信我,只要你坚持这样做,一定可以收获思维的乐趣,并且有一天你也一定会发现,自己对技术的理解进入了下一个层次,因为这些日积月累的知识,早就悄悄地融进你日常的代码和设计中了。
最后,谢谢你学习这个专栏,如果你在学习之后还根据思考题,自己做了一些相关的课外阅读或者动手实验,这些努力一定不会白费,这两件事在算法专栏的学习中其实起着更重要的作用。
专栏暂时结束了,但我们的技术之旅还在继续,**这次的结束只是我们的新开始。我会继续更新若干篇更进阶的加餐和修订过去的章节**6讲高手番外会在接下来的一个半月内持续更新还有很多评论我还没来得及一一回复这些我都会在未来一段时间内抽时间完成。
在专栏要暂时结束的今天,我也非常希望能听到你的声音,点[这里](https://jinshuju.net/f/HzWMHi)参与问卷反馈。如果哪天你发现自己在工作中用到了相关知识点,也欢迎你常回来复习留言。未来,你一定会有更多的问题需要解决,希望有了这个专栏能让你解决那些问题时更加从容一些,也更加快乐一些。
在技术的世界里享受思维的乐趣,这是我对你最大的祝愿,希望这个专栏可以帮助你更快地实现这个目标。