Richard拥有15年的web开发经验,专注于全栈web应用程序. 他擅长使用React、Angular、Vue进行前端开发.js and Node.js、PHP、Django、Ruby on Rails和 .. NET后端, 拥有部署到AWS上的服务器和无服务器环境的专业知识, Azure, and GCP. 他还处理关系和非关系数据库以及大型数据集.
United KingdomToptal Member Since December 15, 2021
凯伦是一位有四年专业经验的软件工程师. 她喜欢构建影响用户的网络软件解决方案. Karen精通于创造易于使用的产品, responsive, accessible, 以及用户友好的网站和web应用程序. 她在后端服务和api的开发方面也很有经验. 一个精通工程概念的开发人员, data structures, algorithms, and system designs, 凯伦确保提供最好的质量.
At Toptal, 我们彻底筛选我们的网站开发人员,以确保我们只匹配您与人才的最高水准. 在200多个中,每年有5000人申请加入Toptal网络, 只有不到3%的人能达标. 你将与工程专家(而不是一般的招聘人员或人力资源代表)一起了解你的目标, technical needs, and team dynamics. 最终的结果是:经过专家审查的人才从我们的网络,定制匹配,以满足您的业务需求.
尽量减少往返请求. 检索资源(图像等)的往返.)从服务器可以是一个巨大的问题,页面加载时间. 因为页面发出的请求越少, 速度就会越快, 提高性能的一种技术是尽可能将资源组合到更少的请求中. 例如,非用户生成的图像是这里的主要候选. 往返服务器只是为了检索一个16x16的笑脸表情符号, for example, 效率极低.
问:提供跨浏览器开发挑战的例子, 包括一些避免或解决这些问题的建议.
在软件开发中,没有什么比处理跨浏览器问题和异常更容易导致过早脱发的了. 即使你只是想支持当前版本的流行浏览器(比如IE), Firefox, and Chrome), 您仍然可能会遇到代码或布局根本不起作用的地方(或者至少, 在其中一个浏览器中不太好用.
这些问题是非常不一致和粗糙的,没有一个指南可以提供一个万无一失的方法来避免它们, 但你可以做一些事情来帮助减少, 保护自己免受, these issues.
提供CSS“回退”. 当使用较新的CSS属性值时(可能尚未被所有浏览器支持), 对于那些还不支持您想要使用的属性值的浏览器,最好提供合理的回退. 旧的浏览器将跳过它们不理解的新属性值,并将简单地使用它们识别的旧(备用)属性, 而较新的浏览器将理解回退和较新的属性,并将使用较新的属性来代替旧的. (Note: 为了在较新的浏览器中正常工作,必须出现回退 before CSS中的新属性,以便更新的浏览器更喜欢更新的属性.)
用户浏览器特定于CSS属性值的前缀. 尽管前两种技术具有不需要任何特定于浏览器的定义或代码的明显优势, 前端web开发是这样的,特定于浏览器的解决方案至少在某种程度上是不可避免的. For example, 浏览器有时会支持自己的, 一些w3c标准CSS属性值的正在开发的版本. 在这种情况下, 使用特定于浏览器的前缀这些值可以是一种有用和合理的方法(常用的前缀包括 -webkit- Chrome和Safari浏览器, -moz- for Firefox, and -ms- (适用于internetexplorer). For example, 下面的CSS代码片段使用供应商前缀,在还不支持W3C标准梯度属性(有点难看)的浏览器版本中提供渐变支持, 但它是可靠的,它的工作):
从历史上看,最常见的方法是通过浏览器检测(a).k.a.(“浏览器嗅探”)来检测客户端正在运行的浏览器版本 . 虽然这可以工作,但它有一些缺点. Most notably, 它要求开发人员根据检测到的浏览器和版本的已知/假定功能对行为进行硬编码. 同样值得注意的是,在许多现代浏览器中,浏览器身份可以被欺骗. 因此,即使是jQuery也不建议使用它 $.browser property.
jQuery提倡的技术, 这是现在普遍推荐的方法, is known as feature detection. 而不是依赖有潜在缺陷的 a priori 了解浏览器的功能, feature detection 使用更健壮的方法动态确定客户端浏览器支持什么和不支持什么. Here’s an example:
使用预处理语言的潜在好处的一个熟悉的例子是色彩管理. 在普通CSS中更改站点的调色板可能会很费力. 通常需要对几个文件进行梳理,以便对要更改的特定颜色进行引用, 对于每一个找到的参考, “我们想要改变这个吗??” must be asked. On the other hand, with SASS or LESS, 您可以简单地修改单个颜色变量,然后对该颜色变量的所有引用都将反映该更改.
Server-side
服务器通常是应用程序的主力. 它对请求进行身份验证、处理数据、应用业务逻辑并构建响应. Servers, and services, 良好的架构和设计可以对系统的性能和可用性产生重大影响.
Cache contents. Of course, deciding what 在设计缓存策略时,缓存可能是最大的挑战. 您可能倾向于缓存生成或计算成本较高的数据, 但这取决于它的使用频率, 这可能会浪费宝贵的缓存空间.
缓存条目的粒度. 数据对象通常由多个“子对象”组成。. 对象应该存储在缓存中,包括它的所有“子对象”,还是应该单独缓存(甚至可能根本不缓存)?? There’s no one-size-fits-all answer here; it all depends on the structure of your database and the nature and frequency of the client queries against that data store.
自描述信息: 资源与其表示解耦,以便可以以各种格式访问其内容. 有关资源的元数据可用并已使用, for example, to control caching, 检测传输错误, 协商合适的表示格式, 并执行身份验证或访问控制.
通过超链接的有状态交互: Every interaction with a resource is stateless; that is, request messages are self-contained. 有状态交互基于显式状态转移的概念. 存在几种交换状态的技术,例如URI重写、cookie和隐藏表单字段. 状态可以嵌入到响应消息中,以指向有效的交互的未来状态.
如果通过使用它的web服务的数量来衡量, 基于rest的Web服务(RWS)在最近几年脱颖而出,明显超过了以前推崇的SOAP协议. RWS的相对易用性在很大程度上是值得称赞的. In fact, REST对web的影响如此之大,以至于它基本上取代了基于soap和基于wsdl的接口设计,因为它是一种使用起来相当简单的风格.
问:请简要描述下列HTTP请求方法:TRACE, OPTIONS, CONNECT, and PATCH.
HTTP server push (a.k.a. HTTP流(HTTP streaming)是一种将数据从web服务器异步发送到客户端的机制. HTTP服务器推送可以通过几种机制中的任何一种来实现.
通常,web服务器在向客户端提供响应数据后不会终止连接. web服务器保持连接打开,这样如果服务器端事件发生, it can be sent out immediately to a client; otherwise, 在接收到客户端的下一个请求之前,该事件必须排队. 这种方法的底层机制是分块传输编码. 大多数web服务器通过CGI提供此功能.
WebSocket API. WebSockets使得在客户端浏览器和服务器之间打开交互式通信会话成为可能. With this API, 客户机可以向服务器发送消息并接收事件驱动的响应,而不必轮询服务器以获得应答.
Pushlets. 推送基于开放源码的基于http的发布/订阅框架,该框架支持ajax. 这种方法利用了持久HTTP连接, 让响应永远处于开放状态(例如.e., 服务器永远不会终止响应), 在初始页面加载完成后,有效地欺骗浏览器保持在“加载”模式. 然后服务器定期发送JavaScript片段来更新页面的内容, 从而实现推送能力. 通过使用这种技术, 客户机不需要Java小程序或其他插件来保持与服务器的打开连接. 客户端自动收到关于服务器推送的新事件的通知. 这种方法有一个严重的缺点, however, is the lack of control the server has over the browser timing out; a page refresh is always necessary if a timeout occurs on the browser end.)
Long polling. 长轮询实际上只是传统轮询技术的一种变体, 但它允许在不可能真正推动的情况下模拟推动机制, 例如具有要求拒绝传入HTTP请求的安全策略的站点. With long polling, 客户机从服务器请求信息与在正常轮询中完全相同, 只不过它的轮询频率要慢得多. 如果接收到轮询时服务器没有任何可用于客户机的信息, 而不是发送一个空的响应, 服务器保持请求打开状态,等待响应信息可用. 一旦打开,服务器立即向客户端发送响应,完成打开请求. 这样就消除了通常与轮询客户机相关的响应延迟(信息首次可用到下一个客户机请求之间的时间).
Flash XMLSocket中继. This technique, 用于各种聊天应用程序, 在单像素Adobe Flash影片中使用XMLSocket对象. 在JavaScript的控制下, 客户端与服务器上的单向中继建立TCP连接. The relay server does not read anything from this socket; instead it immediately sends the client a unique identifier. 然后,客户端向web服务器发出HTTP请求,其中包括此标识符. 然后,web应用程序可以将地址指向客户端的消息推送到中继服务器的本地接口, 通过Flash插座传递它们.
Database
如前所述, web开发的难题有很多, 并不是每个合格的网站开发人员都必须精通所有这些. Accordingly, 许多web开发人员可能主要关注客户端,因此在数据库领域几乎没有专业知识. However, 高效的数据库设计, access, 操作对于大多数基于web的系统的性能是相当重要的, as such, 具有强大数据库专业知识的web开发人员对您的项目非常有价值.
开始规范化数据库的一个好方法是首先根据 normal forms 关系数据库理论. 这些标准形式提供了确定表对逻辑不一致和异常的免疫程度的标准. 满足某一级别要求的数据库, 还必须满足所有前面的关卡. 前三个级别是最常用的,如下所示:
第一范式(1NF) - Each field should represent one and only one value per entity; i.e.,每个字段应该只有一个值(原子性). 例如,一个Person可能有两个电话号码. 如果应用程序将两者存储在同一个字段中(例如.g., the phone_number 列),则该表不符合1NF的标准.
第二范式(2NF) -不允许列的部分依赖于主键. For example, 如果表有多列主键, 其他列都不能仅依赖于组成主键的列的一个子集.
第三范式(3NF) —所有非主键字段必须依赖于主键. 如果不属于主索引的字段的值依赖于其他非主字段, 那么这个表就不是第三范式. 例如,一个包含 total 列是该行中其他字段的和,不符合3NF的标准.
The B-tree 二叉搜索树的泛化是指b树中的一个节点允许有两个以上的子节点吗. B-Tree索引通过评估存储在节点键中的值的范围(索引中的节点包含键和指向其子节点的指针),连续缩小数据范围,从而帮助快速查找信息。. B-Tree搜索从根节点开始,并将每个子节点中的键范围与所查找的键值进行比较. 当它找到其范围包含所需键值的节点时, 选择该节点,然后评估其子节点. 这个过程一直持续到进程到达叶页,那里有指向实际数据的指针.
In a Hash Index, 索引列的值通过哈希函数运行,为哈希表中的每个键生成位置标识符. 桌子被分成“桶”和“桶”, 取决于所采用的技术, 这些桶要么包含数据值本身,要么包含指向这些值的指针. 哈希索引很快,因为桶的确切位置是已知的,哈希键是按顺序排列的. 一旦找到关键位置, 将预散列值(我们正在搜索的值)与我们刚刚在索引中找到的值进行比较,以确保它是有效的.
哈希索引工作得很好,但仅用于相等比较. 因此,散列索引不能支持这种形式的查询 SELECT * FROM table WHERE key LIKE " value % " or SELECT * FROM table WHERE key < value. 相比之下,B-Tree索引在搜索内容方面具有更大的灵活性. 部分值和值的范围很容易处理, 在非连接搜索中,它们的速度大致相同. 在任何一种索引类型都适合您的情况下, 不存在始终如一的“最佳”选择, 因为在某些情况下,散列索引的性能优于b树, and vice versa. 这在很大程度上取决于数据的性质和结构.