前言
首先说明一下博主是一个大三的学生,专业计算机科学与技术,主学的方向是Web后台开发,主语言是Java。前几天看到CVTE有校园招聘实习生,就报名参加了,做了CVTE的笔试题,前面的选择题不难,后面的编程题稍微难一些,而且切换出去调试,做完之后,本来想着没报希望了,就没理了,后来周四晚上短信通知我说过了笔试,让我周六过去面试。
面试地点是在一个酒店里面,当时也是蛮多人的,CVTE招的岗位也很多,嵌入式开发,前端,Android/IOS等都有,排了没一会队就到我了。总结一下面试的题目吧。
问题一:项目
面试官:最近有没有做过什么项目?
我:最近做过一个关于充电电车的电桩管理的项目。
面试官:个系统主要是干什么的,有什么功能?
我就跟面试官描述了一些这个系统的大致功能和流程,这里就先省略了。
面试官:假设有一天,这个电车非常好用,很多人都在使用,数据变得很大的时候,你的数据库要怎么设计?
我:尽量单表查询,建数据库索引,使用缓存。
面试官:那索引有哪几种索引?
因为我对数据库这方面比较薄弱,不过自己以前看过一些文章,只能努力回忆,
我:有主键索引、普通索引……剩下的想不太起来了。
面试官:那我如何知道一张表是不是有索引,或者说我用什么查询语句可以知道我的数据库表中是否有索引?
我:
这里比较尴尬,因为我对于数据库建立索引,优化这方面了解的并不是很多,平时用数据库只用考虑了增删查改,并没有考虑到优化问题。
后面自己恶补了索引的知识,我平时MySQL用的比较多,就以MySQL为例:
- MySQL的索引有普通索引,唯一索引,全文索引,单列索引,多列索引,组合索引。
- 索引算法有b-tree,hash。
- 创建索引可以建表时创建还有通过修改表的方式增加索引。
- 使用explain语句可以查询查询记录和是否使用到索引
- 尽量单表查询可以使用一些反范式,也就是增加一些冗余字段,减少多表查询
- 缓存的话要熟悉Redis和Memcached
问题二:语言
面试官:你的主学语言是什么?
我:Java。
面试官:在Java中有哪些异常?
我:异常分可检查的异常和非检查的异常,可检查的异常有IO异常,非检查的异常有空指针异常,数组越界异常……等
面试官:那我们平时怎么防止空指针异常?
我:使用if条件判断该对象是否为空?
面试官:好的,这个是可以的,在Java8中有一种更优雅的实现方式,你有了解过吗?
我:
面试官:java8中optional实现了这个功能。
面试官:了解过Java中的集合接口吗?
我:Collection接口,List,Set,Map接口
面试官:ArrayList和LinkedList有什么区别
我:ArrayList的是用基于数组的数据结构实现的,LinkedList是基于链表实现的
面试官:这两个的add()方法有什么区别?
我:ArrayList的add方法,将对象插入到数组当中,并且将数组当前位置的索引+1,LinkedList的add方法将上一个结点的指针指向要加入的对象。
面试官:了解过序列化和反序列化吗?Java中是怎么实现的
我:通过实现Serializable接口
面试官:拿出一张纸,写了一个类A,里面有一些属性,int a=1;String b = “123”
让我写出将这个类序列化到文件的代码。
我:回忆了一下,用了FileInputStream和ObjectOutStream,写了出来。
面试官:如果我将这个对象序列化到了硬盘,现在我将这个类增加了一个属性,然后再将这个对象反序列出来,会发生什么情况?
我:会报错。
面试官:如果我删除这个属性呢?
我:也会。
面试官:如果我在这个类里面,对serialVersionUID进行了初始化呢,还会报错吗?
我:不会。
面试官:为什么?
- 我后面也将Java8的新特性重新学习了一遍,包括lambda表达式,函数式接口,方法引用,更好的类型推断,stream,base64编码,javascript引擎,更好的时间格式,jvm移除永久区增加metaspace等。Java9页快出了,也要去学习一下。
- 还有就是集合类中的各种数据结构都要过一遍,最好全部源码都看一遍,包括List,Set,Map接口下的几个实现类比如ArrrayList,HashSet,HashMap,重点是HashMap,HashMap的实现原理,这里面试官可能会问到是否是线程安全的,如果不是,有什么解决方法,又可以引申到其他方面,比如CopyOnWriteArrayList,ConcurrentHashMap,又可以深入问下去了。
- 关于序列化这一方面,的确自己当时没有复习好,现在很多项目都是分布式的,分布式的话就会有RPC,也就要求对象在网络中传输,所以序列化也是很重要的一部分,serialVersionUID是用来保证序列化版本的序号,如果不指定,就会随机生成一个序列号,改动类的任意一个地方,都会改变这个序号,将对象重新反序列化回来后就会报错。这次面试也只问了JDK自带的序列化,实际上还有其他序列化协议,比如xml,json也是一种序列化的方式,还有protobuff和protostuff。
3. 问题三:网络协议
面试官:说下TCP和UDP的区别
我:TCP面向连接,UDP无连接,TCP提供可靠的连接,UDP是尽最大努力交付
面试官:说下TCP建立连接三次握手过程
我:
面试官:断开连接时的四次握手,为什么需要四次而不是三次?
我:
面试官:两个不同局域网内的主机要通讯需要使用到什么协议
我:NAT协议
面试官:如果一个局域网内的主机要向另一个局域网内的主机发送消息,传输的报文是怎么样的?
我:
面试官:HTTP协议有哪些状态码?
我:200 302 404 500
面试官:302代表什么意思
我:重定向
面试官:浏览器是怎么处理重定向的,客户端访问服务器,服务器通过response响应,重定向的url放在response的什么地方?
我:
实际上,如果做web开发的话,对计算机网络也要非常的熟悉,OSI 7层协议,TCP 5层协议,TCP/UDP的区别,TCP如何实现可靠传输,三次握手四次挥手,拥塞机制。HTTP的各种头,状态码,HTTPS和HTTP2.0都要去了解。
302重定向的rul是放在Header的Location属性中
4. 问题四:其他
面试官:除了Java,你有了解过其他技术吗?
我:学过一些JavaScript
面试官:是前端还是node.js?
我:前端
面试官:js如何过滤一些敏感字符
我:正则表达式。
面试官:原生JS发送ajax的四个步骤有哪些?
我:
面试官:了解什么是XSS漏洞吗?
我:
面试官:如何防止表单重复提交
我:表单提交后将提交按钮disable掉
提交表单后重定向到另一个页面
服务器端使用token技术
做后端开发的对于前端的技术,了解就好了,会前端加分项,不会也不扣分,一般大公司的分工都是比较明确的,每个岗位都有自己负责的工作,如果一家公司让你前后端通吃,那可能是外包公司,分工不明确,可能什么都要你来的那种。这个看个人吧,不过对于后端的话,可以学一下现在前端热门的三个框架Angular/React/Vue中的一个。
5.总结:
首先面试官第一个问的就是你有没有做过什么项目,说明项目是很重要的,出去找工作一定要有项目经验。然后面试官问的问题都是有一些规律的,从你的回答中去引申,比如一开始的项目,项目中遇到了什么,如果使用这个项目的人变得很多了,需要怎么设计表。然后再根据你的回答继续深入问你,所以,如果对某些方面一直半解,就不要胡乱说,直接说这个方面我还暂时还没有了解。我们知道面试官会一层一层地深入追问,那么我们也可以引导面试官往往我们擅长的地方去询问,回答的时候尽量答得周全一些,可以突出一些你知道别人不知道的点,这样可以给自己加分。
整个面试过程中,没有问到任何框架的问题,其实想想也可以明白,框架这个东西,会用其实很简答,你学个几天,照着文档写demo,很容易就学会了的,所以一些大的公司往往更加注重基础。除了自己所学的主要语言方面,还可以掌握一些其他的技能,也是给自己加分的项。还有计算机网络,网络层,传输层,应用层的熟悉一定要非常的熟悉,web开发肯定要对这些协议掌握的非常透彻,TCP/UDP、Http。现在语言有很多种,不单单只是Java,Python、Node.js、Ruby这些都可以用来开发Web,只不过每个语言有自己的优点和特色。
最后在当天晚上得出了结果,也在自己的意料之中,自己的回答的确也是挺差的。这次面试也让我学到了很多东西,感谢这位面试官。机会总是留给有准备的人的,Java基础也还需要再进一步巩,重点关注IO/NIO,线程,并发包,集合,Java8新特性,计算机网络相关知识。对学过的知识要进行分类整理,形成自己的知识体系,这样你的逻辑才会清晰。路还长,坑还很多,剩下的时间好好把握,努力学习,充实自己!