您还未登录! 登录 | 注册 | 帮助  

您的位置: 首页 > 业务知识 > 正文

入职优秀科技公司,竞争性编程是必须的吗?

发表于:2020-07-22 作者:读芯术 来源:读芯术

本文转载自公众号“读芯术”(ID:AI_Discovery)

我一直对身边科技所能做到的事情充满敬畏,直到后来遇到基础编程,我才开始得以管中窥豹。读大学之后,我逐渐意识到,在亚马逊、微软、谷歌和脸书这种每天都能在科技领域取得突破性进展的公司里,想成为一名软件开发人员必须付出艰苦努力。

大学生涯中,我印象最深的事情就是人们对竞争性编程的狂热。第一年参加代码俱乐部培训时,有人告诉我,如果想进入像谷歌这样的公司,就必须在竞争性编程领域表现出色。于是后来我做了竞争性编程,主要是线上编程平台Codechef的每月定期挑战,持续了大约6个月。

现在我的大学生活快结束了,也成功入职谷歌成为一名软件工程师。我想谈谈我对竞争性编程的看法,准备面试时应该关注什么,以及竞争性编程是否真的是入职FAANG顶级科技公司的关键。

本文并非阻拦大家做竞争性编程,相反,我鼓励那些不喜欢竞争性编程但希望提高自己解决问题能力的人申请大公司软件开发人员职位。

什么是竞争性编程?

维基百科是这样解释的:竞争性编程是一种常通过互联网或本地网络进行的智力运动,参与者按照既定的规范编写程序。

有很多求职心切的程序员为了面试而参加竞争性编程。作为大一学生,最初我和大多数朋友所听说的竞争性编程都是这样的:“进入谷歌或脸书这样的公司的秘诀”。这听起来太有吸引力了。

然而,直到我亲身准备过这些公司的面试之后,才认识到这些想法中的谬误。我会告诉你它为什么不是实际的解决方案。但首先,让我们深入研究一下竞争性编程对大家有什么好处。

为什么竞争性编程这么有魅力!

在我短暂的竞争性编程旅程中,有一点是无法否认的,没有什么能取代那种你的解决方案被采纳的感觉。无论是旷日持久的Codechef比赛,还是Codeforces的回合赛,这种感觉都是不可替代的。

我刚上大学便开始做竞争性编程,几乎立刻就上瘾了。各种各样的问题,棘手的优化以及随之而来的肾上腺素激增,足以让我六个月完全对它全情投入。

竞争性编程真正帮助到我的,是理解不同的数据结构和算法的细微差别,以及基于不同语言的优化如何让自己走得远。还有最重要的,明白耐心对解决问题的关键意义。如果有人一起做竞争性编程你会收获更多,因为你们可以互相学习,让这个过程更快速、更有趣。

此外,对于像脸书黑客杯(Facebook Hackercup )和谷歌全球编程挑战赛(Google’s Code Jam)这样的竞赛,熟悉竞争性编程是一大优势。然而,除此之外也无太多实际作用了。毕竟,竞争性编程归根结底是一项旨在更快解决更棘手问题的运动。

到底有什么问题?

在Codechef推出了自己的分工体系后几个月,我暂别了竞争性编程。虽然分工体系本身并不是我退出的根本原因,但它确实是一个导火索。

对于一个刚开始编程的人来说,竞争性编程能带来的学习经验绝对是惊人的。然而,初学者所能学到的特质并不是竞争性编程所独有的,而是在这个过程中广泛地练习数据结构和算法所带来的。

我最终意识到了这点,也意识到整项运动会转向以数学为重。到了一定难度后,这项运动终会转向数学密集型领域,需要我们深入钻研数论和几何学,门槛很高。

此时,这些题目不仅对我的面试准备或软件开发经验没有帮助,而且作为一个竞争性编程程序员,仅仅为了保持我的等级和表现分数而去付出额外的努力,会给我带来损失。虽然竞争性编程本身很有趣,但它非常耗时,并且收益严重递减。

那我如何备战谷歌面试的呢?

“你必须通过Codechef来搞定谷歌和脸书的面试”,这样的想法已经影响了很多人。我认识的一些人,尽管他们解决问题的能力很优秀,但因为不是竞争性编程的忠实拥趸,所以他们甚至都不会试着申请这些公司。

作为一个很早以前就放弃竞争性编程但成功通过了面试的人,相信我,即便你不深入竞争性编程的牢笼也能通过面试,很多真实成功的例子都能证明这一点。

如上文所述,竞争性编程真正帮助到我的,是我对数据结构和算法的基础理解与亲身实践。然而,竞争性编程的目的并不集中于此。

像HackerRank和Leetcode这样的资源拥有大量有价值的练习题,题目根据难度适当排序,也根据概念进行了标记,方便大家了解并练习所需的主题。我就是主要用这些资源来准备谷歌编码面试的。

Hackerrank为代码零基础的人提供了一个特殊的30天编码轨道,使其可以获得适当的熟悉度。此外,由于这些网站的数据结构和算法更多是为了帮你在面试中表现更好,因此你不需要特地花更多时间去搜寻以往面试中的例题就能达到熟悉题目的需求。

Leetcode和Hackerrank这样的平台虽然与竞争性编程网站有共同之处,比如在用户界面、提高解决问题能力方面,以及需要使用数据结构和算法优化时间复杂度和空间复杂性的问题等,但相似点也就仅止于此了。

我记得我读过Quora网站上的一个答案,它的比喻非常妙:

“你的想法好比通过骑自行车来训练跑步。诚然,这比躺在床上看电视要好得多,而且很多跑步也需要用到的器官系统也参与其中。如果你在没有运动背景的情况下开始训练,你或许会看到跑步有很大进步。但同时,其实这不是‘正确’的训练方式,职业运动员不会这么做的。”

同样,虽然竞争性编程囊括了一些面试准备基础,并且LeetCode在某些方面与Codechef和Codeforces等竞争性编程网站相似,但它们本质上是两个完全不同的东西,关注的是两个完全不同的用户体验目标。

但是LeetCode是不是足够?

虽然Leetcode并不能实际解决面试问题,但它能帮你积累面试经验。同样地,把时间投入到YouTube上的可用资源中,用Back toBack SWE和Nick White这样的频道也可以更好领悟如何解决问题,提高解决问题的能力。

不必为了竞争性编程而沉浸在复杂的数论和几何概念里,你可以在实际的软件开发项目上更好地利用时间。如果想进入网络和/或应用程序开发领域,就更得亲力亲为——这些技能不仅能帮你获得更好的实习机会,也可以获得实践经验,二者都将有助于打造出一份有吸引力的简历以申请FAANG和其他大公司。

申请简历上不需要竞争性编程经验!

关于竞争性编程的另一大误区是:若在Codechef和Codeforces上加上你的评级,你就会成为公司招聘的首选。

虽然良好的评分证明了你在解决问题方面有丰富的经验,但它并不能掩盖住你在进行编码面试笔试时互动的不足。真实面试中的问题更主流,相对来说也比竞争性编程更简单。但面试中的主要挑战在于与面试官互动,并在面试中解释你的思维过程。

另外,面试中的问题通常是开放式的,可供被面试者提出恰当的问题以获取更多信息,这也是一项你需要自己学习的技能。

单就申请而言,虽然竞争性编程等级有其优势,但实习经历、自己的项目,以及在像Hackathon大赛中获得的荣誉,同样也能丰富简历,也一样会受到面试公司的高度重视。

你可以通过领英(LinkedIn)与招聘人员和内部员工联系,寻求推荐,你的领英档案情况通常反应出你的技能。很多人也倾向于通过公司的人才招聘网站直接申请。就我而言,我认为我在三星的实习经历是谷歌首先考虑面试我的原因。

还应该做什么准备?

准备面试的一个主要部分就是要多多进行模拟面试。谷歌只有一次面试机会,在Pramp等服务器上进行模拟面试,或在YouTube上观看比如interviewing.io频道的面试直播,可以让你做好充分准备,在实际面试中不紧张。

谷歌在YouTube上有一个完整的播放列表,专门让求职者熟悉他们的招聘流程(https://www.youtube.com/playlist?list=PLllx_3tLoo4c_aR8RKOOnizL5LiUH02YF),其他大型科技公司通常也会借助博客、YouTube和领英使求职者更轻松方便。尽量利用互联网上所有可用的资源,这些公司的现任和前任员工也会在GeeksForGeeks和LeetCode Discuss等论坛上发布面试经验。

所以,是时候纠正这个思想误区了。想在科技公司当软件工程师,竞争性编程并不是必经之路。曾经因此绕道而行的求职者,该给彼此一个机会了!