如何问问题

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

前K项问题

其实吧,这个问题问出来是没有答案的,因为在实际业务中会有很多种使用场景,我们需要按场景来分类才能得到真正的问题

必须要服务端全局有序的

数据量小的时候,直接快排

数据量较大时候,对数据做分段,然后归并排序

不需要服务端全局有序的

数据直接交付client处理排序

而client有区分是否是强力PC使用还是弱计算能力的计算设备

 

除了以上,还要区分,要求一直有序还是说,最后输出的时候有序,还是说其他需求

以面试时候提到的跳一跳排名来说,其实根本没有服务端排序这个事情,小程序获取成绩应该是三个步骤:

  1. 获取用户列表中已开通跳一跳的用户
  2. 获取步骤1中所有user的成绩
  3. 对成绩按大小倒序排

就会发现和前K大这个问题没有任何关联。。。

总的来说。。我发现面试的数据结构题目对于强人和应试型人才很有优势。。but,我这种经常是时候脑袋一转发现不对的人来说是很难的。。。毕竟我的注意力也不在这里面。。