2018跳槽经历

avatar 196499
pwh
1270
0
去年跳槽拿了几个大公司的 offer (among FLAG),给大家发一下我准备的总结,希望可以帮到一些人。

1. 算法

; 现在题目这么多,要把所有题刷完是很困难的,再者花这么多时间精力也不一定值得。把题目刷到一定程度,把各种常见类型,每个常见类型的考点都大致弄清楚,就差不多可以面试了。80/20 rule。从准备的初期,到把80% - 90%题型弄懂的过程,投资回报率是很不错的。但是要是想把95%+题目、考点都cover并且熟练掌握,后期投资回报率就不是很高。达到前者的程度,通过面试的几率应该已经挺高了,剩下的就是运气成分,看碰到什么人,什么题。

为了求做题数目去刷,最后自己也会做到麻木,为了追求数量忽略了质量,每个题没有仔细去思考,结果总结不出模式,看到新题或变种还是想不出来。如果每个类型刷 20 - 30 道然后总结,剩下的题目可以作为测试自己总结和理解程度的资源。如果你把大部分的题都看过,你就很难找到一个全新的题去检测自己的总结是否到位。把总结当作一个迭代的过程,做题 -> 总结 -> 做题 -> ...。如果认真总结的话,到一定程度,同一个类型里面的新题基本上会有思路,那样这个类型就算掌握了,可以 move on。

; 做题时可以按 LC 的分类做,每个分类做 20 - 30 题基本上摸索出大致模式了,不用 cover 全部。常考的大类大致就是十几个 DS: Array, Linked List, Hash Table, Stack, Queue, Tree, BST, Trie, Priority Queue Algo: Binary Search, Two Pointers, Sorting, BFS, DFS/Backtrack, Topological Sort, DP, Union Find 有空可以了解一下segment tree, binary indexed tree, skip list等更加高级的数据结构(和算法: Dijkstra, A* etc.)。但是还是80/20 rule,把上面的准备好,已经有七八成把握了。一开始不要把自己 stress out,觉得什么都要弄懂。Start small,build up a solid foundation,最后有时间精力再做锦上添花的东西。

; 面试前做公司的 tag, 感受一下公司出题的方向、难易程度。像 G 的题很多,很难把全部做完,如果很想冲这个公司,可能要提前相当的时间开始做。不过我觉得,像分类做题一样,不要一开始就做公司 tag 的题,因为题型很随机,很难让你总结出规律,而且会减少了之后检测自己总结情况的题库。公司的 tag 应该作为刷完类别之后,检测自己对各类别掌握程度的题目。

----------

2. 设计很多人惧怕系统设计面试,觉得这方面内容太多。但是像算法准备的80/20,系统设计也是有主要需要掌握的内容。我觉得刚开始准备,要打好基础无非就是看看大家都提及到的 paper,有几个 link 别人总结得不错的可以看看。网上有些付费的课程,我觉得价格不高的话 (< $1000) 可以去上一下,如果找到好的工作,这个投资还是很有价值的。

; 重要的 paper
- Google File System, BigTable, MapReduce (有空可以看 Spanner, Chubby)
- Amazon Dynamo
- Memcache
- ZooKeeper
- Kafka

; A few links - github.com - educative.io等你把这些都看完之后,其实设计面试需要知道的知识大部分你也已经知道了。最核心的知识点包括:how does the Internet work (DNS, protocol layers, HTTP, REST v.s. RPC), sharding and consistent hashing for managing big data, replication for availability/fault tolerance, failure detection and handling, parallel processing, caching, normalization and denormalization (space v.s. time trade-off, data duplication and consistency), push & pull models, queuing。我觉得 github 那个 link 总结得很好了,认真多看几次,然后拿里面的题来练。不要直接看答案,尝试设定一个 time limit 然后自己去设计一下。时间到了之后,再看答案去对比自己的思维过程中漏了什么东西。这样才达到学习的目的。如果开始就直接看答案,很容易忘记,因为没有自己思考过。

; 归纳
1) 每个 paper 看完,总结一下这个系统重点是解决一个什么问题,解决这个问题的难点在于哪里,用什么方法解决的。对于每个系统,把这些问题和它们的解决方法类比一下,看看有没有相似和共通之处,这是 finding the dots 和 connecting the dots 的过程。当你连成自己的知识体系之后,遇到一个题目你就有题材可以发挥。这是内容方面。

2) 当你积累了可以发挥的内容之后,答题的方法也很重要。因为没有章法的答题,首先自己的思路很混乱,很容易漏掉东西或者 get stuck,而且自己很容易紧张。其次让面试官很难 follow,听者跟不上的话最后很容易就 get bored,lose interest,最后 feedback 也会不好。 - Procedure: data (schemas), behaviors (services), interactions (APIs and workflows, usually can be broken down to read and write operations), load and scalability。其实看 paper 的过程中多数让你学习到的都是 scalability 的部分,前面三个方面一般比较容易回答。

3. 面试
; 多做 mock interviews - 和同在求职过程的朋友互相 interview,既能让自己更熟悉面试的感觉。当面试官的时候也能让自己换位思考,感受到面试官希望从面试者身上看出什么(比如:我面试的人 get stuck 的时候,我作为面试官不想直接给提示,因为那样来说就像我直接告诉你题目的考点在哪,把面试变得太容易了。但如果面试者自己一直用小的 examples 在尝试怎么解决,我就可以指出他的 attempts 里面有什么想法不太对或者可以改进的地方。这样从面试官的角度我不会觉得我直接告诉 candidate 解法,而是我纠正了一下 candidate 的解法,他自己意识到了正确的解法是怎样的。诸如此类。这个换位思考也能让你变成一个更好的 interviewee,因为你更加明白,面试的过程中我要如何表现,才能更好地 engage 面试官,让他对我起帮助的作用。)

; 自己练白板/纸上写算法题,适应面试的感觉。如果自己书写不清晰的话,建议练习一下。面试的时候不必写得特别好看,但必须干净整洁,让面试官看得舒服,容易 follow。Content and your problem solving skills are important, but presentation is important as well, including your communications and your handwritings.; 至于 social skills,confidence 这些东西,看个人平日积累和锻炼。

4. 准备过程
; 想一想自己找这个工作是为了什么?更多的钱?想搬到某个地方?想做某个领域的东西?现在工作学到的东西不够多,或者不是自己想学的?在现在公司发展空间不够?等等。不一定要找到很清晰的终极目标,但是梳理一下自己的目的,定期回顾一下,在没有动力的时候提醒一下自己辛苦的准备为了什么。

; 我准备的那半年早睡早起,上班前学习。早晨是自己最好的状态,避免工作回来内心疲劳。当然我下班后还是会学习一下,但是我觉得早晨的效果更好。你们可以自己试一下。

; 工作不是生活的全部,可持续发展才更重要。保持专注,但也不要让自己 burn out。注意放松。
  • 22
0条回复