如何问问题

Q:为什么提出这个问题

A:每次面试的时候总是面试官提问题,应聘人回答,但是回答完之后却又发现其实觉得自己没有真正回答任何一个问题,我想通过这个问题,复盘一下我面试时候出现的问题。

Q:所以应该怎么问问题呢?

A:首先先区分这个是不是有效问题,

怎么定义有效问题这个词语呢,我举个简单的例子:

如何对10W的数据进行排序;(这是一个无效的问题)

如何对10W的冷数据进行排序;(这个开始缩小范围了)

如何对10W的冷数据在获取的时候排序(继续缩小范围)

如何对10W的冷数据在获取的时候得到前100位的数据;(范围继续缩小)

如何对10W的冷数据在获取的时候按照数据存放的时间获取最近的100条(这算一个有效问题了)

所以,我们如何定义一个问题是有效问题,即是:能够很清晰简单的回答的问题,比如对10W的数据排序一上来提问,是个人都会是懵的,除非他在日常工作中曾经遇到过相同情景的事情,那他回答的一定会是他的那个分支的问题。

Q:那我们遇到面试官提问的时候如何能够得到真正的问题

A:像平时和产品或者需求提出者那样交流。首先我们应当根据问题确定提问的上下文,比如,还是以上面排序的例子作为示范:

我和产品或者BA会这么沟通:

  • 我要对这10W条数据倒序输出
  • 你这是什么样的使用场景呢
  • 这样的,我需要展示用户的最近几条操作记录以供恢复账号使用,是给运营人员用的
  • 哦,那事实上你只需要最近的操作记录是吧?你大约需要展示多少条呢?
  • 100条
  • 那就是按照时间排序,把最近的100条操作记录返回给页面是吧?
  • 这些数据在业务上来说用户是无法串改的把?
  • 运营方也不许篡改啊
  • 也就是这是这些数据其实是固化了的?
  • 那整个就变成了,我要从10W条固化数据提取出按照操作时间得到最近100条操作一记录并返回给运营人员(得到完整需求)

那么,作为开发,我就会选择在存储的时候用一个Buket存储最近100条数据,然后多个Buket组成一条直链并按照时间严格做排序

查询或者取数据的时候,则只要沿着buket一直扫描或者直接由时间计算得到位置即可。

Q:但有时候提的问题例如:介绍一下SpringMVC是如何工作的

A:这个其实并没有在问问题,这是在考察背书能力毕竟清楚SpringMVC是如何工作的表明,我应该是这个领域的专家。而事实上大部分工作的码农依赖的是HTTP协议中的一些特定部分而非SpringMVC这么一个特定框架下的领域知识。遇到这样的面试或者说面试过程中大部分都是这种问题的话,要考虑下是否还要去这样的公司,毕竟能问出这种问题的公司要么整天是修业务BUG,要么是对SpringMVC这种框架做过hacker使用的公司,哪种日子都不会好过。

Q:所以面试前应该有什么准备工作呢?

A:面试前其实没什么准备工作,面试最主要的是让求职者和公司之间进行交流。不要把面试想象的太过于像考试,而不是交流,心态变化了,那么行动上就会自然的出现变化。