程序员真的是吃青春饭吗?如何面对传说中的 35 岁职业焦虑?

  正走在这条路上的你或许也曾想过这些问题。这一次,力扣邀请到了《高效制胜——程序员面试典型题解》作者吴江(迈克老师),分享他 35 岁跳槽,并拿到了技术负责人 Offer,实现收入增长的故事和面试准备经验。

  — 01 —

  “35 岁危机”真有那么可怕吗?

  在 2018 年快过春节的时候,我们部门突然被通知要开一个会,会上通知我们部门要在明年的这个时候被整体裁掉。我在这家五百强外企已经待了五年,当时虽然有这个预感,但是真的听到正式通知时,不免还是感觉有点震惊。

  从得到通知开始,经历了大约半年的时间处理和企业的各种善后工作,然后我也以 35 岁的“高龄”开始准备面试。本来以为可能这个过程会比较艰难和痛苦,但是其实通过在力扣网站上进行过充分的准备以后,结果挺顺利。

  在面试了五六家以后,拿到了好几个不错的 offer。我选择了一家新零售创业型的外企,担任中国区技术负责人。收入比之前还高了一截,我到现在也一直很满意这份工作。

  聊聊这次面试的心路历程和准备过程,还有一些个人看法吧。

  做任何事情之前,都得先做一些大致的估算。一开始我和大家一样,准备技术面试,就直接从撸起袖子在力扣上刷题开始。在做了几天题目以后,感觉效率有点不对。

  于是,我做了个简单的数学题:如果每天最多可以做两道题目,上午一道下午一道。而力扣上有 1000 多道题目,这意味着我最快也要一年半才能把上面的题目做完。坚持 100 天也不过能做 200 道题目,这对于需要马上找工作的人来说显然不现实。

  所以,我及时地改变了策略:

  首先,确保每周掌握一类题目,这样最多两个月就能掌握所有常见的算法题目类型。然后,做几次力扣的周赛。坚持到每次完成所有的题目,而且最后的排名保持在前 20%,就可以积累对算法的信心。掌握了算法题目以后,再花一些时间练习系统设计题目。找一些典型的系统,画一下结构图,写一些关键部分的代码,以加深对系统各个组件作用的了解。

  很多人惧怕在面试的时候做算法题,其实这些算法题和你平时解决的问题的难度是差不多的。只要你用平时解决问题的方法来解决这些题目就能过关。

  我的算法基础也并没有多么深厚。动态规划类的题目我以前掌握得并不到位,也是这次找工作的时候反复练习掌握的。这说明,有针对性的练习确实有助于水平的进步。

  小贴士

  很多人看到别人介绍成功经验只看到别人刷了很多题,这其实是一种错误归因,就像太阳并不是听了公鸡的叫声才升起的。

  面试成功需要很多要素,甚至还需要一些机缘巧合,但堆刷题数量恰恰是最不重要的一个,盲目刷题只会给你一个在进步的假象。如果只是每天做一到两道题目对自己有个交代,其实大量时间是浪费在自己本来就已经会的技能上。

  我自己就是一个很好的不需要大量刷题也能找到好工作的例子。

  — 02 —

  算法题怎么做?

  讲点干货,以 力扣第 53 题最大子序和 为例。

  这个题目是要求一个整数数组中至少包含一个元素的连续子数组的最大和,最直观的是暴力解法,行不行呢?显然不行,因为组合数的复杂度太高了,数组中的元素稍微大一点肯定接受不了。这个解法在面试的时候,一般就不要展开说,不然会让面试官误解你还想沿着这样不可行的思路进行下去。

  既然暴力求解不行,那么看到问题的结构自然会联想到它可以分解为结构相同但规模更小的子问题,那么这样的问题很典型地就是要用动态规划来求解。

  但是动态规划中如何定义子问题其实不容易,拿这道题来说,很容易就会做出错误的一种定义。比如,我们经过简单推导以后,会认为可以通过划分出最后一个元素,然后求除了最后一个元素以外的子数组的最大和,还有这两者之和,一共这么三个结果,来比较得出哪个结果最大,如此循环来找到答案。这样做,会导致找到的数组并不是连续子数组。

  面试时犯错,不要紧张,我们平时工作也会犯错误,面试官可能要看的正是你的思考和排错的过程,这比直接给一个正确答案有时更能体现你的能力。

  我们回到算法的中间过程,发现结果不正确的原因在于“除了最后一个元素以外的子数组的最大和”这里和后续的数组元素连接上,通过修改算法,构造一个包含当前状态最后一个元素的子数组和,最后对这个构造出来的数组遍历一次最大值,就是正确的解法了。

  小贴士

  解法从简单到复杂、从犯一些常见错误到修正的过程,而不是好像一切都是自然地一出手就完美,这才是面试的时候,大学经常会遇到的场景。我们一定要注意,和面试官进行来往的沟通很重要。

  重点在于:先给出一个能工作的解法,然后和平时工作一样,找出重复的计算过程,然后消除它们,就可以给出优化后的解法。甚至有的时候,题目没有做出来,但仍然可以在面试中取得好的表现印象。

  — 03 —

  系统设计题怎么答?

  俗话说,麻雀虽小,五脏俱全。系统设计题的目的是考察程序员平时工作中对哪些系统组件比较熟悉,并且有过深入钻研。

  比如说短网址服务要考虑哪些方面呢?首先是接口设计,这是直接面向用户的,比较初阶的想法是要做到简单、友好,更高级一些的就要考虑到边缘用例和安全考量。这时,提出一个在创建时的认证机制就可以体现出你思维的全面性。

  但是短网址服务往往更多地考察的是关于容量设计的业务知识,这里面涉及的知识很综合。比如不同的容量要采取不同的编码,以平衡性能和成本,支持高并发的前提下避免碰撞等等,这些都很见功夫。

  一定要在设计的基础上,展示一些硬核的肌肉,比如数据表设计、错误处理等,这样就可以很好地给人留下务实、不只停留在纸面设计的印象。

  小贴士

  在准备这种题目的时候,不妨当成一个了解自己未来本职工作的契机。除了技术方面以外,系统设计题的亮点,往往还在于你能说出一些关于资源计划、任务分配、团队协调的答案。尤其是对于需要带团队的同学来说,这会大大增加你面试通过的机率。

  最后,再次强调,刷再多的题目,也代替不了在面试中表现出的自信。尽情的发挥自己的优点,让面试官看到你就是最适合这个岗位的候选人吧!

  — 04 —

  面试如何高效制胜?

  想要了解更多面试准备技巧?迈克老师撰写的这本《高效制胜——程序员面试典型题解》可以给你更多解答。

  全书采用数十道力扣真题,不仅讲解了这些题目的解法,更重要的是帮助读者掌握举一反三的高效刷题方法,事半功倍地斩获理想 offer。

  35 岁跳槽,拿到了技术负责人 Offer,靠算法职场逆袭

  不仅如此,力扣还请迈克老师以这本书中的题目为线索,并新增了一些相关题目,为扣友们定制了一份“高效制胜”版学习计划,可以一边看书学习技巧,一边在力扣进行实战演练。

  即刻点击图片,加入计划吧!

  35 岁跳槽,拿到了技术负责人 Offer,靠算法职场逆袭

  学习计划 是力扣新推出的高效提升工具,每个计划以天为单位,根据不同学习主题规划题目任务,通过“有计划性”的练习帮你快速掌握相关知识,还能养成每日打卡的好习惯。

上一篇:UCB CS 61A - I Heard You Liked Functions...


下一篇:阿里云DMS发布数据库网关服务: 打通网络限制 开启数据库统一管理的万能钥匙