面试全程(音转文)_26学院本_赢时胜

#牛客AI配图神器##面试问题记录#

我: 你好,面试官,我叫**,我是来自南宁学院计算机专业的一个大三学生。我今天面试的岗位是Java后端开发。

我的核心优势体现在两个方面:

第一方面,我曾在广州金书科技的资金数据中台研发小组,负责过自己独立开发的一个Spark加Spring Boot的ETL框架。这个框架解决了银行数据、微信的流水数据,还有支付宝流水数据这三个数据源的统一问题,通过JSON配置,解决了统一清洗和管理的问题。

第二,我曾在聚创家公司做数据集成平台的开发,主要是将MySQL、PostgreSQL、Redis、Kafka之类的数据源,进行统一的管理,供数据分析人员去分析。

在学校期间,我和我的小伙伴开发了一个校园平台,是二手平台,包含宿舍小店功能、校园代购功能,还有校园二手闲置平台的功能。这个校园二手闲置平台,是我自己从0到1开发的,从系统的架构设计、技术的选型,还有一些功能的实现,都是我自己实现的。

我也实现了一个基于SparkMl的个性化推荐系统。

另外,我自己也对Java机制,比如Java的反射、IO,还有多线程,都有一些了解。对Spring Boot、Spring Cloud的一些组件和开发都有了解,对Spark、Spark的ETL处理框架也有了解,对RabbitMQ之类的也有了解。

我看到贵公司的技术方向跟我的方向很一致,我很想进入到贵公司去工作和学习。我的自我介绍到此结束,谢谢。

面试官: 你好,第一个问题是你刚才也说过,有看过公司的框架吗?了解我们公司是具体做什么的?

我: 是做金融的吧,就是金融的一些软件。

面试官: 对的,所以说,我看你那个实习经历,是做那个属于资金金融相关的?

我: 交易相关吗?对,应该是类似的。

面试官: 你应该是我们前面那个阶段的,我们可能是在你后面的那个环节。我对你这个实习经历里做的事情,这个项目叫资金智能分析平台,还是比较感兴趣的。能够详细讲解一下这个平台是做什么的吗?包括你在里边负责什么,大概是多少人的团队,是怎么样分配工作的?

我: 好的,我们这个平台是一个资金可视化的平台,主要是将公安这边银行给的一些数据,比如说银行的流水数据,中国银行的、建设银行的、农业银行的,还有支付宝的、微信的,这些数据都是一些金融数据,就是这个人的交易流水,这些我们都是可以得到的。

我们这个分析平台主要是把这些数据进行统一的清洗和管理。清洗的话,就是将银行、支付宝、微信这三种大类的数据,合成统一的一个交易流水表。将他们的数据进行统一的管理和清洗,进行标准化的处理,然后入库。

我们还可以导出Excel给用户查看,在我们的数据可视化平台上面,通过我们这边清洗的数据,就可以得到数据的可视化,将这些可视化的数据展示出来。

还有一个数据集成平台,就是将我们的MySQL、PostgreSQL、Oracle,还有Redis,这些数据源的数据进行统一的管理。这样的话,我们就不需要一个一个去点开MySQL去查看数据,我们就可以在一个平台上面解决数据查询的问题,让数据分析人员可以直接去查看我们的数据表。

我自己负责的是数据清洗那一部分,还有管理数据,还有配置JSON,然后将数据进行统一的处理。

面试官: 比较好奇,就是你刚才说的数据集成中心这一块。它是将不同数据源集成到一起去关联,对吧?那具体过程是如何实现的吗?

我: 它实现了一个SPI的机制,就是Java SPI。我们首先是定义一个数据源的接口,统一了数据源的接口。如果有新的数据源,就用这个数据源去实现这个接口。实现这个接口之后,我们就可以通过反射机制,反射去实现这个插件的注册和实例化。

通过我们配置的插件实例化,我们就可以得到类似的一个测试连接。如果要保存一个数据源的话,首先我们要先去测试它的连接,要配置它的一些协议,比如说MySQL、PostgreSQL,这些都是JDBC的协议。

然后我们将要配置的数据源的协议写好。写好之后,我们就可以直接,类似于我们不需要改动任何核心的代码。假如说我们要新增一些数据源,就只需要实现这个接口,在插件的分类里面,然后我们实现这个插件的名称。我们使用了ConcurrentHashMap去实现的,将那个id跟我们插件的分类,比如说是MySQL之类的,将它进行反射来实现实例化。这样的话,我们就可以得到这个完整的数据源管理了。

面试官: 刚才也说过了,我们公司是开发金融软件。你这个之前实习的项目,它的业务占比应该是分配到你们手里的任务话,业务占比应该看起来是不高的,应该更多的还是技术实现,对吧?

我问一下你个人对金融这块,肯定需要后续去学习一些会计、金融知识,比如说在一个交易过程中产生的费用,最终的一个平仓等等,对吧?需要对业务有一个系统性的学习。它的占比可能基本上也能达到50%,甚至是更高一点,对吧?技术的要求也是有,但是不会像其他的那种科技公司占比这么重。

所以说这个就涉及到你后面的职业规划。我想通过这个问题去问一下你是否对这个业务感兴趣,因为过程中可能要花一定的精力去学习业务。第二个就是关于你未来个人的成长规划是什么样的?

我: 我其实个人对于业务也是比较感兴趣的,因为我始终相信,是用技术去实现业务。因为我现在自己独立开发了一个,就是跟我那些小伙伴们开发的项目,其实也能感觉到,很多技术有时候可能是不需要的,但是还是需要去了解,深入去了解这个业务,然后再去通过相应的技术去实现,这种是比较好的。

对于软件开发的话,其实我也是,因为我自己也是一个Java开发的,也是做一些,自己也喜欢做一些软件,然后对软件开发的整个行业,其实也是很向往的,所以我觉得公司的技术方向,其实跟我也是蛮匹配的。

面试官: 那你个人是觉得自己是怎么说呢?会是那一类被环境影响的人,还是说是自己去改变环境的人呢?

我: 我觉得我应该是那种自己去改变环境的人。比如说现在有很多AI落地,AI应用。那么可能不是说因为受到他的影响,而是自己去主动加这些AI应用,而是因为通过自己对这个的理解,然后加上我们业务需要。比如说,我们这个业务需要一个人工智能回复,那么我才会去考虑去加他,而不是说因为这个环境影响了我,就一定要去加他。

面试官: 这个说的还是比较好。为什么问你这个问题,是因为像我们这个做的金融软件,可能已经经过了十多年的迭代。它的代码的复杂程度会非常高,包括业务的一些乱,还有加上一些设计规范,我们也是有开发规范,但是可能经过长时间的多人的迭代,现在是会看起来会较为混乱。

也就是说提前跟你说一下,就要在基于这种代码的情况下去做。我们也是在做优化,也是优化的同时,也在做迭代开发,也在做新一代的技术型的改造。面对这样的代码,还是要有强大的内心和耐心去支撑你基于他的技术上去完成工作的。关于你个人对这一点怎么看?

我: 我这边之前其实我去上一家公司实习的时候,其实也是有这种情况,就是他的代码是用Python写的,因为他想找我进来的话,就想让我用Java加Spark去写,因为他那时候一开始用Python的Flink,好像是Flink什么的,我也不记得,反正他是用Python的技术栈去写的。

一开始我看了那个技术的处理流程的话,其实也是有点头疼的,但是我觉得还是需要去了解这个业务的精髓,要去使用一个合适的技术栈去实现。其实对这种重构这种东西,其实我还是可以接受的。我也是觉得也是蛮有趣的,因为也是那种从前辈那里获得一些知识的方式。

面试官: 关于之前实习的工作强度是怎么样的?

我: 工作强度我觉得还好。因为一开始进去的时候,他是想先让我去了解这个业务的代码,要知道这个业务的流程,让我自己写个demo,让我给他们看一下。就是这个流程的进度是怎么样,跟原来Python的对比,技术看下他们有没有一些相同的地方,然后能不能正常的去实现。

然后我其实后面就写了一些demo给他们,给主管看,主管也是认可的,所以后来就可以参与重构了。

面试官: 然后,刚才也是问过你那个数据集成里面包含MySQL,还有PostgreSQL。那也就是说,关于这几种数据库是有所了解的,包括它的一些语法的书写?

我: 其实,我还是主要是熟悉MySQL的。但是对于PostgreSQL和Oracel也是有一定理解的

面试官: 对,问你这个问题,也是因为我们现在是在往国产化数据库的方向去走,所以我们现在也是兼容很多国产化的一些数据库,包括达梦、阿里这种,华为这种的数据库。我们原先基本上就是围绕Oracle去实现的。那你要去适配其他数据库的话,要去做一系列的改造。所以说这块,我刚才看你这个项目里有,就以为你对他们之间的差异有具体了解。

我: 对,我也了解了他们一些JDBC的语法,然后就将他们进行统一的配置管理而已。

面试官: 关于数据库方面,了解到什么程度呢,就是只是针对于一些SQL书写,建表,这些?对于MySQL的话?

我: 对于MySQL的话,其实我还是十分熟悉的,因为我自己其实对MySQL这些都是有了解的,因为我自己也在使用MySQL的数据。

面试官: 正好,我看这里边也是有写每日稳定处理100万级的交易流水,交易数据的话,量也是比较大的。对吧?那数据量大的话就会有两个问题,一个是性能,就是代码的性能和数据库方面的性能。那关于这两块的话,有没有调优的经验呢?就包括代码调优。

我: 如果是从数据库的写入来说的话,一般我们数据量很大。一般的话,我们就要先进行统一的处理,先清洗、清洗处理掉可能100万的数据,清洗处理掉之后,它也就只有80万。

80万之后,那么这些数据,因为是有银行、支付宝、微信,这些,我当时是这样做的,就是进行分批写入和异步化,因为我们通过Spark进行分区的任务清洗的话,他会在内存快速的执行,这时候,当我某一个节点,比如银行清洗完之后,我可以对这个操作成功先进行批量写入,并且实现异步化,因为其实用户是不太在意你的操作的,我们在处理的时候都是在后面执行,等执行完成后我们会通过RabbitMQ进行一个异步化通知,告诉用户清洗好了,不会阻塞他,然后我还采取了分批写入的方式,因为这部分我们也测试过,就是单条插入和批量插入的TPS都差差不多10倍,然后我们选择是每1000条插入一次。

具体的操作就是,首先,我们通过Spark转换的数据,它可以有两种方式,一种是保存为一个parquet文件,避免我们服务丢失单机的时候数据丢失。我是先在那个parquet文件里面进行分批写入,就是依次写入。一开始,我们是先做好备份的,就是把那个数据进行parquet的备份在我们的本地里面。第二步的话,我们就把那个parquet文件分批的去写入MySQL里面,每一批次是1000,并且采取了多线程去处理这个并发的问题,调整事务级别。这样的话,它就不会导致我们一次性写入100多万条,也不会说一条一条导入速度满,这样的话对数据库压力是很大的,所以我采用了分批写入的方式去实现这个。

面试官: 这个是从前往后看,根据这个交易量,从前看怎么样去优化它。那如果已经发生了这个性能问题的话,就是从后往前去定位这个问题?

我: 从后往前的话,那就只能去分析它的语句了,或者是说分析我们SQL的语句。首先就是在每次查询上线的那个时候,我自己都会去用Explain去分析之心的计划,去重点看类型,看索引,还要去看他扫描了多少行,可以从explain去分析我们SQL的语句,然后还可以通过查询我们的慢语句。一般的话,我们写入的话都会有语句,要去查询这个慢语句,去看一下这个地方到底还可以怎么调优,一般来说,我会确保一诶查询条件排序啊关联的字段都加上合适的索引,也不是说越多越好,因为会影响性能,所以一般这个都会慎重

面试官: 好,可以,然后这个也是。关于Spring Boot和Spring Cloud,既然发生的,那肯定对这个地方有一定的了解,那跟我说一下,因为它们也都是从Spring发展来的,对吧?那它们主要是做了那一部分的优化,然后面向的场景有什么不同?

我: 好的。Spring Boot的话,他有很多优点较于SPring,因为他可以说是将Spring繁杂的配置给简化了,有一句话就是叫约定大于配置,它其实有了一个,就是相当于注解,就是自动配置吧。可以先从注解上面讲,就是Spring Boot它有一个注解,叫做@SpringBootApplication。那么它就集成了我们Spring的三个注解。比如说,@EnableAutoConfiguration,还有@ComponentScan,还有一个@Configuration。

通过这三个配置,我们就可以实现自动配置。一般的话,我们是先去查找,就是我们用注解写的,添加组件写的那些注解。比如说@Service、@Configuration这种。然后就可以通过@EnableAutoConfiguration去将那个注解给它注册为实例化。这样的话,就可以很方便,就可以实现一个自动注 入的方式。具体的思想就是,先通过ComponetScan去扫描这个类的包还有它的子包,然后Spring容器会去用一BeanFactoryProcessor去找到所有被configuration注解的配置类,然后解析这些配置类,它主要是会创建一个类路径的Bean定义的扫描器,去通过类加载机制,找到所有匹配的class对象,然后去判断这个类是不是被componet注解,然后就能找到,这个过程,他也不会马上创建这个实例,就是把它先Bean实例化在去创建实例

然后还有Spring Boot的话,它也提供了一些比较好的东西。比如说AOP,其实AOP、IOC的话,这部分也是可以的。就IOC的话,它就是控制反转,也就是通过DI注入。比如说,我们写了一个@Service,是一个注解。那么我们可以通过@ComponentScan去获得这个注解,并将注册为Bean的实例。

然后这样的话,我们就可以把这个Bean的实例给它放到一个Map,类似于一个工厂里面。那么当我们需要注入的时候,就可以使用这个,从这个工厂里面获取这个Bean,给它注入进去。这样就通过@Autowired注入进去。这就是Spring Boot一个好的点。

Spring Cloud好的点的话,就是通过有个@EnableEurekaClient,它有个Spring Cloud,它有几个组件。比如说@EnableEurekaClient,它就可以进行统一的配置化管理。就是我们就可以把我们的配置项写在Eureka上面。这样子的话,就可以进行配置化的管理。

那么在我们的应用端的话,我们就可以添加实时的刷新。我们假如说,我们Eureka上面的配置项改变了,那么我们的Spring Boot它也会及时的去响应。因为我们这个配置项不需要我们去重新去启动它。

然后还有Spring Cloud的一个,就是限流。限流的话,就是当我们有很多很多并发数据去,假如从我那个项目来说,假如说我这个商品有很多个用户需要去点击去查看它。那么这个时候,假如说我这个Redis,我Redis它就刚好过期了。我们这个缓存key它刚好过期了。那么就导致这个访问会冲击我的数据库。假如说此时我如果不管的话,可能会导致我数据库崩掉。

那么我就只能够说去搞一个限流。比如说那么多请求去访问它。那么我就商品服务可能说有时候承受不过来。那么我就给它搞一个熔断降级,就搞降级,就是告诉用户说不好意思,目前这个商品给了一个,就是通用的一个商品,告诉把之前那个快照的版本的商品给它看。这样子就OK。就从那个Redis那里看,就类似于Caffeine加那个Redis这个多级缓存来看。

然后还有一个就是Spring Cloud,还有一个就是Gateway,就统一的网关配置。就我们可以将所有端口进行统一的管理,通过这种网关的配置实现这种服务,服务之间就不需要我们去前端,就不需要去了解我们服务的端口号是多少。我们可以直接去那个网关服务的话,就可以直接访问相应服务了。

对,就网关服务Gateway有那个Nacos,还有那个RabbitMQ,对,还有RabbitMQ。RabbitMQ就是个消息队列,它用了异步线程的方式。比如说我们点击一个商品想要请求。那么此时如果我们想要告诉用户,用户的浏览记录的话。那么此时我们可以发送一个消息,就类似一个消息的生产者,告诉消息发出一个消息,告诉给那个浏览服务,用户的浏览服务给他获取。

然后此时我们用户浏览服务获取到这个消息之后,我们就将这个消息进行保存。这样的话,就可以记录我们的用户的浏览信息。这样子就异步操作,也不会阻碍我们的主线程的操作。异步的话,就可以实现,就是我们支持此时,此时不会影响我们的主线程的工作。然后也可以实现,就是我们的用户浏览记录也是正确被记录了。

对,然后还有个Spring Boot AOP。AOP就是切面,切面就是把通用功能通过切面的方式,就不需要去管那些通用功能。比如说日志系统,权限系统,这些我们都是可以在我们方法注入之前,就可以将它加入到我们这个服务里面。比如说我们写一个日志系统,需要写注解,写个切面的注解就可以了。然后就不需要去管那个通用功能的那些实现,就可以进行一个日志的单独的把它拎出来做一个模块。这样子比较好。

面试官: 然后校园里,这个二手闲置交易平台,那也是说是自己独立去完成的?

我: 对。

面试官: 当时是基于什么样子的想法,去想去做一个这样的项目?

我: 因为当时我是想着,就是做一些校园经济,因为我们这边,我看到很多很多人都是在那个校园群里面发那个,就说想要卖什么东西,但是我那时候买他们东西都说,他们都告诉我,不好意思,你这里东西已经卖完了。但是那群消息,他不会告诉你已经卖完了,所以的话,我就想着做这么一个平台。

首先,我最先做的就是MVP版本,就是宿舍小店,因为我是想说先积累一下用户,就把宿舍类似于我们做一些泡面,买卖泡面,帮别人泡泡面,然后送到别人楼上面去。然后因为我们这边有一小伙伴,他是在宿舍里面搞了个冰箱,把冰冻的饮料,还有一些零食都放在那里,然后他就有人下单了,他就把那冰的饮料,还有泡面给他泡上去。

然后后面的话,就慢慢发展了,因为用户多了,用户多了之后,我们就开始做一个校园二手平台。这个校园二手平台的话,我们一开始想的就是,不可能是跟闲鱼一样,因为闲鱼的实在是太广泛了,而且它不支持,不只是针对校内。校内的话,它其实是不太友好的,因为它可能要到校外去。

那么我们就实现了一个叫校园二手平台,那么就叫南宁学院的二手平台。那么通过这个二手平台的话,我们就可以,就是用户当天买,他们就可以面交,面交之后再确认收货OK了。

然后一开始做的话,就很有点,就是因为人数不多,我们也不知道商品的一些,就是如何推荐。然后我们就是做了一些卖点,比如说我们就把最近最热的一些商品给它显示出来,最新的商品也给它显示出来。目前刚开始做的是,就是最热和最新的产品。

后面有了一定的数据量,比如说用户买了这个东西,我知道用户的一些行为,这些行为它都会被我记录在那个数据库里面。然后通过这些行为的话,我就可以自己构造一下,就是用户的特征,就是那个画像。就用户的特征,然后通过这些用户的特征的话,我就可以自己去搞一下,就是那个协同算法去学习。那个协同算法,通过这些协同算法给用户推荐出去,但是目前的话商品量还是太少了,所以说我觉得就没有什么上线的必要。所以说还是自己设计的。

面试官: 就是这样,很好,然后那个,我看你的求职意向是北上广深,上海,杭州,那是其实是看工作,找到这几个地方都可以,就是没有固定一个想发展的城市,是随着工作走?

我: 对,我其实因为我对城市其实是想去一线城市里面的,所以说我这些城市其实都是一些互联网大的城市。对我其实对哪个地方其实是不太有那个,其实我就是觉得这个地方刚好,刚好跟我的工作的地方是满意的。要刚好,它是一个好的互联网厂,那么就是我就可能会在那里长期的去从事行业,对我就是这样想的。

面试官: 好,然后,我这边大概就这些问题,然后你看看,你有没有什么要问我的。我这边如果知道的话,就跟你说一下。

我: 我想问,目前我们这个部门业务是什么,就是做金融之类的。

面试官: 这个不好说,因为最近要有一些结构上的变化。我们之前你说的这个部门是指的是哪一部分业务,还是说是负责哪一部分?

我: 就是类似于,就是接下来可能会说要做什么,做什么业务。比如说,我们有什么项目开发,或者说什么项目迭代之类的?

面试官: 就是围绕目前我们这边来说的话,基本就是围绕一些金融,基本都是会计里面的一些,账目类的处理。那偏向的话,就可能是债权、增资、税务这种的业务去完成它的一个市场上的政策性的,或者说国家发布的一些政策性变动,我们去做需求去实现这个业务的迭代。包括日常的运维,当然这个只是一个部分,我们内部的话,还有分很多,有各种各样的部门,但大方向都是业务开发。

我:还有就是,你对我这次面试的一个评价是什么

面试官: 我觉得你对实践方面的在我这儿的感觉还是比较好的,就是也有自己的真实的东西和对自己做过的内容,有自己的总结和了解。因为程序员,可能在,当然还好,如果在多人集成里去做迭代任务的话,可能慢慢地,它就缺乏了一个整体性的思想。所以关于这一点,至少在我这边认为还是不错的,就是有思想。然后其他方面的话,就,暂时不多说了,因为我们这个只是说,想要面试的吧。

我: 大概还会有几轮面试?

面试官: 这样,没有了,就基本上应该就是我这一轮,所以后面如果有通知的话,应该是HR里面会有消息,会联系你们的,时间的话应该不会很慢,应该就本周吧。

我: 我了解,大概了解,就是想问这些。

面试官: 那还有其他的吗?没有,我们今天就先到这儿。

我: 没有了,谢谢,面试官。

我: 好的,谢谢面试官,好的,拜拜。

全部评论
我这有大厂项目包装,需要的同学可以看下我简介中的项目地址哦
点赞 回复 分享
发布于 今天 10:50 江苏
点赞 回复 分享
发布于 昨天 17:32 四川
太棒了吧
点赞 回复 分享
发布于 昨天 17:32 上海
点赞 回复 分享
发布于 昨天 17:32 广东

相关推荐

评论
2
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务