首先声明,这一篇文章并非完全原创,它的灵感来源于一篇我最近在Medium上读到的英文博客:ABC: Always Be Coding。我在这篇文章的基础上做了一些修改以及加入了一些我个人的感受。
首先,我们来做一个简单的测试,测试一下大家的面试情况。x是你拿到offer的数量,y是你进入到二轮面试的数量,我们来根据一下公式来计算一下分数:。我算了一下自己的,从毕业至今,一共拿过大大小小7家公司的offer,进入二轮面试没有拿到offer的有3家。这样算下来的分数是125.4,大家可以算算自己的,一般120以上算是不错,如果分数在90以下的话,这篇文章就非常值得一看了。
本文当中包含很多建议,这些建议大概可以分为技术建议(Technical Tips)以及总体建议(General Tips)两个部分,我们一个一个来看,首先是大家最关心的技术建议。
技术建议
always be coding
这个很好理解,和practice makes perfect是一个意思,即孰能手巧。编程既然是一门技术活那么一定的训练量就是必须的,也一定会有一个熟能生巧的过程。一段代码或者是一个算法第一次写起来非常费劲是正常的,经过多次练习之后,会迅速熟悉起来,之后再来写就要容易多了。
但是由于不同的语言以及不同的人学习曲线可能不同,所以很多人会在自己进入熟练阶段之前就放弃,这无疑是非常可惜的。最好的练习方式就是专注练习,也就是有明确的目标,知道练习的对象以及目的是什么。这样有两个好处一个是不会陷入迷茫,第二个可以通过记录练习的结果来清晰地获得反馈,既可以调整练习的频率以及强度,也可以对自己的进度有所了解。
这一块大家应该都有所了解,就不多赘述了。
精通至少一门多范式语言
首先解释一下多范式的含义,范式是编程当中经常出现的一门术语。看起来很玄乎,但是它表示的意思非常简单就是编程所使用的方法,比如面向对象就是一种编程范式,同样函数式编程也是一种范式,面向过程也是一种范式。所以多范式语言也就是拥有多种编程范式的语言,比如我们常用的C++、Java、Python等都是多范式语言。
这里的英文原文用的单词是master,这也是我翻译成精通的原因。也就是说对于这一门语言仅仅是粗浅的会使用以及熟悉是不够的,必须要对语言的方方面面都有所了解,一些常用特性更是了如指掌,这样才称得上是精通。精通一门语言的好处非常多,既可以帮助我们学习其他以这门语言为基础的技术,并且也会大大提升我们的开发能力以及学习其他语言和特性的能力,是非常非常重要的。
当然C++除外,因为没有人能精通C++,就连C++的作者也觉得自己只精通了80%。
打基础而不是背题
很多人会在面试之前疯狂在网上搜索面经,这是非常好的行为,可以帮助我们了解到应聘公司的提问范围以及面试风格。但是这应当是准备阶段做的事,而不是面试前临时抱佛脚做的。相比于死记硬背面试的时候可能会出现的题目,我们更应该打好我们的编程(算法)基础。
夯实基础的一个表现是搞清楚常用算法的复杂度,大家可以看下cheatsheet,当中包含了所有常用算法的复杂度以及一些其他的基本信息。
推荐阅读:吊打字节面试官的算法笔记?在GitHub上也已经标星76.8K?
当然仅仅知道复杂度还是不够的,还需要自己亲手实现一下这些算法,比如Dijkstra算法,Floyd-Warshall算法、旅行商问题、A*算法、布隆过滤器、BFS、DFS以及各种排序算法、最近点对问题等等。想要做点这些没有其他任何取巧的办法,只有刚才说的always be coding.
另外,适当的练习也是必不可少的。这里作者推荐了著名的编程竞赛网站TopCoder,我个人感觉TopCoder的曲线略微陡峭,可以使用codeforces代替,LeetCode中的题目质量没有大家想象的那么高,不要过度依赖LeetCode。作者提到刷题至少需要40小时以上的时间,并且需要涵盖各种算法。比如递归、模式匹配、贪心、动态规划、图论等等。
Heck提到他花了两周的时间投入在TopCoder当中,就是简单的重复重复再重复。两周结束之后他甚至可以做到单手闭眼写出Dijkstra算法(当然是玩笑)。但这里面的道理是明确的,就像Eric Schmidt说的那样,Repetition doesn't spoil the prayer,重复永不辜负。
自己造轮子
不要依赖语言当中现成的各种数据结构的库,尽可能自己动手实现一下。
对于这一点我也非常赞同,虽然现在各种库都非常完善,但是只会使用它们和真正了解掌握它们其实是两码事。很多细节和道理是只有亲自实现一下才能get到的,比如hashmap为什么不是线程安全的,为什么hashmap的数组长度永远是2的幂?这些问题如果不亲自动手,单单看博客文章是很难理解深刻的。即使记住了,过后也很容易忘记。
让coding变得简单
对于工程师来说编程可能是整个工作当中最简单的部分,因为在开始编码之前你需要对项目以及功能进行设计,甚至还需要对架构进行设计。这需要你对相关领域有着非常丰富的经验以及了解,在编码完成了之后,可能需要对性能进行测试,对项目投入使用进行维护,这当中一定会出现大量的问题需要解决和修复。这两点都比单纯的编码要困难,所以不要让自己害怕编码,编程其实是很单纯的工作,可以让人全身投入,要尽量学会享受这个过程。
其次是训练自己白板编程的能力,其实不只是谷歌,现在各大公司都越来越喜欢在面试中添加白板编程的环节。对于许多人来说在面试官的注视并且没有IDE的帮助下进行白板编程并不是那么一件容易的事情,这是需要训练的。如果大家想要去外企以及一些比较著名的公司,那么白板编程的能力是必不可少的。
总体建议
做好准备工作
如果你在面试的时候你对于正在面试的公司,他们的业务,他们现在做的事情,以及目标一无所知的话,那么最好放弃。
如果是大公司可能还好,但如果是小公司的话,这种情况一定会扣不少分。对自己未来可能的雇主做基本的了解也是职业素养之一,这除了可以体现我们的专业性之外其实对我们自己的职业生涯的发展也是非常有帮助的。我们对未来雇主的了解越多,其实也说明了我们对于自己职业生涯规划越清晰,知道自己下一份工作是什么样的。长远来看,这是非常关键的。
不做假设
如果一些问题不是百分百确定,不要想当然,一定要查阅资料或者是找人求证。无论是在面试还是在实际工作当中都是如此,对此我也非常非常赞同。
很多人会习惯性地对一些问题做假设,尤其是不是非常熟悉或者是了解的事情。比如遇到了某一个报错信息,通过某一个命令解决了,他们就会下意识地觉得这个命令就是针对这个报错信息的,而不去细究这其中的原理究竟是什么。很有可能之后因为其他原因遇到了同样的报错信息,他们就歇菜了。
所以对不是完全了解的事情不要做假设,不知道就去了解、学习,千万不能想当然。
热情
如果你自己对一件事情不在意,别人也同样不会在意,因此保持热情非常重要,它可以让你充满了干劲。因为人往往只能在自己有热情的领域做出成绩,所以问一问自己,我们有让自己充满了热情的事情吗?
比如说想要自己做一个个人网站或者是APP?比如说想要自己做一台无人机?还是想要做好自己的一个技术博客呢?其实对什么有热情不重要的,重要的是让自己找到这么一个充满热情的领域。
总结
说到这里,如果我告诉你们Heck没有读过大学,大家会不会感到很震惊呢?
其实我倒不觉得意外,因为从字里行间我能感觉到这是一个对于技术以及自己有着非常高要求的人,并且对于生活和编程充满了热情。有热情它并不一定可以让我们把一件事情做好做成功,但是它可以推动着我们朝着成功的方向不断努力,路途远并不可怕,可怕的是没有动力了。
最后,让我们再回顾一下那一句经典的忠告吧:
Always be coding.
今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)
推荐阅读:
程序员年薪百万的飞马计划你听说过吗?
为什么阿里巴巴的程序员成长速度这么快,看完他们的内部资料我懂了
从事开发一年的程序员能拿到多少钱?
程序员50W年薪的知识体系与成长路线。
关于【暴力递归算法】你所不知道的思路
开辟鸿蒙,谁做系统,聊聊华为微内核
看完三件事❤️
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
关注公众号 『 Java斗帝 』,不定期分享原创知识。
同时可以期待后续文章ing