以下文章由 Philip Walton (@philwalton) 客座撰写。 Philip 最近经历了一系列在湾区科技公司面试前端工作的经历,结果发现面试并非他想象的那样。
几个月前,我开始漫不经心地在旧金山湾区寻找前端工作。 我喜欢我现在的工作,但我感觉我在我所在的城市已经无法满足我的技术发展需求了。 我想离开我的小池塘,看看我在一个大池塘里,与世界上一些最好的开发人员一起,会有什么样的表现。
当我开始寻找工作时,我知道我想在一个我不会是 *唯一* 专家的地方工作,所以我只申请了知名的大公司。 整个经历最终非常有价值,通过它我有机会见到了我的偶像,并参观了我最喜欢的公司的一些办公室。
但并非所有事情都很好。 事实上,当我回顾整个面试过程时,我忍不住觉得科技公司面试前端候选人的方式存在着根本性的问题。
在继续之前,我想提出以下免责声明。 本文的部分内容将是批判性的,因此我认为最好将这些公司的名称保持匿名。 毕竟,它们是谁并不与我的主要观点相关。
我将分享的唯一细节是我申请并进行了电话面试的六家公司,其中四家邀请我进行现场面试。 我总共接受了 23 次不同的面试,全部都是技术性的。
值得一提的另一点是,这些都是知名公司。 我敢肯定你们都听说过这些公司,我之所以提到这一点,不是为了吹嘘,而是为了表明,既然它们是设定标准的公司,那么我所经历的体验可能非常接近常态。
我的体验
总的来说,我的体验非常好。 其中一些公司因其令人痛苦的面试而闻名,但我经历的并没有我听到的故事那么糟糕。 每个人都很友好,每个人都很专业,如果我对某个问题不知道答案,我从未感到被轻视。 大多数时候,它只是看起来像两个讨论如何解决问题的人之间关于技术的简单对话。
但明显缺少了一点:特定于前端的问题!
现在,我不是面试专家。 我相信大多数招聘经理会对如何最好地衡量任何特定面试问题的有效性存在分歧。 但有一点我相信每个人都可以同意,那就是你所提出的问题应该是那些最合格的人能够最好地回答的问题。
换句话说,如果一个有才华的计算机科学毕业生,刚从大学毕业,几乎没有前端经验,却能够在你的面试中胜过一名优秀的前端工程师,那么你可能问错了问题。
这基本上概括了我的批评。 我绝大多数的面试问题都是逻辑谜题、通用编码挑战和算法设计问题——这些都是必要的,但远远不够充分。
缺少了什么
我知道有几个人做了很多面试,我从他们那里听到一遍又一遍的同样一句话:我宁愿聘用一个聪明的人,然后教他们 X,也不愿聘用一个对 X 了解一切,但缺乏创造力、逻辑和推理能力的人。
我理解这一点。 问题是前端开发是一种特定领域的技能。 它不仅仅是关于智力能力,还关于知识和经验。
前端工程师,从最基本的层面上讲,是编写在用户浏览器上运行的代码的开发人员。 如今这意味着一个编写 HTML、CSS 和 JavaScript 以及了解浏览器公开的各种 API 的人。 通用术语“程序员”和特定术语“前端工程师”之间的区别仅仅是知识存在的领域。 一名超级明星前端工程师可能也是一名超级明星程序员,但反过来并非一定如此(通常并非如此)。
如果你同意我刚才所说的话,那么你就会理解我对以下主题在所有 23 次面试中都缺席感到惊讶。
- 我从未被问过任何关于新的或即将推出的 HTML API 的问题。
- 我从未被问过任何关于各种浏览器和浏览器版本之间差异的问题,以及如何针对这些差异或处理这些差异的问题。
- 我从未被问过任何关于桌面浏览器和移动浏览器之间差异的问题,以及关于为在两者上运行的 web 应用程序构建技术的任何问题。
- 我只被问了一个 CSS 问题(只有一个!),那就是“告诉我行内和块级之间的区别”,即使大多数非前端人员都知道这个问题。
- 我只被问了一个与 DOM、DOM 事件或事件绑定有关的问题。
我被问过很多类似这样的问题
- 编写一个函数,它接受两个已排序的数字列表,并将它们合并成一个已排序的列表。
- 给定一个整数数组(正数或负数),找到具有最大总和的子数组。
- 确定给定字符串是否是回文。
- 给定一个大型哈希表,其键是电影名称,其值是这些电影中演员的列表,编写一个函数来确定特定演员的 培根数。
再说一次,我不想暗示问这些问题没有价值。 问题是它们与前端开发无关。 正如我之前所说,大多数拥有强大计算机科学背景的优秀开发人员都可以回答所有这些问题,即使他们从未构建过网站。
所以发生了什么?
我确信问题的一部分是,对于仅限前端的职位以及“前端工程师”本身这一术语的新颖性。 它不是一个定义明确的术语,并且根据使用它的人的不同,可能意味着非常不同的东西。 我愿意承认我的前端角色理念可能与发布招聘信息的人不同,但我怀疑这不止于此。
另一个可能的原因是,我大多数的面试官本身并不是前端工程师。 他们是高级团队成员、招聘经理、副总裁、创始人等,但他们通常不是前端工程师。 因此,他们坚持他们所知道的,并且他们问了他们一直问的同样问题。
我的建议
鉴于我最近的经验,我想向未来可能面试前端工程师的任何读者提供以下建议。
- 前端候选人应该至少由一名前端团队成员(最好更多)面试。 如果你没有前端团队成员,请找到你认识并信任的人,并请他们来做这件事。
- 显然,逻辑和算法之类的主题很重要,尤其是对于某些公司而言,但如果你正在面试前端职位,那么很大一部分问题应该集中在前端。
- 如果你真的想问关于逻辑和算法的问题,想办法将你的问题与特定于前端的知识结合起来。
为了说明最后一点,与其问关于归并排序的复杂度,不如问关于这个 jQuery 表达式的复杂度
$("#nav a")
.addClass("link")
.attr("data-initialized", true)
.on("click", doSomething)
对这个问题的正确答案将展示对基本计算机科学原理的理解以及对 jQuery 在幕后所做的事情的更深入的了解。
与其让某人编写一个添加两个日期的函数,不如让他们构建一个简单的日历小部件来配合它。
与其询问他们关于 CSS 的琐事,不如给他们两段文字,看看他们能想到多少种将它们并排排列成两列的方式。 然后让他们描述每种方法的优缺点。
最后,优秀的工程师往往非常自觉。 由于浏览器技术通常不在学校教授,因此大多数前端工程师都是自学成才的。 因此,与其询问他们所知道的(这价值有限),不如询问他们如何保持领先,以及如何避免落后。 他们正在做什么来确保他们在一年后比现在更出色?
结论
面试是一件棘手的事情,即使是一些最具创新性的公司有时也会做错。 而且,由于前端这一术语的模糊性和随之而来的期望范围,面试前端职位甚至更加困难。
我从许多面试官那里得到的印象是,这些公司中的大多数直到最近才开始意识到专门的前端人员的重要性。 他们的前端代码库开始变得庞大且难以管理。 问题的一部分是管理它们的人并不精通前端最佳实践。
如果你想聘用一名前端候选人,请考虑重新审视你的面试流程。 如果你正在做本文中提到的某些事情,你很可能错过了很多优秀的人才。
如果你正在寻找前端工程师的工作,现在可能是最好的时机。但根据我的经验,我建议你复习一下计算机科学的基础知识。我强烈推荐一个资源,那就是MIT 开放式课程的系列讲座,特别是算法导论。
最后,我希望这篇文章不要被视为一个对面试问题不满的人的抱怨。这绝对不是我的本意。我希望我能尽我所能,为我们行业的前端工作提升标准。我相信,实现这一目标的最佳途径之一,就是帮助公司为这些职位招聘合适的人才。
这真是一个很棒的见解,但也略带恐怖。
我已经盯着那个 jQuery 函数看了 5 分钟了,它似乎并不那么复杂?除了是一个假设的 selector,我看不出有什么问题——请原谅我的无知!
我注意到两件事:
为什么它要通过 JavaScript 添加“link”类?根据这段脚本,它似乎不是条件性的,那么为什么不直接在 HTML 中添加它,从而节省 DOM 操作?
上面关于 data-initialization 属性也是如此。
尽管如此,这些看起来都是比较小的细节,所以我很想听听作者的意见,看看我可能遗漏了什么。
我主要指的是算法复杂度,而不是一般意义上的复杂度。算法复杂度用于确定算法的效率。
但你指出的关于这个表达式没有特别“复杂”这一点是正确的。
你的评论很有趣。我认为他所说的“复杂度”指的是“时间复杂度”。
我注意到最主要的一点是在
#nav
中对每个 anchor 都设置了单个点击处理程序。这将占用与 anchor 数量成比例的内存(线性复杂度)。相反,最好将点击处理程序委托给 nav,这样只需要一个(常数时间复杂度)。
@Benjamin Goering——你对此有任何更多信息吗?我找不到合适的谷歌搜索词语来了解更多。如果可以的话,我想减少我的内存使用量。
$(“#nav a”)
我认为这个想法是要解释 jQuery 在这三种前端技术背景下究竟会做什么。
#nav 可能是一个导航元素
以编程方式添加“link”类可能可以在没有 JS 的情况下进行优化
data-initialized 是一个 HTML5 元素布尔属性
添加点击事件使用 jQuery 事件管理,可以选择使用命名空间
doSomething 是当前 JS 范围内的命名函数,但也会在不同的范围内执行(“this”将发生变化)
由于缺乏事件委托,你可以假设它是一个静态导航(你的评论也暗示了这一点)
代码就像语言,并非所有懂语言的人都能写书。
面试官想看看你是否能用你的语言技能写出一本好书。
换句话说,你能用你的技能为问题提供最佳的解决方案吗?
Philip,很棒的见解,感谢分享。
不过,我想澄清一下,因为你使用的“前端工程师”这个词可能会让其他人,比如我,那些可能阅读这篇文章的前端开发者感到困惑。
简单来说,你是一位网页开发者,也就是前端工程师,而不是仅仅“前端”人员。
但是,你拥有其他网页开发者所没有的东西:你关心前端的东西,这很棒! :].
因此,在阅读了你的经历后,我发现 HTML、CSS 和 JavaScript 是“前端开发者”和“前端工程师”的重叠领域,前者可能更多地受到“网页设计”的影响,而后者则更多地受到“网页开发”的影响。
显然,网页行业职位名称的舞曲变得更加复杂……
再次感谢你分享你的经历。
PS。谁会想离开谷歌?o_O
我最终接受了谷歌的工作 :)。
除了那些离开谷歌去到上市前的 Facebook、Twitter 和 Snapchat,或者更进一步,去创业的人……
但对许多人来说,谷歌多年来一直是排名第一的工作场所。许多快乐的工程师在那里创造着非凡的东西。
Ricardo,我同意你对“工程师”这个词语语义的质疑。不幸的是,这个词被过度使用,已经失去了意义。
我接受的是计算机工程教育,我学习了数字和模拟技术(包括元件和电磁学)的物理、数学、系统、理论和模型的许多方面。我的同窗和室友通常都是某个工程专业的学生,例如化学、电气、机械或土木工程(也许还有物理学专业)。
当然,这些东西在应用于行业时会变得更加具体,有些学校甚至会为此专门开设专业,但它们之间有一个共同点,那就是使用定义明确的系统,这些系统具有设计好的行为、物理、方程和数学,以及 **对所有这些如何组合在一起创造事物的理解**。我仍然在思考,是否可以将纯粹的软件称为“工程”,而没有物理方面的支持,我认为使用“开发者”这个词更合适。
我称自己为前端开发者,但当然,我必须接受雇主赋予我的任何头衔。在聚会和公众场合,我发现直接说“我做网站”更容易。
读完引言第一句话后,我就知道这篇文章的内容。这些顶尖公司的所有人都是真正了解计算机科学的人,如果开始招聘不懂计算机科学的人,那将是一个很大的转变。通过维持现状,这些公司肯定会错过一些优秀的前端开发者,而代价则是确保不会招聘到不称职的人。
对我来说,这就是前端开发者和前端工程师之间的区别:后者是一名软件工程师,他可以无障碍地参与任何软件开发活动,但主要专注于网页开发。
我完全同意存在问题,也许需要一种平衡,或者类似的东西,想想你并没有被测试你实际要做的工作,这真是让人难以理解。
此外,我推荐 Steven Skiena 的《算法设计手册》,它适用于所有想尝试算法设计的人。它用很少的正式数学方法,涵盖了复杂度、数据结构、算法等内容。
很棒的帖子。我经常与那些对开发/代码知之甚少,但不知何故在招聘过程中被委以重任的招聘人员交谈。想知道 Philip 对 Darcy Clarke 的“前端面试问题”(http://darcyclarke.me/development/front-end-job-interview-questions/)的看法。无论如何,这篇文章很有启发性。当然要牢记这些,不断磨练自己的技能。谢谢。
@Henri Helvetica,大多数招聘人员对开发/代码的理解程度在以下值之间变化:
零 • ——————— • 什么都没有
很少(非常少)我遇到过对开发/代码有一些模糊概念的人,最近几个月,我和几位招聘人员都有这样的经历。
我也遇到了类似的经历,这让我打消了追求旧金山机会的念头。我和那里大约三家类似的大公司进行了面试。他们有一些逻辑谜题和小项目,用来测试我的理论和实践能力,我确实与不同的人进行过很多以前端为导向的结对编程,他们也问过你提到的很多问题,尤其是电话面试。出于某种原因,我的电话面试总是感觉最棒,即使我确信我在电话和当面面试中表现都一样好。
但我最终还是走开了,感觉在那个地区任何一家公司面试都需要花费大量时间和精力,但他们不太可能给我提供工作机会,因为他们的选择偏向于那些拥有扎实的计算机科学背景的人,而我的背景是设计。
从长远来看,我无法想象为这些公司工作会比为自己工作更令人满意。我决定把原本花在改变自己以符合他们要求的时间用在制作项目、寻找客户和教学上,这些都比在马拉松式的面试后收到拒信更令人满意。
我的意思是,你无法买回生命中的时光。如果你真的想在这些公司工作,如果你真的会因此感到快乐,那么请继续,按照他们的要求改变自己。努力追求他们!但是,如果你不确定在旧金山甲科技巨头工作会比在纽约乙中型创业公司工作更快乐,那么也许这并不值得付出额外的努力。人生苦短,如果你现在可以做一些重要的、令人满意的工作,就不要因为别人的期望而折磨自己。
这是我遇到的第一个赞同的评论。“你无法买回生命中的时光。”——很多时候,人们似乎没有意识到时间和金钱一样宝贵。我曾在硅谷面试过一次,从那以后就放弃了任何回到那里的机会。就像我决定不读博士学位,也不做教授一样,我决定世界上有太多机会,我不能目光短浅地专注于通过一家公司在山谷里的那道门,而这道门是由斯坦福大学的优等生把守的。当然,如果我想付出努力,我可能做得很好——只是回报与我现有的水平相差无几。
作为 Google 的前端开发人员,我理解你的观点。但作为一名经常面试别人的人,我可以告诉你,你认为“大多数拥有强大计算机科学背景的聪明开发人员能够回答”的问题,并非如此。你会惊讶于我面试了多少年经验丰富的人,却无法回答最基本的 CS/数学问题。你发现它们很简单,证明了你自己的能力,而不是你应该泛化的东西。
Andrew Shebanow: 我认为,这正是我的问题所在。我将以我的个人经历为例,但我相信有很多像我这样的人。
我在大约 8-9 年前大学毕业。大多数 CS 知识,尤其是算法等,并不是你在日常工作中会用到的(这是因为这些问题通常已经被解决,隐藏在您使用的工具或框架中)。所以,我当然在算法或谜题方面很生疏。但话又说回来,我已经掌握了这些知识,只需要提醒一下——比如快速 Google 一下——我就能再次理解它。现在,在进行面试时,我讨厌我必须知道在日常工作中没有用到的算法知识,而且在某种程度上,这些知识似乎与我的经验和技能无关。我有超过 10 年的经验,有丰富的工程背景,不太擅长解决谜题——但我总是能完成工作,取得高质量的结果,而且一直都得到过很棒的反馈。但我会很容易被那些刚从学校毕业、没有任何实际经验、但精通算法并且记忆犹新的人挤掉。我个人认为这是一个问题,而且我认为公司并没有真正尝试解决这个问题。对他们来说,错过一位好候选人比雇用一个考试不及格的候选人更容易,而且他们会承担这种成本。我的意思是,我明白,你需要一些东西来衡量候选人的技能,但我认为目前使用的题目并不理想。
Andrew,
我会是那些会回答不好 CS 问题的开发人员之一。我是自学成才的,我已经做了大约 15 年的全职全栈开发人员。到目前为止,我在工作中还没有遇到过与 CS 相关的任何问题。请回顾一下过去几周的工作,并提出与之相关的问题,而不是回到你的 CS 课程中。
我每周都会多次面试全栈 Web 开发人员,我从不在乎他们是否能排序数组、B 树、创建随机洗牌算法、反转链表或其他任何来自该领域的算法。我在乎的是你是否能高效地为我们的团队做出贡献,完成我们每天都要做的任务。你了解 JavaScript 吗?闭包?异步?CSS 呢?多列布局?渲染速度?你有 TDD 的经验吗?你会如何测试异步代码?这些是我们解决的问题。记住 CS 教科书中的内容不是其中之一。
我很想知道 Google 的前端工程师会遇到哪些需要 CS 的问题。
我也会在这个面试中失败,我已经做了 17 年的 Web 开发人员,曾在戴尔、英特尔和微软等大型公司工作过。在所有这些年中,我几乎没有处理过比高中数学更复杂的问题——测试我将坐在电脑上工作时要做的任务,而不是一些与实际情况无关的模糊理论。我最喜欢的面试类型是给你一些家庭作业任务,让你交上来——让我向你展示我能完成工作。
那些无法回答基本的 CS/数学问题的人,最终是好的开发人员还是糟糕的开发人员?作为一个开发人员,我永远不需要写“JS 类”,或者关于闭包定义的冗长演说,或者排序算法(典型的 CS 课程,但我是自学成才的)等等。
所以,当被问到这些问题时,我很容易就卡住了。现在我已经训练过这些东西,但它们只是为了面试,而不是为了任何实际应用。
我也只能同意前面所有人的观点。我一直都非常擅长理论和算法,最近又开始学习数学(函授学习),仅仅是为了好玩(我怀疑我是否能拿到学位——我已经有了 CS 学位,我只是想测试一下我的大脑)。
然而,在我多年在山谷工作以及现在(回到)德国工作的这段时间里,我还没有遇到过真正困难的“CS”问题,如果遇到过(一年一次或更少?),我可以通过 Google 在一分钟内找到解决方案,或者我可以花更多时间自己设计出算法。
我发现,以下几点更重要
愿意接受任何挑战,不会退缩地说“我做不到,我会让别人处理这个问题”。
喜欢编写(内联!)文档——真正描述他们做了什么以及为什么要这样做,而不是描述发生了什么(任何能读懂代码的人都能看到这一点!)。
轻松自在,这意味着承认自己不知道的事情,很容易承认自己犯的错误,而不是掩盖错误。
我(或曾经?可能已经退化了)最不必要的技能是为上面示例中提出的问题设计算法。
伙计们,我们说的是最基本的东西。设计一个算法来检查回文不是什么难事。你甚至不需要记住它,你应该能够现场想出一个。
这些问题不是为了检查你的记忆力,而是为了检查你的创造力、对控制流的基本了解以及评估算法复杂度的基本能力。
说清楚,我指的是前端工程师,而不是纯粹的 Web 开发人员。谷歌雇佣了很多纯粹的 Web 开发人员,但他们并不是为了开发复杂的 Web 应用程序(例如谷歌音乐,我就在那里工作)。对于这类应用程序,你需要能够用 JavaScript 进行严肃的编程,就像在服务器端的 Java/C#/任何语言中一样复杂和困难。这两个职位的技能重叠,但最终却截然不同。
function palindrome(s) { var n=s.length-1; return n < 1 || s[0] == s[n] && palindrome(s.substring(1,n)); }
JS 中的尾调用递归优化,请 :)
观点很好,对面试过程提出了很好的批评,正如一位评论者指出的,面试过程似乎已经演变成了这样。你被问到的许多面试问题最大的问题是,它们甚至无法识别“聪明人”,正如一位评论者所指出的,它们的目的并不是识别“聪明人”,它们主要识别的是那些以前听过这个问题的人。当然,它们不反映“现实生活”中的问题,这些问题通常更加平淡无奇,即使出现,预期的解决方案也无法说明你会如何解决它们。在现实生活中,你会使用库和 API,不太可能“自己编写”解决方案。事实上,如果你这样做,我会立即怀疑你的技能。
“另一个可能的原因”->“另一个可能的原因”。
你没有提到你去了哪里面试,以及他们问了你什么样的问题,导致你拒绝了他们的工作。
我认为这种筛选过程的原因与“工程师”将扮演的角色有关。当你在 Google、Github 等地方被录用时,他们往往会让你跨栈工作,而不仅仅是某一个特定领域。事实上,这对新员工来说是一件好事,因为他会学到很多东西。
所以他们愿意冒风险雇用一个不一定了解所有前端细微差别的人,但他在 CS 方面很扎实,并在需要时能够适应。
我认为他们应该设置两个不同的职位。一个是前端开发人员,另一个是前端工程师。
不幸的是,关于面试,这是事实。我最近参加了一个关于 PHP 数组语法的面试,它写于……2005 年!所以错误答案 [] 变成了正确答案。
非常遗憾。
顺便说一句,我会优化你的 jQuery 事件处理程序。我说的对吗?
我最近参加了一个面试,面试官让我在纸上写出 - 没错,是在纸上 - 一个不使用 JavaScript 的下拉菜单的 HTML 和 CSS,它可以在 IE 6 中运行。我问他们这个任务是否代表了我每天需要做的工作,两位面试官给出了不同的答案:其中一位说“嗯,可能不是” (那为什么我在面试中要这样做?) 另一位说“是的,我们所有的产品都需要在 IE 6 中运行” (谢谢,我已经停止构建 IE 6 兼容性 4 年了)。
简而言之,当时我意识到这个地方不值得我浪费时间。
也许他们真的只是在寻找更多面向 CS 的工程师。
我目前正在做一个大型项目,我们的一些前端开发人员几乎不接触 HTML 或 CSS。他们所做的很多工作都涉及扩展我们的 MVC 框架(在本例中为 Angular),编写单元测试或为我们(包括我)的初级开发人员编写 API。如果我们必须在项目中替换他们,关于 jQuery 的面试问题将无法帮助我们找到合适的候选人。
我理解前端工程师是一个足够广泛的术语,它可能涵盖从编写框架的人到只编写 HTML 和 CSS 的人,但我猜想大型公司可能更难找到前者。
我认为我在一些相同的地方参加过面试(虽然很难说,因为问题是如此毫无意义,它们几乎可以适用于任何地方的任何编程工作),虽然我大部分同意你的观点,但我认为你太慷慨了。你提到这种面试前端开发人员的技术可能是因为以前不需要他们,但根据你对面试公司的描述,他们似乎需要前端开发人员才能达到你注意到的程度。
我的理论是,这不是公司招聘第一位前端人员的问题;这些公司需要专家,如果他们在寻找某人来填补一个利基市场,根据我的经验,他们会非常小心地找到一个能够尽可能好地填补这个职位的人。相反,我认为,当公司开始囤积工程师时,这个问题就会出现,他们不是为了完成任何特定的任务或提供任何特定的专业知识而招聘人,而是主要想要更多的人手来处理可能出现的项目,因为他们会继续扩张。因此,我认为前端人员不应该学习算法,而应该在发现自己参加面试时,所有问题都是通用的,没有一个问题与他们想要继续使用和磨练的专业技能相关时,应该朝着相反的方向跑。如果有人像对待商品一样面试你,那么你将接受的就是商品的角色。
Garann 说得很有道理!我认为你关于商品视角和工程师囤积的观点可能正确。我以前从未这样想过。
在我的上一份工作中,我是被聘为第一位前端工程师的,我被问了很多更多前端问题。具体来说,我被问到了他们最近遇到的问题,而他们没有好的答案。
此外,我非常喜欢 Frip Frap!
我喜欢这种说法。
如果面试很糟糕,工作也可能很糟糕。
很棒的文章。为了反驳一下 - 我猜想,当你申请前端工程师职位时,你向雇主提供了投资组合、示例网站或至少是一份过去项目的清单,他们可以搜索这些清单以了解你的前端工作。通过这些,他们可能能够确定你是一个合适的候选人。
很多那些类似“谜题”的面试问题是为了考察你的方法。展示你方法的能力胜过你的投资组合。记住,编程职位与平面设计或文案写作职位不同。人们需要用他们的眼睛看到你的解决问题的方法。他们不能仅仅信任你的投资组合。代码很容易复制,而不必理解它。
一个聪明的面试官非常害怕招聘一个“贡献”负面价值的“心灵巫师”。“心灵巫师”通过“快速”下载东西并将它们拼凑在一起,直到屏幕上出现一些东西,来“解决”问题。
我认为对公司需要什么以及应该问你什么问题,假设太多是有风险的。你通常会面试一个特定团队的空缺职位,他们会知道他们想要什么。
例如,如果你没有或不想运行在移动和桌面浏览器上的网络应用程序,为什么要问相关问题?如果一家公司使用 Angular,为什么要问 jQuery?如果角色主要集中在使用 Node.js 和 React 进行日常产品开发,为什么要关注询问候选人 React 已经处理的低级 DOM 问题?如果你已经有了一个很好的 UI 框架,为什么要在面试中花时间询问候选人如何大规模编写 CSS?
将问题与前端特定知识相结合的建议可能是让某人轻松进入面试的一种好方法,但你也可以争论说,一个优秀的候选人应该能够解决问题,而无需将这些问题包装在一个熟悉的盒子里。因此,在某些时候,你想要看看某人如何思考他们不熟悉的东西,如果他们在工作中经常遇到这种情况。
说了这么多,我真的很惊讶你被问到的 CSS 问题这么少!恭喜你加入 Google 开发者关系团队。
我同意这条评论的精神,但我认为它忽略了 Philip 所说内容的重点。
我认为 Philip 的观点更像是,如果他们知道自己在寻找什么,就会更明显。如果相同的 question 可以问一个 .NET 开发人员的面试,那么很明显这些问题缺乏重点。
那么,他们想要什么呢?我认为 Philip 的观点是,问题应该足够具体,以针对将要进行的工作。
同样,我认为他的观点与特定技术无关。当然,如果这不在工作描述中,他们就不会问关于 jQuery 的问题。这篇文章说的是,他们没有问与将要使用的技术相关的足够具体的前端问题。
同样。他们没有问关于 React 的问题,或者任何其他问题。这就是他的观点。他们在寻找聪明的人,不一定非要寻找聪明的前端开发人员(这又回到了 Garann 的绝妙观点,即成为商品)。
如果工作是“前端工程师”,他们为什么会在“经常”遇到不熟悉的情况?是的,当然,前端开发中总是会出现新的和具有挑战性的问题。但是所有这些问题都在特定技术框架内。换句话说,问题可以非常具体到技术,但又足够陌生,可以对候选人的技能和经验提出真正的挑战。
同样,我认为 Philip 在这篇文章中提出的一个最强的观点,也是 Chris 很好的回应了,是很多问题可以被从未构建过网页,更不用说使用 DOM API 的人更有效地回答。
可怕的是,如果这些公司确实知道他们在做什么(就像你似乎建议的那样),那么很明显 Garann 是正确的,他们将开发人员视为商品。
从你的文章中,我可以看出你很自以为是,认为自己很特别,独一无二。
举例说明
这是我读过的最荒谬的事情。
不,不是。
我一直在旧金山和硅谷附近面试前端职位,我对面试过程印象不深。你真的说得很对。就像你说的,他们问了很多计算机科学问题,这些问题可能并不那么相关。
一家公司让我复制莱文斯坦距离算法。另一家公司问我关于面向服务的架构的问题。虽然这些很重要,但它并不能说明我是否可以编写出好的前端代码。
一个精明的前端人员应该了解好的 CSS 架构,更重要的是,为什么要关注它(SMCSS、OOCSS、BEM)。在 JS 方面,DOM 和与公司相关的 API。也许如何处理异步内容。然后,正如你所说,他们如何学习和保持最新。标记和布局非常基础,虽然我要说我以前见过“前端开发人员”把它搞砸了。一个简单的代码挑战可能可以筛选掉他们。
是的!进行更好的面试是大多数公司可以改进招聘流程的最明显方法之一。
但这不仅仅是前端工程问题;各种各样的员工被派去参加面试,却对要问什么问题或具体要评估什么毫无头绪。他们经常会花时间问候选人以前面试中已经问过的问题,或者只是当场想出新的问题来打发时间。大家,我们可以做得更好!
理想情况下,每个面试官在每次面试前都有一个计划,这样他们就知道要问什么问题以及应该在哪些方面重点关注面试。每次面试的重点应该由一组招聘标准驱动,以便对候选人进行全面评估——特定的技术技能、知识、关键个性特征和动机、与团队/公司的契合度、经验等。
让我沮丧的是,事情不必这样!好消息是,越来越多的公司开始认同这样一个观点:专注于招聘是他们可以创造最大价值的方式之一,所以我认为即使还有很长的路要走,但这种情况也会继续改善。
如果你想查看采用更明智、更有条理的面试流程的公司列表,请访问我的网站 http://www.greenhouse.io 查看我们的客户列表。
我最近在纽约也有类似的面试经历(尽管最让我惊讶的是,一些大公司花在面试上的时间之长——几周!)。甚至一些广告/设计机构也更看重正规的专业知识,而不是自学技能。
然而,我确实认为那是一种错误的态度,我认为你对前端面试困难的原因说得非常对:这个领域变化太快,很难知道什么是好的前端候选人。最重要的资格是不断重塑自我的能力,以及不要固守你的流程,但你如何面试这种能力呢?
而且,虽然许多前端任务与直接的编程有许多共同之处,但能够组织项目的 CSS 并创建自定义框架有多么宝贵?测试一个人构建二分搜索算法的能力,并不能告诉你该开发者是否能够创建模块化且可重用的元素,从而使你的项目能够顺利完成最终阶段。
也许,如果我要面试,我会花时间让开发者来阐述他的开发流程。如果她使用 grunt,我会希望她能说服我使用 grunt 是个好主意。同样的道理也适用于 Sass、Less 等。我会提出一个 CSS 组织哲学:BEM、OOCSS、SMACSS,并询问使用它的潜在好处/成本。
对我来说,前端开发首先是介于非常有主见的设计学科之间的桥梁。它需要务实且灵活,始终寻找另一种方法来完成任务,以防首选方法无法奏效。但前端开发也在机构之外迅速发展,它并不适合所有人,它可以像程序员一样被设计师评估。
我非常希望看到一篇后续文章,介绍用 JavaScript/jQuery 解决这些逻辑谜题的方法……
一篇非常有见地的文章,读起来很愉快。
我和 Tanel 的反馈很相似,我在和 Google 招聘人员交谈时的经验也反映了这一点。在我与招聘人员讨论了 Google 的各种机会(一切皆有可能,但招聘人员不能谈论任何对我有用的具体内容)以及他们的面试流程(从关于基本 CS 类内容的电话面试开始,感觉与我过去 10 年作为开发人员每天使用的技能完全脱节)后,我决定甚至不去参加第一次技术面试。更令人沮丧的是,从那以后,似乎每隔一两个月就会有新的招聘人员给我写信,试图让我重新加入,完全没有意识到我过去不继续的原因。
我最近对招聘人员持怀疑态度,我不会和招聘人员交谈,只会关注我可以有机会与担任类似职位的员工交谈的公司。Google 的方法可能对新员工有效(就像我在 Microsoft 开始工作时对我有用一样),但我认为他们限制了自己很多。
我还认为,Google 有团队远程协作,但仍然要求每个人都到办公室,这很荒谬。但这有点离题。
顺便说一下,如果你所在的公司正在寻找具有丰富开发经验的前端和 .NET 开发人员,最好是远程工作,我将在网站链接中提供我的 Github 个人资料(我的一个公共仓库包含我的简历)。
也许可以考虑另一种观点:根据我的经验,大多数优秀的招聘人员会更关注你的软技能,因为他们已经通过你的在线资料(GitHub、博客等)、你过去的工作经历和推荐信了解了你的技术能力。如果他们不知道这些信息,却在面试你时问技术问题,我建议他们没有做好功课?
在我看来,提出更多前端问题恰恰是招聘合适人才的错误方式。大多数优秀的招聘人员会更关注你潜在的团队和文化契合度、你的解决问题的能力、你的自信和个性类型,而不是你在面试中能否回答特定的技术问题。
值得思考一下。
“超级明星前端工程师”
请了解真正的工程师是什么,这样你就不至于误用这个词。
你想用不傲慢的方式解释一下吗?
我认为“前端工程师”这个职位名称是可以接受的。但我乐于听取不同的观点。
有趣的是,我刚刚写了一篇关于这个特定主题的文章,回复了Ricardo Zea 的上面的评论(#comment-927535),希望不会被认为是傲慢。:P
关于“内联 vs 块级”问题的评论。当我还是招聘经理的时候,我经常问这个问题,我不得不告诉你,很多简历上写着有 CSS 经验的人都不知道答案。除了作为电话面试的筛选问题之外,候选人如何回答这个问题也很有趣。在我交谈过的数十位候选人中,只有一位描述了比较两者时关于填充、宽度等的细节。有时,回答的方式比回答的内容更重要。
总的来说,我在美国东南部也有类似的经历。一家公司尤其问过类似的问题(是为“前端开发人员”招聘的),面试结束时,我觉得我被要求同时做前端和后端。这没问题,但不幸的是,这家公司没有让我担任这个职位,而是选择了其他人。几个月后,他们似乎又在招聘同一个职位,而且已经重复了三次(没有扩大其他领域的招聘)。也许我应该把这篇文章发给他们的人事部门……
我同意 Mo 的观点,我目前正在为一位客户工作,她花了整整一天时间插入内联 CSS,只是为了让内联元素看起来像块级元素,反之亦然。当我解释了其中的区别时,她意识到前端工作确实有所不同,而且专业性更强。
总的来说,我认为这个主题是另一个令人讨厌的面试问题“你有什么问题要问我们吗?”的完美切入点。这是你确定他们是否真的要招聘前端开发人员、网页设计师或中间层开发人员的时机,当你帮助他们理解其中的区别时。通常,我遇到的招聘人员要么想看更多后端代码而不是前端代码,要么想看网页的漂亮图片,这些图片很容易由猴子制作出来。
我认为你只是运气不好。我之前被问过你期望在这些职位中被问到的所有问题,但这取决于招聘人员。这是典型的无稽之谈式面试。不幸的是,被问到像你列出的那些具体的 CSS 和 HTML 问题,就像你遇到的那些通用的计算机科学问题一样有用/无用。
这是我们行业的一个严重问题。我本人也是一名前端工程师,我经常遇到这个问题,能够理解这有时会让人有多沮丧。
但责任在我们,我们这些热爱前端挑战并了解其复杂性的人需要解决这种文化问题。我会尽我所能,只问前端工程问题,比如:闭包、回调地狱、Promise、异步/同步、分布式 XHR 调用、HTTP、JavaScript 中的 MVC、跨域脚本等。至于测试算法能力,有很多有趣的问题,比如编写井字棋游戏等。
我通常不问太多 CSS 问题,因为我坚信 JS 是前端工程的核心所在。我尽力确保面试前端职位候选人不会有任何一刻感到问题与职位无关。我在自己的职业生涯中也经历过这种令人厌烦的遭遇,并且为此付出了很多努力。
根据我的经验,大公司难以进行有针对性的前端面试。然而,一些初创公司非常了解前端职位,无论你是否通过了面试,你都会带着愉悦的心情离开。
我也有过同样的经历。虽然我似乎能找到工作,但我从未被问过任何真正与前端相关的技术问题。我没有 CS 背景,而且我不认识很多前端开发人员,即使有,也是很少。我写了一篇文章,谈论我认为成为现代前端开发人员所需的独特事件和技能组合,https://medium.com/p/d12bbb3ac785
我在面试中被问过很多算法问题,这些问题与我的工作无关。它们更适合游戏开发者。
几个月前,我也经历过类似的经历,试图在西雅图的一家大型公司找到工作。即使在我 10 多年的业务软件开发经验中,我的工作更像是后端软件开发职位,但我从未有机会处理实际的算法。现在没有人这样做。因此,理论上,一个人需要了解各种算法的 Big O 数量级,但在海外电话面试中要求实现它们,我认为有点过分。
关键是他们正在寻找解决问题的人,这很好,但你在 40 分钟的面试中能提出什么样的问题呢?一个与候选人经验无关的小问题,或者一个标准的问题,即实现算法。
因此,我建议任何在当今大型科技公司面试的人,只需记住这些东西,网上有很多资料可以找到。花 3 到 5 天的时间用你选择的语言实现它们,这将对你面试非常有利。一旦你完成了,你可以安全地忘记所有这些。
整个算法这件事并不难,只是出乎意料。但现实是现实,需要适应。
无论如何,我将在一个月左右的时间内再次尝试 :)
你真的认为人们有时间在快节奏的硅谷公司进行面试吗?我很少这样做。大多数面试都是由招聘经理在面试前一两天安排的,而且是在最后一刻进行的。很少有工程师愿意花时间去想出针对团队中每个职位描述的专门问题。在拥有许多角色的大型团队中,当你正处于一个上周就要完成的项目中时,这很不现实……人们真正想要的是看看你是否相信公司的使命,是否对这份工作感到兴奋,是否能很好地融入团队,是否努力工作,是否能随机应变,是否不需要太多指导就能完成工作。每个硅谷公司都有自己的文化。在这里面试是一个了解你、你能力的机会,而不是你所知道的。因为如果你什么都知道,那你申请的职位不对,你应该自己创业。
多么愚蠢而自大的回答。如果你的公司不关心他们的产品或面试,以确保提出正确的问题,从而不雇用一个注定会失败的人,那么他们的公司文化是倒退的。
如果一家公司正在寻找一个关心使命宣言的人,他们可以通过申请者在求职信中付出的努力或他们在简历上拥有的经验来筛选申请者。如果一家公司正在寻找一个适合公司文化的人,他们可以与他们在咖啡馆坐下来聊 30 多分钟。如果一家公司想知道某人的能力,只要简单地看一下他们的代码库或作品集即可。
面试不是见面会。它是一个向候选人提问和布置任务的地方,这些问题和任务与职位直接相关。不需要花两天时间与你现有的团队一起说“好的,我们经常做些什么,对这个人来说至关重要?”你可以在午餐时间想出来。
如果只有前端开发者领域中真正杰出的人能够创建一个包含良好面试问题的 github 仓库……
哦,等等:“前端工作面试问题”,包括 Paul Irish 在内的 61 位贡献者?
https://github.com/darcyclarke/Front-end-Developer-Interview-Questions
现在就把这个传真到硅谷……
这里有一些分歧。
我认为像亚马逊、谷歌、VMware 等核心产品开发公司通过询问 DS 算法、难题而不是前端来做对了。
我在印度的一些顶级公司参加了 30 多次面试,现在在亚马逊担任 Web 开发人员。
他们的想法是,他们想要聘用聪明的人(不仅仅是知识渊博的人)。因此,薪酬水平非常高。
从你的 jQuery 类比来看,它很容易学习和应用。弄清楚 jQuery 链式操作是如何工作的,以及为什么“#nav a”选择器是一个慢速选择器,并不需要太多智力。
但我绝对同意日历小部件部分。
我曾经被要求用 CSS 定位在前端构建一个拼图游戏。
但是,像 JavaScript 最佳实践、前沿的 HTML5 功能、CSS 技术等东西,可以在没有太多努力的情况下找到,而且很容易理解和使用。
然后,它就变成了一个积极主动、关注互联网上正确人士的问题。除非你了解一些真正稀有的东西,而其他开发人员不知道,否则这很不公平。
那么像谷歌这样的公司为什么要给我这样一名工程师支付如此高的薪水,高达 15 万美元甚至更高呢?(我并没有赚那么多!!)
为什么不写一本包含所有网络内容的书,其中包含 jQuery/JavaScript/CSS/AMD/MVC/MVVM
/HTML5/WebRTC/单页/响应式设计,以及互联网上所有可用的内容,从 100 美元起。
谷歌雇佣了 AngularJS 开发的新毕业生。
VMware 要求我用 JavaScript 实现 sleep 函数。
亚马逊要求我创建一个用于实现链表的 JS 类,
另外,一个基于 Promise 的接口来解析嵌套 DOM 元素的 CSS 属性。
我认为这完全合乎逻辑。唯一的例外是,如果一个面试官仅仅因为一个算法而贬低我,而他甚至没有接近我的前端技能,我就会感到非常愤怒。感觉就像一个孩子在试图惹我生气。
你的观点只适用于那些不真正进行此类工作的公司或 Web 开发机构,他们想要根据与他们实际工作完全不同的技能来雇用人。
或者可能适用于刚刚组建团队的初创公司。由于这类公司的创始人、副总裁等本身就是以前的研发或研究人员,他们希望确保领导团队的人很聪明。
在这种情况下,他们只是相信你的前端/UI 和后端技能很好,你只需要证明你很聪明。
我个人认识一位 C++ 开发人员,他不会 JavaScript,但在一周内就被迫学习了新的 Canvas API,并创建了一个现在在亚马逊使用的 HTML5 图像转换应用程序,用于应用过滤器、删除背景等,如果你是在亚马逊上销售产品并上传图片,就可以看到这个应用程序。
这个家伙用 HTML5 Canvas API 用 JS 编写了所有算法。因此,亚马逊放弃了 Aviary 图像套件,因为现在我们有了自己的单页应用程序。
嘿,我真的很抱歉得知另一个 C++ 程序员做了你被指定的工作。
毕竟他是一个后端开发人员,他做了一份非常好的前端工作,而且在一周内就完成了。他一定是一位非常有才华的人,能够掌握不同于他所在领域的另一种技术。
当你是一个以自我为中心的人,总是说“谷歌问我”,“亚马逊问我”的时候,这更令人痛苦。
我相信前端不再局限于设计模型并将其转换为 HTML。
浏览器现在能够执行繁重的逻辑任务,因此需要区分前端开发人员和前端设计师。
让开发人员做所有逻辑方面的思考,比如处理数据之类的事情,让设计师专注于 CSS 和 HTML 以及应用程序的外观。
因此,我相信应该向开发人员询问所有逻辑推理方面的问题,向设计师询问 HTML、CSS、Photoshop 等问题。
问题确实与一个人申请的职位有关。
毕竟,你不想找一个什么都会,但什么都不精通的人。
嗨,
你提到的那些问题以及公司没有问你的问题,都是用来测试你在某个领域的知识,而且所有问题都可以通过简单的 Google 搜索得到答案,并且可以很快学会。
公司问你的那些问题,不是为了测试你的知识,而是为了测试你的逻辑以及你在遇到问题时如何解决问题,而这是无法学会的。塑造你的思维方式成为工程师的思维方式是一个漫长的过程。
第二种问题比第一种问题更有价值,因为如果你能回答第二种问题,那么你就可以轻松快速地学习第一种问题。
此致,
里斯托
很棒的文章。我身处世界上的另一个地方,但你提到的问题在这里也确实存在。人们应该认为,在面试中毫无准备地进行面试是愚蠢的,更常见的是,那些远远更优秀的 前端开发人员被淘汰,而那些拥有编码基础但对特定职位没有深入了解的人却被录用。我认为主要原因是,公司里的高级人员对前端开发了解不多(主要是因为前端开发比较新,而且非常庞大),所以他们最终会问一些关于基础知识或他们所知的问题。
那些总结为 1 (CSS)的问题实际上验证了这种观点。我真心地希望这篇文章能被一些科技博客收录,以便获得一些公司回应。
附注:祝贺你加入谷歌。我只能想象在那里工作是多么棒。希望几年后,我能申请并得到面试邀请,谁知道接手技术面试的人会不会是你呢..:)再次祝你一切顺利,菲利普。精彩的文章,感谢克里斯在这里分享它。
此致
罗伊
不错的文章,感谢你写它!
让我感到不可思议的是这些问题
如果被要求在面试中现场完成,我将**绝对失败**于这**四项任务**。
在“现实生活中”——我可能可以慢慢地解决所有问题。我会用谷歌搜索。我会深入了解为什么我要这样做,这将激励我完成任务。我会写出一种解决方案,它只是我慢慢推理的过程,然后把它带给比我更擅长这类问题的人,向他们解释我的思路以及我的解决方法,这样当他们帮我改进时,我就能理解他们的思路。
这是否意味着我是一个糟糕的计算机科学家?也许吧。我理解对于那些硬核程序员来说,这些东西应该非常简单。这是否意味着我是一个糟糕的前端工程师?我不这么认为。我在很多网站上担任过前端工程师,我觉得自己做得还不错。我认为我在任何前端团队中都会很有用。然而,我可能无法通过很多专门招聘前端工程师的公司的第一轮面试。我相信我并不孤单,那么有多少优秀的 前端人员错过了他们本来可以胜任的工作呢?
克里斯,重要的是你在面试中如何努力尝试解决难题,而不是你是否正确地回答了一个难题。
在工作中,人们以不同的方式找到解决方案。有些人通过研究,通过互联网,从他人那里获得反馈,或者仅仅因为他们有经验而知道。如今,谷歌是每个人的资源。
面试是为了观察面试者在逆境中的挣扎。观察他们如何克服挑战,即使他们需要指导。当提供指导时,看看他们是否学会了更多知识,并对解决方案有了更多补充。
我更感兴趣的是观察个人是否放弃了……雇用那些有韧性的人,那些坚持不懈的人,那些会问问题的人。给出简单的问题,让候选人感到舒适。然后提出更难的问题,看看他们在具有挑战性的情况下**表现**如何。我并不关心你是否回答了更难的问题,我关心的是候选人付出的努力,以及他们是否留给我**印象**,以便与其他候选人进行比较。
这不是关于是否知道所有东西,而是关于候选人在面对艰难挑战时的**韧性**。在旧金山湾区/硅谷,氛围非常创业。它一直都是关于提供新的想法,而不是旧的想法。
克里斯,我同意……我不得不查一下“回文”这个词……但当我看到它的意思后,我想到了如何得到答案。(我的脑袋里充满了代码,而不是词典)。我认为公司过于关注术语,并期望你脱口而出所有术语。在我看来,这并不现实。当然,我可能是错的。
克里斯:你构建的东西中,有多少次涉及到数据结构、算法和 O 符号?可能不多……因为你是以 UX/UI 为中心的开发人员(我也是)。
很多招聘职位实际上是在寻找“软件工程师”,他们精通 JavaScript 这门语言——他们称之为“前端工程师”。而不是那些精通新的 HTML API、CSS/RWD 等,并构建传统 Web 应用程序的人。
我也是……但现实情况是,谷歌或类似公司招聘“前端工程师”的招聘流程以及他们的招聘经理倾向于招聘有计算机科学背景,并且在学习过程中掌握了 JavaScript 这门语言的 Python/Java/服务器端开发人员——即使像你我这样的以 UX/UI 为中心的开发人员在该职位上能做得很好(并且已经做过了)。
无论如何,也许我只是不确定传统计算机科学数据结构和算法在前端工程中的作用有多重要——似乎他们以上述面试问题中寻找的主要知识就是这些(这也是我与这些公司及其需求交流后的经验)。也许这需要更深入的讨论……*呼叫尼古拉斯·扎卡斯*!
我非常喜欢“带回家测试”,尤其是在面对面面试之前,你会被要求根据模型/PSD 和某种功能规范来编写代码。这样,他们就可以在面试中解决很多技术技能方面的问题,而面对面的会面则更侧重于性格、文化契合度以及回答问题。此外,这允许开发人员以类似于他们在公司工作时表现的方式展现自己,而不是被当前情境的压力所困扰(而且没有合适的资源——没有人知道所有事情)。
唯一的不足是,候选人可能还有其他紧急事情,所以如果在提交编码练习时出现延迟,需要进行沟通。我做这件事的时间越长,我就越想知道为什么我没有成为兼职招聘人员,哈哈。:P
克里斯和菲利普绝对正确。人们过于强调学术智能(基于学术学习和经验的信息复述),而不是我所说的常识(经验和创造力的运用)。
几乎**没有人**以常识的方式面试别人,正如菲利普所说,他们希望你解决一些非常不恰当的逻辑难题,或者解释一些让我想要切腹的算法。
我成为 Web 开发人员只有 3 年——2 年自由职业,1 年全职。去年,我花了 3/4 个月时间在伦敦及周边地区寻找我的第一份“前端开发人员”全职工作,我被问到的问题中超过 75% 与我的实际工作完全无关!这绝不是夸张,我申请了很多工作,我不记得到底申请了多少,但这让人非常恼火,也极大地考验了我的耐心!
直到我在一家非科技公司找到了一份前端开发人员的工作,面试非常棒,真正考验了我的常识、经验和知识。那是我参加的第二场真正面对面的面试,当天我就收到了工作邀请。
听到大多数在旧金山/加州等地的知名公司也是这样,真是令人难过。这是一种浪费潜力。我宁愿雇用 100 个聪明、有常识和经验的人,也不愿雇用 1000 个最聪明、学术上无脑的僵尸,他们每天都服从一切指令。
首先,OP 写了一篇很棒的文章!
@克里斯,你在这里谈到前端开发/UI UX 设计与计算机科学之间的脱节真是太好了。我最近参加了一次 UI UX 前端开发的在线技能测试,第一个测试就是回文挑战。
在我多年的工作经验中,我从未,从未需要处理回文。我当时确实想出了一个解决方案,并证明了我的计算机科学和逻辑技能,但这并不是重点。对于我申请的职位,我不会以这种方式筛选数据进行分析和比较。你想分析什么?给我一个问题,问我怎么分析谷歌分析中的流量漏斗,找出 X 跳出率异常高的原因。
另一个例子是,我需要经常操作 DOM,但没有一个测试问题与之相关。没有追加子节点,没有使用 jQuery 操作 CSS,什么都没有。
简而言之,我将勇敢地举手回答你的问题“有多少优秀的 前端人员错过了他们本来可以胜任的工作呢?”,并回答“我就是其中之一”。
感谢 OP 的精彩文章,感谢克里斯所做的一切。
Kerry Kobashi – 首先,韧性不是解决问题的方式。韧性是一种让你即使没有人看着你,也没有人等待结果,也依然坚持追寻目标(在这种情况下是解决方案)的品质。我同意在面试中不仅仅是获得正确答案,但我认为你不能通过给面试者 4 个难题来测试他们的韧性。如果我在面试中没有答对问题,即使它不再重要,我也会回家试着解决它。韧性是一种随着时间推移而体现出来的品质,而你并没有时间在面试中观察这种品质。半小时不放弃算韧性吗?还是一小时或两小时?面试官会陪你两个小时,看你一直不放弃吗?如果在工作中遇到类似的问题,我不会放弃,直到我自己或在一些帮助下解决问题,但面试官在面试环境中无法观察到这一点。然而,你可以在面试中观察一个人如何思考和推理,但这并不是韧性。因此,如果你要招聘韧性强的人,我认为,一次面试并不能提供你需要的信息来决定候选人是否具备这种品质。
Chris,你不觉得你为了这 4 件事而做的事情,比如“谷歌搜索、深入理解等等”,计算机科学家也能做到吗?
就像我说的,我在亚马逊的朋友,他是 C++ 开发人员,他在一周内通过谷歌搜索并构建了一个基于 HTML5 的图像编辑器。
亚马逊曾是 Aviary 的客户。现在不再是了,因为这位朋友编写了所有算法,并构建了一个很棒的产品,它可以完成大多数功能,包括所有 Canvas 变换、滤镜等等。亚马逊将它用于卖家上传商品图片。
我同意这个应用程序在视觉上没有吸引力,但当亚马逊要招聘一个人将这个产品打造成为一个视觉上吸引人的单页面应用程序时,无论他/她是否是前端开发人员,亚马逊都会确保候选人能够理解并扩展这些算法。
这对所有产品公司来说都是合理的。
我 100% 同意,那些开发应用程序(而不是网站)的公司更加需要招聘那些具有强大编程基础的人员。
然而,我的观点是,再强的智力也无法替代前端经验,尤其是在前端技术中,很多东西都不遵循逻辑规则(例如浏览器兼容性、不一致的规范等等)。
让我举个例子。
几个月前,我正在度假,QA 发现我们的应用程序在 iOS Safari 上出现了一个错误。错误是,当侧边导航抽屉展开时,用户可以拖动抽屉关闭,但实际上并没有关闭抽屉(也就是说,内部存储的状态没有改变)。
无论如何,我们公司最聪明的人之一开始着手解决这个问题。在他看来,问题是用户可以水平拖动,所以他决定在抽屉打开时禁用水平拖动。他对触摸事件不太熟悉,所以他做了一些研究,写了大约一百行代码来检测拖动事件(仅在水平方向上),并在这种情况下阻止默认操作。
他签入了代码,它可以工作。虽然有点笨拙,但也足够 QA 解决问题了。
然后我从度假回来,看了一眼这个错误,就想:“哦,我打赌
<body>
上缺少overflow-x: hidden
”。果然,解决方案就是这么简单。问题是,这位开发者比我聪明得多,而且他的编程水平也更高,但我提出的解决方案才是正确的,原因是我有前端经验,知道该使用什么技术。
我认为,一个优秀的开发者可以开发出很棒的应用程序,但这(从轶事来看)我们是否见过,没有 Bootstrap 或者类似的前端框架,优秀的开发者也会束手无策,创造出非常僵硬的前端代码,这些代码不能很好地适应各种设备尺寸,而且只要稍微改动就会崩溃?
前端开发,在与 UX 和信息架构重叠的地方,与它与程序逻辑和后端结构重叠的地方,是截然不同的。我认为这篇文章和大多数评论的主要观点不是“这些公司不知道如何面试前端开发人员”,而是“这些公司可能最终不会雇用最好的前端开发人员”。也就是说,如果他们没有问正确的问题(就像我之前说的,我认为前端开发人员的工作流程和流程比他们掌握的知识更有价值)。
Chris,我刚刚意识到,这个论坛真的很需要一个“赞”按钮,或者类似于 Stack Overflow 的评分系统。
+1
这篇博文很有意思。有没有人像这样在 SF 的公司面试“前端开发”?那些从设计领域转过来的前端开发人员怎么办?或者像谷歌这样的公司会不考虑非计算机科学专业的候选人吗?
我在微软面试时,被要求在一趟实时遍历中对字节数组进行排序。这是面向前端职位。事后我意识到,这需要一个哈希映射或类似的东西。我在面试中使用我们共享的在线环境中的 JavaScript 编码。
我在网上找工作时看到很多职位要求 4 年以上 Java 或 C# 经验,而 HTML/CSS/JavaScript 技能只列为加分项!
在这个行业摸爬滚打了三十年后,我发现它和音乐一样。不是他们在 9 点到 5 点做什么,而是他们在休息时间做什么。
所以你会雇用那些下班后不写广告歌曲,而是去乐队演奏的音乐家或音响工程师吗?还是你会雇用那些每天工作 9 个小时都在演奏音乐,然后回家做其他事情的人?
代码也是一样——你会雇用那些每天工作 9 个小时都在编写代码的代码编写者,还是你会雇用那些无论你是否雇用他,无论他是否有工作,他都会编写代码的人,因为——仅仅因为。
你可以学习代码,但你学不到热情——而有热情的人总是能更好地学习代码。
我认识的一些最好的前端开发人员,在下班后就不再工作了,除非是在家做兼职工作。恕我直言,我认为热情不是由你的工作时间决定的,而是由你在工作时的心情决定的。
对前端特定的职位问这些问题很奇怪。
部分挑战在于,前端开发人员的角色,或者更确切地说,任何 web 开发人员的角色,都有一个范围很广的定义。
在过去,前端开发人员意味着使用 HTML/CSS 进行皮肤设计,并了解浏览器渲染规则。现在,更多地强调 JavaScript 以及构建单页面应用程序,在这种情况下,对传统编程/逻辑问题的了解更加相关。
不,真正“过去”的时候,设计、HTML 和 CSS 意味着:**网页设计师**,而 PHP、Java、ASP、Python、Perl、JavaScript [插入其他编程语言] 意味着:**网页开发人员**。
很简单。
@Philip,我同意。我见过更多有趣的情况,开发者使用很长的代码行来解决一个简单的问题,而这个问题可以用一行 JavaScript 代码解决,有时只需要重新排列 HTML 元素就可以了。
因此,事实证明,前端工作经验无法用智力和现代的勤奋来弥补。
但是,经验也无法弥补基础智力。所以,完美的组合应该是,一个既聪明又勤奋、对 Web 和前端保持兴趣的开发者。我相信,大多数优秀的前端开发人员都属于这一类。
如果有人在面试前端职位时问我关于二叉树或在 JAVA 中找到链表的中间元素,我肯定会把咖啡泼在他脸上。但是如果有人让我在浏览器中构建一个类似 Excel 的应用程序,我会觉得很有意思。
另外,一些烧脑的谜题也会吸引我。
而且大多数优秀的公司都知道这一点。我在 Atlassian 和 VMware 都面试过前端开发人员,并且惊讶地发现,他们认为我反感 JAVA,并且非常注重我的前端技能,即使产品完全是用 JAVA 编写的。
他们直接询问了原型继承、AJAX、CSS 定位、布局等等。还让我编写了 JavaScript 记忆函数、唯一函数、call 和 apply 技巧等等。
其中一个问题是
requestAnimationFrame
——在 CSS 过渡结束后传递一个 JavaScript 回调函数,我惊讶地被问到了这个问题。那些缺少优秀前端开发人员的公司也面临着同样的困境。
我本质上是一个前端开发人员。我永远不会在一家说“**有 Java 背景的前端开发人员**”的公司工作,即使我的背景是 Java。因为我知道,这类公司除了问 Java 问题或一些蹩脚的前端问题之外,没有其他方法来识别前端开发人员的智力或欣赏他们的经验。
有时我会在面试中**直接嘲笑**一些声称自己是优秀前端开发人员的 Java 开发人员提出的愚蠢的前端问题。我得到的反馈是“**候选人过于咄咄逼人**”。大多数情况下,我试图向他们证明,他们在客户端方面的知识是多么可怜。
其中一个人认为
.ajax()
是一个原生 JavaScript 函数。经过一番激烈的辩论,我终于告诉他——先生,你需要回去检查一下 jQuery 和普通的 JavaScript。他对此很不满,并且**抱怨**我!!
哇!你太聪明了……哈哈;)
不错
这是一篇很棒的文章,对公司如何筛选优秀开发者有一些见解。我曾经面试过一家公司,职位是 SQL 代码编写和基本的数据库开发。在面试中,我被问到关于我的军旅经历,服役地点,服役时长,最喜欢的演员等等。唯一与技术相关的问题是关于斜角(bevel)的含义。当时我没有意识到自己把创意简历寄给了他们,而不是开发者简历。我完全被弄糊涂了,因为我知道答案,但我的思绪还停留在面试的其他部分,并没有考虑 3D 开发或图形设计。我感到很尴尬,因为我无法给出清晰的描述。虽然我已经使用过该工具数百次,并且可以告诉你访问它的快捷键。面试官会用一些方法来让你失去平衡,观察你在压力下的表现。吸取教训,对我来说。
没错没错!这篇文章完全说出了我一直在经历的事情。
人们问为什么做我的工作这么难找工作。这就是原因。我们拥有如此多的优秀人才和优秀的公司,但之间却存在脱节。这就是我多年来一直独立工作的原因。所以,这只是证明,不是你懂什么,而是你认识谁。感谢你写这篇文章。我无话可说。
非常有见地的文章。有点吓人,我认为当你像你描述的那样在这样的公司面试时,他们会问更具体的问题。我想他们只是假设如果你有逻辑/解决问题的能力,他们就可以教你其他东西。
感谢你的文章,Philip!
我理解坚持不懈的论点,但问题是,现实中的坚持不懈不是用你在一小时内做了什么来衡量的,而是经常用没有报酬的周末来衡量的。
很棒的文章。听起来又是一个技术职位的“融合”。我越来越看到这种现象,招聘临时工和临时转正的公司,他们要求前端 Web 开发人员精通 ASP.net C#/VB、Java、JS、jQuery、PowerShell 等等。这是一个入门级职位,但他们要求 3-5 年经验。
什么?!
我理解坚持不懈和随机应变,但也有很多不是 CS/数学专业毕业的前端开发人员,他们思考、睡觉和吃饭都是前端,他们也拥有同样的动力和渴望,每天都在创造令人惊叹的东西,比如这个网站的运营者 Paul Irish、Nick Gallagher 等等。
真是很棒的文章。当然,简单的問題可以篩選出真正的 талант。
我通常负责公司的前端面试,我遵循你的逻辑——如果你想要一个前端工程师,就问前端问题。根据面试者应聘的职位,我有一个维基页面,上面列出了各种各样的问题——基础、高级和资深级别。我从简单的开始,只是为了“探查”一下候选人,然后继续前进。大多数情况下,我并不需要我的列表,会根据潜在同事的回答来提问。我最喜欢的问题是:“如果你可以改变 CSS 世界中的一个规则,你会改变什么?” :)
height:100%
,不过现在可以用 flexbox 实现这一点 :)一个问题是斯坦福帮是发明 jQuery 之类东西的人,所以他们倾向于问一些问题来评估你是否能够发明 KQuery 或营销团队后来决定用什么名字来称呼它。嘿,总得有人发明这些东西,否则我们都要用原始机器代码编程。
招聘拥有完全适合工作技能的人是有道理的。一个精通 HTML、CSS 和 Javascript 的前端开发人员可能是宝藏,但很多高科技公司想要的是多面手,也许精通一两门。毕竟,说到计算机语言,正如吉卜林所说,“上校的夫人和朱迪·奥格拉迪在血缘上是姐妹”。工作就是要找到意识到这一点并能从这个角度工作的人,即使他们必须使用一些 Google 技巧来获得细节。
当我还是程序员的时候,我们遇到了各种各样的计算机科学问题。我记不清有多少次我们遇到性能问题,需要一些图论或巧妙的重新思考才能将事情降到 O(n log n)。也许前端开发人员从未遇到过资源问题,但我猜一个意识到正在发生的事情的人胜过两个不知道的人。即使作为一个退休的业余爱好者,我也经常遇到 CS 问题。现在有几十种语言在使用,了解闭包和对象之间的关系等等,确实可以让从一种语言跳到另一种语言或在合理的时间内学习一种新语言变得容易很多。
jQuery 是由罗切斯特理工学院校友 John Resig 创建的。他不是斯坦福大学的。而且 RIT CS 系的大学在美国新闻排名中也没有任何排名。
不过讨论得不错……。:)
为了在一个回复中涵盖上面的一些评论……
我同意 @Michael Whyte,一些关于 javascript 中逻辑问题的解决方案会很棒!
这是我对“给定一个整数数组(正数或负数),找到具有最大总和的子数组”的看法。
@Henri Helvetica 我也非常想知道 Philip 对 Darcy Clarke 的 前端面试问题 的看法。
最后,我赞同 @mmcgu1966 的观点,这个评论论坛确实需要一个点赞/评分系统。没有必要写出这个特定的评论/回复。
上面的错误……希望我能编辑
这篇文章真的很不错。我必须说,我相当惊讶,大型“大公司”会问文章中提到的那些无关紧要的问题。正如其他人提到的,似乎对“前端”工程的含义存在广泛的误解。如果有人成功地回答了冒泡排序算法问题,并不意味着他们就能胜任一名优秀的前端工程师。雇主最好询问前端面试者他们通常如何解决浏览器之间的问题,询问他们关于他们的构建流程(如 GruntJS),或者让他们谈谈他们使用的框架/库,并询问他们为什么这些框架/库有用。
是的,另一位前端工程师应该在面试中提问。
相反,一些大公司,包括湾区的公司,一直在寻找多面手,或者根本不理解职位名称所隐含的范围。
“中间件”怎么样了?天哪,现在我正在编写自己的 Web 服务,并努力为 MVC 正名,这样我就不用用 JS 和 HTML 做所有事情,即使是在大型企业中。我最近做了 WAYYYY TOO MUCH Java。
这正是我现在的感觉。
我最近从创意部门——图形设计师转到工程师——前端开发人员,在我公司。我之所以转行,是因为一位高管问我是否有兴趣担任前端开发人员职位,因为他们不想外包。我认为这将有利于我的职业发展,因为我会与其他前端开发人员在一起。我希望我能学习 javascript。我知道我精通 HTML、CSS,并且了解基本的 jQuery。所以我抓住机会,怀着成为一名优秀前端开发人员的希望转行了。然而,我在部门里与我的同事们在一起时,感觉完全迷茫了。我的第一周,工程师部门的高层管理人员说,我应该学习 C#、ASP.NET,因为我们这里没有足够的 HTML、CSS 工作。几周过去了,我仍然感到非常没有效率。我根本不知道他们使用的任何术语。我没有像工程师部门的每个人一样获得 CS 学位,我都是从朋友和像这样的博客中学到的网络知识。我正在考虑回到创意部门。你们怎么看?
根据你的说法,很明显你被误导了。
前端开发人员与 C#、ASP.NET 或任何其他**后端**编程语言无关(至少不一定是)。他们想要你成为一名后端开发人员,但他们用“前端开发人员”这个词掩盖了整个事情。
告诉你这里没有足够的 HTML、CSS 工作的那个人,他肯定不知道(对不起,我西班牙语不好)发生了什么。我敢打赌,那个人本身对 HTML 和 CSS 并不了解。远离这样的人,他们不值得你付出任何努力。
现在,当你对创意部门说“回去”时,我个人并不认为是“回去”。我认为是“集中”你在创意部门所做的事情上的精力,以及你能如何创造更多价值……也许让其他人欣赏你带来的价值,因为,“工程”部门没有这样做。
你现在要问自己的问题是:经历了这次之后,你认为继续待在那里还有意义吗?毕竟,你已经知道在前端领域没有成长的机会了。
很多公司更倾向于招聘刚毕业的人,原因有几个。
1) 他们想要把新人灌输到他们的公司文化/最佳实践中。
2) 雇佣他们成本更低 - 不仅仅是工资,还有其他费用,比如健康保险。
3) 他们希望工作成为你生活中的中心。
如果你40岁,有两个孩子,你更有可能拥有其他优先事项,以及一种即使有些事情没有现在就做好,世界也不会终结的观点!
我在硅谷工作了20年。我曾在大型公司和初创公司工作。我拥有电子工程学位 - 我上学的时候还没有互联网 - 所以我不必开发算法。但我一直是信息架构师/UI设计师/前端开发人员/需求分析师/项目经理/QA工程师。
我总是能够弄清楚需要做些什么,如何完成它,并从我的错误中吸取教训。我拥有良好的职业道德。- 我是一个非常优秀的 前端开发人员。
但如果我的简历能通过过滤掉非计算机科学学位的软件,而且如果我能设法隐藏自己不到30岁的事实,如果他们让我写一个将两个排序列表合并成一个的函数,我不会通过第一次面试。我可能需要在 CS101 中使用 Fortran 来做到这一点,但此后就没有再用过了。
但生活太短暂了。我不愿意和一群自大的斯坦福毕业生一起工作。:^)
这是我一段时间以来读到的最有趣文章/评论线程之一。向以上所有参与者致敬 :)
好文章。从招聘方面发现了一些有趣的观点,可能对大家有帮助:与谷歌的拉斯洛·博克的访谈
不是专门针对前端的,但无论如何。
很有见地 :)
我完全同意这一点
“优秀的 前端工程师通常非常有自驱力。由于浏览器技术通常不在学校教授,大多数前端工程师都是自学成才的。”
干杯!
我同意菲利普斯的说法。为什么在前端面试中会问数据结构和算法?我曾在湾区公司面试,也遇到过数据结构和算法问题。面试结束后,我会问他们“你们公司在前端开发中在哪里使用数据结构或算法?” 或者“作为开发者,你在前端开发中使用过数据结构和算法吗?” 在他们回答后,我接下来的问题是“既然如此,你们为什么问算法问题?” 他们最常见的回答是“你是硕士生,你应该知道这些。”唯一没有问过我数据结构和算法的公司是领英。整个面试过程都是围绕 HTML5、javascript 和 CSS3 进行的。他们主要问的是循环优化、data-attributes、事件监听器,简而言之就是优化和网站在浏览器中的下载。面试过程真的改变了我对领英的看法,我开始比对亚马逊、谷歌更加尊重领英。现在我明白了为什么亚马逊的 UI 如此糟糕。CSS3 和 HTML5 在过去几年发展如此之快,以至于你可以在其中提出一些棘手的问题。这也有助于减少加载时间。
我在 StackOverflow 上回答了这个问题:http://stackoverflow.com/questions/22022112/complexity-of-a-jquery-expression
逐行解释如下
("#nav a")
– 一般情况下,查找匹配元素是O(N)
任务。假设#nav
分配给body元素,并且你的文档中只有<a>
元素。你需要对所有元素进行扫描以匹配“a”选择器。.addClass("link")
– 这只是一个遍历列表的O(n)
任务。但它有一个隐藏的成本 - 通过更改元素的类,你要求浏览器重新计算元素及其所有后代的样式。所以最坏情况下,所有 DOM 元素都会受到影响。考虑到样式重新计算的成本是O(N*S)
任务(N
- DOM 元素数量,S
- 所有样式表中的样式规则数量),那么总成本将是O(N*S)
。.attr("data-initialized", true)
– 原则上与上面的成本相同。.on("click", doSomething)
– 这是一个O(n)
任务(n - 集合中的元素数量) + 它还包含为事件绑定结构分配内存的成本。集合中的每个元素都会有新的绑定,因此会分配额外的内存。因此,总的来说,计算复杂度为
O(N*S)
,内存消耗为M(N)
。用户代理通常会进行一些优化,但由 CSS 选择器结构规定的最坏情况就是这样。
将两个日期相加?嗯,将两个日期相加到底意味着什么?(1月11日 + 7月4日)我可以理解为什么你会将一个日期减去另一个日期,或者在一个日期上加上 x 天,但为什么要将两个日期相加?我是不是漏掉了什么?
然后,还要构建一个“简单”的日历小部件,与之匹配,什么,两个日期的总和?嗯?我还在试图弄清楚两个日期的总和代表什么,现在我还要编写一个日历“小部件”来与之匹配?
此外,“小部件”一词含义过于广泛。你是指通用小部件,还是 jQuery UI 小部件,还是 WordPress 小部件,还是其他什么?我可能需要知道一个 API,具体取决于你所说的“小部件”的含义。而且在面试中真的有时间从头编写一个日历“小部件”(当你已经很紧张的时候),现在你还需要进行计算来确定闰年(能被4整除但不能被400整除的年份)和夏令时(考虑到没有夏令时的地区,例如)等等,再加上用于放置日历数据的表格的样式吗?
我同意面试问题应该与职位相匹配,但我并不一定同意你的替代问题(至少有两个)更有用。上面的问题对我来说毫无意义。还有那个 jquery 复杂度问题 - 至少对我来说,我认为讨论合并排序的复杂度(Big O)比你的 jquery 表达式更容易。至少,合并排序是一个众所周知的算法。有多少人知道用来计算 jquery 表达式值的算法?你必须深入研究 jquery 源代码并计算评估特定表达式所需的所有“步骤”数量,随着标记的无限增大,用方程来表示它,然后将 Big O 应用到该方程。或者也许我只是没有理解这个问题。
有谁知道我在哪里可以找到加拿大安大略省的全职固定薪酬的前端开发人员?
这是真的。我认为面试官更热衷于在候选人面前展示自己的知识(即使他们没有),而不是了解候选人的知识。
哇……很高兴看到我不是唯一一个经历过令人困惑的前端开发职位技术面试的人。我也来自设计领域,并且从事设计工作已经超过14年了。我知道我的知识,并且对新技术感兴趣。我发现很难找到一个团队,在那里我不是唯一的 前端开发人员,要么是后面一屋子 Java 工程师,要么是一办公室平庸的经理,然后由我进行协作开发……真是太糟糕了。最重要的是,我发现我认识的人中没有人会用这些面试中提到的术语交谈。我只是告诉面试官我不喜欢那样,那些喜欢那样的人……我可能也不想和他们在一起。尽管如此,挑战是真实的,并且迫使我学习更多并适应不断变化的需求。我感觉我必须按照自己的方式来做,但这些方式可能仍然不被那些自命不凡的人理解。最后,我选择引用一位伟人
“我不想鼓吹任何人使用毒品、酒精、暴力或疯狂,但这些东西一直对我有用。”