我如何在亚马逊上建立自己的职业生涯,在那里我被误认为

今天,我在亚马逊庆祝成立五年。在这段时间里,我将超过500,000行代码转移到生产环境中,检查了他人的代码500多次,设计,开发,部署和支持了大型系统,这些系统已被世界各地成千上万的客户使用。我被认为是团队中领先的技术领导者之一。



但这并非总是如此。2015年,我获得了一流软件开发人员的工作。并且徒劳。我是一个真正的冒名顶替者。但是我微不足道的工程技能并没有阻止我最终晋升为第二名。我想分享我的故事,以帮助其他冒名顶替者在FAANG公司(或其他公司)中取得成功。



我如何潜入亚马逊



我很钦佩那些在FAANG公司之一中经历了整个甄选周期的人。这是从早上到晚上的一系列采访,在此期间,应聘者会被问及公司五名不同员工的技术知识和个人素质。要通过此考试,您需要花费数百小时的准备时间,全面研究复杂的数据结构和算法,并解决数月的问题。所有这些都需要与出版书籍一样多的耐心,决心和毅力。



我走过了所有这些困难。 2014年,亚马逊在校园内为暑期实习生进行面试。我的一些同学在我之前去了那里。他们都带着他们被问到令人困惑的编程问题的故事回来了。



那个星期我有四次考试,平均每天睡四个小时。我设法花了三个小时准备。有两次采访。我遇到的编程问题非常容易。一个是关于位操作,另一个是关于使用链表,我还必须谈论哈希表。就这样。我真幸运。



亚马逊的实习生如果做得好,会收到一份邀请,要求他们转到第一级入门级的全职开发人员。他们不必重复采访。我在西雅图实习-从头开始刻苦地雕刻Ruby on Rails网站。得到了要约,并于2015年在弗吉尼亚州开始了他的软件开发业务。



关于我知识的匮乏



排名第一的开发人员应该精通高级数据结构:堆,图,前缀树。我什至不知道这些词的含义。等级1的开发人员应该能够估计用于排序,搜索,插入和拆分的算法的时间和空间复杂性。我不会告诉您二叉树中平庸的深度优先搜索的时间复杂性。



为什么我会有这么多知识空白?有两个原因。



首先,我学习计算机工程,而不是计算机科学。重点是软件和硬件的集成,而不是大型系统的开发。这个方向教会了我在可疑条件下解决复杂问题的能力,但是该程序根本没有提供对数据结构和算法的详细分析。其次,我没有经过全面的准备过程,没有花费数百小时的学习时间,这就是为什么我没有学习。



我自己意识到我没有跟上。起初,冒名顶替综合症用可怕的力量折磨了我。



第一煎饼



每次代码检查都是一场灾难。我提交了一个代码段进行审核(例如,以接受更改的请求的形式),它以80条评论返回给我。不会的 我已更正并提交了新版本。五十多条评论。不会的 等等等等。



由于有一些片段,事情是如此糟糕,以至于同事们根本不知道如何向我解释问题的实质。他们必须下载代码并重写。他们想帮助我,而且非常友好,但是我实在很me愧。我一直担心人们会理解:我不属于这里。没有一个工作日过去了,没有想到今天我会被解雇。



暴露冒名顶替者



我一点一点地振作起来。最后,我开始按时完成任务,并将代码始终投入生产。大约九个月后,我有了自信。我认为是时候彻底摆脱假冒者综合症了。我转向LeetCode上的问题,只是为了向自己证明我在我的位置上。我记得当时在想:“我现在是Amazon的成熟开发人员。我有投入生产。为什么我不能应付这些简单的任务?”



我在LeetCode上选择了一种简单的方法-但我无法解决。我选择了另一个-我也不能。第三和第四。然后对我来说我显然没有患任何综合症。我是冒名顶替者。



是,似乎不是



两年半后,我被提升为二线开发人员。第二级别的开发人员能够在很少的外部帮助下自行创建和维护大型系统。那我该怎么做呢?我如何以我的意愿重新诠释游戏规则?



好吧...没办法。在亚马逊,恶作剧不起作用。无法重播系统。 “假装成为专家直到成功”是一个非常普遍且非常糟糕的建议。这是行不通的。要让自己成为二级开发人员的唯一方法就是成为二级开发人员。



晋升是一个艰苦的过程。您需要在20多页的文档中描述您的优点和成就,以至于同事和老板都相信。您需要不断收集指标和证据,以证明您的成功更高。仅当您连续六个月甚至整年都保持下一个水平的门槛时,您才能指望增加。



您可能已经听过这样一句话:“我们的个性是由我们定期做的事构成的。” 下面,我将告诉您为阻止冒名顶替并成为高级开发人员而采取的行动。



我做了什么



调整以最大程度地提高反馈接受度



FAANG的新手经常会自我膨胀。这剥夺了他们接受和考虑同事的建设性批评的能力。但是这些同事是聪明的人,每个人背后都有他们在IT领域的独特经验。



我的自尊心没有任何问题。以友好的方式,我与公司无关。因此,当我得到反馈时,我会认真听讲。



同事的言论是正确的,有争议的或不正确的。如果这句话是正确的,我会毫无保留地听从建议。如果是有争议的事情,我首先尝试理解另一位开发人员的观点,然后才传达我自己的观点。而且,突然之间,我在听错误的言论。



在这种情况下,思路是:“为什么我确定我是对的?是什么导致一个人产生这样的想法?我能以某种方式澄清,以免发生这种反应吗?”这就是我所说的最大开放度。聪明的人,即使他们错了,也要从结论中得出一些结论。我弄清楚了它的来龙去脉,并牢记这些信息来改进了我的代码。



提出愚蠢的问题



FAANG公司的新手经常尝试不提出问题-他们担心自己会被认真考虑。冒名顶替者综合症的这一要素与自负的自相矛盾地并存。好吧,作为一个真正的冒名顶替者,我完全理解我的问题很愚蠢。它没有打扰我。



例如:



« , . , ?»



« , ?»



« , . - ?»


很快,我掌握了数百个书签,收集了大量信息,并非常成功地参加了会议。



创建了一个Restless代码检查器



首先,尽可能多的其他开发人员检查您的代码非常重要。每位进行检查的员工都会有自己的喜好,,, pet恼。但是找出不安定的检查员更为重要。



任何团队中只有一个。他的工作从不满足。它紧贴每个变量,每个日志,每个选定的API参数的名称。我特别努力地找到了这个人,并尽可能多地将我的密码扔给他。为什么?因为我理解:我收到的建设性意见越多,培训就会越快。



使用现有的设计来避免错误,



青少年们经常尝试重新发明轮子。大多数开发任务都不是新鲜事物。在开始编写请求的代码之前,我正在寻找内部资源的类似解决方案。我浏览了几个不同的示例,研究了其中代码的结构。然后,我查看了我团队的代码,并找出了如何最好地将新片段与整个系统联系起来。



编写设计文档和验尸报告时,我采用了相同的方法。首先采样,然后进行操作。



专注于正确性和适当性



我避免了沉没的成本陷阱。如果我做错了,没关系,我已经花了四个小时。我知道我将不得不撇开自己开发的内容并以正确的方式重做。



对于发送的一百行代码进行检查,我写并扔掉了250行垃圾。我试图确保这一百行内容中的每一行都是可以理解的,有目的的书写并且是某些事情所需要的。现在,我的代码通常在一两个版本后就可以通过。



让自己陷入困境



您将永远不会“准备就绪”从事关键职能,将项目部署到生产中,进行采访并消除紧急情况。为所有这些做准备的最好方法是接受并执行。



第一次机会,我只是告诉老板:我准备好了。即使在那之前,我也没有机会像通常建议的那样详细观察他人的行为。有时我必须寻求帮助或同事的帮助才能跟进我的工作。但最终,它使我能够扩大自己的舒适范围并加速成长。



在小事上保持主动,



我注意到有机会提高团队的运营水平,工作流程和开发经验。我自愿执行了不止一次或多次的无聊任务:我执行了手动执行的自动化程序,完成了文档,完善了CI / CD管道,重构了旧代码。



我试图成为专业人士



编程是一种基于逻辑的创造力。我认为每个任务,每个新功能都是一张空白纸,您可以在上面显示自己的技能并离开创作。



《艺术战争》的作者斯蒂芬·普雷斯菲尔德(Stephen Pressfield)表示,第二层开发人员必须是软件工程师或专业人员。我全力以赴编写简洁的代码(您绝对应该阅读同名的书)并创建美观,优雅的解决方案。



他清楚地表明了他希望增加的机会。



在FAANG公司中,没有人愿意增加-您自己问他们一次,而且不止一次。如果不这样做,该过程将持续数月。



在与老板的私人对话中,我明确表示我想得到提升。我要求提供反馈,以了解哪些区域正在下垂。我客观地评估了已完成工作的结果,并接受了我的批评。我寻找机会磨练技能并缩小差距。如果我能够炫耀一些技巧,我会尽量保持反馈的书面形式。毕竟,您无法预测下一次重组将在何时进行,而您的老板将更换。



将晋升工作放在首位



我了解:您不能只为升职而工作。如果每个人都这样做,团队氛围肯定会变得不适合生活。但与此同时,我从字面上把晋升所需的任务放在首位。



也就是说,如果我需要专注于一项重要的职能,因为最后期限很紧迫,那么我从早上开始就开始工作。这样,我可以确定自己有足够的时间做好这项工作。如果我需要更积极地进行代码检查,那么早上就花了很多时间。如果我需要更频繁地参加面试,我会通过签约即将开始的工作来开始我的工作。



不断收集我成功的证据



一个人不能没有能力通过定量和定性指标相结合来表达自己的成就。



在执行任务之前,我寻找了概述系统当前状态的指标。完成工作后,我查看了新指标并进行了计算,以了解我的行动在多大程度上影响了形势。最后,我在文档中记录了与该任务有关的所有内容,这些内容本应作为晋升的理由:STAR分析,定量指标,代码检查结果的链接,图形和其他工作成果。



我意识到什么取决于我,什么不取决于我



我了解到一切都会发生。有时,一个团队缺少重要的职能。有时项目关闭。有时,由于重组,管理层会发生变化。有时,CI / CD管道已经很完善,并且没有任何改进。



同时,我意识到,如果我专注于极限工作并专业地完成任务,那么我会为出现自我展示的机会做好准备。机会来了-他表现出自己是一名专业人士。这带来了更多的机会-我再次在这个级别上做了所有工作。等等。



感言



在招聘过程中发展起来的“ Leetcode文化”是否会损害业务?



我成功地在亚马逊站稳了脚跟,尽管当我刚到亚马逊时,使用Leetcode的任务对我来说太难了。然后,当我本人开始进行面试时,我当然会有目的地分解所有必要的算法和数据结构,以便能够评估候选人的反应。



我认为当前的方法是有回报的。公司对那些具有毅力和动力去学习新事物并将这些信息与现有技能结合使用的人们感兴趣。既定的流程可以很好地选择此类人员。



那么通过实习进入排名第一的开发人员更容易吗?



我不会那样说。对于实习生而言,这两次面试通常不比对全职员工进行五次面试容易。 2014年面试时,我很走运。如果有人确定他们肯定会收到与我相同的简单问题,那么他们就是在破坏自己。



在公司中,对实习生的要求与对一流开发人员的要求相同。几乎在显微镜下检查了作品的各个方面。我认识许多完成实习的程序员,但他们从未获得工作。



在这五年中,我本人曾教过几名实习生,现在,从另一端来看,我知道他们的标准是多么高。现在,回顾和评估我的实习工作,我意识到自己在那个夏天做得很好,真的应该被提升为开发人员。



因此,亚马逊不应该雇用您吗?



直到最近,我还是倾向于肯定的回答。毫无疑问,我当时的编程知识不符合要求。但是渐渐地,我得出的结论是,从长远来看,公司做出了雇用我的正确决定。我肯定给亚马逊带来了实实在在的好处。



我使AWS更安全,并参与了教育和销售计划。我已经为大量内部和外部客户提供了解决方案。我已经为数百人的观众开设了入门课程。我成为许多渴望加入二线开发人员的程序员的良师益友。加入亚马逊之前,我是足球队和篮球队的队长,两人都进入了弗吉尼亚的四分之一决赛。多年来,我提高了与人和领导者合作的技能-这些技能在亚马逊派上了用场。将来,我希望给开发者社区更多的东西,因为我知道成为冒名顶替者是什么样的。



All Articles