当前位置:   article > 正文

两年后端的面试分享

两年后端的面试分享

从今年5月份就开始面试了,前前后后也有4个多月了吧,面试了几十家公司,其中有几十个人的小型创业公司,也有几百人的上市公司,踩了不少的坑,最后收到了宝能集团的offer,我也决定就去这家了。

看过很多别人的面试分享经验,这里我也做一些面试的分享吧。

前言/背景

首先,提前要求自带简历的一般都不太靠谱,特别是小公司要求自带简历,一般都是hr不专业,不想提前把你的简历打印出来,或者说不想为了你浪费几张A4纸,所以这种公司可以直接pass了,除非你特别缺offer,生存都成困难了。

其次,可以提前问一下hr面试流程是什么样的,现在很多公司都取消笔试了。众所周知笔试没有人监督你,所以可以掏出手机(虽然我没做过,但是面试看见其他人这样做过),所以我觉得笔试作用其实没多少。如果有公司是明确要先笔试,笔试通过再进行面试,而你面试的不是应届生岗位,就要小心了,先考虑一下那家公司过去面试距离远不远,提前去看准网看一下相关的评价,再考虑要不要去面试的事。我之前面过两家都是需要笔试的,笔试没通过是直接没有后面的面试的(有的面试题非常脑残,下面上图),来回也比较远,浪费了我一个上午的时间。

面试准备

面试的时候99.99%的公司都会让你做一下自我介绍和最近做的一个项目,所以自我介绍和项目要提前打好草稿,特别是不太会说话的。

自我介绍

我觉得简洁一点就行了,一般面试官都会趁着你自我介绍的时候看简历,也没认真听你做自我介绍。

面试官你好,非常荣幸参加贵公司的本次面试。下面我简单的介绍一下我的个人情况,我叫凌霄,xx年毕业于xxx学院xxx专业。目前在xxx公司工作,主要是从事xxx开发。 通过xxx招聘平台关注到贵公司岗位的招聘信息,这个职位比较符合我未来的职业发展,而且贵公司的业务对我都非常有吸引力,非常希望能够进入贵公司发展。

我对技术有浓厚的兴趣,专业知识面宽,技术也相对全面,责任心强,思路清晰,沟通能力好,熟悉JAVA体系, 对各种开发流程和主流架构模式,设计模式和UML,有较强的需求分析、架构设计、项目管理能力,并有丰富的实战经验; 出于对工程师文化的向往,我在研发团队管理期间,尝试了多种方法去建立良性的团队氛围,并有效的改善了研发效率; 技术是为产品支撑的,所以我现在也在熟悉产品设计过程,希望可以结合公司发展战略,营销策略,跟着团队打造出一个好的产品。

上面的可以适当简化一下,能说出来多少取决于你的记忆力。

项目介绍

这个是真的要提前准备好说辞,不然你面试的时候边想边说,说起来磕磕巴巴的,你给面试官的第一印象就不好了,至少说明你的表述能力不强。

介绍项目的话可以不用太紧张,面试官才拿到你的简历看多久,所以肯定是对你自己的项目是最熟悉的。需要注意的地方就是不要只讲一些业务相关的,面试官不需要知道这些,他只关心你的技术能力是否足够,通过你的描述知道你使用了什么技术,再根据相关的技术进行提问。

贴一下我的草稿:

我在xx公司做的xx系统,客户主要是xx,项目的功能主要是提供代理雨伞,代理快递,代理订餐,图书借阅等服务,后台用的是主体架构是使用Spring Cloud,微服务模块划分为xxx,我主要负责其中xxx几个模块的开发, orm用的是mybatis,数据库是用的mysql,缓存是用的redis,前台用到了vue技术。共有xx个同事参与开发,整个项目持续了xx时间。

面试官会对他感兴趣的点进行提问。 

项目中遇到的难题

让我想起小学时经常写的作文:最难忘的一件事。这可真是太艹了,没想到小学学的知识现在派上了用场。

项目中遇到的难题,解决了之后其实都不是什么难题了。我列几个点可以参考一下:

  1. 跨域
  2. 任务调度幂等性
  3. 使用mq遇到的问题
  4. 分布式系统中的事务问题
  5. 内存溢出问题

当然最后还是要自己的专业技能扎实,才能获取源源不断的offer。

常见问题

1、jvm调优

我觉得这不是一个中级开发工程师甚至高级开发工程师能做的出来的,但是面试就是要问。死记硬背考记忆力呗,只要记住其中几个常用的配置就行了。

堆大小设置

  1. -Xms:初始堆大小
  2. -Xmx:最大堆大小
  3. -XX:NewSize=n:设置年轻代大小
  4. -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
  5. -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

收集器设置

  1. -XX:+UseSerialGC:设置串行收集器
  2. -XX:+UseParallelGC:设置并行收集器
  3. -XX:+UseParalledlOldGC:设置并行年老代收集器
  4. -XX:+UseConcMarkSweepGC:设置并发收集器

调优总结

年轻代选择

响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。 吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

年老代选择

响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。

2、代码优化

分为三个维度来谈,可以稍微拓展一下:

  1. 整体框架的优化,根据模块(类)的职责做一些划分,尽量做到每个模块的接口清晰。然后就是善用六大设计原则和24种设计模式。
  2. 功能逻辑的优化,把内聚的逻辑独立成一个个函数,函数依赖的数据都通过参数传递,这样做到函数可重用,当上层结构做出改变的时候,修改的代码量不会太多。
  3. 性能优化,如果性能不敏感,代码也不是那么糟糕,那这个优化可以不用关注。

3、六大设计原则

  • 单一职责原则

    接口的单一职责,一个职责一个接口,我们对外公布的是接口,而不是实现类,所以不需要过度关心实现类是否遵循单一职责,生搬硬套单一职责会引起类的剧增,给维护带来非常多的麻烦

  • 里式替换原则

    只要父类能出现的地方我子类就可以出现,而且调用子类还不产生任何的错误或异常,调用者可能根本就不需要知道是父类还是子类。但是反过来就不成了,有子类出现的地方,父类未必就能适应。里式替换原则包含了四层意思:

    1. 子类必须完全的实现父类的方法。我们经常写service会定义一个接口或者抽象类,然后编写实现,调用类则直接传入接口或抽象类,其实这里已经使用了里氏替换法则。
    2. 子类可以有自己的个性。子类当然可以有自己的行为和外观了,也就是方法和属性,在子类出现的地方,父类未必就可以胜任。父类向下转型可能会出现类型转换异常
    3. 覆盖或实现父类的方法时输入参数可以被放大。
    4. 覆盖或实现父类的方法是输出结果可以被缩小。
  • 依赖倒置原则

    依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。我们在项目中使用这个原则要遵循下面的规则:

    每个类尽量都有接口或者抽象类,或者抽象类和接口两都具备

    变量的表面类型尽量是接口或者抽象类

    任何类都不应该从具体类派生

    尽量不要覆写基类的方法

  • 接口隔离原则

    客户端不应该依赖它不需要的接口,客户端需要什么接口就提供什么接口,把不需要的接口剔除掉,对接口进行细化,保证其纯洁性。通俗的讲就是:建立单一接口,不要建立臃肿庞大的接口。

  • 迪米特法则

    一个对象应该对其他对象有最少的了解,通俗的讲,一个类对自己需要耦合/调用的类应该知道的最少,这个类内部是怎么复杂、怎么纠缠不清都和我没关系。尽量不要对外公布太多public方法和非静态的public变量,尽量内敛,多使用private、package-private、protected等访问权限

  • 开闭原则

    类、方法对于扩展是开放的,对于修改是关闭的,在程序需要进行拓展的时候,不能去修改原来的代码。

4、24种设计模式

单例模式

工厂模式

建造者模式

观察者模式

有观察者和被观察者,被观察者接口:增加观察者、删除观察者,通知观察者更新 观察者:被观察者发送消息了,我自己也要做些什么

责任链模式

适配器模式

5、mysql的优化

十家公司有九家会问,这个必须要记住。基本上只要记住我写的这些,面试基本上稳了:

  1. 数据库表设计优化
    1. 所有表必须使用Innodb存储引擎
    2. 字符集统一使用utf-8
    3. 字段加注释
    4. 控制单表数据量的大小,建议控制在500w内
    5. 冷热数据分离,减小表宽度
    6. 禁止存储图片,文件等二进制数据
    7. 三大范式
  2. 数据库字段设计优化
    1. 优先选择符合存储条件最小的数据类型,能用tinyint的就不用int,能用varchar的不用text
    2. 避免使用text,blob数据类型
    3. 尽可能把所有列定义为not null
  3. 索引设计优化
    1. 限制每张表的索引数量,单张表不超过5个
    2. 禁止给每一列都建立单独索引
    3. 每个表必须有一个主键
    4. 频繁查询的字段建立索引
  4. 编写sql优化
    1. 建议预编译语句进行数据库操作
    2. 避免数据类型的隐式转换
    3. 充分利用表上已经存在的索引
    4. 不要使用select * 查询,要使用select <字段列表> 查询
    5. 避免使用子查询,把子查询优化成join操作
    6. 避免使用join关联太多得表
    7. 对同一列进行or判断时,使用in代替or
    8. where从句中禁止对列进行函数转换和计算
    9. 在明显不会有重复值时使用union all而不是union
    10. 拆分复杂的大SQL为多个小SQL
    11. 使用 group by 分组查询是,默认分组后,还会排序,可能会降低速度,在 group by 后面增加 order by null 就可以防止排序.

6、jvm内存模型

必考题,抽时间看看深入理解jvm虚拟机吧。

总结

面试和工作是两回事,面试没通过的人,工作能力不一定比你弱,面试通过的人,工作能力不一定比你强。所以面试没通过也不要灰心,回去好好总结复盘,不要因为失败就丧失斗志,加油!

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/462657
推荐阅读
相关标签
  

闽ICP备14008679号