Loading...
Loading...
时间:50min
11号下午投的简历,没想到12号hr就打电话过来了,加了微信后十分钟就过简历评估了,流程最快的一集。
答:我和面试官都互相介绍了一下,他是产品负责人(可能是leader?),然后我介绍了一下学历和学习经历,以及我简历上的项目。
答:主要讲了一下我一开始是在网络上认识了一些同好(面试官肉眼可见的恍然大悟,然后点了点头),后来就开始一直有利用课余时间学习和做这方面的事情,选择前端主要是因为前端有一个特点就是所见即所得,我可以用代码快速的实现我的头脑风暴,然后即时的获得反馈,我比较享受这个创造的过程,尤其是AI来了之后就能更加快速的将我的想法落地,所以我比较喜欢前端。
PS:讲这句话的时候面试官频频点头给予反馈,让我刚开始比较紧张的心情很快就放松了下来,太感谢了orz
答:讲了一下我们专业主要就是研究如何使工业生产环节降本增效,然后灵光乍现,主动提了一下AI,我说我觉得我的专业知识其实跟Agent工作流比较契合,因为Agent系统也是在做这样一个过程,研究如何让AI更加高效和工程化的去完成任务,接着还用我前几天的一个想法为例子:想设计一个面试进度追踪工具,因为随着投递数量的增加,我每天都要花大量时间去追踪和整理这些面试信息,很麻烦,那我就想通过设计一个系统,它能结合我们专业学的一个知识,叫甘特图,去优化时间管理,并结合Agent去更好更方便的管理面试进度。
面试官明显知道甘特图是什么,还开玩笑说甘特图管理几百个面试的话可能会有点力不从心,不过他后来说感觉我们专业确实和Agent有点关联性。
答:这方面主要就是再次简单的讲了一下它是什么。
答:是网页应用,没有使用到跨端技术,回答完后主动提出并当场打开线上部署版本去展示和介绍大概的功能。
答:它是以对象的形态存在的,主要记录了一下它自身的属性,比如颜色、类型、Lamport 时间戳等等,以及它的轨迹。
后面还细问了一下采集的是像素点还是什么,我说是通过节流控制后的固定频率采点,不是逐点采集。
答:是存在服务器的,客户端进入房间后会从服务器拉取所有历史数据。
答:经典八股题,简单概括了一下缓存、DNS、OSI七层模型、HTTP、TLS握手、服务器反代和响应、浏览器解析和渲染的过程,大背诵时代这一块(
答:我主要是通过两套方案,在触控屏幕上,直接采集压感数据计算,而在非触控屏幕上(PC等),主要就是根据采点时的信息(距离、时间间隔),然后通过v=s/t这个公式去计算这一段的速度,最后再根据一套平滑算法去更详细的将速度转化为这一段的线宽。
答:Canvas底层是用两点连线来绘制的,曲线其实是一段段直线拼接而成的,所以视觉上体现出来的就是锯齿状的效果,然后再讲了一下我利用了二阶贝塞尔曲线进行平滑处理,让它看起来没有那么生硬。
答:可以分段插值处理,每一段都计算当前的颜色插值,从而在宏观上达到渐变的效果
答:这题没答上来,我说没仔细研究过这一方面的算法,他说那我们换一个问题。
PS:面试结束后了解了一下,其实Canvas有一个专门的 ctx.createLinearGradient API 能够处理渐变填充,如果是手写插值计算的话也可以用 value = start + (end - start) * t这个公式,对RGB三个通道分别进行处理,最后组合到一起就可以得到混色后的RGB色号。
答:直接利用现成的包围盒算法,把字体边框看做成一个包围盒,然后字体框里面通过计算文本长度(面试时没想到ctx.measureText这个API,直接说用等宽字体的统一宽度来计算了,逻辑上似乎也成立),当检测到文本的长度即将超过文本框包围盒的宽度的话,就自动触发换行操作(面试官表示认可了)。
实则我根本没写过这句话,面试结束后特地去看了一下网申填写的简历信息,也没找到,不知道为什么会这么说,应该是记错了吧。
答:我没有直接阅读过这篇论文,只是学过里面的一些理论,这篇论文主要就是提出了Transformer这个架构,它高效的利用了现代GPU的并行计算能力,能够显著提升模型的训练速度和训练质量。
答:它是一套人工智能架构,主要就是提出了Attention机制,解决了传统CNN和RNN的缺陷,也就是长上下文信息丢失、训练效率低等问题。
Attention就是让每个token都能并行的计算出对其他每个token的相似度,最后输出一套完整的hidden vector,并通过后续的FFN和词表命中等操作最终去得到输出,提高了模型的训练效率和推理能力。
简单聊了一下之前用JS手搓的一个Transformer Encoder玩具,实现了完整的Encoder模块和Backward机制,并训练了几万轮,分析了一下loss降不下来的原因(loss一开始是六点几,最后也只是降到了5.2左右,分析可能是数据集质量差或者训练效率太低的原因)。
有一张灰阶图片,通过一个二维数组来表示,其中的值代表当前像素灰度,仅有0、1两个值。1表示白色,0表示黑色。
Photoshop中有魔棒功能:在用户点击图像之后,可以获得用户点击坐标ⅹ和y。如果用户点击的位置是一个白色的像素,那么所有与该像素连通的白色像素都将被认为是同一区域(黑色同理)。编写一个函数,实现photoshop魔棒功能,计算该位置所在的白色像素区域的面积。
注意:连通指的是上下左右四个方向相邻的像素。
/**
*@param {number} image-二维数组表示的图像,值为0或1
*@param {number} x - 点击的x坐标(行)
*@param {number} y - 点击的y坐标(列)
*@return {number} 连通域的面积
**/
function getArea(image, X, y {
// todo
}
//测试用例
const image1 = [
[1, 1, 0, 0, 0]
[1, 1,
之前刚好复习到了这题,而且还允许用代码补全,直接十分钟秒了:
function getArea(image, x, y) {
const rows = image.length;
const cols = image[0].length;
let s = 0;
while (x >= 0 && x < cols && y >= 0 && y < rows && image[y][x] === 1) {
s++;
后面讨论了一下优化方案,比如有没有方法能让dfs的那四行不用每次都写s+=赋值,以及不需要每次都计算cols和rows等。
关于对AI时代的前后端的看法,面试官的看法很务实,说的也很有道理,他说感觉AI对我们的影响就是,现在没有说特别明确的岗位区分了,拿我(候选人)举例子,我虽然是做前端的,但是现在让我去做后端,我完全做不了吗?肯定不是,同理,我从来没学过swift之类的语言,也没从事过iOS开发,但是得益于AI,我们可以只花几天时间就快速上手业务流程,然后参与到开发环节中,这就是他对AI的看法,所以他们这个岗位才是全栈,然后岗位类别还是客户端,因为确实没有什么特别明确的职责划分。
总的来说,这场面试给我的体验还是很好的,面试官没有特别压力,而是循序渐进、由浅入深的一层层往下挖,语气比较温和和开朗,很大程度上缓解了我的紧张和焦虑。
面试的内容还是让我感到比较意外的,一方面,他基本没有问八股(就简单问了一道很经典的从url到渲染),但问了很多场景思考题,十分考验临场思维能力,也让我收获颇丰;另一方面,岗位名称是AI全栈,JD写的也是“参与 AI 创新方向的产品孵化,从 idea brainstorm 到 MVP 上线全链路 owner”,但全程没有考我简历上的另一个AI Agent项目,反而是一直在追问协同白板,不知道是想留着二面问,还是面试官认为这个全栈项目跟具体业务更相似。
面试之前准备了好几天的 AI 项目拷打应对策略,全程没问倒是差点给我打了个措手不及,好在之前就对这个协同白板项目的理解比较深,也持续迭代了很长一段时间,勉强算是接住了这番拷打。
反问部分给的建议倒没有让我很惊讶,岗位区分度逐渐模糊确实是目前特别显眼的话题之一,不过也算是解答了我之前对于岗位jd的疑惑(JD写的是AI全栈,职位类型却是客户端开发),感觉后面要是进组的话应该也是负责一些非前端的技术探索,真要几天速通landing期了吗(
整场面试的氛围也比较轻松,感觉面试官很看重思维水平,最后的反问也是对每一个问题很耐心的给出了很详细的回复,看来真要面试还是得要面大厂啊,这才是真正有帮助的面试。
许愿oc ing……