本文根据CurtisEinsmann的自述采访编译而成,他在2015年实习结束后,成为了亚马逊的一名正式员工。在亚马逊工作期间也顺利完成了从SDEI到SDEII的晋升。如今,Curtis是一名自由职业者。

(CurtisEinsmann)

去年我离开了亚麻,如果我还在那里工作,那么上个月将会是我在亚麻的第7个年头。回想过去,我对自己在工作中获得的成就还是相当自豪的!

在亚麻的这几年,我写过并发送了超过550个pullrequest;我设计、开发、部署了大规模的软件系统,供成千上万的客户使用;我作为公司内部讲师,给数百名学生上过课;我还曾作为我们团队的主要技术负责人之一。

虽然这些成就看似光鲜亮丽,但我的工作其实经历过很多坎坷。当2015年亚麻聘用我为SDEI的时候,我其实不觉得我该被录用,因为那时我的技术能力在其他SDE眼里跟个“冒牌货”差不多。

尽管当时我的技术水平有限,我最终还是成功晋升为了SDEII。我从SDEI到SDEII的过程应该跟许多人相似,但这样的经历很少有人会去分享。所以我挺想跟大家说说我的故事的,毕竟这算是我早期职业生涯中最喜欢的经历之一了。

无论你在什么领域,希望我的分享能帮助那些跟我有类似情形的人获得成功。

我是“混进”亚麻的

对于每一个能进入亚麻的SDE我都非常钦佩!因为光准备面试就需要花上至少上百个小时。正式面试时还要在一天的时间里,接受5个不同的面试官就TechnicalandBehavioralQuestions对你进行拷问。

准备过程中,你必须研究那些复杂的数据结构和算法,连续好几个月练习Coding的问题。这都需要很大的耐心、决心和勇气。

但是我当时的准备过程还没有现在这么复杂。在2014年的时候,我参加了亚麻的暑假实习项目校招。我记得那一周我还有4场学校的考试。为了应付考试和亚麻的实习校招,我那周几乎没有睡觉,但也只能每天抽出几个小时来为亚麻的面试做准备。

好在当时的面试比现在要容易太多了,实习生的面试也不用花一整天,我当时只面了两轮。而我的技术面试问题可以说异常简单。一个是关于BitManipulation,一个是应用LinkedList,还有一个是让我解释HashMap。因为比较简单,所以我很幸运地都回答上了。

就这样了,我幸运地成为了亚麻的实习生!如果表现良好,实习生在毕业时,不需要重新面试就能正式成为SDEentry-level的员工。

当时的我在西雅图实习,实习期也非常努力,开发了一个RubyonRails的新网站。最终,我也如愿获得了正式员工的offer,并于2015年在弗吉尼亚州开始担任SDEI的工作。

刚开始我的技能真的很“菜”

在亚麻,公司期望SDEI了解高级的数据结构,比如:heaps,graphs和tries,还需要了解sorting,searching,inserting,以及partitioningalgorithm的复杂性。

当时我对这些一无所知。我在学校里学的是ComputerEngineering,不是ComputerScience;学的重点是软件和硬件的整合,而不是软件开发。学校里的课程并没有教会我那些高级的数据结构和算法。

我知道我的能力不足。从那时开始,我就一直觉得我是个“冒牌货”。

我的CodeReview就是场“灾难”

有时候我写的代码实在太差,我的同事甚至无法用我能理解的方式向我解释,他们不得不下载我的代码然后重写。

虽然他们很友好也很愿意帮助我,但我却感到尴尬又羞愧。我会不断地想,大家会不会觉得我太弱了所以不该在亚麻,我每天都担心自己会被炒鱿鱼。

我还曾试过通过解答LeetCode上的编程问题来帮大家为面试做准备,因为我迫切地想证明自己是一个合格的SDE——“我现在是亚麻的正牌SDE啦,平台上这些简单的问题我能解决!”

然而结果是——我选了个LeetCode中标为“简单”的问题,我没能搞定我又挑了另一个问题,还是搞不定一次又一次,不断失败。这时我才意识到,我的技术能力真的很差!

还好走过来了

不过后来,我一点点改进,最终能在Deadline前完成工作并交付。以上“不断意识到自己有多弱鸡”的过程,我大约经历了9个月,最后才慢慢改进并逐渐恢复自信,也才慢慢把“我是个冒牌货”的想法赶走了。

在随后的两年半的时间里,我也顺利晋升成了SDEII。作为一个SDEII,就意味着要在较少的指导下,独立开发并维护一套大规模的软件系统。

在亚麻,工作里没有任何花招、没有噱头、没有“作弊”系统的方法。“Fakeittillyoumakeit”的建议很常见,但这并没有什么用。我经历下来,认为想晋升为SDEII的唯一途径是必须实打实地努力提升自己。

晋升的过程很困难。你要不断地收集整理自己的工作成果,然后用几十页的内容去说服你的Manager和同事们。只有当你有半年到一年的持续性良好表现,你才有可能获得晋升。

自我提升的tips

在提升自我的过程中,我首先会把“自我”放到一边。因为我知道我的同事都很聪明,他们都有着更独特的背景和行业经验。

即使有时候同事们的意见不对,但聪明的人说的话也是有原因的。我会试图去理解这个原因,然后转化为改进我自己工作的方向。

下面是我总结的一些帮助自我提升的Tips:

01

不要怕问问题

想要快速提升自我,就不要害怕问看似很蠢的问题。我不在乎别人对我的评价,毕竟我知道自己是个“冒牌货”,成千上万的技术terms我也不可能都了解。

所以不要害怕提问:

“我不明白这些terms是什么意思,你能解释一下吗?或者麻烦告诉我一个能解释的资源?”

“我可以用什么工具来找到解决这个问题的方法?”

“我不太明白那次会议上讨论的内容。能否跟你继续聊一聊,帮助我解答一些疑问呢?”

通过类似这样的提问,我很快就能获得需要的信息资源,并自信地参与工作讨论。

02

找到最“无情的”Reviewer

在工作初期,让不同的同事来审查你的代码和设计是很重要的。找到那个最“无情的”Reviewer来帮你做审查会很有帮助。虽然一开始会很受伤,但受伤过后你真的会有收获。

每个团队中总会有这样一个Reviewer。他们对每个变量名称、每个日志信息、每个API参数的选择都吹毛求疵。

03

利用现成的例子

在开始一个Coding任务之前,我会去搜索一下现有的解决方案。再去看一些不同的例子,了解它们的代码结构。然后,我会去看我自己团队的代码,再决定如何修改。

在设计文件和事后报告中,我也会用类似的方法。先看看过往的例子,然后再开始做事。

04

有目的地做正确的事

在我提交审查的每100行代码中,可能有250行是被我丢弃的“不那么好”的代码。我会确保提交的这100行代码中的每一行都是有目的的,并且有明确的内容。

就这样慢慢地,我能做到在提交审查中时做1-2次的修改。

05

努力跳出舒适圈

等到“准备好了”再去做事是不可能的。做好每件事的最好方法不是一直在“准备中”,而是真正地去做。

我会尽早地告诉我的Manager,我准备好了。当然,有时我会需要帮助,但就是这样不断地积极努力地做事,扩大了我的舒适圈,也加速了我在亚麻的成长。

06

主动去做平凡的事

在工作中,我还会主动去做那些看似平凡的事。

我会去注意那些能改善我们团队运营、流程,以及提升开发人员经验的机会。我曾经多次主动承担那些看起来平凡又普通的工作。比如:将手动程序自动化、改进运行手册、指导实习生、改进团队的CI/CD流程、重构遗留的代码,等等。

07

致力于成为Coding“艺术家”

Coding是一种基于逻辑的创造力。每个任务,每个新的功能都是一次全新的机会,能让我展示技能,创造“艺术”。

SDEII就是软件的工匠——是“一个专业匠人",StevenPressfield在《WarofArt》中这样写道。而这也是我工作的“信仰”。

我会专注于写简洁的代码,努力创造完美的解决方案。

08

保持强烈的晋升欲望

亚麻的晋升是很困难的,你需要不断地主动争取,否则升职会拖很久。

每次在跟我Managerone-on-onemeeting的时候,我都会明显地表现出晋升的欲望。

09

工作要有优先级

不要陷入一些日常琐事,而忘记了自己的职业发展与晋升的目标。我每天都会排好工作的优先次序。

10

记录好工作成果

如何通过定量和定性的指标来“推销”自己的工作成果是很重要的。比如:在开始一项任务之前,我会去搜索能显示系统当前状态的指标。然后在完成任务后,我会再去参考这些指标,并进行计算来衡量我成果的影响。

然后,我会在我的个人成果中记录下这一切。包括STAR的写法、量化的指标、CodeReview的记录链接、图表或其他的工作成果,等等。

11

做好自己能掌控的事

工作中不会时时刻刻都有大的功能需要开发/改进。有时候项目会被取消,如果遇到Reorganization,原来的Manager也会被更换。所以我意识到,只有专注于我自己能掌握的工作,把它们做到最好最专业,那么当机会来的时候,我就是准备好的状态。

当机会来的时候,我就去努力执行。就这样,我在亚麻得到了成长。这些年来,我也有了一些自己的思考。

我曾经觉得自己是个“冒牌货”,因为我解决不了类似在LeetCode的那些Coding问题。但后来我发现,这并不妨碍我在亚麻获得我自己认为的成功。

LeetCode问题的面试风格在科技行业很流行。但是近年来,它的存在成了一个很微妙的话题。许多人并不认同,因为它实际上与开发人员的日常工作不太相关。虽然许多公司已经放弃这样的面试了,但有部分公司仍然在使用,包括亚麻。

不过今天我不想讨论LeetCode的好坏与否,只是想分享一些我从曾经的“自认为冒牌货”,到如今能克服职场中的问题的一些感受。

在我们这个行业,许多Entry-level的SDE一定都会有类似的困难经历和问题。有的人可能像我一样,对类似LeetCode的问题不了解;有的人可能对Git的经验不足;也有的可能是害怕在会议上发言;抑或是不知道怎么做CodeReview,等等。

工作中总会遇到各样的困难,但最重要的是调整好心态积极去面对它们。

我是一名合格的亚麻SDE!

渐渐地,我不再认为亚麻雇佣我是个错误。其实就算在实习期,你也会被当作正式的SDEI来对待。你工作的各方面都会被细致地评估。想要成为亚麻的正式员工并不容易,许多实习生并没能得到全职工作的机会。

而我最后能成为亚麻的一名正式员工,并且为公司做出过贡献,这使我自己的领导力和技能得到了提升,收获了宝贵的成长!

老刘有话要说

可能许多小伙伴现在也像Curtis一样,正在经历刚开始工作的那种陌生、什么都不懂的困难阶段,和患得患失的心态。

SDE的成长之路从来都不是一帆风顺,看完Curtis的故事,你会发现,只要有积极的心态去面对困难,在工作中有目的有方法地去学习积累,就一定能收获成功~