白癜风医院南京哪家好 http://m.39.net/pf/a_7540336.html
本文送给那些即将开始找工作的人。
你可能担心自己没有斯坦福的计算机科学(CS)学位,无法找到一份顶级的科技行业工作。或者有人告诉你,你不够好,进不了微软或Facebook。但是我告诉你,你可以。我在推特找到了梦寐以求的工作,现在告诉你,我是怎么做到的。
本文包括:
我的学历背景。我是怎么拿到世界顶尖科技公司面试的:Facebook、谷歌、亚马逊、领英、微软、推特、Pinterest、Snapchat等。作为一名全职软件工程师,我是如何获得多份工作的。从面试经历中我学到了什么。
我的学历背景
我不是从常春藤联盟学校毕业的。我在爱达荷州的一所社区学院读了两年,然后在一所小型天主教大学完成了CS学位。
大三才开始学计算机科学,因为当时觉得很有趣。成长过程中,我唯一一个像电脑的东西是任天堂SNES(还是中国制造)。每次放磁带进去,都会坏掉。
为了在大学养活自己,我做了很多兼职,比如清洁地板之类的。
毕业时,我没有工作。海投了一些大型科技公司,有幸拿到几个面试。
当时,我对技术面试是什么样子没有任何概念,更别说作好准备了。我去参加面试,心想面试官可能问我链表或二叉树之类的问题。
然后,就没有然后了。
向前一步
我没想过是不是自己不够优秀。我知道自己可以学得很快。只是需要一个机会。
俗话说,广撒网,钓大鱼。接下来我干了件特别自豪的事儿。
我写了个简单的Python脚本,在Craigslist网站抓取包含关键词列表的标题,获得招聘信息清单,并用电子表格收集电子邮件。
这不是最聪明的解决方案,但在Craigslist上发帖的人起标题非常精准。
然而,Craigslist不喜欢别人爬取他们的网站信息。为了解决这个问题,我用一个VPN运行脚本,并设置计时器,每隔几分钟暂停一次脚本。这不完美,但足够有效。
最后,我收集了大约封来自旧金山、波特兰、斯波坎和西雅图的电子邮件。还发现已经有一些机器人在爬取Craigslist并自动发送邮件。这些公司大多是海外公司,希望将公司推向美国市场。
我想了个变通办法,在自己的电子邮件标题中,加入了清单上的关键词。然后在正文里添加了更多细节,显得内容充实一些。我做了个快速A/B测试,自此收到的面试回复从之前的2%-3%增加到10%。
幸运的是,我终于在西雅图一家初创公司,找到了一份初级软件工程师的工作。然后我在那里呆了三年半,学到了很多东西,比如亚马逊AWS、EC2、DynamoDB、SQS和Docker。这期间也成长了很多。学会了编写模块化、可维护的代码。学会了如何推理软件的设计过程。也学会了处理问题。
公司同事有的在微软、亚马逊和领英工作过,我努力融入他们,像个海绵一样吸收他们扔给我的任何东西。相信这对我的职业生涯产生了巨大影响。
学习
在创业公司期间,我几乎只从事后端开发,偶尔做点devOps工作。我开始编写一些函数来添加或修改一个范围很小的特性。这可以更好地理解代码库并获得代码反馈。
一年后,我负责代码库的一部分,工作是将一组特性转化为服务。这是启动SOA阶段的第一步。我们把网站的各种组件转化为服务,我开始了解RESTful服务、认证、AWS服务、pub-sub、分布式系统等。
注:DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
有趣的是,这都不是从书本或正规教育中学来的。相反,我要构建一些功能,但是存在瓶颈。接下来就是解决它!
发现问题之处就是该学习的地方。我开始学习特征范围、谈判系统、监控、警报和文档。这个过程中的每一步,都要求我继续学习更多东西。过去的2-3年里,无论作为个人还是软件工程师,我都获得了巨大的成长。
开始准备面试
经历过第一次求职后,我告诉自己,必须为未来的面试作好准备。
我列出擅长的、不擅长的以及可以改进的地方。分成三类:数据结构、算法和系统设计。
工作时我都用PHP工作,大学里用C++,为了面试方便,我选择了Python。它易于学习,支持很多现成的数据结构,可读性强,容易在白板上书写。下面是C++和Python一个小比较。
C++:
Python:
在45分钟的面试中,你得用大部分时间解决实际问题。
小提示:选择一种不太冗长的语言,这样你可以快速在白板上演示代码。
准备过程
我花了大约一周时间挑战LeetCode、HackerRank和Euler项目,以熟悉界面,并习惯使用Python。
又花了一周时间做程序设计,并尽可能地深入其中。
这对我来说很有趣,因为我经常看iOS应用程序,想办法弄清楚它们是怎么做到的。例如:如何从头开始构建Instagram?
重要的是要知道,设计面试的目的是了解你知道多少。我看了一个前Facebook工程师关于如何解决设计问题的Youtube视频,从中学到两点:掌控面试节奏,展示自己所知道的。
我列出了自己在以下方面的能力水平:数据结构(链表、哈希映射、二叉树、二叉搜索树、堆、数组)、算法(二叉搜索、哈希、动态编程、排序)以及特定语言的语法和库(如排序、Python的lambda、追加、索引)。
我选择了最不擅长的领域去研究:算法。
算法从来不是我的强项。大学毕业挺长时间了,平时工作也不怎么做二元搜索。我知道每种算法怎么执行,在什么情况下使用。但在10分钟内,在面试官面前,在白板上写二进制搜索,我很担心自己的表现。
我买了一堆非常好用的马克笔,又买了一块白板,还买了一些书,然后开始了编码实践。我要保证自己在二进制搜索、递归、动态编程、BFS和DFS方面掌握扎实。许多面试问题都围绕递归和二进制搜索或其一些变体展开。
面试谷歌时,一个问题是关于文件系统目录以及如何遍历它的(提示:递归),我比较快地解决了这个问题,面试官问我如何识别目录中丢失的文件。这有点困难,但我挺过去了。然后我们开始讨论如何重建目录,如何序列化/反序列化它,我们花了大量时间讨论文件目录在引擎下是如何工作的。对我来说,挺愉快的。
去顶级公司面试
这是一次令人神经绷紧的经历,就像坐过山车。
我按以下方式分配时间:20%的简历、20%的研究和60%的面试准备。
我花了20%的时间来整理简历,简历已经三年没更新了。我认真回顾了过去做过的事情,并展示了一个端到端处理的项目。
这样做原因有二。从项目开始到完成需要纪律和领导力——这是我想展示的。
其次,端到端项目可以让我详细深入地谈论项目的各个方面。事实证明,这对我的设计至关重要,在推特面试时,他们不仅严厉盘问我的项目设计,还盘问我背后的决策。
我20%的时间用于研究。研究就是对感兴趣的公司进行调查,并寻找推荐机会。推荐能给你加分,拿到更多面试。根据我的经验,我向初创公司和中期公司发了20条左右的消息,只收到了少数回复。但经过现在同事的推荐,很多公司在一周内就给我发了消息。
我不是那种善于交际的人,也不知道有多少人能推荐我去感兴趣的公司。为了解决这个问题,我上了领英。它有一个搜索功能,我曾用它搜索一级和二级连接。二级关系是指离你的直接圈子一步之遥的人。换句话说,你们有共同的朋友,可以证明你的可信度。
领英搜索这非常重要,因为给某个人打电话找工作非常非常困难,尤其在今天这种市场。接到陌生电话时,人们倾向于谨慎行事。使用领英对我非常有帮助。
回顾面试过的所有公司,以下是我一些看法:
Facebook/谷歌:非常机械、标准的面试过程,我感觉不到与他们有任何个人联系。
Pinterest:不是最好的面试体验,但它是一个很酷的公司,有很酷的产品。
微软:热爱这个团队,尤其是他们经理。标准的面试问题,但很有风度。接近我的第二选择。不过你的面试可能有所不同——微软负责面试的每个团队都不一样。
亚马逊:标准面试流程。大约50%的人喜欢,其他人不喜欢。
推特:令人难以置信的有趣和个性化。喜欢整个面试过程,他们非常重视个人和我过去的工作。
Snapchat:洛杉矶的办公室很酷,有一大群决定加入创业潮流的人。感觉他们所有事都被笼罩在一片秘密之下。
Lyft:靠近我住的地方,办公室不错。标准的面试流程。没有太大感觉。
谈谈我最喜欢的
从许多方面来说,推特的面试风格很独特。但它比我面过的其他公司更有趣、更有风度。
他们的面试从与工程经理的介绍性电话开始。接下来是一两个技术类电话面试,如果你表现好,他们会让你去西雅图的办公室面试。面试有三轮,1小时15分钟,每轮都有两名面试官。
前两个技术类电话面试是标准的普通面试,要求解决共享编码文档中的编码问题。
现场面试更具对话性,也不让人害怕。面试官就你过去的项目提出深入的问题,会问你过去做过什么。如果你做了一个完整的项目,可以期待一下相关问题。
我没有感受到任何压力,就神奇地想出了一个完全有效的解决方案,而且它看起来协作性非常高。
其他
相比之下,Facebook和谷歌的面试更机械。他们有一两个技术电话面试,五到六个现场编码。每一轮都要在白板上写代码,以检测你在合理时间内,找到近乎完美的解决方案。
Facebook有两轮编码,一轮设计,一轮行为面试。
注:行为面试法是通过要求面试对象描述其过去某个工作或者生活经历的具体情况,来了解面试对象各方面素质特征的方法。
一天结束时,我脆弱的小心脏又蒙上一层阴影,这并不是我所有的成绩。
谷歌有五轮编码,没有一轮侧重设计,也没有一个面试官问我以前的项目。这不一定很糟糕。但我感觉很机械,没有给工程师多少展示能力的机会。有些人在这种情况表现出色,就像有些学生在考试中表现出色一样。
我不喜欢Pinterest的面试。他们的产品很有趣,工程团队似乎在研究非常酷的技术问题。但是面试体验太差了。
Pinterest有三轮编码和一轮设计。在四轮比赛中,我最失望的是设计。
面试官来晚了,他花了几分钟浏览了我的简历,然后简要描述了他期望API做什么,并问我怎么解决。我们聊了聊API的特性,然后我在白板上描述解决方案。大约5分钟后,我转过头,看见他在打盹!
不酷。
在一次调查中,我给了招聘人员反馈,之后没有收到他们的回复。
关于这些面试,我不会深入探讨被问问题的细节,只想分享一些在准备过程中学到的见解和有用的技巧。
我学到的
1.诚实地写简历。
大多数公司会问你简历是不是编造的。对一个项目了解%比对10个项目了解10%要好。
2.使用一页简历。
对于科技公司来说尤其重要。
3.社交并建立网络。
软件工程工作竞争激烈,顶尖科技公司每天都要筛选成千上万份简历。获得推荐可以让面试官多看两眼你的简历。
4.完美的回答。
每个对你感兴趣的公司,都想知道你为什么对他们感兴趣。不好的答案是:我现在只需要一份工作来支付账单。不太坏的答案是:我在网上浏览,发现了你们,听说你们在做有趣的事。好的答案是:我知道你在X做一些有趣的工作来实现Y。我过去做过一些工作,以下是我对A、B、C的了解,这可能与X有关。我对Y充满热情,因为balabalabala。(不要拿这个当模板。你应该借鉴这种模式——做你的研究,使用你的背景,并向公司展示为什么你们很合拍。)
更多建议
技术面试非常困难。然而,最好的机会留给作好准备的人。
1.早点准备,好好准备。
2.系统地练习技术技能。
我从1-10分开始,就自己有多优秀进行评级,并对自己表现最差的方面进行评估。我花几天时间解决不同类型的问题,直到完全掌握每个概念。我每天都在Evernote上写笔记。我有一个笔记,所有编程相关内容都在上面。它充斥了编程技巧、常见错误和误解、解决特定类型问题的框架,等等。
3.记下学到的东西。
我用Evernote和OneNote记录事情。OneNote记录技术资源和代码,Evernote记录我的文章和思考。下图显示了我对体系结构和系统设计的理解。
把所有东西都记下来,即使你认为不会用它。
我很容易忘事儿,所以把学到的任何东西都写下来,包括shell命令。我经常看技术博客,如果发现什么有趣的东西,马上记到Evernote上。我每周或每月修改一次,并重新组织。这极大地帮助了我的工作。
4.进行模拟面试。
5.失败是可以的。
刚开始面试时,很多电话面试都没过。我怀疑自己的能力,开始担心自己的技能不适用于当前就业市场。然而,我给了自己一个提示:如果失败10次,就再试10次。你只需要一次成功。这种想法给了我很大的信心继续前进。
我花了大约2个月时间精心练习和准备面试。花了大约每周20小时,或每月80小时,在全职工作之外学习和写笔记。
为了简历,我花了3年半时间专注又深思熟虑地工作。我故意选择又难又讨厌的东西,只为了比其他人学到更多。尽管我的简历上没有名牌大学或顶级科技公司,但我对自己从事的项目了解清晰、透彻。
记住:强者生存,强者繁荣。
推荐工具
《ElementsofProgrammingInterviews》:这本书帮你解决更困难的编码问题。
《CrackingTheCodingInterview》:这本书涵盖了基础的CS内容。
OneNote:存储所有代码片段。
Evernote:记录所有文字相关的内容。
Dropbox:我把所有的文件、图片、简历都保存在这里。
CodeRunner:我喜欢这个Mac应用程序!我用它运行特殊的Python脚本/函数。
Jobscan:可以试试他们的简历筛选工具。
Refdash:由一群前谷歌人经营。他们的模拟面试质量很高。面试官是前谷歌员工。
CodePath:一个非营利组织,帮助人们为科技职业做准备。
马克笔:把它带到你的面试中。
我喜欢看CTCI的基本知识,比如链表是如何工作的,哈希映射是如何工作的,以及如何解决一些基本问题。
EPI介绍了一些比较难的编码问题。我会花2-3周的时间逐章浏览这本书。
剩下的时间里,我将所有时间用于EPI,学着解决更多有趣、困难的问题,并且充分理解CTCI中的基本数据结构,以帮助我更容易地解决这些问题。
来源:Medium作者:ZhiaHwaChong智能观编译
—完—
扩展阅读:
youtube网红老师SirajRaval:5个月教会你计算机科学
想了解AI?能读英文书?来,这里有20本很好的AI电子书送给你!
如何在人工智能和机器学习领域找到工作
亲爱的朋友:“尽管我的简历上没有名牌大学或顶级科技公司,但我对自己从事的项目了解清晰、透彻。”读完本文,你有何想法?在这个终身学习、随处可学习的时代,不给自己设限,目标清晰、行动力强,想实现梦想不再是遥不可及的事。希望本文对你有所帮助。祝安!智能观灵米-10-3于北京中关村
声明:
编译文章旨在帮助读者了解行业新思想、新观点及新动态,为原作者观点,不代表智能观观点。