【AICon】 如何构建高效的 RAG 系统?RAG 技术在实际应用中遇到的挑战及应对策略?>>> 了解详情
写点什么

那些巨头公司的前端面试都喜欢问些什么?

  • 2019-01-28
  • 本文字数:3174 字

    阅读完需:约 10 分钟

那些巨头公司的前端面试都喜欢问些什么?

在过去的几年里,我在亚马逊和雅虎面试过很多专注于前端开发的 Web 开发者和软件工程师,在这篇文章中,我想分享一些面试技巧,帮助候选人为面试做好准备。


免责声明——本文并非旨在列出在前端面试中可能会被问到的所有问题,但可以将其视为知识的基线。


通过面试不是件容易的事,作为候选人,通常需要在 45 分钟的时间内展示自己能做些什么。作为一名面试官,同样难以在这么短的时间内评估候选人是否适合。对于面试来说,并不存在一刀切的方法,面试官问的问题通常会有一个范围,但除此之外,他们可以自行决定要问哪些其他问题。


作为曾经的候选人和面试官,我试图在这篇文章中涵盖你可能会在面试中被问到的最重要的前端开发知识。

常见的误解

我见过候选人犯的最大错误之一就是准备了一些琐碎的问题,例如“什么是盒子模型”或者“JavaScript 中的==和===之间的区别是什么”。知道这些问题的答案固然是好,但这并不会告诉面试官来太多有用的信息。


相反,在实际的面试中,你可能需要使用 JavaScript、CSS 和 HTML 来编写代码。在你的面试期间,你可能需要实现 UI、构建窗口小部件或使用 Lodash 和 Underscore.js 这样的库编写常用的实用程序函数。例如:


  • 构建常见的 Web 应用程序的布局和交互,例如类似 Netflix 网站那样的。

  • 实现小部件,如日期选择器、轮播或电子商务网站购物车。

  • 写一个类似 debounce 或深度 clone 对象的函数。


说到库,我看到候选人经常犯的另一个错误是他们需要完全依赖最新的框架来解决面试问题。你可能会想,如果我可以在生产环境中使用 jQuery、React、Angular 等,那为什么就不能在面试中使用它们呢?技术、框架和库会随着时间的推移而发生变化——我更感兴趣的是你是否了解前端开发的底层原理,而不是依赖更高层次的抽象。如果你不能在没有它们的情况下回答面试问题,我希望你至少可以彻底解释和推测这些库背后的原理。


总的来说,大部分的面试都涉及实际的编码。

JavaScript

你需要了解 JavaScript,而且是彻底地了解。你面试的职位越高,对语言知识的要求就越高。以下是你应该熟悉的 JavaScript 知识点:


  • 执行上下文,尤其是词法作用域和闭包;

  • 提升、函数和块作用域,以及函数表达式和声明;

  • 绑定——特别是 call、bind、apply 和 this;

  • 对象原型、构造函数和 mixin;

  • 组合和高阶函数;

  • 事件委托和冒泡;

  • 使用 typeof、instanceof 和 Object.prototype.toString 进行类型转换;

  • 使用回调、promise、await 和 async 处理异步调用;

  • 什么时候可以使用函数声明和表达式。

DOM

知道如何遍历和操作 DOM 非常重要,对于重度依赖 jQuery 或者开发了很多 React & Angular 类型应用程序的候选人来说,他们可能会在这个问题上栽跟斗。你可能不会每天都直接接触 DOM,因为我们大多数人都在使用各种抽象。在不使用第三方库的情况下,你需要知道如何执行以下这些操作:


  • 使用 document.querySelector 选择或查找节点,在旧版浏览器中使用 document.getElementsByTagName;

  • 上下遍历——Node.parentNode、Node.firstChild、Node.lastChild 和 Node.childNodes;

  • 左右遍历——Node.previousSibling 和 Node.nextSibling;

  • 操作——在 DOM 树中添加、删除、复制和创建节点。你应该了解如何修改节点的文本内容以及切换、删除或添加 CSS 类名等操作;

  • 性能——当有很多节点时,修改 DOM 的成本会很高,你至少应该知道如何使用文档片段和节点缓存。

CSS

至少,你应该知道如何在页面上布局元素,如何使用子元素或直接后代选择器来定位元素,以及什么时候该用类、什么时候该用 ID。


  • 布局——安排彼此相邻的元素的位置,以及如何将元素布置成两列或三列;

  • 响应式设计——根据浏览器宽度大小更改元素的尺寸;

  • 自适应设计——根据特定断点更改元素的尺寸;

  • 特异性——如何计算选择器的特异性,以及级联如何影响属性;

  • 适当的命名空间和类命名。

HTML

知道哪些 HTML 标签最能代表你正在显示的内容以及相关属性,应该掌握手工知识。


  • 语义标记;

  • 标记属性,例如 disabled、async、defer 以及何时使用 data-*;

  • 知道如何声明 doctype(大多数人不是每天都会写新页面,所以可能会忘了这个)以及可以使用哪些元标签;

  • 可访问性问题,例如,确保输入复选框具有更大的响应区域(使用标签“for”)。另外还有 role=“button”、role=“presentation”,等等。

系统设计

在系统设计方面,通常涉及 MapReduce、分布式键值存储系统或 CAP 定理等知识。虽然前端工程师日常不需要深入了解如何设计这类系统,但在被要求设计出常见应用程序的前端架构时,你也不应该感到惊讶。这些问题通常含糊不清,比如“设计一个像 Pinterest 这样的网站”或者“如何构建购物结账服务?”。以下是需要考虑的知识点:


  • 渲染——客户端渲染(CSR)、服务器端渲染(SSR)和全局渲染;

  • 布局——如果你正在设计被多个开发团队使用的系统,需要考虑进行组件化,以及是否需要开发团队通过指定标记来使用组件;

  • 状态管理,例如在单向数据流或双向数据绑定之间做出选择。你还应该考虑你的设计是采用被动式还是反应式编程模型,以及组件如何相互关联,例如是 Foo->Bar 还是 Foo->Bar;

  • 异步——你的组件可能需要与服务器进行实时的通信。在设计时需要考虑使用 XHR 或双向调用。如果你的面试官要求你支持旧浏览器,那么你需要在隐藏 iFrame、script 标签或 XHR 之间做出选择。如果没有,你可以建议使用 websocket,或者使用服务器发送事件(SSE),这样会更好;

  • 关注点分离——Model-View-Controller(MVC)、Model-View-ViewModel(MVVM)和 Model-View-Presenter(MVP)模式;

  • 多设备支持——你的实现是否同时支持 Web、移动 Web 和混合应用程序,还是为每一种场景提供单独的实现?如果你正在构建像 Pinterest 这样的网站,你可能会考虑在 Web 上使用三列,但在移动设备上只使用一列,你的设计将如何处理这个问题;

  • 资产文件交付——在大型应用程序中,独立团队拥有自己的代码库是常有的事。这些不同的代码库可能彼此依赖,每个代码库通常都有自己的管道来发布代码变更。你的设计需要考虑如何基于依赖项进行资产文件的构建(代码拆分)、测试(单元测试和集成测试)和部署。你还需要考虑如何通过 CDN 交付资产文件或者内联它们来减少网络延迟。

Web 性能

除了通用编程最佳实践之外,你应该期望访问者查看你的代码或设计及其性能影响。它曾经足以将 CSS 置于文档的顶部,而 JS 脚本位于页面底部,但 Web 正在快速移动,你应该熟悉这个领域的复杂性。


  • 关键渲染路径;

  • Service Worker;

  • 图像优化;

  • 延迟加载和捆绑拆分;

  • HTTP/2 和服务器推送的一般含义;

  • 何时预取和预加载资源;

  • 减少浏览器回流以及何时将元素提升到 GPU;

  • 浏览器布局、组合和绘制之间的区别。

数据结构和算法

这个可能有点争议,但对 Big-O 时间复杂性和常见运行时间(如 O(N)和 O(N Log N))有一个基本的了解对你来说不会是坏事。单页应用程序现在非常常见,所以了解内存管理等方面的知识是有帮助的。例如,如果你被要求构建客户端拼写检查程序,那么了解常见的数据结构和算法将会让你的任务变得轻松许多。


我不是说你一定需要念一个计算机学位,但这个行业已经从构建简单的网页转移到了计算机科学。网上有很多资源可以让那个你快速掌握基础知识。

一般的 Web 知识

你需要掌握一些构成 Web 的技术和范式。


  • HTTP 请求——GET 和 POST 以及相关标头,如 Cache-Control、ETag、Status Codes 和 Transfer-Encoding;

  • REST 与 RPC;

  • 安全性——何时使用 JSONP、COR 和 iFrame。

总结

对 Web 开发人员或工程师来说,构建 Web 应用程序需要掌握大量的知识。不要被知识的深度所限制,而是要保持开放的心态去学习所有复杂的部分。


除了这里涉及的技术主题之外,你还需要讨论过去参与的项目,描述发生了哪些有趣的事情以及做出了哪些权衡。


更多内容,请关注前端之巅。



英文原文:http://davidshariff.com/blog/preparing-for-a-front-end-web-development-interview-in-2017/


2019-01-28 09:528443
用户头像

发布了 731 篇内容, 共 430.5 次阅读, 收获喜欢 1995 次。

关注

评论

发布
暂无评论
发现更多内容

Java注解编译期处理AbstractProcessor详解

石臻臻的杂货铺

Java

大模型“涌现”的思维链,究竟是一种什么能力?

脑极体

人工智能

连ChatGPT都不懂的五一调休,到底怎么来的?

禅道项目管理

程序员 GPT 调休

如何进行带有透明压缩技术的SSD基准测试?

ScaleFlux

扩容 存储技术 压缩数据 固态硬盘 企业数据

SBOM喊话医疗器械网络安全:别慌,我罩你!Part Ⅱ

安势信息

网络安全 SBOM 开源组件 医疗器械 医疗网安

人脸识别:现代科技与隐私保护的博弈

来自四九城儿

2023阿里云合作伙伴大会-主论坛回顾

科技pai

阿里云 伙伴大会 2023阿里云合作伙伴大会

城市的智能进化,汇成数字中国的璀璨银河

脑极体

智慧城市

从五一的旅游热潮看,该如何实现数字文旅的转型升级?

加入高科技仿生人

低代码 旅游业 数字赋能

什么是对象存储?对象存储的原理是什么?有哪些开源的、非开源的对象存储服务?

Java架构历程

对象存储 三周年连更

Go 方法接收器:选择值接收器还是指针接收器?

陈明勇

Go golang 方法 三周年连更 方法接收器

开启云上高效开发新时代,华为云开发者日东莞站成功举办

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 4 月 PK 榜

软件测试/测试开发丨Python装饰器常见报错信息、原因和解决方案

测试人

Python 软件测试 自动化测试 装饰器 测试开发

【民生证券】敏捷转型大步迈进!民生证券敏捷实践培训圆满结束!

嘉为蓝鲸

敏捷转型 民生证券

《流畅的Python》第二版上市了,值得入手么?

Python猫

Python

ShareSDK 抖音平台注册指南

MobTech袤博科技

服务百万商家的系统,发布风险如何规避?微盟全链路灰度实践

TakinTalks稳定性社区

LoRA: 大语言模型个性化的最佳实践

Zilliz

Towhee 大语言模型

音视频八股文(8)-- h264 AnnexB

福大大架构师每日一题

音视频 ffmpeg 流媒体

算法题每日一练:螺旋矩阵 I

知心宝贝

数据结构 算法 前端 后端 三周年连更

苹果商店上架流程_App上架苹果流程及注意事项

雪奈椰子

2023-04-28:将一个给定字符串 s 根据给定的行数 numRows 以从上往下、从左到右进行 Z 字形排列 比如输入字符串为 “PAYPALISHIRING“ 行数为 3 时,排列如下 P

福大大架构师每日一题

Go 算法 rust 福大大

编程界的新星 — Rust 凭什么被业界青睐(内附学习资源)

Greptime 格睿科技

rust 云原生 时序数据库 分布式时序数据库

好玩的策略游戏:群星Stellaris+DLC

真大的脸盆

Mac mac游戏 科幻策略游戏 游戏推荐 游戏安利

多云管理的六大价值

穿过生命散发芬芳

多云管理 三周年连更

龙蜥社区 4 月度运营大事件回顾

OpenAnolis小助手

开源 运营 龙蜥社区 sig 月度回顾

智能公厕设备升级方案@光明源智慧公厕

光明源智慧厕所

智慧城市

程序员真的要失业了?新技术潮如何改变我们的职业生涯? | 社区征文

拾数崽

职业成长 ChatGPT 三周年征文

云服务规划技术

阿泽🧸

云服务 三周年连更

语义分割标注:从认知到实践

来自四九城儿

Bash 脚本中,特殊变量$0到底是什么?

wljslmz

bash Linux 三周年连更

那些巨头公司的前端面试都喜欢问些什么?_大前端_David Shariff_InfoQ精选文章