失业记(上)
从去年三月宣布被裁到今天接offer,人生第一次被裁总算quote unquote上岸了。拟一个标题党的题目大概是:北美码农行业寒冬无身份被裁十个月终上岸。回顾这一段旅程,用鸡汤一点的语气来说,的确是三十几年来各方面成长最快的一段时间,在此记录一下。包含一些个人找工准备和实战经历,美国H1B失业可行的身份选项,以及可能又臭又长的心路历程,全文中英夹杂、包含一些程序员业内术语的缩写。另外大前提是本人在美国有7年Full Stack Software Engineer工作经验,都不是大厂,刷题基础差,面试经历少。感谢您的酌情阅读。
找工篇
准备面试
简历 & 内推
被裁第一天便开始火急火燎改简历,找各种认识的人寻求建议。我发现每个人给出的意见都不大相同,有的人提的建议是expand on some bullet point,有的人给的建议是present the project that you're most proud of(当时我心想是:没有什么proud of的,只能假装选一个最能拿得出手说的),有的人给的建议是调整bullet point顺序展示一些不同的方面和逻辑。我觉得都有道理,当然最后做决定把简历递出去的还是你本人,所以采各家长吧。有一次一位好心的“大佬”内推,看了我简历给了我一些友善的unsolicited advice,原话是我的简历像一个augmented version of new graduate resume,在他建议下加了很多数字到bullet point里,砍掉了学校项目和国内的实习,调整了下格式篇幅也差不多够了。那是我最大刀阔斧的一次改动,不过在他看我简历之前那份augmented new graduate简历也拿到了不少面试。
内推的话,就厚着脸皮找一切直接认识、间接认识、不认识的人吧。I人这时候也是被逼无奈了,没有管那么多的都发了,你找人哭一下说被lay off了友善一点的人至少都会给个回复。个人经验LinkedIn找recruiter没什么效果,有好心象友替我开了六个月LinkedIn Premium有一件生成站内message的feature,发了几次没什么用作罢。个人觉得Premium没啥帮助,冤枉钱别花了。Open to work也挂了快一年,没有严格对比不知道效果如何,没挂的时候也有recruiter骚扰。内推一般就是把简历、你感兴趣的job link和一段第三人称的自我介绍发给帮你内推的人,每个公司流程不同,有的公司会generate a link你还需要apply一下,有的就等recruiter直接联系你,记得和refer你的人问清楚。我个人只有两个版本company specific的简历,大多数时候是用的一个通用的。摆正心态,reach out了别人帮你是情分,不帮你是本分,什么反应都有,阿弥陀佛帮助了便积极感谢人家。那个一什么三什么的论坛上也有一些内推帖子有事没事看看。
海投也投了那么一些,到后面没具体算投了多少了,个人只收到过5个以下的海投回应,面试主要还是靠内推或者recruiter直接联系。
算法
一句话概括本人算法基础大概是,去年5月面Google第一轮,我只知道这个问题要用graph来解,后来跟朋友讨论说要用Union Find解,而我be like:啥是Union Find?到之后有几个面试当场写了Union Find出来。都是血泪史吧,出来混欠的刷题债总要还。
算法的话感觉现在市场很卷,不过我也没有在好市场的时候找工对比,该学习的算法都要学了,一些进阶算法的学了也无害。刷数据结构和算法也要有逻辑,比如你先学了Queue才能学Breadth First Search,才能学Tree or Graph Traversal,比如你要先学会基础的Recursion才能进阶学习Backtrack和Dynamic Programming。学好一个知识点再学下一个知识点。
另外一些微不足道的心得:debug很有必要,帮助你明白算法底层怎么实现的,在哪一步哪发生变化,为什么要这么做;有一些网上看到的fancy solution或者第一次接触一个advanced算法,如果裸眼看代码不明白,最好的方法大概也是debug,弄明白就试图盲写出来,再把这个算法internalize成自己的东西;另外老生常谈是,题确实是要“刷”,一遍不够就两遍、三遍直到看到一个类似的题就能有intuition可以用什么方法做,并且快速写出该算法的框架。用我最喜爱的算法老师NeetCode的话说就是,三分钟之内闭眼写出一个cookie cutter Breadth First Search。
以下是个人觉得有用的一些资源
- 个人强烈推荐NeetCode的Roadmap,没有比这个更好的roadmap了,逻辑非常顺畅。
- 老生常谈LeetCode premium买,按月买按年买看客官的心情;使用顺畅,题库丰富且新,讨论帖多,官方editorial写的质量也越来越好了;debugger大多数情况都好用,我刷Java如果是设计题或者定义了class的题,debugger就用不了,建议自己也弄一个IDE比如Visual Studio Code去debug。
- 没有对比就没有伤害,别人推荐下买了另外一个付费平台AlgoExpert,体验不好别花冤枉钱。题库大差不差,但是不能debug,code editor不能调整tab距离强迫症非常难受,好处是大多带讲解视频,但我看了几个觉得讲得很啰嗦,讨论少,sample solution写得很丑。姑且可以丰富一下题库。
- 按照Roadmap学习完基础的数据结构之后,可以开始刷Blind75,有一个工具Grind75帮你制定计划。另外一个可以参考的list是LeetCode 150,总之有时间的话都刷了。
- 如果刷够多了,有时候要回归数据结构本质if you haven't already,比如你用的语言里array是怎么实现的,是static array还是dynamic array,dynamic的话如何expand the size and allocate the memory,Heap / Priority Queue是怎么实现的(我在有一个面试中就被问到这个问题,可能也是面试官没啥好follow up的了)。推荐NeetCode的付费课程(有算法和系统设计,都推荐),讲解很清晰有逻辑。如果不想付费,也推荐他所有的讲题视频(完整list),视频最多半小时,他都是先把算法可视化、带你过一遍,根本上弄明白这个算法怎么运行的,再到代码本身,而且他solution都很简洁、漂亮。个人觉得YouTube上没有比他讲得更好的(且没有印度口音)。(NeetCode给我打广告费谢谢)
系统设计
感觉看的资源也不少了,但也不能说很有心得,没有感觉特别好并且得到正反馈的轮。大体是觉得需要在45分钟之内展现你的gather requirement, communication能力,并且drive the conversation给出一个大体end to end框架,解决需要解决的核心问题(别问,问就是我犯过这个错误),能deep dive一些细节。每个公司、每个面试官的侧重点也有可能不同,比如有的面试官说个大概就嗯嗯啊啊过去了,有的tech-oriented面试官会不停追问细节,追问不一定代表对方不友善,拿出你的reasoning即可。有时候也要注意不要在一个细节上费太多时间,要自己拽回正题,end to end解决该解决的问题。
以下是个人觉得有用的一些资源
- NeetCode付费系统设计课程,对于新人来说知识框架逻辑清晰,新手友好
- YouTube 欧洲大哥,视频内容非常扎实aka干货,我得用倍速慢放做笔记,知识点密集而且有可以应用到实战的思考逻辑
- Alex Xu的两本书(网上都找得到资源),老生常谈了,可以借鉴答题框架,涵盖很多知识点、题型。个人觉得不太好的是只给你列出技术而不去讨论为什么要用这个技术,第一次看的时候有点不友好。
- AlgoExpert System Expert,again别人推荐的平台,我当时碰到了一个bundle deal所以买了,如果您觉得价钱不合适可以略过。题感觉比较新,优点是实例讲解视频是两人一问一答的形式,比较好地模拟了面试真实情形,也可以参考一些答题思路。
- 传说中的DDIA,有时间看没时间就算了吧,感觉是回归本源,把知识串起来,讲为什么distributed system会出问题,以及如何解决问题。
Behavior / 行为面试
怎么说,老生常谈,准备故事用STAR结构回答,多说多练,找人mock寻求反馈。故事不够用同事的来凑,功劳揽自己身上。用I而不是We,说多了说到自己都信了。显示自己拥有社畜的良好品质。我自己有一些故事是在临场面的时候想出来的,之后加入故事库继续polish。再有就是如果你准备了Amazon的Leadership Principal基本别的公司没在怕的。
我见到的最高频的几个behavior question是
- What are you looking for in your next job?
- Tell me about a time when you help your customer solve a problem(Amazon著名Customer Obsession,现在基本哪个公司都很看,要把customer挂嘴边,客户爸爸最大)
- Tell me about a time when you had a conflict / difficult conversation with a coworker
- Tell me about a time you go beyond the scope (could be technical or non-technical)
- Tell me about a time you wanted to achieve something but had to compromise due to different reasons (主要考察的点是,比如为了deliver项目不得不牺牲一些方面,外在blocker一般是business/stake holder要得急,要展示出你有尝试沟通并且解释,展示你在技术上追求高质量完美)
- Tell me about a major feedback you have received and how you have improved
- Tell me about a time you have made a major production incident and what have you done to remedy (勇于承认错误,快速纠正错误,快速行动)
- 再一个就是有几年工作经验都要准备project deep dive,即一个你牵头的项目,从plan到deploy讲怎么做的,为什么这么计划部署,遇到哪些困难挑战,what would you have done differently之类的
面试篇
本次找工我实际碰到过的技术面试形式包括不限于
- 普通算法题,screen和onsite都会出现。有的要run and compile有的不要,建议问问recruiter是否有这个需求。有的公司typically比如Meta每轮有两道题,需要把握好时间。有的公司说自己是Java Shop,题目就涉及一些Java exception handling, garbage collection很具体的东西。
- 不需要compile的对正确性要求没有那么高,面试官觉得你的逻辑没问题即可。沟通,沟通,沟通,一边写一边说你在干什么,为什么要这么干。口头dry run,cover edge cases。
- 需要compile的也有要自己写test和有既定test case写好了你点一下run即可。熟自己写test case要确保尽量cover多的case,熟悉你的语言怎么initiate a new array for testing。个人感觉现在市场如果碰到这种run and compile coding,没有全过即挂了,大概是所谓的bug free?
- Online assessment,有的比如Amazon就直接刷面经吧,都是一些刁钻难题对performance还要求很高,过了就行;也见过写一个特定语言small program,parse and validate一些input并且,有很多刁钻和怪的test case,很烦。
- 系统设计,也很常见不多说了。
- Take home,比如写一个简单React program提交(不想写没交),写一个shopping cart program;有要我实现一个elevator system然后onsite做一个presentation给面试官展示,我以为他们会死抠很多细节、不同场景,当时觉得自己的solution不够solid,但实际看到我的output大差不差也没那么抠细节,问了一些C#/ .NET framework 和Object Oriented Design相关的实现问题。
- 有一些full stack的job考察front end。比如抖音爱问概念题什么是React Hook,为什么要用React Hook,Hook里能不能有if statement,不能的话为什么,还有JavaScript里的async print顺序;有考JavaScript语法,实现基本的一些array manipulation function,然后问有什么更好的实现方法(考完了我也没理解到底是往哪个方面引导,可能是一些JavaScript best practice之类的);还有前天刚面一个要我在code pen里实现网上fetch一个GCP里的JSON file,parse一下用一个JavaScript library画成图表展现出来。呃总之前端面试都很烦、准备范围很广,也没花特别多精力去系统地准备。
一些微不足道的心得
- Mock Interview很重要,本人血泪史大概是以面代练了,是在跟面试官的交流中学会怎么沟通、drive conversation,prompt for hint,读面试官的sign。以及很多时候问题乍一看没想出来,一边沟通说不定就发现了solution。付费平台太贵我没用过,免费的Pramp用过一次感觉还不错,也很取决于匹配的人是什么水平。
- 算法题的话跟人讲题非常有帮助,一般是相互解释一个题,为什么这么做,为什么选择这个算法或者这个数据结构,可以假设你在做一个YouTube讲题视频,对方提问你回答,彼此交流丰富题库。大概是完成知识从输入到输出的转变吧,也很提高面试实际的communication,我跟象友狗毛和柴相互讲过题,都是愉快的讲题经历。
- 一般两三天之内没有follow up的基本都是没有下文了。
- 面试Feedback应要尽要,feedback一般是HR电话给,多问各种细节,问哪里可以做得更好之类的。不给的公司都(背地里)骂一句垃圾。面试是一个调试的过程,feedback应收尽收,收到反馈然后不断精进,用到下一轮去。
- 有些难以判断哪些公司是真的在招人,有的你觉得面得好但也没到下一轮,有的可能就突然招到了人冠冕堂皇把你拒了,有的可能就是个绿卡广告,有的是完成recruiter KPI,都难以判断。总之什么情况都有。调整心态面完就不想了(说起来容易做起来难)。
一不小心居然废话了这么多?H1B失业身份篇和心态篇就下篇再写吧。
Comments
Post a Comment