1. 背景
本人本科毕业于国内中上985光电子专业,硕士在日本东京大学就读硕士研究生,专业也是photonics。 研一(2018年秋)开始琢磨转码,抱着早期的鸟儿有虫吃的心态和冒着延毕的风险终于收获了心仪的结果:
2019年春:腾讯,阿里实习offer
2019年秋国内秋招:
腾讯 -> pcg后台sp 百度 -> 侮辱价,秒拒,后来百度没招够人来挽回,继续拒。 商汤 -> 后端sp 网易 -> 不确定是不是sp 阿里 -> B+ 评价,没有达到阿里云标准被拒。 字节跳动 -> 前前后后面了4-5个岗位,全都终面拒 (谁告诉我为什么?)
2019年冬 ~ 2020年春日本校招:
LINE -> Server-side engineer sp offer Amazon Japan -> Software Development Engineer,只招13个,风评比美国Amazon好。 这两个公司相关内容我发过帖子。Google Japan -> 5轮virtual onsite 后被拒。
以下内容均以随想的形式叙述,不具有系统性的指导作用,也不保证帮到所有人,请各位轻喷。
2. 我零基础如何开始转码
我转码很大原因是因为有一个朋友的影响,让我产生了离开天坑专业的想法,同时他推荐我学习C++以及CS基础课,我也第一次知道了LeetCode这个平台。当时主要是看着不知道哪里来的视频课学C++语法,跟着视频敲代码,然后抽空做一做Leecode。因为是第一次接触CS,每天脑袋都装着很多问号,很多为什么,网上搜了一堆帖子,被各种“经验贴”疯狂轰炸,反而不知道自己应该干什么。在这里我觉得只要找一篇人气高的帖子,然后只看这一篇跟着做就行,有遗漏的可以在之后慢慢查缺补漏。因为知识点都大同小异。
刚刷LeetCode的时候也是完全不知从何入手,只能见一题(easy题)直接看答案,然后才慢慢知道算法题是怎么一回事。 因为当时朋友推荐我先学基础课,所以我对算法题的认识和学习也是非常缓慢。
但是我觉得我比较幸运的是在这个过程中喜欢上了这个领域,所以每天都花7-8小时在学习,网上能搜到的经验贴里推荐的知识点,书籍,我多多少少都看过,当时没有想结果,只是单纯的想学习。就这样不知不觉过了3个月,突然发现自己好像开始入门了。于是朋友推荐可以做一个项目,用这个项目找国内的实习。因为我的入门语言是C++,所以我就选了个做得烂大街的服务器项目,其实主要是用C++和系统调用写个多路复用的reactor模型。当然我没有全部靠自己写,都是边查边抄边改。anyway,通过这个初级项目的学习,我也掌握了很多高级用法,掌握了计算机网络和一些操作系统的原理,简历终于也能写上一个不会特别丢脸的项目。
3. 我如何获得第一份offer
因为是转专业的,所以非常需要一份实习来提升背景同时让自己更加了解这个行业。 所以从2019年2月开始我就各种刷牛客的面经贴,每个问题我都有搜过,都有整理到文档里,这个过程主要就是学习和记各种面经问题,同时自己深挖面经问题背后的原理已经相关知识点。这个我个人觉得非常重要,在后来的面试中发现,我能在转码仅半年时间内拿到腾讯阿里实习offer的原因很大一部分是虽然这个问题是常见问题,虽然背过,但是因为我有学习跟它相关的其他拓展问题,背后的原理,有深入思考,所以我能说的东西多很多。 比如面试官想问你“线程和进程的区别是什么”,你回答“线程是调度的基本单位,进程是资源分配的基本单位”,这个回答没有错,但是没有用。如果学习深入一点的,会回答线程拥有哪些资源,进程拥有哪些资源,并进行对比。再深入一点,就可以从Linux内核原理上分析线程和进程是怎么产生的,比如可以回答对于内核来说线程和进程没有本质区别,在内核都有自己的task_struct结构体代表,它们在clone调用时会有一些标志位的不同,比如进程的话,会分配一个新的virtual memory map,是父进程的拷贝,而如果是线程的话,是和父进程共用 (细节忘了,有错可以指正)。 而且在scheduler调度时,线程和进程的调度也是不同逻辑,比如不同线程会共用父进程的虚拟时间片,等等。 我想强调的是,如果你最开始学习的时候,可以尽量深入学习,那能帮你事半功倍,帮助你在竞争者中脱颖而出。你后面深入,拓展回答的问题,面试官可能根本就没想问,但是你说出来了无疑beyond expectation。其他问题同理,面试问题最好把它当成是和面试官的讨论,面试官提出一个问题,你解释,深入,拓展,甚至可以反问面试官一个问题,我相信你这场面试会是成功的。
当有了第一份实习offer后,一切都会开始顺利起来,基础继续学习,面经继续刷,实习好好做,项目好好总结。后面秋招就会顺利起来。
4. 我如何获得外企offer
获得外企offer其实就是刷题一条路了。关于刷题方法已经有很多帖子了。 我只说我怎么做的。 先易后难,按照类型刷,这些就不赘述。对我个人来说,一道题如果我10分钟内没结果,我就会直接看答案,然后把答案的思路理解清楚,如果不理解可以去LeetCode discussion看不同人的答案和解释。然后自己再写一遍,很多时候就算你觉得你看懂了,你写的时候依然会写错,这个时候就要重点看为什么自己写错了,往往这些细节是你不熟悉的地方。我觉得刷算法题跟学习cs关系不大,更多的是一种重复的训练(ACMer勿喷),就跟记单词一样,重点就是,大量,反复。 所以你最好不要一开始猛刷100,200题,可以每做10-20题就回来复习,保证下次你遇到这题可以秒解。再次强调,一定要复习。
LeetCode上的题都有点赞和踩,一般点赞比踩少的题我会直接跳过,因为大概率是很多没意义的Corner case,面试考这些题的概率不大,时间紧迫的可以直接跳过。然后就是有条件的可以买个会员,按照频率刷题。频率高的即使不会考,但也是经典题,解法思路都非常general,很多时候可以迁移到其他题目里。另外,个人觉得DFS, BFS 这两种搜索应该非常重点学习和训练, 同时也要学习记忆化搜索 (DFS + memo hash map), 在面试的算法题里,很多时候你情急之下想不到dp 解法,但是很多dp的题都可以靠记忆化搜索做出来,同时保证复杂度和dp只有常数级别的差距。 当做出题之后,有时间可以improve成dp解法。
在面对外企面试时,他们非常在乎communication,所以在练习刷题的时候,要习惯性 "think a loud",你怎么想的,都要说出来。 面试的时候不要自己一个人静静得想,而是要让面试官你在想什么,面试官也希望能引导你回答出题目。这一点只能靠平时自己多训练,一开始还是很不习惯的,但是不得不练习。
同时 coding style也很重要,缩进是否一致,函数,变量命名是否符合规范。 如果你是用Java,JavaScript这种语言的话,可以尽量用一些高级的语法,比如forEach, lambda, stream,目的就是让你的code更简洁明了,同时让面试官知道你的coding熟练度。在算法面试中,我认为最重要的是, 1. complexity 2. coding style 3. communication
剩下的就是上一亩三分地看看外企的经验贴,面经。
写累了。。。。 有空再补把
全部评论
(8) 回帖