有一位网友发了他们最近招聘时使用的一个面试题,把它作为薪资的薪资的参考标准之一,如果回答得好,就定位在50万以上年薪。题目是这样的:
有一个 10TB 的数据文件,里面内容全是 64bit 整数,大小顺序是乱的,要求把原有 10TB 文件中所有整数进行排序,排序后内容写到新文件中,只用标准 C/C++ 或者 Golang,不用其他任何第三方工具库,如何解决这个问题? 估计代码量大概多少? 写代码和调试,一共需要多长时间实现? 在普通服务器上,完成排序,需要运行多长时间?
非常经典的 大文件排序,这种类型的题目我看着特别有亲切感。因为我自己是做大数据的,Hadoop MapReduce 底层实现里有相当一部分代码是专门做这个事情的,当时看过之后受益匪浅,最大的感受就是单纯的文件排序(理想环境)和特定业务场景下的文件排序(现在环境)实现复杂度完全不是一个量级,有兴趣的同学可以自己翻一下相关的源码实现(Java)。
后来在团队招聘的时候,很多候选人面试过程中都会提及 Hadoop MapReduce Shuffle 的实现过程,用于证明自己对于大数据底层实现原理是有研究的。提到的次数多了之后,我就发现大部分同学这部分内容的理解多数来源于《Hadoop权威指南》这本书相关的章节,描述的整体流程是没有问题的,但很多都经不起推敲,涉及到实现细节,每个人掌握的程度差别就很大了。
考虑到不是每一个同学都会了解这个实现过程,或者看过相关的源代码,就做了一个简化:完全脱离 Hadoop、Spark、Flink 之类的框架环境,就一台本地服务器,用一个你自己熟悉的编程语言,不借助第三方库,针对大文件排序的问题,给出实现方案和关键细节。
候选人给出的答案大致可以划分为以下几个类型,我这里列出的粒度比较大:
- 没有思路;
- 能够给出分而治之的思路,就是常见的划分成多个小文件局部排序,然后再归并成一个大文件;
- 能够给出单线程版本的实现方案和关键细节;
- 能够给出多线程版本的实现方案和关键细节;
- 能够给出分布式版本的实现方案和关键细节,前面部分能够搞定,才会到这里;
对于第 2 种情况,候选人应该了解过数据结构与算法里的分治法和归并排序,或者就是提前背过类似的题目和答案,需要进一步考察;
对于第 3 或 4 种情况,实现方案主要考察候选人的逻辑思维和沟通能力,就是脑子里有想法,还能够讲述明白;关键细节主要考察代码能力,可能会涉及到IO、多线程、异常处理等;
对于第 5 种情况,主要考察候选人分布式计算和存储相关领域的储备和经验,因人而异。
我要求的答案必须是两个部分:
- 实现方案
对于某个问题,能不能给出一个可行的实现方案。这个方案可以是自己想出来的,也可以是从别人那里借鉴学习过来的。
因为现在市面上有好多大厂面试真经之类的东西,专门汇总常见的面试题型和答案,所以我需要进一步判断你是真的有货,还是只是看起来有货。 - 关键细节
对于给出的实现方案,能不能落地成实际的代码。大部分看起来有货的这个地方就会露馅,我也会根据候选人的反馈延伸出若干变种,充分考察代码能力。
有想法,能落地,才是一名程序员工程能力的最好体现。