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