刷了 500 个力扣(Leetcode)题之后,我学到了这 5 件事
神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。
编者按:找开发方面的工作或者从事开发工作的人应该都听说过Leetcode(力扣)。这个网站汇聚了大量包括大厂真题在内的技术面试资源,拥有丰富的题库和活跃的社区,是很多找开发工作的人都离不开的一个必备网站。但是,也有说法认为这种题库只是纸上谈兵,对实际工作并没有太大帮助。在这里做过大量练习的Federico Mannucci谈了他的感受。原文发表在Medium上,标题是:Five things I have learned after solving 500 Leetcode questions。
想找软件开发工作的任何人应该都非常了解Leetcode(力扣)。因为这个网站收集了最吃香的一些公司(如Google、Facebook以及微软)的技术面试时问题和解决方案。
这类涉及数据结构、算法的面试问题甚至在小一点的公司当中也越来越受欢迎,但很多人对此却感到沮丧,因为他们认为知道怎么解力扣的题目并不是自身工作能力的真实反映。
不知道怎么解力扣题未必就说明你是个糟糕的开发者,这一点我也同意,而且你在工作过程中可能永远都不需要倒置一棵二叉树这一点也是事实,但在力扣这里多练肯定是可以教会你一些东西的,这对于你的职业生涯一定会有些好处的。
1)数据结构与算法的重要性
力扣并不是数据结构与算法课,如果你以前没有准备过这门课的话,那绝对应该选修一门传授这方面基础知识的课程,这样才能有效地利用好这个平台,但是有一点力扣是很有帮助的,那就是它可以很好地帮助你深入了解数据结构与算法的原理,以及那些数据结构和算法最擅长的是什么。
坦白说,在数据结构方面打下坚实基础对于每一位开发人员来说都是必不可少的,我最近就碰到一个故事,讲的是一个非常简单的算法就把GTA V的屏幕加载时间改进了70%,而且根据我的经验,高效的实现可以让应用甚至处在压力下也能够平滑运行。
2)总会有比你更懂的人
在找到解决方案后,我通常会为自己写出的代码感到非常自豪,但是当我看到评论部分时,这种自豪感往往就会消失殆尽,因为你有时候会找到甚至比官方解决方案还要好的实现。
说实话,我在力扣练习的时候学到的内容有一半都是来自认真看别人代码并试着实施他们的建议。
要学的东西永远都是越来越多,这一点在工作中更是如此。我很幸运,有经验丰富的前辈帮我改进,这种向他人学习的心态让得以尽可能多地吸收他们的知识。
3)边界情况可能会毁掉你一整天
我在工作之前还没有那种感受,就算代码犯了点错误也没有太大的关系,特殊情况下才会发作的bug出现的几率很低,可以被忽略掉。
但现在情况完全不一样了,我现在是给生产代码库做贡献,会有成千上万的人跟我的工作进行交互,任何错误(甚至影响很小的半边街情况)都有可能出现,而且会给我们的客户带来不便甚至造成损害。
值得庆幸的是,力扣这个地方是个绝佳的培训基地,在这里每个问题都有数百个测试用例,而且往往也包括每一个边界情况——如果不对那些边界情况加以考虑的话,它们就会导致代码出问题。
我是在最近被迫跟数据库打交道的时候才认识到这一点的根本性的。当时那个数据库没有做出适当的约束,有很多行数据都包含有非预期值,幸运的是,我提前在代码中处理掉那些问题了,否则的话在生产环境下出问题就不得了了。
4)勤奋胜于天才······
(前提是)当天才没有努力工作的时候。我喜欢蒂姆·诺特克(Tim Notke)这句话,从我个人的经验来看,这完全也适用于力扣,我认识的很多很出色很有才华的开发者也无法解决大多数难度一般的问题,因为他们不了解该用什么模式,不知道使用合适的工具,没能开发出适当的结构来解决此类问题。
我刚开始的时候甚至比这还要糟糕,几乎任何一道简单的问题我都很难解决,但是在上了一些跟数据结构和算法有关的课程,并经过大量练习之后,我终于取得了进展,大部分的普通问题我都能搞定,而且是在合理的时间范围内解决的,甚至只用一半的时间也能解决一些难题了。
当我最近为了解决问题从Python切换到Java时,我再次确认了实践的重要性,我每天在工作中使用Java时,根本感受不到那种敏悟,大多数问题如果不去网上搜实现细节的话都解决不了,就像我是个初学者时候的样子。
但这并没有让我感到沮丧,现在我知道,只要有了足够多的练习,我用Java也会像Python一样精通。
5)计划是软件开发的重要组成部分
在练习以及实际面试中解决了许多问题之后,我很快就意识到编码只是整个过程的一部分,而在看完提示后马上就写解决方案也许是一个人能犯下的最糟糕的错误。
软件开发过程中充满了模糊性,总会遇到意想不到的结果,编码面试经常想要通过提供模棱两可或不完整的问题来复制这种情况,你得去跟面试官进行沟通,要求澄清并弄清楚可能的约束。
不仅如此,在编写实际代码之前,你应该先提出解决方案,分析其优缺点,只有在每个人都同意你所提出的建议是可接受的情况下才开始编码;如果你写的东西并不能满足时间和空间要求的话,等你意识到这一点时已经为时已晚,而且你也没时间去做出一个更好的实现了。
这一点在实际工作当中同样重要,如果你不先分析需求并仔细考虑可能性就开始写代码的话,那极有可能最终需要重构大部分的工作。
结论
就我个人而言,很幸运我喜欢力扣 ,而且我不介意就算不找工作也到那个网站去练习一下,但是我知道,也有很多人非常不喜欢它,觉得它其实并没有传授任何可以运用到实际工作当中的东西。
我希望这篇文章至少可以说服一部分人,情况并非如此,而且如果你被迫用它来准备面试的话,请至少试着从中获得一些有价值的东西。还有,如果你确实不喜欢它的话,外面还有很多工作是不会问你力扣问题的。
译者:boxi。