从竞争力规划到APL

2021-06-04 12:19:12

今天在节目上,我们解决了算法编程问题。你知道你什么时候采访一份工作来编写CSS,他们要求你使用C和恒定的内存空间在白板上反转二叉树?这是那种东西。这些问题在算法编程竞赛中有他们的根源。我们的客人Conor Hoekstra是前竞争对手。

Conor的故事在大学时始于竞争编程竞赛。但是,如果你遵循一个长期且足够坚硬的单一想法,那就很有意思,你最终会在令人兴奋的地方,如写作GPU的软件。

对于Conor来说,这个想法正在寻找表达对编程问题的解决方案的完美方法。他的旅程将把他带入leetcode,进入梦想工作,一直到APL,这是更不寻常和模糊的编程语言之一。

订阅这里

注意:此播客旨在听到。如果您能够,我们强烈建议您倾听Theaudio,其中包括强调亚当页面:您好,欢迎科委员会。我是亚当戈登贝尔,主持人。每一集,有人分享了一些建造的软件背后的迷人故事。

今天在节目中,我们解决了算法编程问题。你知道你什么时候采访一份工作来编写CSS,他们要求你使用C和恒定的记忆空间在白板上反转二叉树,这是那种东西。这些问题具有算法编程竞赛中的根源。我们的客人是前竞争对手。

Conor:我的名字是Conor Hoekstra,我目前是一个高级图书馆软件工程师,在Rapids QDF库上工作了NVIDIA。

亚当:Conor的故事在大学开始,当他在编程竞赛中竞争。但是,如果你遵循一个长期且足够努力的单一想法,那就很有趣,你最终有趣的地方,如写作GPU的软件。

对于Conor来说,这个想法正在寻找表达对编程问题的解决方案的完美方法。他的旅程将把他带入leetcode,进入梦想工作,一直到APL,这是更不寻常和模糊的编程语言之一。

但我想我已经领先于自己,这个故事是在2012年开始的,当时Conor仍在大学。

Conor:我当时不是计算机科学学生,但我正在服用一些计算机科学课程,我刚刚碰巧由计算机科学实验室走路。墙上有一片海报,说竞争计划比赛,免费披萨,星期六在午餐时见面。而且我喜欢竞争事物,听起来很有趣。我真的不知道它是什么。所以,我出现了。因此,我在西蒙弗雷泽大学学习,该大学是BC温哥华。我们有一堆计算机实验室。所以,它发生在那里。

如果我记得,大约有20到30人正在竞争。你基本上只是坐在Linux工作站上。他们给你一些指示。您代码和任何语言列表,但大多数流行的,C ++,Java,Python,et Qeta都是全部可用的。

您可以从开始完成解决方案。这是一个名为ICPC的比赛的资格赛,国际大学规划比赛。您必须从start划分的整个文本文件编码。

所以,如果您在C ++中执行,则必须包含所有包含陈述。你必须有一个主要功能。通常,它们为您提供了一个规范,因为您的输入将是表示T的一个整数,测试用例的数量,然后每次测试用例的五行,其中每行代表您需要解决的数据。因此,您必须负责在该数据中读取,然后将其输出到任何标准才能正确解决。

亚当:然后您提交文件,就像它是单个文件一样,您提交它,然后编译它。并且他们通过标准使用测试用例。

Conor:是的。所以通常,他们会给你两个或三个测试用例。所以,他们会给问题陈述。他们会给你两个或三个简单的简单,你可以测试,看看你是否得到了基本情况。

然后你提交一个。 C ++的CPP或。 py for python,然后它将违反一堆测试,并且您可能会收到失败。所以,如果你错过了一些角落案,也许这是一个空名单或一个空字符串,你没有照顾,它不会告诉你你失败了什么,它只是告诉你的你失败了。

你必须去你的代码并弄清楚,“好的,我错过的角落案是什么。”然后重新提交一旦你认为你找到它。然后最后,你会像传球一样得到,然后你继续前进到下一个问题。

竞技编程工作的方式您有一定的时间。对于这场比赛,这是两个小时。你有一系列问题。我认为其中有六个或八个。目标是尽可能快地解决尽可能迅速。

我在第一次尝试中,不知道如何实际提出问题。所以,我解决了我认为他们三四或四个并不明白你等待的时间暂停。所以,当还剩10分钟时,我走到了个人,教授正在竞赛,说:“嘿,我没有成功提交这些。”

他有点像我一样看着我,“这是一个全部目标。你在说什么?”他说,“你提交了多少人?”我说,“好吧,我已经解决了,但我没有提交任何东西。”所以,他只是有点摇了摇头,过来了。我最终提交了几个,但随后没时间了。

但幸运的是,有第二个限定符。所以,我有点回到了我的宿舍,弄清楚如何实际竞争这些。然后在第二个中,我做得很好,以便进入大学队之一。它就像B或C层团队。

亚当:所以,你加入球队,你兴奋吗?你有没有见过球队或者在你的球队中完成了什么过程?

Conor:所以,是的,一旦我们加入球队,就是三名成员。我们基本上有一次练习比赛。这只是一个学期。然后我们已经结束了所有三支球队,就像一个团队,B团队,而C团队最终进入了地区。

我们并没有结束这样做,因为我们正在与一直在竞争他们整个大学职业的人竞争,只是在竞争的编码上练习。因为已经越过初学者的一件事,它只是解决了简单的算法。中级级别,您需要了解基本上的算法类。但要达到超级先进水平,您基本上就是记忆所有这些自定义不同,如搜索算法。

等等,你会读一个问题并且知道,“哦,那是弗洛伊德插入名称,插入名称,你需要使用的特定算法。”这只是需要时间和精力。您实际上允许将预先提示的粘合剂带入这些比赛中。

因此,只要您能够认识到需要哪些算法来解决它,很多时候,它就是研究这些宇宙算法的时间和精力,否则您可能最终不会最终需要了解。

亚当:所以,你有一个带有所有这些标签的活页夹吗?你会翻到它,并开始键入它?

Conor:是的,是的。通常,通常,ICPC工作的方式,一旦您在域名中,您就有三个人和一台计算机的团队。因此,通常工作的方式是您有一个人编码了他们的解决方案,他们已经手写和解决了纸张。所以,两个人在纸上用代码手写,然后换掉键入。

因此,您基本上需要能够在没有键盘的情况下解决您的问题。还有很多时代,当你这样做时,如果你可以拉出一张纸,说“哦,这是我需要的算法,”你可以涂上一些纸张来读取它并读出或写出你的答案,你很高兴。

亚当:算法不能正确,它也必须是表演。因为每个测试用例都必须在两秒钟的CPU执行时间内处理。

Conor:对于简单的问题,它并不重要,因为输入大小并不大。

但是当你越来越难的问题时,你所做的第一件事之一就是你看起来是什么大小,所以它是一个10,000个阵列,你知道,基本上你只有1倍10到八个操作。因此,如果您已有1次10到您的阵列中的五个元素,则您知道的二次算法将要获取所谓的TLE,超出时间限制。

所以,就在蝙蝠,当你在这些更难的问题时,你正在看一个输入的大小,并自动排除一些蛮力二次算法,这也是问题的整洁部分,有人说,“哦,你怎么不只是这样做?”这就像,“好吧,我们知道这不起作用。”这导致我认为90%的人在那些问题中使用C ++,使用Python和C ++之间的差异将是一个接受的解决方案。

亚当:我猜它会让你整洁地洞察解决问题的复杂性,因为你有这种剪断东西,只要知道它不会是这个障碍。

Conor:是的。有趣的是,你知道你知道你有两秒钟来解决一些东西的现实世界中通常不会出现。所以,然后,“哦,我正在选择的算法,或者我写作的代码将被时间复杂性完全驱动。”

通常,您编写代码,然后您稍后会优化它,如果您发现某些东西太慢。你不是时候从时间复杂,然后向后工作。但它绝对是了解线性二次和登录和类似的东西之间的差异。

亚当:Conor的团队继续在太平洋西北地区竞争。区域人在大型计算机实验室中进行。

Conor:每个人都在电脑周围挤出。他们所做的是他们对每个问题都有彩色气球。所以,问题A将有一个红气球,问题B将有一个橙色的气球。

每当一个团队解决问题时,他们都会来带上这些氦气的气球并将其绑在你的电脑上。因此,您可以查看实验室正在发生实验室,并看到只有多少气球挂在某人的计算机上方,基本上是谁的获胜。

所以,整个部分,我认为是超级,超级凉爽。但是,是的,所以在那个区域比赛之后,我不认为任何SFU队伍,我想可能是UBC和斯坦福,他们通常是两支努力做到最好的球队。有时,伯克利突然出现在那里。之后,是的,这基本上是我大学竞争性规划职业的结尾。

亚当:五年后,竞争编码长期以来,Conor被邀请参加Bloomberg的招聘面试,为软件开发人员角色。

Conor:当时,我不是一个软件工程师本身。我是一名程序员,在我的日常工作中使用代码作为精算师。

所以,我为保险公司工作。彭博最终伸出了我。我说,“当然,我很想采访。”即使它只是学习它的样子。他们说,“好的,我们打算在一个名为Hackerrank的网站上采访。”他们有这种侧面网站称为Codepair,它可以根据Google Doc的那种实时流式排序,但具体与编辑器。

您实际上可以测试您的代码。所以,您编写功能,然后您可以在示例输入上测试它。他们说,“如果你不熟悉,请查看哈克兰克。这是几个问题。“那是我第一次听说哈克兰克。

所以,我最终解决了一些问题,以为它真棒。而且我就像,“哦,是的,这就像五年前我曾经做过的那样。”然后绝对绝对轰炸了面试。这太糟糕了。绝对是我生命中曾经拥有过的最糟糕的采访之一。

Conor:我们正在做封面。我不记得确切的问题。我非常确定它的答案是使用一个站点分区,这只是一个来自标准算法库的单个衬里,基本上,分区意味着每种语言的不同。但在C ++中,您将给出分区,基本上是一个容器,一系列元素和一系列谓词。它将所有元素放在开头上的一元谓词中返回的所有元素以及返回末尾的所有返回错误的元素。

所以,如果你有数字1到10,你做一个甚至是偶数,偶数2,4,6,8球在开始时出现,其次是1,3,5,7。所以,我很确定这是问题的答案是什么。我甚至不知道那个时间点是什么。所以,我不会写下来。

但它到了这一点,我需要知道如何,我认为,交换两个迭代器或类似的东西。并且我问是否有一个内置函数来交换两个迭代器。有。它被称为iter_swap。但是当时,我不知道它。和面试官说,“是的,有。”我说,“你介意告诉我它是什么吗?”他说,“不。”而且我很确定这只是热身问题。我偶然发现了我的方式。但是,我的面试结束是。

而且,这只是缺乏我对标准图书馆的了解。这只是一种眼部开放,因为我不习惯经典的大科技公司,他们只是要求您喜欢算法和数据结构问题。

每个公司,谷歌,Facebook,你叫做这一点,这是千万和数千份申请人,他们基本上有一个标准格式,他们手机屏幕。如果你做得很好,你就去了现场。然后在现场,你将纯粹是在数据结构和算法上的五个面试中有四个。

他们不在乎你在做什么语言。但是,你必须善于回答这些问题,这些问题不会在你的日常工作中出现。你将被聘用甚至写一些不利用这些东西的前端代码,但这就是他们测试你的方式。

所以,我基本上一直在一年多的旅程,只是试图真的,真的擅长他们称之为leetcode问题或又名竞争计划的问题。

亚当:我有类似的经验,在某些时候。我采访了,我不知道这是多久,我怀疑我比你年长。但我在堆栈overflow上采访了网站,他们告诉你问题的回答。而且我没想到,是的,这些算法问题之一,我只是轰炸了。

和那个正在做的人,他厌倦了世界。他可能每天有四个,几乎没有关注。他就像是第一个人。他们可能拥有这个巨大的漏斗,大多数人从未让它过于第一阶段。他几乎没有努力告诉我,“是的,这不顺利。”就像“我们只是要去这里挂在这里。我要说不。然后我正在下次会议。“

但我发现它超级痛苦被拒绝。因为我觉得我是一个很好的软件开发人员,不是那样的。我的意思是,你有这种反应吗?

Conor:老实说,我无法回答我的感受。我想可能是在我的那一刻,它有点不流明,因为你对这个机会很兴奋。

同时,我对自己的观点是我不是一个真正的软件工程师。我甚至不认为我有资格参加这次采访。我只是在接受它,因为我想,到底是什么,最糟糕的是可能发生的?然后可能发生的最糟糕的事情发生了。

但我的想法更多,我已经经历了一些哈克兰问题。我知道这是我可以非常擅长的东西。我看到了面试格式。所以,它冒着炸弹,但我知道这只是时间和精力的问题。这些类型的问题与你在精算科学中所做的事情和这些疯狂的五个小时考试相比,他们让你拍摄,这似乎更容易做到。这只是你需要的时间和精力。

还有很多人会告诉你,这只是令人沮丧的是,与你的日常工作无关。而且需要时间和精力,人们很多时代就像,“好吧,为什么我要去了解这种额外的技能,以便做出我已经知道如何做的事情。“我完全同意这一点。

这是一个破碎的模型,但我觉得它是关于民主的同样的报价是最好的最糟糕的政府形式或任何我们拥有的东西。您如何做详细的面试过程,这些过程并不偏见的人的人口统计?

这是它的准则标准化,但也看起来不仅仅是你的能力,这是一个难以解决的问题,这是这些大科技公司目前的最佳解决方案。

亚当:经济学家有时会谈论大学是否实际上是有价值的或是否只是一种信令的形式。为了教育以信令工作可以像这样一样,我想雇用人,但我希望他们成为智能性的前20%。

所以,我只是找一些酒吧,获得物理学位,与我准备好的工作无关。但它有效充当屏幕。在一个纯粹的信号世界中,进入物理学计划的人没有更聪明,并且没有更好地完成我想雇用他们的工作。

但是,我从那个池中招聘了那些人的所有人都被预先筛选。进入物理学的人,他们在该计划中没有学会,但他们没有购买该信号,说我能够通过这个程序。因此,在纯粹的信号世界中实际上没有教育价值。但它仍然可以是一种有效的方法。

在更大的意义上,这可能不太好。但是,在经济意义上的双方都可能有动力做这样的事情。我认为像一个编码挑战,你可以那样看待它并说,就像“,这与你的工作有任何关系。但我们知道通过这些人的人似乎能够完成工作。“

Conor:是的。这种过程背后可能很多,即使是某些职业背后的许多凭据。你会听到人们的谈论,“好吧,这次测试,这不是我实际上学习技能的东西,无论域名是什么,在我的日常工作。这只是一个箍。“

但是,他们因为这个原因而让人们跳过这个箍。可以通过箍跳过的人通常,它与能够妥善执行的相关性,而这种专业是对行业负责的任何相关性。

亚当:现在,Conor知道篮筐是什么,他只是必须跳过它。由于他具有竞争力的编码经验,他实际上有一个很好的策略,让他需要通过这些求职面试。

Conor:基本上,LeetCode每周六都有一场比赛,具体取决于您的时区。它通常在东部标准时区的晚上。我每周都会这样做。

然后所有其他网站,哈克兰克,墓碑,Topcoder,Hackerearth,还有几个其他网站,他们有竞争有时他们每月一次,有时他们每周。 因此,您认为没有缺乏比赛的缺乏,我认为是模拟面试经历的最佳选择。 但是积压中也有数千个问题。 你可以看看所有这些过去的比赛,只需解决你想要的任何一个。 我慢慢地,但肯定只是开始竞争和练习。 每当我愿意的时候 ......