2022 年有意义的Java面试题 – Galovics


关于 2022 年或前几年的 Java 面试问题有很多内容。在本文中,我将向您展示我在 2022 年的几个 Java 面试问题以及我的观点。
 
从Cassandra迁移到PostgreSQL
问题是这样的。有一个项目运行了几个月,有30个人在做这个项目,这个应用是用Cassandra作为数据存储的。该产品还没有投入生产。客户来了,说我们需要在两个月内投入生产。你的反应是,嗯,这是可行的,我们已经准备好了。我们需要做一些事情,但它肯定会符合2个月的时间表。然后客户说,是的,但是我们在一个云供应商那里得到了一个很好的交易,它没有Cassandra,但是它支持PostgreSQL。你是工程师,要决定下一步该怎么做。你会怎么做?

这就是问题所在。这就是问题所在。看到它有多开放了吗?我至少问过100多次这个问题,我从来没有得到过相同的答案。

你可以专注于很多事情,比如。

你到底要如何按时重写整个数据访问层到PostgreSQL?
如果重写工作不知不觉地完成了,你到底要如何确保所有的工作都能正常进行呢?
如果你会要求客户寻找其他支持C*的云计算解决方案
C*和PostgreSQL之间的差异;以及为什么重写会有困难
而这些只是更广泛讨论的起点。无论候选人提出什么,我都会深入了解。如果他们开始谈论技术方面的问题,例如最初在Cassandra层使用Spring Data,那么切换到Spring Data JPA就像是对代码的最小改动。我们会越来越深入,问更多的问题。

如果他们开始谈论测试,我们就深入讨论测试。他们想象中的测试过程是怎样的,他们会在哪里划定测试覆盖率足够或不够的界限,诸如此类的问题。

如果他们很会说话,他们可能会开始讨论如何让客户改变使用的云供应商的策略。展示一个关于做迁移与只是去另一个云供应商的成本评估。

不管是什么,我都会深入挖掘,并提出其他开放式的问题,引导整个讨论,看他们的思维过程。

我经常改变这个问题,不问Cassandra/PostgreSQL,而是问他们用什么NoSQL/SQL DB,并比较这两个。比如MongoDB和MySQL。
 
你将如何开始一个全新的项目?
这是一个多层次的问题。您可以完全专注于您组织的实践,但我想看看如果候选人是选择该技术的人,他们将如何从头开始一个全新的项目。
例如,这里的常见答案是 Java + Spring Boot + Hibernate 组合。然后我通常会问他们为什么会选择那个。这只是我们开始的另一个问题。我们可以讨论为什么候选人认为 Spring Boot 是一个很好的项目启动器。他们可以谈论框架本身,他们可以谈论该框架在行业中的大规模采用,他们可以谈论这样一个事实:在这种情况下,未来招聘可能比选择一个外来的框架更容易,无论如何。这会带来越来越多的问题,你只需要在候选答案中找到它们。
休眠也是一样。我个人是 JPA 和 Hibernate 的忠实信徒,但我知道它有它的位置。而且我根本不会为大多数项目选择它,因为如果开发人员不小心,很容易导致严重的性能问题。但这是您可以询问的另一个方面,即候选人在使用 Hibernate 时是否有任何性能问题。
 
你如何调试一个性能问题?
问题是这样的。你有一个网页用户界面,一个后台和一个用于存储数据的数据库。产品负责人在JIRA中创建了一个新的bug ticket,说如果他点击页面上的一个按钮,需要5秒钟才能收到操作成功的通知信息。你会如何调试这个问题呢?

这又是一个非常开放的问题,有多个焦点。

有人开始谈论JIRA票据的质量问题
有人开始分析从前台到后台的问题
有人会谈论缺乏测试,以及这个问题是由用户而不是由自动测试发现的事实
有人开始讨论可用的监控和跟踪工具
如果候选人谈到了JIRA票据,让我们讨论一下一个好的bug报告应该是什么样的,其中应该有什么样的信息。如果这一点已经确定,你将如何强制要求错误报告具有一定的质量要求。

如果他们开始分析问题,我们经常讨论他们把问题分解成可操作的部分的过程。比如如何检查前台,那里是否很慢。然后如何检查后端,哪些部分慢。如何分析/检查数据库的查询,如果它们很慢,等等。

如果他们谈到了测试,那我们就来讨论测试。这也是非常有趣的一点,因为性能测试不像单元测试那样黑白分明,有很多问题需要讨论。
 
如何处理代码审查中的个人冲突?
这个问题是建立在两个开发人员之间在代码审查中出现分歧的想法上的。比方说,一个开发者提交了一个PR,另一个需要检查。另一个开发者在那里发表了一些评论,而作者并不同意这个评论,并认为这是个人行为。你会如何处理?在这个问题上,我通常关注两个不同的角色,要么你是一个高级开发者,需要帮助在两个开发者之间达成协议,要么你是对PR发表评论的那个开发者。显然,这个角色取决于我面试候选人的工作。

这又是一个非常开放的问题,没有完美的解决方案。但是,要处理这种情况,肯定需要一个好的沟通者。
 
您会根据哪些属性来选择数据访问框架?
你会选择 JPA + Hibernate 吗?你会选择 jOOQ 吗?你会选择 MyBatis 吗?你会使用 Spring Data JPA 吗?您会编写自定义数据访问层吗?
这些选项可能会引发很多问题。基本上,如果有人快速说“X”,我问的第一个问题是“为什么是 X?”?
您需要考虑很多属性:

  • 表现
  • 可维护性
  • 灵活性
  • 文档
  • 安全
  • 行业采用,也就是雇佣具有这种技能的人是多么容易
  • 工装
  • 可测试性

以及更多。但接下来我要问的是“你说的 Z 是什么意思?” (Z 是属性之一)。
 
你什么时候会在项目中使用微服务?
尽管我对何时应该将微服务应用于某个问题有我个人的看法,但我愿意听取其他人的想法。对于这个问题,它主要是一个听力游戏。
如果候选人提出了有趣的观点,请提出后续问题。这里没有完美的答案,我不希望任何人尝试重复微服务有希望的所有花哨属性(在纸上),而是分享关于问题空间的真实想法。
他们可以谈论:
  • 扩展应用程序和团队
  • 组织困难——时间紧迫、管理不称职等。
  • 他们以前如何以及为什么使用微服务
  • 他们会选择的技术堆栈
  • 服务间通信的潜在困难

以及更多。