前端中的算法问题。 Yandex示例和竞争

昨天,一个新的Yandex.Blitz正式发布-这次竞赛对界面开发人员来说很有趣。 对于第一至第五名的人,我们将为您提供一个简化的方案:一个面试部分,而不是四个面试部分。 因此,Blitz仍然是到达Yandex的最快方法。

竞赛的任务再次接近生产任务-您不仅需要前端技能,还需要算法知识。 在此处注册以参加资格回合。



闪电战是讨论工业前端出现的算法问题的历史以及它们与竞争对手的区别的好理由。

关于任务


在Yandex中开发接口时,算法上的饱和任务一直出现。 我记得2005-2006年的例子。 这些任务之一是处理抽象事件的系统。 有必要创建一个内核,以允许将处理程序(由函数指定)附加到任意事件(由字符串指定),然后它会触发特定事件并删除处理程序绑定。 另一个复杂之处是,应尽可能快地执行列出的三个主要操作。 关于这一点,在一份旧报告中甚至有一节。

另一个有趣的任务是有关Yandex中缩略图的位置。图片搜索结果。 必须在右边缘对齐具有相同高度和不同宽度的矩形对象的流。 在一般情况下,此问题无法解决,因此可以更改原始图像大小(缩小和裁切),但是信息丢失不会超过某个给定的合理阈值百分比。

还有与Yandex模板引擎的开发相关的任务,以关键字XJST和BEMTHML闻名。 主要的困难是使其保持足够快的同时保留所需的语义表达能力。 可以在许多报告中找到有关此问题的详细信息,以下是一些包含详细信息的第一份报告: events.yandex.ru/lib/talks/43events.yandex.ru/lib/talks/329 ,还有许多其他报告。

各种实时处理系统,例如,在使用鼠标滚动和拖动时,也经常被迫反映出来。 如果长时间客观地执行实际操作,则必须想出各种算法技巧来使界面(至少在主观上对用户而言)快速显示。

例如,在Yandex.Mail的第一个版本中,几乎可以将所有关键元素相互拖动:字母到文件夹,字母上的标签,标签上的字母,甚至字母上的文件夹。 在此过程中,当用户“手持”对象并将其带到屏幕周围时,有必要突出显示可以“重置”该对象的那些元素。 “额头上”的幼稚认识减慢了不可能。

实际任务与竞争任务之间的差异


通常,以团队模式解决Yandex内部的任务。 人不会像在比赛中那样任凭自己的设备。 他可以从同事那里获得帮助,并且应该使决策方式与过程中其他参与者的利益相匹配。

事实证明,您编写了一个快速版本,但是大多数同事认为该代码对于理解,开发和将来的支持来说是不合理的困难。 在这种情况下,必须寻求妥协。 通常,团队互动被设计为解决方案的顺序添加或结对编程的同时过程。 我们几乎永远不会并行做同一件事,以便以后进行比较和选择最佳选择。

另一个重要的区别是,我们编写的实际代码存在并且在很长一段时间内都将继续受到支持。 如果仅通过测试,则这不是“忘记工作”的过程。 重要的是要记住,您的代码在编写之后可以继续存在-不仅可以执行,而且可以编辑-多年。

关于其他前端竞赛


您可以轻松地在Internet站点上找到纯JavaScript任务。 这本质上是相同的体育节目,只是特定的语言。 此外,还有一种“暗码”格式,当在不查看结果的情况下强加布局时,只能盲目地看到代码。 像我们这样的竞赛并不是特别广泛,因为-由于界面开发的特殊性-很难挑选好任务并对其进行自动检查。 从历史上看,Yandex建立了强大的前端自动测试流派,包括使用来自真实浏览器的屏幕截图进行比较。 基于这些发展,我们试图在比赛中进行任务检查。 对于我们来说,这也是一个实验,但是我们确信它会奏效,并且我们已经在准备进一步开发该主题。

Source: https://habr.com/ru/post/zh-CN426587/


All Articles