本人22届软工本科,从去年年底开始慢慢准备笔试/面试。原本意向岗位是后端,后来觉得前端更有意思,就转投了前端,基本面的都是前端岗位。找春招实习的经历还是挺磕磕绊绊的,在此进行汇总记录。
4.3 投递(直接官网投递,无内推):
4.7 华为笔试[已挂]
4.10 网易笔试[已挂]
4.11 美团笔试[已过]
4.16 投递(直接官网投递):
4.18 腾讯笔试[简历未被捞]
4.21 美团一面[已挂]
4.23 阿里笔试[已挂]
5.20投递(校园22届实习双选会):
以上是有后续消息的,总共投了10家左右吧,其他暂无笔试/面试通知(也有可能错过了一两个电话)。
5.28 中国电子系统笔试[6.2已过-以为有了搜狐offer拒了面试]
5.29 搜狐一面[ 5.31口头offer - 6.3口头offer被鸽]
6.1 贝壳找房一面+二面[6.1已过]
6.2 思特奇线下笔试+面试[6.2已挂]
6.3 贝壳找房hr面[已挂]
6.18 字节抖音前端内推投递
6.25 字节前端一面[已挂]
6.27 牛客投递
通过内推链接或邮箱投递:
实习广场投递:
(虽然都是通过联系内推投递,但可能是简历改得不好,基本上都石沉大海没有消息,除了便利蜂直接给我推了校招笔试的链接,唯一一个打电话联系我的是网易有道,但是错过了。)
7.6 便利蜂前端校招笔试
7.6 科大讯飞后端内推投递
7.9 科大讯飞后端面试[已offer]
后端只面了两场,第一场基本没有什么参考价值,面试官知道我不会框架以后就没怎么问了。第二场是唯一拿到offer的科大讯飞的面试,也比较简单。面经主要以前端为主。
这是我投递前端岗位的第一次面试,搜狐的面试官人特别好,居然说我基础知识掌握得还不错。base北京,部门是搜狐焦点,腾讯会议进行的视频面45min。
项目只是简单地聊了聊一两句,没有问关于难点和亮点的问题。
不是力扣上的题,就只是特别基础的题目,感觉就是编程入门的时候的课堂练习那种。
f(n) => 1+2+3+…+n,即输入n,输出1加到n的和,条件是不能使用循环和不能使用数学的求和公式(不能用乘除)。
(递归)
const arr=[x, y]; f(arr) =>[y, x] //x,y是数字或字符串。即将x和y的值互换,条件是不能开辟新的内存空间,即不能声明变量。
(x=x+y,y=x-y,x=x-y)
我还是挺想去搜狐的,hr5.31给了口头offer,问6.3(周四)能不能入职,我说6.3有事,6.4才能去,她说找人帮我代办入职。后来加了另一个hr微信,又说代办比较麻烦,6.10(下周四)再入职(只能每周四办入职)。结果,6.3和我说,因为我一周去三天太少,领导不批offer,让我6.4不用去了。感觉就是养鱼吧~
贝壳首先是要做一个线上的测评,我是5.20线下投递,5.28做完测评当天就给我打电话约了一面时间,效率很高的一家公司!一面完过了十分钟就给我打电话让我接着二面,二面完过了十分钟又给我打电话约了6.3的hr面。贝壳的面试官人都很好!!
二面的面试官好会引导人思考,特别循循善诱!因为是科班出身,他问了我一些前端以外的软件开发过程的问题。我之前的面试都感觉面试官提问题都是东一榔头西一棒槌的,而这一面就感觉是把很多东西给串起来。我回答不出来的,他都会给我讲解引申一下,很有交流探讨的感觉。
介绍一下学习经历包括一些在校期间参与的一些项目
对前端的理解
你对前端的理解?你觉得前端在一个公司里面主要应该扮演一个什么样的角色?(面向终端使用者,注重交互流畅、用户体验)前端分几个部分,第一个部分是可视化,另一个部分是数据方面的,一些非业务数据的,比如一个购物网站,我们可能并不关注用户下单之后的动作,我们可能会关注用户下单之前的动作,你能大概理解前端在一个项目开发过程中的意义吗?以你的项目为例,研发人员是分为多少个角色,他们是怎么互相协作的?
前后端合作
那前端和后端合作的过程中,你刚刚提到了前端先写好接口标准,给到后端开发,但你觉得这种合作方式有没有什么弊端呢?
一般的企业里,一个前端要对3-4个后端,接口如果是前端来定的话,要求前端对业务非常熟悉,但大多数项目中,基本都是后端先了解业务以后,将接口文档给到前端以后,前端做mock,然后才开始做开发。所以一般情况下,标准是后端开发来定的。
测试
你刚刚提到的衔接链里少了一个关键的部分是测试,那你对测试是怎么看呢?你觉得前端应该做哪些测试?QA了解吗?你觉得前端从代码和交互上都需要通过哪些测试以后才能上线?
单元测试
我们一般的测试分两种,其中一种是代码测试,代码测试可能就是一段单元测试,那你之前了解过单元测试吗?大概是什么东西?定义方面的就可以。
单元测试就是可能会去看某一个函数有没有成功,或看某一个页面有没有渲染成功。
自动化测试
单元测试以外,还有一种是自动化测试,自动化测试就是比如说,前端涉及到的点击事件,人工测点击事件需要功夫,所以我们就需要有自动化测试来模拟操作,那你之前有没有了解过这种UI模拟的测试?或者说让你来做的话,你有什么思路?说一下思路就可以。
因为咱们所有页面都是通过DOM结点组成的,你所有的操作实际上都是DOM结点,那我们既然要做一个自动化测试,就是一个模拟DOM操作的过程,那你觉得我们应该怎么模拟呢?比如现在一个表单提交,表单就是一个登录,有用户名有密码,然后再点击确定,这个操作作为一个测试单元,如果让你来做这个自动化测试的话你有什么思路?
一个前端产品的上线,除了你刚才说的要从需求到开发,还要有测试。不需要太专业,但还是希望对这个项目有一个整体的把握,各个环节点做的程度不一样但至少要做到。
webpack
我看你还写了基于webpack构建的项目环境,那你首先解释一下什么是webpack,你用它做什么?
webpack主要还是解决一个模块化编译的问题,比如处理一些css文件,一些静态文件,或者要把编译的东西进行拆包和打包。在webpack没有出现之前,JS是比较分散的。一般我们会把一堆JS打包成一个或多个,主要是为了一个编译的问题,webpack里面有很多loader,后续你可以了解一下。webpack里面有很多配置信息你们知道吧,你项目里面是拿过来直接用呢,还是加入了自己的一些自己配置信息?那你们webpack打出来的文件,是打成一个了还是打成多个了呢?
比如在开发工作中,从10到20个JS文件,最好打包成一个文件,你觉得这是好还是不好?
比如说一个系统,打成了一个JS和一个CSS,那么刚打开界面的时候就要把这个JS和CSS加载进来,如果说你把这个文件叫做1.js,你每一次打包都会产生一个1.js的文件,那它会产生一个什么样的不良问题?
这个问题可能和缓存有关。比如版本1打出一个1.js,版本2也打出一个1.js,这两个1.js内容不一样,但名字不一样,当我发到线上的时候,可能因为缓存发生什么样的问题?(有的用户因为手机或电脑设置不一样,发了第二个版本以后,他还处在第一个版本,就是根本没更新到上面)
所以webpack打包的时候就有一个设置,每一次打包的名字是不一样的,打一个和打多个的区别就出来了。如果一个项目特别大,就打出一个JS,它文件也会很大,这就涉及到前端加载效率的问题。如果打成多个呢,就有一个异步加载的过程,效率就比较平滑。
页面优化
刚才我说的所有都是一个页面优化的问题,那除了我说的这些,你知道哪些常用的页面优化的方法?(减少HTTP的请求)怎么减少?
HTTP状态码
HTTP请求需要的类型比较多,涉及到很多状态、很多请求方式,比如说web socket听说过吗?HTTP状态码200和401?(200是请求成功,401是没有权限,500是服务器错误)
node
后端不只支持一个部门,导致数据接口不能像我们要求的一样。比如说首页我们要访问十个数据源,后端给我们提供了十个接口,后端这十个接口可能别人也在用,所以他不可能给你变成一个,那这样的话作为前端有什么解决方案吗?一下子加载这十个接口肯定是不行的,效率太低下,产生错误的几率、用户打开的速度肯定都会受影响。那你有什么处理的思路?
如果后端能帮你解决这个问题,你要提一个什么方案?(变成一个)在后端没有办法完成的情况下,前端有一个工具可以实现,node或者dnode。node可以限制或者合并一些访问,推荐你看一些公众号上的关于node的实践。
vue
项目为什么用vue,怎么选的框架?在你之前没有学vue之前是怎么写的js?那你觉得vue解决了一个什么问题,为什么大多数人用vue这种框架写而不是用原生JS去写?
vue是数据驱动的,页面的改变和渲染是通过接口数据、返回数据不一样导致的。那你有没有思考过为什么是以数据驱动去做渲染,而不是事件驱动?
之前前端用的jQuery有了解过吗?它就是事件驱动的。
无论是vue还是react,里面都有一个子组件和父组件,你理解组件这个概念吗?
比如一个input输入框,有时候我希望输入的是纯数字,有时候必须是身份证号,有时候希望输入的是手机号,说明input就有很多的可能性。如果input具备了以上的所有属性,它的属性就变广了,那前端是怎么知道它有时候输入的是身份证号,有时候是手机号?就是把一个input输入框变得更有可能性,支持更多的业务,把它封装起来,它就可以称作组件。input是表单里面的一个组成部分,那表单就是父组件,input就是子组件。
你们这个项目里面,有涉及到表单验证的方面吧?如果要保证填入的是身份证号,应该怎么做?(正则表达式),正则表达式你了解多少?
项目中遇到过的最难的问题是什么,怎么解决的?
给定一个字符串chas[],其中只含有字母字符和“*”字符,现在想把所有“*”全部挪到chas的左边,字母字符移到chas的右边。完成调整函数。
示例:把’o*f*f*e*r*‘变成’*****offer’
基本上都是在闲聊+确认信息。很轻松的氛围,一点儿也不紧张。
基本是在聊项目和前端知识,没有问算法题。
出来之后hr进去和面试官交流,然后hr就告诉我面试不通过,让我回去了。他们这种中小型公司比较偏好那种拿来就用的实习生,估计看我还是缺乏基础知识加项目实践的经验就挂了。
内推我的小哥人很好,帮忙修改简历,给我前端学习的建议。组内直招的面试应该是比较简单的。虽然我临时加急,头悬梁锥刺股学了一周前端,但终究是底蕴不足、根基不稳,让面试官见笑了。其实这场面试的表现,我自认相比起面搜狐、贝壳都有些许进步,但对于字节这样的大厂,抖音这样的核心部门,还是远远远远不够的。
每场面试我都录了音,但这场的录音应该是被我不小心删了,只能凭着回忆写一下问的问题。面试官基本上是照着我的简历一行一行地问的,不放过任何一个细节。然而我投递之前按照建议修改了简历,没信心说对简历上提及的所有内容都了然于心,于是造成了惨挂的后果。
var str1 = 'abc';
var str2 = String('abc')
var str3 = new String('abc')
前端似乎还问了一些,但我不太记得了。
为Array实现一个Reader
为Array实现一个Reader,通过接口getReader获取,Reader有一个接口read(n)
每次调用会按顺序读取数组的n(默认为1)个元素
调用不会改变数组本身的值
若数组已全部读取完则返回空数组
若传入的参数不为正整数则抛出异常
interface Reader {
read: (s: any) => any[],
}
Array.prototype.getReader = function() {
// 在这里写答案
}
// example
const arr = [1, 2, 3, 4, 5, 6];
const reader = arr.getReader();
console.log(reader.read('1')); // Error
console.log(reader.read(-1)); // Error
console.log(reader.read(1.5)); // Error
console.log(reader.read()); // [1]
console.log(reader.read(1)); // [2]
console.log(reader.read(2)); // [3, 4]
console.log(reader.read(3)); // [5, 6]
console.log(reader.read()); // []
console.log(arr); // [1, 2, 3, 4, 5, 6]
JS实现array_chunk函数
将一个数组分割成多个数组,其中每个数组的单元数目由 length 决定。最后一个数组的单元数目可能会少于 length 个。
示例:
const a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
chunk(a, 4);
结果:
[['a', 'b', 'c', 'd'],['e', 'f', 'g', 'h']]
舍友在科大讯飞找了实习,base北京,业务主要是智慧医疗。刚好组里有个实习生没来,就有岗位空缺。这个岗位是做后端的,让我来试一下。之后部门也可能开前端线,如果有机会的话希望能转到前端吧。
面了好久总算有个offer了,虽然岗位不是特别匹配,待遇感觉也比较一般,转正率不高,但听说部门氛围很好。7.20就入职,接下来打算一边暑期实习一边准备前端秋招了~