最近在知乎里看到了一个很有意思的问题,很有感触,就和大家简单聊聊。
其实不只是在知乎,平时也有很多同学问过我这个问题,尤其是在他们刷LeetCode刷得头疼,不知道这些题目刷了有什么用的时候,估计这种心理最是明显。
在我看来,这个问题之所以会产生,只有一个原因就是搞错了学算法的目的。因为我们从小到大接受的教育都是学以致用,学了就是要拿来用的。反之一个东西如果没有用,那么我们自然也没有必要学,因此还产生了屠龙术这么一个专有词语,描绘那些高大上但是却毫无卵用的技能。
而算法呢就是这样一个学来乍一看和仔细一看都没什么用的技能,很多人不敢承认这一点,可能是担心真相打击大家的积极性,也可能是深受学以致用这一传统观点的束缚。所以有很多大V强行列举出许多算法的用处来证明学算法是有用的,你看某某场景某某场景就用到了某某算法,你不学能行么?
但实际上这些用到高端算法的场景凤毛麟角,我就不谈acm-icpc竞赛当中用到的一些高级算法和数据结构了,很多我高中竞赛时候学的算法至今也没有在工作当中用过,哪怕一次。即使是机器学习、人工智能这些新兴算法也是一样,在日常工作当中在有现成的库或者是其他人已经开发好了的模型的时候,我们也是不会自己从头到尾复现论文或者是自己做一个模型的。原因也很简单,因为成本。有现成的用当然要比自己重新写一个更快。
当然这只是我的个例,但也看得出来算法的实用性真的不强的。所以相比于强行给自己或者是初学者找学算法的借口,倒不如大大方方地承认,算法这个东西它本身就不是一个实用性非常强的领域。所以问题来了,既然不是为了实用,那么我们为什么又要学习它呢?
这个问题的答案和我们为什么要学数学是一样的,反智主义者们经常挂在嘴边的一句话就是买菜只要十以内的加减法,高数这种东西学来干嘛。
碰到这样的问题去纠结是不是真的用不到没有意义就走偏了,很多看起来用不到的东西可能只是时候未到。这个和玩游戏有点像,有些英雄是前期英雄有些是后期英雄,有些技能前期的时候简直是bug,到了后期废柴的不行。同样自然也会有一些技能前期的时候看起来平淡无奇,但是到了后期至关重要。游戏还有可能前期结束战斗,但人生总是要拼后期的。等到了后期阶段的时候再点后期的技能往往就晚了,技能点不够用了,需要我们前期的时候提前布局。
比如高数就是一个非常经典的例子,几乎所有理工类的专业深入研究之后都需要用到高数,微积分可以算电流、电容、能量,还能算宇宙的各种粒子的运动情况,还能算化学反应的进行程度,也可以推导神经网络的梯度公式……这么多领域当中只要涉及一个,就必须要用到高数,这个时候你还能说高数没有用吗?
算法也是一样的,殊途同归。算法培养的是我们的思维,既给我们提供了种种可以参考的模板、脚手架,也提升了我们思维的能力。举个简单的例子,当你理解了各种复杂的树结构,理解了平衡树各种旋转操作,再去学决策树、随机森林的时候,你会自然而然融会贯通,原理一看瞬间理解。因为你的脑子里有了参考,可以瞬间建立联系,自然学东西更快,理解得更深刻。
在当今时代,大数据、大流量是主流,几乎无论什么岗位到了后来都离不开系统设计。而系统设计不是说闭门造车,随便设计一下可以用就行。不但要包含业务发展需要的所有功能,还需要为将来的拓展做好预留和准备,并且还要注意一些技术痛点。到了这个时候,你就会发现对高并发的各种中间件、框架、系统设计没有深入的思考和理解是玩不转的。强行设计只会纸上谈兵。
因为设计出来的系统运行的环境绝不是理想环境,一定会有各种意想不到的情况发生。像是什么内存爆了,系统扛不住了,延迟太大了下游抱怨了等等等等。相比于设计系统,解决这些意想不到的问题才是真正的考验。因为我们看到的现状都是表象,真正引发问题的核心本质是需要自己通过理解去捕捉的。内存不够就加内存,并发扛不住就加机器只会欠下越来越多的技术债,直到崩盘的那天。
我们拿后端举个例子,对于后端工程师来说,前期的时候几乎和算法没什么关系,无非是做做增删改查,写写业务逻辑。
但是真到了需要系统设计的时候,你会发现分布式和并发是一个绕不开的问题。而并发和分布式天生又会产生许多问题,比如著名的一致性问题。举一些现实一点例子,比如当用户多次提交或者是网络延迟导致数据重复发送的时候,怎么保证逻辑上最终只会执行一次?对于一个分布式系统来说怎么加锁?怎么保证多台机器之间的数据、状态共享?
而分布式的一系列问题、中间件、工具以及理论,本质上就是一系列算法、数据结构和软件工程的结合体。像是SkipList、B+树、LSMT、布隆过滤器等等数据结构都是在分布式场景当中有实际作用的,显然这些内容没有一定的算法和数据结构功底,几乎不可能吃透。
这就是为什么大家叫得出名的外企那么看重候选人的算法能力,甚至很少考察其他方面。而且有些企业的岗位分配也不是固定的,我就听说过有后端出身的被分配去了前端组,我也曾替他担心过,但很快就听说他做得有模有样照样风生水起。其实想想也不意外,能硬着头皮把这么晦涩算法啃下来的人,去理解业务逻辑、一些框架和工具的使用,显然毫无压力。
说了这么多,其实都是在说一点,算法是一个后期技能,前期看起来废柴不代表不重要,它越到后期威力越大。最后放上这篇回答下的高票回答做个结尾罢。
好了,今天的文章就到这里,感谢大家的阅读,喜欢的话不要忘了三连。