10个基本完整堆栈面试问题 *

寻找 自由职业者全栈开发者工作?将您的生活方式设计为具有顶尖的全堆叠开发人员。

提交面试问题

如果您要编写一个终端检查资源是否存在,请使用哪条路径和方法?

这个问题的目的是测试候选人对RESTful API标准的了解。在构建端点时是在路径中使用描述性动词时常见错误。例如:

  • GET /users/search
  • GET /posts/create

相反,真正的RESTFUL路径应该只包含名词 - 端点上使用的方法应该确定动作。例如:

  • POST /users (创建用户模型)
  • PUT /users/{id|slug} (替换用户模型)
  • PATCH /users/{id|slug} (更新用户模型的一部分)
  • DELETE /users/{id|slug} (删除用户模型)
  • GET /users/{id|slug} (检索用户模型)

确定资源是否存在是API中经常需要的操作,但根据RESTFUL和INDUSTRY标准很少正确完成。使用上面的“用户”资源作为示例,确定资源是否存在的常见方法是:

  • HEAD /users/{id|slug}

This request will use the least amount of bandwidth as it will return no data, simply just a 200 (resource exists) or 404 (resource does not exist) HTTP status.

考虑以下数据库表设计:

CREATE TABLE `notifications` (
	`id` INT NOT NULL AUTO_INCREMENT,
	`type` INT(8) NOT NULL,
	`notifiable_id` INT unsigned NOT NULL,
	`notifiable_type` VARCHAR(10) NOT NULL,
	`relation_id_1` INT unsigned,
	`relation_type_1` VARCHAR(10),
	`relation_id_2` INT unsigned,
	`relation_type_2` VARCHAR(10),
	`updated_at` TIMESTAMP NOT NULL,
	`created_at` TIMESTAMP NOT NULL,
	PRIMARY KEY (`id`)
);

上面有什么问题,怎么能改进?

The key issue with the proposed table design are the object_id_X and object_type_X fields. It is considered poor design to increment named fields when the data could be stored in a related table like so:

通知表

CREATE TABLE `notifications` (
	`id` INT NOT NULL AUTO_INCREMENT,
	`type` INT(8) NOT NULL,
	`notifiable_id` INT unsigned NOT NULL,
	`notifiable_type` VARCHAR(10) NOT NULL,
	`updated_at` TIMESTAMP NOT NULL,
	`created_at` TIMESTAMP NOT NULL,
	PRIMARY KEY (`id`)
);

通知关系表

CREATE TABLE `notification_relations` (
	`notification_id` INT unsigned NOT NULL,
	`relation_id` INT unsigned NOT NULL,
	`relation_type` VARCHAR(10) NOT NULL,
	PRIMARY KEY (`notification_id`)
);

在您的API请求中集成第三方服务时的常见问题必须等待响应,因此,强制用户必须等待更长。

你会如何避免这个?如果合适,请命名任何相关技术

解决此问题的最有效方法是使用队列。

当对我们的API进行请求时,然后创建单独的作业并将其添加到队列中。然后,此作业将独立执行到所请求的端点,从而允许服务器在不延迟的情况下响应。

有许多队列提供者,但最值得注意的是:

  • 亚马逊平等
  • redis.
  • Beanstalkd.

申请加入Toptal'S开发网络

并享受可靠,稳定,远程自由职业的全堆栈开发者工作。

申请自由职业者

如果用户尝试创建已经存在的资源 - 例如,已经注册的电子邮件地址 - 您会返回哪些HTTP状态代码?

Although the answer to this is debatable, the widely accepted practice would be to use a 409 Conflict HTTP status code.

It would also be acceptable to return a 422 Unprocessable Entity.

Some may argue that a 400 Bad Request is acceptable, but we discourage this, since conventionally it implies the server did not understand the request, which in this case is not true.

您如何防止BOT刮掉您公开访问的API?

如果API中的数据可公开访问,则技术上,不可能完全防止数据刮擦。但是,有一种有效的解决方案,可以阻止大多数人/机器人:速率限制(也称为节流)。

Throttling will prevent a certain device from making a defined number of requests within a defined time. Upon exceeding the defined number of requests, a 429 Too Many Attempts HTTP error should be thrown.

注意:跟踪设备不仅仅是IP地址,这是重要的,因为这不是设备,并且可以导致整个网络丢失对API的访问。

其他不太理想的答案包括:

  • 阻止基于用户代理字符串的请求(易于绕步)
  • 为前端的访问者生成临时“会话”访问令牌。这不安全:在前端存储秘密可以反向设计,从而允许任何人生成访问令牌。

考虑以下两个表:

CREATE TABLE `posts` (
	`id` INT NOT NULL AUTO_INCREMENT,
	`text` TEXT,
	`user_id` INT unsigned NOT NULL,
	`updated_at` TIMESTAMP NOT NULL,
	`created_at` TIMESTAMP NOT NULL,
	PRIMARY KEY (`id`)
);

CREATE TABLE `post_likes` (
	`post_id` INT unsigned NOT NULL,
	`user_id` INT unsigned NOT NULL,
	`created_at` TIMESTAMP NOT NULL
);

Write a query to retrieve all data from the posts table for a given user_id. In addition to this, the returned recordset should also include a count of post_likes for each post.

首先,最重要的是,答案应包括一个,只有一个,查询。有许多方法可以实现预期的结果,但正确的方式是以下内容:

SELECT
   posts.*,
   COUNT(post_likes.user_id) AS likes 
FROM
   posts 
   LEFT JOIN
      post_likes 
      ON posts.id = post_likes.post_id
WHERE posts.user_id = 'XXX'
GROUP BY posts.id

考虑一个响应的站点设计,需要在所有响应状态下都需要全宽度图像。编写此操作的正确方法是什么,以确保页面加载填充空间所需的最小图像?

The key attributes here are srcset and sizes. These attributes allow the developer to specify multiple image sizes for one <img>, for example:

<img src="//example.com/images/image.png" srcset="//example.com/images/image-1024.png 1024w, //example.com/images/image-512.png 512w" sizes="100vw">

By using srcset and sizes, the browser will then intelligently select the correct image source to be used based on the size of the visitor’s viewport.

基于视口的大小根据视口大小更改图像源的任何建议都应被视为红旗。这表示开发人员尚未对CSS功能支持和/或最佳实践保持电流。

考虑一个在页面中心中只有登录表单的站点设计。使用CSS,确保盒子水平和垂直居中的最佳方法是什么?

There are technically various ways to achieve this. However, nowadays, there is one “correct” way to do this: using display: flex and margin: auto.

Other methods include position: absolute;, top: 50%, and margin-top: -Xpx, but these are no longer considered good practices since the introduction of display: flex.

在与SEO编写时,列出三个关键的事情。

为了构建针对有机搜索引擎排名优化的网站,在整个代码中实现某些标准非常重要。这些包括:

  • Specifying an alt tag on images
  • Using the correct HTML tags for content hierarchy i.e., <h1>/<h2>/<h3> and p
  • 将网站连接到公司的社交网页
  • 添加XML网站地图
  • 避免破碎的链接
  • 使用虚荣/友好的URL(人类可读)
  • 添加robots.txt文件
  • 整合Google Analytics(或替代)
  • 为指定指定浏览器特定图标的Favicon,奖金
  • 确保闪电快速页面加载时间
  • 避免JavaScript错误
  • 优化资产(包括欺凌)
  • 启用和强制SSL
  • 为每个页面指定唯一标题,而不超过70个字符
  • 包括每个页面的元描述
  • 确保有足够的内容具有足够的相关关键字(搜索引擎将惩罚您的网站,如果所有页面是一句话页面)
  • 利用浏览器缓存
  • 避免W3C标记验证错误
  • 指定相关的元标签

列出五种以上的方式,您可以优化一个网站,尽可能高效且可扩展。

优化网站是少数熟悉的艺术。工程师越多列出他们的头顶,它们就越有可能自然地完成以下所有代码,而不是稍后返回。

(此外,通常,专业构建的网站应在分析时得分超过75% gtmetrix.com.,它也可以作为清单。)

  • 优化所有资产
  • 将所有资产放在一个单独的饼干域名。使用CDN是最好的
  • 避免内联javascript和css
  • 启用gzipping.
  • 确保缩小所有代码
  • 推迟解析JavaScript
  • Use srcset for responsive images
  • 利用浏览器缓存
  • 减少DNS查找
  • 避免重复的代码
  • 避免URL重定向
  • 启用HTTP保持活动
  • 服务缩放图像
  • 在适当的地方使用图像精灵
  • 喜欢异步资源
  • 指定服务器级别的字符集
  • 避免CSS. @import
  • 指定缓存验证器
  • 最小化请求大小
  • 避免不良请求和404s
  • 指定图像尺寸
  • 减少饼干尺寸
  • 缩小HTTP请求,即,尽可能少的外部资源加载
  • 避免不必要的图像;在可能的情况下,使用CSS
  • 确保没有W3C验证错误

有更多的采访,而不是棘手的技术问题,因此这些是仅作为指导。不是每个值得招聘的“A”候选人将能够回答他们所有人,也不回答他们所有保证“A”候选人。在一天结束时, 招聘仍然是艺术,科学 - 以及很多工作.

提交面试问题

提交的问题和答案可能需要审查和编辑,可能会或可能不会被选中以在Toptal,LLC的唯一自行决定酌情选择。

* 各个领域都需要

Arthur Lorotte de Banes

自由架全堆栈开发人员

法国自2018年1月25日以来的Toptal会员

2012年,亚瑟赢得了一位大师'计算机工程学位,但他很快就会发现他的真正北方正在制度管理。他的编程背景帮助他沿途自动化他的大部分任务,他最终在云计算中最终结束,因为它给了他更多的可能性。 Arthur是一个完整的堆叠文件,他们具有特别强烈的开发技巧,所有事情都可以证明他的众多认证。

展示更多

Valeri Vicneanschi.

自由架全堆栈开发人员

加拿大最佳tal.成员自2016年1月4日起

Valeri是一个充满激情的软件工程师,在Web和Windows环境下开发了十五多年的开发软件。他专注于Node.js和.NET Frameworks,以及前端的反应和AngularJS。瓦莱尼拿着一位大师'计算机科学的学位与各种敏捷团队合作。他非常良好地沟通。

展示更多

Prashant Singh.

自由架全堆栈开发人员

英国自2018年12月3日以来Toptal会员

Prashant是一个具有广泛和多功能编码技能的全堆栈开发人员。他很快通过有效地建立了原型和想法,以有效地建立了现实的初创企业和想法。他的专业知识在于建立MVPS,APP,企业软件,可缩放的微服务,Web爬虫,休息和套接字API,基础架构建模,AWS和部署。 Prashant是您的任何开发需求的转向家伙。

展示更多

寻找全堆栈开发人员专家?

寻找 全堆栈开发人员专家?查看Toptal的全堆叠开发人员。

toptal连接 最佳 3% 世界各地的自由人才。

加入Toptal社区。

了解更多