人生第一次面试,算被拷打了吧
金锐面经(估计凉了)
1、自我介绍(这里自由发挥就好)
2、讲解一下你的项目,有什么功能,做了什么?
这里我讲了一下你这个项目的作用,项目初衷,项目功能。
3、Oj判题系统
(1) 你用了spring工厂模式和配置化,为什么要用工厂模式,工厂模式在这里做了什么?
① 解耦合,将对象的创建和使用分离开,客户端代码不用关心对象创建的细节,只需要通过工厂来获取实例对象,实现了类之间的耦合度。
② 灵活性,可以更方便的更改对象的实例化方式,比如不更改客户端代码的情况下修改工厂内部逻辑返回不同的对象实例。
③ 可扩展性,当需要添加新的产品类型时,只需要创建新的产品类和工厂类即可,无需修改已有代码。
④ 集中化管理,工厂模式可以管理对象的创建过程,使代码更加清晰易懂,易于维护。
(这里答上来第1、2点,后面两点没答上来,但说了统一管理)
(2) 你修改了配置文件,项目需要重启吗?那有什么办法不重启呢?
项目是需要重启的,但是没有答上来不重启项目的办法,后面搜了一下,有以下办法:
1、使用Spring Cloud Config、Nacos等配置中心,将配置文件集中化管理,然后在应用程序中动态化获取配置。
2、使用动态刷新配置,你可以在配置类上使用 @RefreshScope 注解,并使用 Actuator 提供的 /refresh 端点来刷新配置。这样在修改配置后,可以通过向 /actuator/refresh 端点发送 POST 请求来使配置生效,而不需要重启整个应用程序。
(这里一点都没答上来,确实不知道,以前只知道Nacos能管理配置,不知道还能动态获取)
(3) 你的判题流程是怎么实现的?
答:先获取用户提交的代码信息,然后进入判题逻辑。首先呢,我们会对用户提交的信息进行一个判断(参数校验、合法性校验等),获取题目该相关信息(题目限制、测试用例等),然后调用代码沙箱接口执行代码获取代码运行的结果信息(输出结果,运行实现等),最后再根据用户选择的语言类型到我们的判题策略中选择不同语言的判题策略,最后修改数据库题目提交信息。其中我们调用代码沙箱这一步采用了rabbitMq进行异步解耦。(想让他问rabbitMq的知识,这块我比较熟悉,结果没问)。
4、Mysql
(1) 我有一批数据,我想查询里面有重复的名字的数据,该怎么查?用什么函数?
答:可以用count统计同名的个数,如果个数大于1,那么就存在重复。
(2) Sql语句怎么写
答:SELECT name, COUNT(*) AS count FROM your_table GROUP BY name HAVING count > 1;
(这里没答上来,mybatisplus用多了,都快忘了sql怎么写了。)
(3) Mysql分页查询的方法有什么?
答:是limit和skip吗?(当时不确定)可以通过limit限制查询行数,skip表示需要跳过的行数。
(4) Mysql分组的函数是什么?
答:可以使用groupBy进行分组,同时利用having对分组数据进行筛选。
反问?
1、这是我的第一次面试,表现怎么样?
对于本科生来说,你的表现还不错。基本的了解也有,但是希望再往深度发展一下。
2、我目前的技术栈还需要补充什么?该往哪个方向学习?
你目前的技术栈够用了,可以重心放在技术的深度方面的问题。比如spring的ioc和aop等方面,我之前说的不用重启项目就能读取配置文件的办法,你也可以去了解一下。算法的话你的奖项是不够的,还需要加强。
总结:
下午两点接到的约面通知,告知时间后,下午五点半面试。结果我当时还在上课,真正准备时间不足两小时,也由于平时没有做好随时面试的准备,所以导致面试过程感觉不太理想。面试的点虽然大部分答上来了,但是后面复盘感觉表达方面不清晰。建议现在跟我一样还在找实习的同学,接到面试的第一时间,如果没有准备好,就推一天(应该不要紧吧)。
