在完成大力神的12个劳动后成为英雄,和马戏团训练的动物毫无意义的连续呼啦圈跳跃之间,这是一件尴尬而有压力的事情,我们轻描淡写地称之为求职面试。我们都讨厌它们,但它们却是我们职业生活中不可避免的事实。
当我第一次天真地冒险进入令人不舒服和不友好的软件工程技术面试的世界时,没过多久我就感觉到,在两三个小时内判断一个软件工程师的能力就像克朗宁一样准确。
然而,我一直在想,像坐在另一边的那个人是什么样子,需要什么才能理解一个工程师是否适合这个角色。在过去的几年里,我进行了100多次软件工程技术面试,虽然每家公司都有其独特的流程,但人们往往会犯一些常见的陷阱。这是我关于如何避免它们的诚实建议。
“成功之路和失败之路几乎完全一样。”--科林·R·戴维斯。
优秀的软件工程师没有唯一的定义。它关系到公司角色的需要以及公司的多样性和成熟度。一家最近的初创公司无疑需要很短的时间推向市场,而一家成长为庞大客户基础的更成熟的公司可能会面临一些规模和架构方面的挑战。在构建产品的同时了解什么对业务有意义,这与解决复杂的技术挑战是不同的。详细的完美主义工程师不同于快速迭代的工程师。你需要了解公司在寻找什么,并将你的行为和言论框定在这种心态中。不要做一刀切的简历,而要根据实际情况进行调整。如果你必须做一个推介(在某种程度上,你总是做一个正式的或其他的),用一种你展示你将如何成为该特定公司的资产的方式来框定它。你应该理解这个角色试图填补的必要性,并问问自己,如果它激励了你,那么就去拥抱它。你应该弄清楚“好”的定义在公司的背景下是什么样子,并表明你的知识、经验和态度如何符合这个定义。
在对公司一无所知的情况下去面试,就像是去约会,只谈论自己,并不意味着不会有第二次约会,但不会给人留下好的印象。努力了解业务、目标、使命、战略和结果。我不会因为对此一无所知而让人失望,但这是候选人动机的一个暗示。同时,这也是HR倾向于评估的标准。除了业务目标之外,如果他们有技术博客并了解他们的技术堆栈,请务必查看他们的技术博客。应聘者通常不会对公司表现出合法的兴趣,但当他们这样做的时候,这是一个脱颖而出的绝佳方式。
“能够接受一个思想而不接受它,这是一个受过教育的头脑的标志。”--亚里士多德。
在我的职业生涯中,我遇到过很多优秀的技术专家,他们是各式各样的人。尽管如此,他们都至少有一个共同点:他们都是那些挑战现状,使流程和技术得到改进的人。因此,当被问及是否有问题时,许多候选人没有什么要补充的。避免提问是一次浪费的机会,抓住这个机会询问公司做出的技术决策和他们面临的挑战,并讨论每种技术的权衡。
他们是否考虑迁移到HTTP/3?他们是否正在转向事件驱动的微服务架构?他们使用的是哪种Message Broker?为什么不用Kafka代替RabbitMQ呢?他们使用的是哪种数据库技术?使用案例是什么?在该用例中,ElasticSearch是SQL的一个很好的替代方案吗?
诸若此类。质疑技术决策将表明,您不仅了解这些技术并可以争论何时应该使用它们,而且您还可以批判性地思考并最终关心改进您所使用的任何应用程序。
再多的实验也不能证明我是对的,一次实验就能证明我是错的。--阿尔伯特·爱因斯坦。
当前技术面试状态的忘恩负义和直截了当的不公平令人震惊。大多数过程涉及解决与计算机科学基础相关的某种算法问题,如图搜索或排序算法。我发现有传闻说,候选人必须以最小的资源占用实现树遍历算法,这样当他得到这份工作时,首先要做的就是调试一个使用了10年的单片计算机。作为一名应聘者和面试官,我觉得这种试图美化我们工作复杂性的自命不凡的尝试令人沮丧。这些类型的挑战很可能会解雇那些头脑中没有新鲜概念的高级开发人员,即使他们可能在该角色中拥有最高的经验。
我同意这些类型的练习并不是完全没用的;快速解决小问题的能力与解决持续几天的复杂问题的能力有关,但它们从根本上是不同的。面试过程应该尽可能地反映日常工作的实际情况。一些过程包括查找和修补实际应用程序上的错误,成对编程,或者实现自动化测试,我发现这些比深奥的算法问题要充分得多。对于这些类型的情况,一定要对公司选择的语言感到舒服,不要害怕提问,以了解挑战的全貌。
但是,对于大多数流程,您将面临某种算法或数据结构问题,除非您具备良好的计算机科学基础知识,否则无法绕过它。像“破解编码面试”这本书、Leetcode或Pramp这样的资源可以是很好的参考资料。
不管怎样,一定要大声解释你的理由。通常情况下,问题层出不穷,只要你能在问题的其余部分取得优异成绩,一门课不及格也没关系。如果你陷入困境,面试官会帮你的,关键是要看到应聘者从一个不太知名的科目中恢复过来,并在其他方面做得很好。此外,当你遇到困难时,经验丰富的面试官可能会从提问转变为教学,不要将这种改变解读为失败;上下文的改变有助于解除大多数人的障碍。
面试官是来帮助你的,也是来评估你的,而不是来评判你的。把他看作是在问题上指导你的老同事。一定要讨论各种解决方案和权衡;这将显示出你对该主题的了解程度。
我曾经有过一个应聘者,他在面试时非常摇摆不定,没有把握。尽管他没有安全感,而且还在事后批评自己,但他做得很好,所以他还是被录用了。但是,安顿下来后,在日常工作中,他信心十足,能够领导讨论,在技术课题上指导团队。后来我问他,为什么在面试的时候态度这么胆小。然后他向我解释说,他接受了一系列灾难性的面试,当时他不太能很好地应对被拒绝的情况。拒绝是这个过程的一部分,你不能让它影响到你。
要在几个小时内评估与软件工程师相关的所有能力是不可能的。每个流程都为公司选择相关的流程,并尝试以最好的方式对其进行评估。可以是你擅长的,也可以不是。
糟糕的员工对公司来说是很艰难的,特别是在士气方面,他们加入的团队更是如此。它们也有很大的成本。再加上许多公司没有标准化的流程(重点是比较候选人,所以每个面试官都应该处理相同的问题,而且应该有一个明确的流程,对每个面试官都是平等的),这样你就会得到相当大比例的假阴性。面试做得不好并不意味着你就是坏人。这意味着你所表现出的能力在那个特定的时间并不是最适合这个过程的。
我知道,当我失败了,读或听这样的东西时,我总是认为这是胡说八道。我一生都在努力成为一名斗士。然而,有几次我输掉了太多的比赛。总是输的拳击手不过是一个出气筒。但有时你必须找到内心的力量,才能把自己从你已经屈服的残骸中拉出来。站起来,举起你的手,再战斗一次,不要让失败影响到你。
“你的工作将占据你生活的很大一部分,而真正感到满意的唯一方法就是做你认为伟大的工作。做伟大工作的唯一方法就是热爱你所做的。如果你还没有找到,那就继续找。不要安于现状。就像所有内心的事情一样,当你找到它的时候,你会知道的。“--史蒂夫·乔布斯。
当我们在日常生活的混乱和混乱中前进时,我们渴望那些清晰的时刻,当我们在挑战或任务中迷失自己时,时间会弯曲,现实也会褪色。在那些超越的时刻,你的一生可能会在你不知不觉中流逝。这就是编程对我和我们中的许多人的意义,这种永恒而坚定不移的激情深深地刻在了我们的核心里。同样的激情也是成功的秘诀。
我看到应聘者在我们的面试过程中表现出色,只是在他们被录用的职位上表现一般。他们不坏,他们才华横溢,知识渊博,只是表现平平。有时候你擅长你并不真正关心的事情,但正是这种激情会驱使你走向成功。要评价一名软件工程师的热情并不容易。但如果我问你有什么副业,或者你做过的最好的项目是什么,你可能会在整个下午热切地讨论几个项目。不管它是一个拥有数百万用户的平台,还是一个几乎不起作用的副产品。一个充满激情的程序员会满怀喜悦和怀旧地描述他应用的每一种模式、他征服的每一次挑战、甚至每一次破解和失败。那么任何一位面试官都会知道,桌子对面的那个家伙和他一样,是一个对编码充满热情的程序员同事。
这是一个非常真实的反应;你几乎可以从他们的眼神和肢体语言中看出。要么你对它充满热情,要么你对它没有热情。如果你是,一定要谈论那些打动你的项目,这可能是一次普通面试或一次优秀面试之间的区别。
我一直觉得,作为一名候选人,压力最大的部分是知道我需要得到这份工作,并证明自己足够优秀。面试官的角色并不完全没有压力,面试官需要确保有充分的理由来批准或不通过某人,这样才能对决定进行审计,对我来说,总是如此,特别是凭我的良心。
大多数面试官在某个时候都必须接受采访,所以他们很有可能会表示同情。我希望我能帮助你从另一个方面了解一些情况,我真诚地希望我的建议能帮助你找到你真正想要的工作。