ITPub博客

首页 > 数据库 > 数据库开发技术 > 面试问:项目中遇到过哪些问题,你是怎么解决的?

面试问:项目中遇到过哪些问题,你是怎么解决的?

原创 数据库开发技术 作者:安瑞哥是码农 时间:2022-09-15 22:09:30 0 删除 编辑

这也是讨论群里,某位小伙伴在面试时面试官抛给他的一个问题,之所以能激发我写这篇文章,还是那个不二原因:它具备代表性。

当然,这里的问题,一般指的技术问题。

一般来说,对于一个【成熟】的技术面试,如果前半程聊的还可以的话,基本上后半程都会被问到这个问题,反正我每次面试几乎必问。

对于这种开放性问题,有的小伙伴会非常的喜欢,而有的可能避之不及,喜欢的小伙伴因为一来语言表达能力比较好,二来对此类问题做了精心的准备,知道如何应付。而不喜欢的小伙伴可能因为过于依赖背【技术八股文】,对技术的准备还停留在:对应问题->对应答案 这种僵硬的模式中,对稍微灵活一些的问题,就会显得不知所措。

其实我当年也一样,对于从来没有遇到过的面试问题,第一反应都是懵逼,等自己缓过神来,面试官已经不给你机会了,这也是我一直强调大家要多面试的原因,因为很多问题你自己是想不到的,你只有【见识】多了,才知道别人对你的要求是什么样的。

对于这道题,如果想回答好,是一定需要提前整理好思路的,否则就算你平时真的遇到过很多棘手问题,也解决过很多问题,但是时间一长,你是很难在面试现场想起那些问题细节,以及组织好语言的。

这篇文章,就结合我这些年的经验和心得,来聊一下面对这种开放性问题,我的一些思考心得,希望能对你接下来的面试提供些许帮助。


1. 问题的底层逻辑
这种问题之所以问出来,其实考察的是当你在实际工作中遇到技术难题时,有没有一种系统性的思考问题、定位问题、解决问题的方法论,或者说思维模型?

这是一种需要你在日常跟程序、服务器打交道过程中,逐渐磨炼出来的一种能力,它跟那种直接问你一个问题,就能有确定答案的题目不同,这个需要你对平时做过的工作内容进行总结、提炼、思考,需要有自己的思想温度。

而这道题,面试官想得到的不是一个千篇一律的所谓【标准答案】,你得有自己的角度、方向和思考路径,然后将这些平时积累的干货总结,向面试官娓娓道来,能体现出自己的一点【独特见解】,我觉得这就是非常好的答案。

这个问题也是一个能区分你到底有没有真正的项目实战经验的分水岭,对于很多只会背理论八股文,但是缺乏实际项目历练的同学来说,从这道题的回答质量高低就能够轻松分辨出来。


2. 实际项目中我们通常会有哪些问题
对于这道题的回答,就不要想着用平时背过的八股文来应付了,因为场景不对,你一开口就可能被面试官识破。

在实际的软件项目开发中,我们能遇到的问题,其实总结起来,我认为可以大致分为如下几类:

2.1 软件架构设计问题
我见过很多中小项目的技术架构,很多时候为了省事方便,或者为了满足设计者的一些技术偏好,根本没有考虑到其技术架构的合理性,本来就那么点数据量和有限的数据需求,非得去学某某大厂,把各种所谓的高大上的技术组件给堆叠到一起,跟农村老大娘的裹脚布一样,又臭又长,结果真正玩起来时,痛苦不堪,时间都花在填各种无谓的坑去了。

对这种尾大不掉的架构优化,是你可以思考这道题的一个重要切入点。

2.2 需求设计合理问题
这里的需求设计,指的是将业务方的需求转化为技术实现,算是上一个问题的子问题,比如某个功能的子模块实现,在上线后发现数据的处理效率很低,时效性差,或者某个环节老是出现一些莫名其妙的问题,导致最后处理的数据结果不尽如人意。

那么思考如何提高各个环节的合理性,数据流转时对各个技术组件使用的恰当性,是你可以思考的点。

3.3 数据处理效率问题
对于很多经验比较浅的同学来说,扔给他一个数据处理任务,他可能经过各种折腾也能把这个需求给完成,但你要是用心看一眼他的代码逻辑,和这个过程中涉及到的流程设计、表设计等考验程序员核心能力的地方时,很有可能就露馅了。

可以从数据处理的时间复杂度、空间复杂度,IO效率,表设计合理性来思考。

3.4 生产上出现的一些难点问题
尤其对于一个大数据项目来说,如果处理的数据量大,业务要求繁杂,那么这里面一定会出现诸多的技术难题。比如,随着业务数据的递增和需求的愈加复杂化,那么软件工程的复杂度也会呈比例增加,我们团队就时常碰到过,因为软件工程在不断增加新的软件依赖过程中的jar包冲突问题。

此外,随着处理数据量的上升,可能原本跑的好好的一个程序,突然就在某个时间点就OOM,即便你给加大了资源,但是情况依然得不到好转,还是跑一段时间就挂。

还有比如服务升级过程中,软件之间出现的兼容性问题,这个在大数据项目中经常出现,而这个不兼容,很可能只是某个软件中某个jar包的版本过低导致。

再比如数据倾斜问题等等(之前视频中有讲,这里不再赘述)。

以上就是我暂时能想到的,算比较拿的上台面的,能给面试官battle一番的【技术性问题】。

3. 如何思考回答

这个问题想要回答好,一定不能只是简单说下问题的表面特征,然后再匆匆给个解决这个问题的办法就敷衍了事。


面试官真正想听的是你的思考路径,和支撑这个思考背后的逻辑,下面就根据上面的几个问题,来谈谈我的思考路径:



3.1 架构设计问题的优化

所有技术架构设计的初衷都是为了解决实际业务问题,不是玩花拳绣腿,其实一个技术架构设计的好坏,开发人员是能明显感知的,因为这个跟你的系统运行效率、稳定性、后期维护成本息息相关,比如对于数据接入模块,对于同一种类型的数据,用一个数据接入组件足够,用了Sqoop,就尽量别去用dataX,用了Filebeat,就别用flume、logstash等等,尽量把一个工具能够覆盖的功能用全,用深入。


一来可以增加对单个技术的理解深度,二来可以减少开发人员的工作量,三来还可以增强系统稳定性、可维护性,砍掉过多的中间环节。


所以你可以这么回答:技术架构设计的核心一定是遵从满足需求原则和简单原则,其次考虑扩展性。那么对于一些明显拖垮效率,以及给系统增加复杂度和稳定性的冗余设计,就可以考虑砍掉。


比如我看很多小项目中,明明数据量不大,用一个普通数据库,通过合理的表设计以及索引设计,就可以搞定数据查询效率的问题,非得学人家在数据库和服务端加一层缓存,结果效率没见快多少,反而引来很多数据不一致的新问题,把开发人员搞的痛苦不堪。


那么如果是你,是不是可以考虑从哪些技术维度去优化和解决呢?


3.2 需求设计问题的优化

比如一个很常见的数据处理场景,每次数据处理时需要对当前的数据做是否存在的判断,也就是当前数据如果之前处理过了就不再处理,这个时候很多的设计一般都是做【全量比对】,也就是直接查看当前这条数据在之前的处理记录中有没有,如果有,不处理,如果没有,新写入。


但是这样做最大的一个问题是对数据库系统有很大的【侵入性】,因为你需要频繁的查询,如果数据量巨大,那么对数据库系统会造成不小的访问压力,所以需要你优化。


一种优化就是,把比对剥离出来放到一个第3方的位置,比如Redis,这样原本数据库的压力就小了,但是你要知道这么做,随着数据处理量的增大,Redis的数据压力也会越来越大。


那么为了进一步减少Redis的压力,就需要根据当前的业务特点进一步优化,因为当前的业务要求只要判断数据是否存在就可以,不要做那种一一比对,那么完全可以利用Redis的BitMap特性,这样可以大大减少Redis的存储压力,虽然Bitmap存在一定的误判:如果没有则证明一定没有,但如果有也可能没有。


但是没有关系,误判的那部分完全可以再到数据库查一次就好了,这样对数据库的侵入性就大大减轻。



3.3 数据处理效率优化

这个应该是开发人员遇到最多的问题了,比如对一份数据的处理复杂度过高,明明可以放到一个HashSet中的数据集,却放到了Array中,把时间复杂度可以为O(1)的逻辑,写成了时间复杂度为O(N)。


比如数据处理过程中,明明可以一步到位的,却加入了很多无谓的中间步骤,让数据落盘,增加多余的IO操作,或者明明可以设计一张带索引的表(比如ES、MySQL),来提高查询效率,但是却偏偏让数据写入到弱索引的表中(比如hive)。


再比如,很多数据处理步骤完全可以在计算引擎端完成,结果全部给写到了数据库中,然后在查询阶段,通过复杂的SQL语句来完成本可以前置的数据处理步骤,降低了查询性能。


如果是你,你该如何优化?



3.4 针对难点问题

对于一个有些经验的开发来说,其实这种【棘手问题】时不时就会碰到的,有些人经历过了就过了,没有去好好思考和包装,以至于在回答这样的问题时并不出彩。


比如上面提到的软件工程中的jar包冲突问题,有的候选人可能一句话就说完了,而有些聪明的候选人则可以把这个问题进行展开(具体可参考文章:一次硬核的项目jar包冲突实战),这样面试官会认为:这个问题你确实会。


再比如说程序OOM,OOM有很多种,有些OOM纯粹只需要你在运行时增加点内存就够了,但是你要这么回答,会显得你特别【寒酸】,面试官心想:就这?也值得拿出来说的吗?


而如果问题变成,即便加内存了也依然会出现OOM,那么问题就变得不一样了,这个时候大概率是内存泄露导致,那正确的玩法就是把这个程序的JVM中的各种堆栈对象给dump出来,看看哪些对象在不断的生成,而没有被GC掉。


而这个也一定是因为你代码写有问题导致的,比如把不断增长的数据放到静态成员变量中,会导致这个对象一直膨胀,且不会被回收,那么内存爆掉是早晚的事情,你再结合下原因给面试官一顿侃,能够做到知其然且知其所以然,这么这道题应该就不会有什么问题。


再说兼容性问题,在一个大数据项目中,那么多组件一起配合工作,不同的组件又是不同团队的人开发的,那么不兼容是件很正常的事情,所谓不兼容一般要么不能直接通信,要么就是数据在两个软件之间无法直接互通,我的你不认识,你的我不认识。


找到问题核心,如果是通信问题,那就看他们的通信协议兼不兼容,如果通信协议兼容,那就看其通信使用的框架版本是否一致,比如几年前,我升级spark + Elasticsearch的组合时,当时把Elasticsearch从2.x升级到6.x,结果直接玩不转了。


后面各种尝试,最后发现是Elasticsearch升级后,原本的spark所用的netty版本过低导致,但是程序根本没有一点提示,只是告诉你连接超时,具体原因你得自己去定位,所以当时排除各方面原因后,断定原因出在通信上,最后定位这个问题,升级netty解决的。


再比如数据不兼容问题,比如spark跟hive的兼容问题,之前文章有讲(spark2 + hive3遇到的坑),感兴趣的同学可以去看看,完全可以作为你的案例拿出去说,但前提是你真的理解了。



|最后

看到这,可能有些小伙伴会失望,说:这也没告诉我答案啊。


确实,像这样的问题,我给不了答案,也没那个水平,只能说给你提供些个问题回答的思路,至于具体如何组织语言,优化细节,依然需要你的思考。


因为只有你自己的回答,才是这个问题的最佳答案。



我这有一个高质量的大数据学习讨论群,不怎么扯淡、偶尔活跃气氛、大部分时间都在讨论技术,你在群里的几乎任何大数据相关的问题,都可以得到解答,要不要进来试试呢?拉你进群啊...


原文作者:安瑞哥是码农;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-02-16

  • 博文量
    228
  • 访问量
    115449