大家好,我是坚持刷算法的前端西瓜哥。
最近我一如既往地打开了 Leetcode 官网打算找道算法题做做,然后看到了一个 “关于 web 前端需不需要刷算法” 的讨论,觉得可以说上一说我的看法。
我个人觉得 web 前端是非常有必要刷算法题的。这对我们的职业发展和个人成长是非常有帮助的。
个人职业发展
算法题能够提高自己写出高效率代码的能力。
大部分的 web 前端开发不少时间都是在写业务代码,要用到复杂算法的机会并不多,通常就是切切图还原视觉稿、实现下交互、和后端对下接口。
但我们不应该将自己局限在写业务代码,有时候我们还是要写非业务代码的。
或许你会说可以找别人写好的轮子,但并不是所有轮子都能满足我们的项目需求,尤其是细分领域,有些时候还是得自己动手造轮子。
很多算法问题其实都是脱胎于实际的场景的,对我们写出好的非业务代码有不小的借鉴意义。
如果你不想成为一名打杂,刷算法还是非常有必要的。
代码更健壮
刷算法有一些好处,你会注重代码的可读性,使用可读性更好的变量名,不使用多余的变量,让代码尽量简洁。
在刷题中,你不得不考虑算法的各种边界情况,以便应付一些极端的测试用例。这能提高你写的代码的健壮性,写出 bug 更少的代码。
此外你也能学到一些有意思的算法技巧。比如,Flood fill 算法可以处理油漆桶填充图形的问题,前缀和技巧可以通过缓存快速求一些中间范围的值。这对我们做方案有一定的帮助。
我们看一些优秀源码时,代码里面可能针对场景做了特殊的算法优化,如果你刷过算法题,就能更好地理解作者这样写的意图。
面试的基本要求
随着近些年前端开发从业人员越来越多,很多公司的产品越发切进细分市场、复杂度越来越高,考察算法能力基本上是中大型公司面试的标配了。
面试大公司时,你可能在每轮技术面试都会被要求解答至少一道 medium 难度的算法题,偶尔也会出现 hard 难度的题。算法不好被刷的概率会增大,除非你的项目经验表现足够优秀。
中小公司则好些,多数不考算法题,或者出一道很简单的算法题。
如果想让你的职业发展有更多的机会的话,建议你刷算法。
面试中能够做出所有的算法题,面试官不免会高看你一眼,有非常好的初步印象,提高你斩获 offer 的概率。
场景方案的思考
我们在开发中完成需求,经常会有多个解决方案,认真根据场景权衡不同方案的利弊,从中选择最合适的方案,是一名优秀的程序员非常重要的能力。
刷算法题,其实就是锻炼这个能力的过程。
不少的算法题的解法很多。有的解法空间复杂度高但时间复杂度低,有的时间复杂度高但空间复杂度低,有的实现起来很简单,有的性能更好但实现复杂容易写错。
虽然在刷算法题中,通常时间最快的算法是正解,但也有不少加了时间复杂度限制的题目,你需要分析不同的方案,找出对应场景最合适的解法。
我们在做题中,对每一个解法的利弊的分析,也是面试中重点考察的内容。
“与其刷算法题,还不如多做点项目”
也有人说:“与其刷算法题,还不如多做点项目”。其实这两点并不冲突,我们的业余时间不可能全部用来刷算法题。
刷题应该是我们能力提高的一环,而不是全部。我们除了刷算法题,还可以学习其他的知识,读书、学习理财知识、做点个人项目、像我这样写文章,都是可以的。
并不是说,我们刷了算法题,就没时间做其他事情了。
我是推荐每周完成 5 道算法题,周一到周五每天一道,哪天没完成,周六日再补上就好了。
像玩游戏一样刷算法题
首先我们不要想着算法能够速成,能够短时间就能大幅提高,它是一个慢慢积累的过程。
你应该像玩游戏一样,每天打一关,一点点地收获熟练度并提高难度。应该带着去通关一个有难度的游戏关卡去对待它。即使今天完不成,明天我们再尝试,不行就看攻略。
Leetcode 其实是一个非常好的提高自己算法能力的平台,因为它有覆盖度足够的测试用例,能让我们每次提交都能获得反馈。
相比自己工作中写出的代码,不知道部署到线上什么时候会导致事故,Leetcode 的反馈是即时的,对我们快速提高能力有非常大的帮助。
结尾
无论是什么程序员,我都建议他去刷算法题,因为算法能力是一名程序员的基本素养。
我是前端西瓜哥,感谢您的阅读。