程序员面试笔试真题库(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-29 18:46:21

点击下载

作者:猿媛之家

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

程序员面试笔试真题库

程序员面试笔试真题库试读:

前言

程序员求职始终是当前社会的一个热点,而市面上有很多关于程序员求职的书籍,例如《程序员代码面试指南》《剑指offer》《程序员面试笔试宝典》《Java程序员面试笔试宝典》《编程之美》《编程珠玑》等,它们都是针对基础知识的讲解,各有侧重点,而且得到了广大读者的认可,但是,我们发现,当前市面上没有一本专门针对C/C++程序员、Java程序员的面试、笔试真题的分析与讲解。很多读者朋友们反映,他们经过精心准备之后,不知道自己是否真的能够在程序员面试笔试中得心应手。而网上一些IT企业的面试、笔试真题大都七零八凑,且绝大多数都是一些博主自己做的,答案简略,准确性不高,这就导致读者做完了这些真题,也不知道自己做得是否正确。

针对这种情况,编写团队经过精心准备,细致挑选了17套当前著名IT企业的笔试真题,将其汇集成册,形成了这样一本《程序员面试笔试真题库》。编者从数百份真题中挑选的这17套真题非常有代表性,这主要体现在以下三点:

第一,考查率高。本书所选真题均为程序员面试笔试常考点,例如语言基础、链表、算法、海量数据处理等。

第二,行业代表性强。本书所选真题均来自知名IT企业,其中绝大多数真题因为题目难易适中且具有非常好的区分度,通常会被众多企业借鉴。

第三,答案详尽,授之以渔。本书对每一道题目都给出了非常详细的解答,不仅给出了正确答案,还提供了详细的解答过程。读者在学完基础知识以后,可以通过做本书中的习题来找出自己的知识盲区,查漏补缺,从而真正掌握这些知识点。

由于篇幅所限,本书无法将所有程序员面试、笔试真题囊括其中,鉴于此,编写团队(猿媛之家)在官方网站(www.yuanyuanba.com)上提供了一个读者交流平台,供读者上传各类面试笔试真题,查找自己所需要的知识,同时也可供读者向本平台提供当前最新、最热门的程序员面试笔试题、面试技巧等相关材料。除此以外,我们还建立了公众号“猿媛之家”,作为对外消息发布平台,以期最大限度地满足读者需要。

本书主要针对C/C++用户,后续还有专门针对Java用户的类似图书。有需要的读者可以在各大电商网站或实体书店进行购买。

感谢给予我们帮助的亲人、同事、朋友以及同学,无论我们遇到了多大的挫折与困难,他们都能一如既往地支持和帮助我们,在此对他们致以最衷心的感谢。

所有的成长和伟大,如同中药和老火汤,都是一个时辰一个时辰地熬出来的;所有的好书,都是斟字酌句地打磨出来的。在技术的海洋里,我们不是创造者,但我们更愿意去当好一名传播者,以期让更多的求职者能够通过本书的系统学习,找到一份自己满意的工作,实现自己的人生理想与抱负。

人生如戏,我们每个人都应成为自己这场戏剧的主角,所以,求职者在求职的道路上,无论遇到了多大的困难、遭遇了多大的挫折,都不要轻言放弃,只要你认真努力,就能在属于你的舞台上绽放自己的精彩。请记住:“在这个世界上,没有人可以让你仰视,除非你自己跪着”。

由于编者水平有限,书中不足之处在所难免,还望读者见谅。读者如果发现问题或是有此方面的困惑,可以通过邮箱yuancoder@foxmail.com联系我们。猿媛之家

面试笔试经验技巧篇

想找到一份程序员的工作,没有技术显然是不行的,但只有技术也是不够的。面试笔试经验技巧篇主要针对程序员面试笔试中遇到的13个常见问题进行深度解析,并且结合实际情景,给出了一个较为合理的参考答案供读者学习与应用。掌握这13个问题的应答技巧,对于求职者大有裨益。

面试笔试经验技巧1 如何巧妙地回答面试官的问题

在程序员面试中,求职者不可避免地需要回答由面试官提出的各种刁钻、犀利的问题,这时不能简单地回答“是”或者“不是”,而应该具体分析“是”或者“不是”的理由。

那么,面对面试官提出的各类问题,如何才能条理清晰地回答呢?如何才能让自己的回答令面试官满意呢?

谈话是一种艺术,回答问题也是一种艺术。同样的问题,不同的回答方式,往往会产生不同的效果,甚至是截然不同的效果。在此,编者提出以下几点建议,供读者参考。

首先,回答问题务必谦虚谨慎。既不能让面试官觉得自己很自卑,唯唯诺诺,也不能让面试官觉得自己清高自负,而应该通过回答问题表现出自己自信从容、不卑不亢的一面。例如,当面试官提出“你在项目中起到了什么作用”的问题时,如果回答“我完成了团队中最难的工作”,可能会给面试官一种居功自傲的感觉;而如果回答“我完成了文件系统的构建工作,这个工作被认为是整个项目中最具挑战性的一部分内容,因为它几乎无法重用以前的框架,需要重新设计”,这种回答有理有据,更能打动面试官。

其次,回答面试官的问题时,要适当地留有悬念。人一般都有猎奇的心理,面试官自然也不例外,而且人们往往对好奇的事情更有兴趣,也更加记忆深刻。所以,在回答面试官问题时,应说关键点而非细节,说重点而非和盘托出,通过关键点,吸引面试官的注意力,等待他们继续“刨根问底”。例如,当面试官希望对简历中的一个算法问题有进一步了解时,求职者可以这样回答“我设计的这种查找算法,对于80%以上的情况,都可以将时间复杂度从O(n)降低到O(logn),如果您有兴趣,我可以详细给您分析具体的细节。”

最后,回答问题要条理清晰、简单明了,最好使用“三段式”方式。所谓“三段式”,有点类似于中学作文中的写作风格,包括“场景/任务”“行动”“结果”三部分内容。以面试官提的问题“你在团队建设中,遇到的最大挑战是什么”为例,第一步,分析“场景/任务”:在我参与的一个企业资源计划(Enterprise Resource Planning,ERP)项目中,我们团队一共四个人,除了我以外的其他三个人中,有两个人能力较好,人也比较好相处,但有一个人却不太好相处,每次小组讨论问题时,他都不太爱说话,也很少发言,分配给他的任务也很难完成。第二步,分析“行动”:为了提高团队的综合实力,我决定找个时间和他单独谈谈。于是我利用周末时间,约他一起吃饭,顺便讨论项目问题,并询问了一些项目中他遇到的问题,通过他的回答,我发现他并不懒,只是对项目不太了解,缺乏经验,缺乏自信而已,所以越来越孤立,越来越不愿意讨论问题。为了解决这个问题,我尝试着把问题细化到他可以完成的程度,从而帮助他建立自信心。第三步,分析“结果”:慢慢地,他的技术水平有了大幅提升,不仅能够按时完成安排给他的工作,人也越来越自信了,也越来越喜欢参与小组的讨论,并能良好地表达自己的想法了。由此,团队整体协作能力也得到了提升。“三段式”回答一个最明显的好处就是条理清晰,既有描述,也有结果,有理有据,让面试官一目了然。

回答问题是一门大学问。求职者可以在平时的生活中加以练习,提高自己与人沟通的技能,等到面试时,自然也得心应手了。

面试笔试经验技巧2 如何回答技术性问题

在面试中,面试官会经常询问一些技术性的问题,有的问题可能是历年的笔试面试真题,求职者在平时的复习中会经常遇到,应对自然不在话下,但有的题目可能比较难,来源于Google、Microsoft等大企业的题库或是企业为了招聘需要自己设计的题库,求职者可能从来没见过或从来都不能完整地、独立地想到解决方案,而这些题目往往又是企业比较关注的。

如何能够回答好这些技术性的问题呢?编者建议,会做的一定要拿满分,不会做的一定要拿部分分。也就是说,对于简单的题目,求职者要努力做到完全正确;对于难度比较大的题目,不要有畏难心理,即使无法完全做出来,也要努力思考问题,至少要把自己的思路表达清楚,而不是完全回答“不会”或放弃,因为面试官除了关注你独立思考问题的能力以外,还会关注你技术能力的可塑性,观察求职者是否能够在别人的引导下正确地解决问题,所以,对于你不会的问题,他们很有可能会循序渐进地启发你去思考,以期通过这个过程进一步了解你。

一般而言,在回答技术性问题时,求职者大可不必胆战心惊,除非是没学过的新知识,否则,一般都可以采用以下六个步骤来分析解决。(1)勇于提问 面试官提出的问题有时可能过于抽象,让求职者不知所措或无从下手,所以,对于面试中的疑惑,求职者要勇敢地提出来,多向面试官提问,把不明确或是有二义性的情况都问清楚。这样做不仅不会让面试官烦恼,影响你的面试成绩,相反还会对面试结果产生积极影响:一方面,提问可以让面试官知道你在思考,也可以给面试官留下一个心思缜密的好印象;另一方面,提问有利于后续自己对问题的解答。

例如,面试官提出一个问题——设计一个高效的排序算法。求职者可能摸不到头脑,排序对象是链表还是数组?数据类型是整型、浮点型、字符型,还是结构体类型?数据基本有序还是杂乱无序?数据量有多大?1000以内,还是百万以上个数?此时,求职者大可以将自己的疑问提出来,问题清楚了,就可以有针对性地设计解决方案了。(2)高效设计 对于技术性问题,如何才能打动面试官?完成基本功能肯定是必需的,仅此而已吗?显然不是,完成基本功能只能算是及格,要想达到优秀,至少还应该考虑更多的内容。以排序算法为例,时间是否高效?空间是否高效?数据量不大时也许没有问题,如果是海量数据呢?是否考虑了相关环节,例如数据的“增删改查”?是否考虑了代码的可扩展性、安全性、完整性以及鲁棒性?如果是网站设计,是否考虑了大规模数据访问的情况?是否需要考虑分布式系统架构?是否考虑了开源框架的使用?(3)伪代码先行有时实际代码会比较复杂,上手就写很有可能漏洞百出、条理混乱,所以,求职者可以先征求面试官的同意,在编写实际代码前,写一个伪代码或画好流程图,这样做往往会让思路更加清晰明了。

切记在写伪代码前要告诉面试官,否则他们很有可能对你产生误解,认为你只会纸上谈兵,缺乏实际编码能力。(4)控制节奏 如果是算法设计题,面试官都会给求职者一个用以完成设计的时间限制,一般为20min左右。完成得太慢,会给面试官留下能力不够的印象;但完成得太快,如果不能保证100%正确,也会给面试官留下毛手毛脚的印象。速度快当然是好事情,但只有速度没有质量,就不会起到加分的作用。所以,编者建议控制好答题节奏,如果完成得比较快,也不要急于提交给面试官,最好能够利用剩余的时间,认真仔细地检查一些边界情况、异常情况、极性情况等是否也能满足要求。(5)规范编码 回答技术性问题时,多数都是在纸上写代码,离开了编译器的帮助,求职者要想让面试官对自己的代码一看即懂,除了字迹工整以外,最好能够严格遵循编码规范,同时,代码设计应该具有完整性,保证代码能够完成基本功能、输入边界值能够得到正确的输出、对各种不合规范的非法输入能够做出合理的错误处理,否则,写出的代码即使很高效,面试官也不一定看得懂或看起来非常费劲,这对面试成功都是非常不利的。(6)精心测试 众所周知,任何软件都有缺陷(Bug)。但不能因为如此,就让自己的代码漏洞百出。尤其是在面试过程中,实现功能也许并不那么困难,难的是在有限的时间内设计出的算法是否使各种异常都得到了有效的处理,是否使各种边界值都在算法设计的范围内,等等。

测试代码是让代码变得更加完美的高效方式之一,也是一名优秀程序员必备的素质之一。所以,在编写代码前,求职者最好能够了解一些基本的测试知识,做一些基本的单元测试、功能测试、边界测试以及异常测试。

在回答技术性问题时,即便是在思考问题,也不要“惜字如金”。面试官面试的时间是有限的,他们希望在有限的时间内尽可能地去了解求职者,求职者的“惜字如金”很有可能会让面试官觉得思考问题能力以及沟通能力存在问题。

其实,在面试时,求职者往往会存在一种思想误区——把技术性面试的结果看得过于重要。对于面试过程中的技术性问题,结果固然重要,但也并非最重要的内容,因为面试官看重的不仅仅是最终的结果,还包括求职者在解决问题的过程中体现出来的逻辑思维能力以及分析问题能力。所以,求职者在面试过程中,要适当地提问,通过提问获取面试官的反馈信息,并抓住这些有用信息进行辅助思考,从而提高面试的成功率。

面试笔试经验技巧3 如何回答非技术性问题

评价一个人的能力,除了专业能力,还有一些非专业能力,如智力、沟通能力、反应能力等,所以在IT企业招聘过程的笔试面试环节中,并非所有的笔试内容都是C/C++、数据结构与算法、操作系统等专业知识,也包括其他一些非技术类的知识,如智力题、推理题、作文题等。技术水平类测试可以考查一个求职者的专业素养,而非技术类测试则更侧重于考查求职者的综合素质,包括数学分析能力、反应能力、临场应变能力、思维灵活性、文字表达能力、性格特征等。考查的形式多种多样,但与公务员考查相似,主要包括行测(占大多数)、性格测试(大部分都有)、应用文、开放问题等内容。

每个人都有自己的答题技巧,答题方式也各不相同,以下是一些相对比较好的答题技巧(以行测为例)。

1)合理有效的时间管理。由于题目的难易不同,因此不要对所有题目都“绝对公平”,要有轻重缓急,最好的做法是不按顺序回答。行测有各种题型,如数量关系、图形推理、应用题、资料分析、文字逻辑等,而不同的人擅长的题型是不一样的,因此应该先回答自己最擅长的问题。例如,如果对数字比较敏感,那么就先答数量关系。

2)注意时间的把握。由于题量一般都比较大,因此可以先按照总时间/题数来计算每道题的平均答题时间,如10s,如果看到某一道题5s后还没思路,则应马上放弃。在做行测题目时,以在最短的时间内拿到最多分为目标。

3)平时多关注图表类题目,培养迅速抓住图表中的各个数字要素间相互逻辑关系的能力。

4)做题要集中精力,只有集中精力、全神贯注,才能将自己的水平最大限度地发挥出来。

5)学会关键字查找,能够提高做题效率。

6)提高估算能力,很多时候,估算能够极大地提高做题速度,同时保证正确率。

除了行测以外,一些企业非常相信个人性格对职位的影响,所以都会引入相关的性格测试题用于测试求职者的性格,看其是否适合所申请的职位。大多数情况下,只要按照自己的真实想法选择就行了,不要弄巧成拙,因为测试是为了得出正确的结果,所以大多数测试题前后都有相互验证的题目。如果求职者自作聪明,选择该职位可能要求的性格选项,则很可能导致测试前后不符,这样很容易让企业认为你是个不诚实的人,从而不予考虑。

面试笔试经验技巧4 如何回答快速估算类问题

有些企业的面试官喜欢出一些快速估算类问题。对他们而言,这些问题只是手段,不是目的,能够得到一个满意的结果固然是他们所需要的,但他们更希望通过这些题目去考查求职者的快速反应能力以及逻辑思维能力。由于求职者平时准备的时候可能对此类问题有所遗漏,因此一时很难想到解决的方案。这些题目看似毫无头绪,但实际上比较灵活,属于开放性试题,一般没有标准答案,只要找准回答要点,分析合理到位,使答案具有说服力,就可以了。

例如,面试官可能会问这样一个问题:“请你估算一家商场在促销时一天的营业额”,求职者如何能够得出一个准确的数据呢?

其实本题只要能够分析出一个概数就行了,不一定要得出精确数据,而分析概数的前提就是做出各种假设。以该问题为例,可以尝试从以下思路入手:从商场规模及商铺规模入手,通过每平方米的租金估算出商场的日租金,再根据商铺的成本构成得到全商场日均交易额,然后考虑促销时的销售额与平时销售额的倍数关系,乘以倍数,即可得到促销时一天的营业额。具体而言,包括以下估计数值:

1)以一家较大规模商场为例,商场一般按6层计算,每层大约2长100m,宽100m,合计60000m。2

2)商铺规模约占商场规模的一半,合计30000m。222

3)商铺租金约为40元/m,估算出年租金为40元/m×30000m×365天=4.38亿元。

4)对商户而言,租金一般占销售额的20%左右,则年销售额为4.38亿元÷20%=21.9亿元,则计算平均日销售额为21.9亿元/365天=600万。

5)促销时的日销售额一般是平时的10倍,所以大约为600万×10=6000万。

此类题目涉及面比较广,例如,“估算北京小吃店的数量。”“估算中国在过去一年方便面的市场销售额。”“估算长江的水的质量。”“估算一个行进在小雨中的人5min内身上淋到的雨的质量。”,等等。但一般都是即兴发挥,遇到此类问题,读者应一步步地抽丝剥茧,找准要点,合理分析,给出具有说服力的答案。

面试笔试经验技巧5 如何回答算法设计问题

在面试中,很多算法设计问题都是各家企业历年来的现成题目,不管求职者以前对算法知识学习得是否扎实,理解得是否深入,学上一段时间,牢记于心,应付此类题目应该没有问题,但遗憾的是,很多世界级知名企业也深知这一点,如果纯粹是出一些毫无技术含量的题目,会让考前“突击手”占尽便宜,这样不利于人才的选拔,所以,为了把优秀的求职者与一般的求职者能够更好地区分开来,他们往往会推陈出新,越来越倾向于出一些有技术含量的新题。

在面试中,算法的地位如同托福考试在出国考试中的地位——是必需的但不是最重要的,它只是众多考核方面中的一个,不直接决定求职者的“生死”。虽然如此,但并不是说不用去准备算法知识,因为算法知识回答得好,必然会成为面试的加分项,对于求职成功,百利而无一害。那么,如何应对此类题目呢?很显然,编者不可能将此类题目都在《程序员面试笔试宝典》中一一解答,一来由于内容众多,篇幅有限;二来也没必要,今年考过了,以后一般就不会再考了,不然还是没有区分度。编者以为,靠死记硬背肯定是行不通的,解答此类算法设计问题,需要求职者具有扎实的基本功以及良好的运用能力,这里仅提供一些比较好的答题方法和解题思路,以供求职者在面试时应对此类算法设计问题。(1)归纳法 此方法通过写出问题的一些特例来分析总结其中的一般规律。具体而言,就是通过列举少量的特殊情况,经过分析,最后找出其中的一般关系。例如,某人有一对兔子饲养在围墙中,如果它们每个月生一对兔子,且新生的兔子在第二个月后也是每个月生一对兔子,问:一年后围墙中共有多少对兔子?

使用归纳法解答此题,首先想到的就是第一个月有多少对兔子。第一个月,最初的一对兔子生下一对兔子,此时围墙内共有两对兔子。第二个月仍是最初的一对兔子生下一对兔子,共有3对兔子。到第三个月,除最初的兔子新生一对兔子外,第一个月生的兔子也开始生兔子,因此共有5对兔子。通过举例,可以看出,从第二个月开始,每一个月兔子总数都是前两个月兔子总数之和,U=U+U,一年后,n+1nn-1围墙中的兔子总数为377对。

此种方法比较抽象,也不可能对所有的情况进行列举,所以,得出的结论只是一种猜测,还需要进一步证明。(2)相似法 如果面试官提出的问题与求职者以前用某个算法解决过的问题相似,此时就可以触类旁通,尝试改进原有算法来解决这个新问题。而通常情况下,此种方法都会比较有效。

例如,实现字符串的逆序打印,也许求职者从来就没遇到过此问题,但将字符串逆序肯定是在求职准备的过程中见过的。将字符串逆序的算法稍加处理,即可实现字符串的逆序打印。(3)简化法 使用此方法,应先将问题简单化,例如改变一下数据类型、空间大小等,然后尝试着将简化后的问题解决,一旦有了一个算法或思路可以解决这个被简化过的问题,再将问题还原,尝试用此类方法解决原有问题。

例如,在海量日志数据中提取出某日访问×××网站次数最多的IP。很显然,由于数据量巨大,直接进行排序不可行,但如果数据规模不大,采用直接排序不失为一种好的解决方法。那么,如何将问题规模缩小呢?于是想到了散列法,散列往往可以缩小问题规模,然后在简化过的数据里面使用常规排序算法即可找出此问题的答案。(4)递归法 为了降低问题的复杂度,很多时候都会将问题逐层分解,最后分解为一些最简单的问题,这就是递归。使用此种方法,应先解决最基本的情况,然后以此为基础,解决其他问题。

例如,在寻求全排列时,可能会感觉无从下手,但仔细推敲,会发现后一种排列组合往往是在前一种排列组合的基础上进行重新排列,一旦知道了前一种排列组合的各类组合情况,只需要把最后一个元素插入到前面各种组合的排列里面,就解决了这一问题,即先截去字符串s[1,…,n]中的最后一个字母,生成所有s[1,…,n-1]的全排列,然后再将最后一个字母插入到每一个可插入的位置。(5)分治法 任何一个可以用计算机求解问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。而分治法也是如此,即将一个难以直接解决的大问题,分割成一些规模较小的相同问题,各个击破,分而治之。分治法一般包含三个步骤:①将问题的实例划分为几个较小的实例,最好具有相等的规模;②对这些较小的实例求解,而最常见的方法一般是递归;③如果有必要,则合并这些较小问题的解,以得到原始问题的解。

分治法是程序员面试常考的算法之一,一般适用于二分查找、大整数相乘、求最大子数组和、找出伪币、金块问题、矩阵乘法、残缺棋盘、归并排序、快速排序、距离最近的点对、导线与开关等。(6)散列法 很多面试笔试题目都要求求职者给出的算法尽可能高效。那么,究竟什么样的算法是高效的?一般而言,时间复杂度越低,算法越高效。而要想达到时间复杂度的高效,很多时候就必须在空间上有所牺牲,即“用空间来换时间”。而用空间换时间最有效的方式就是散列法、大数组、位图法。当然,此类方法并非“包治百病”,有时面试官也会对空间大小进行限制,此时,求职者只能再去思考其他的方法了。

其实,凡是涉及大规模数据处理的算法设计,散列法就是最好的方法之一。(7)轮询法 每道面试笔试题,在设计时,往往会有一个载体,这个载体便是数据结构,例如数组、链表、二叉树、图等。当载体确定后,可用的算法自然而然地就会显露出来。可问题是,很多时候并不确定这个载体是什么。当无法确定这个载体时,求职者一般也就很难想到合适的方法了。

编者建议,此时求职者可以采用最原始的方法——轮询,在脑海中轮询各种可能的数据结构与算法,从中找出一种合适的解法。常考的数据结构与算法知识点见下表。

此种方法看似笨拙,其实很实用,只要求职者对常见的数据结构与算法烂熟于心。

为了更好地理解这些方法,求职者可以在平时的准备过程中,应用此类方法去答题,练习得多了,自然就熟能生巧了,面试时遇到此类问题,也就能够应对自如了。

面试笔试经验技巧6 如何回答系统设计问题

在面试时,求职者偶尔也会遇到一些系统设计问题,而这些题目往往只是测试求职者的知识面,或者测试求职者对系统架构知识的了解,一般不会涉及具体的编码工作。虽然如此,对于此类问题,很多人还是感觉难以应对。

如何应对此类题目呢?在正式介绍基础知识之前,首先罗列几个常见的与系统设计相关的面试笔试题。

1)设计一个域名系统(Domain Name System,DNS)的Cache结构,要求能够满足每秒5000次以上的查询,满足IP数据的快速插入,查询的速度要快(题目还给出了一系列的数据,例如,站点数总共为5000万,IP地址有1000万,等等)。

2)有N台机器,M个文件,文件可以以任意方式存放到任意机器上,文件可任意分割成若干块。假设这N台机器的宕机率小于1/3,要求在宕机时可以从其他未宕机的机器中完整地导出这M个文件,求最好的存放与分割策略。

3)假设有30台服务器,每台服务器中都存有上百亿条数据(有可能重复),如何根据某关键字,从中找出重复出现次数最多的前100条数据?要求使用Hadoop来实现。

4)设计一个系统,要求写速度尽可能快,并说明设计原理。

5)设计一个高并发系统,说明架构和关键技术要点。

6)假设有一个25T的log(query->queryinfo),log的大小还在不段地增长,设计一个方案,给出一个query能快速返回queryinfo。

以上所有问题中,凡是不涉及高并发的,基本可以采用Google的三个技术解决,即GFS、MapReduce和Bigtable,这三个技术被称为“Google的三驾马车”,Google只公开了论文而未公开源代码,开源界对此非常感兴趣,于是仿效这三篇论文实现了一系列软件,如Hadoop、HBase、HDFS、Cassandra等。

在Google这些技术还未出现之前,企业界在设计大规模分布式系统时,采用的架构往往是Database+Sharding+Cache,现在很多公司仍采用这种架构。在这种架构中,仍有很多问题值得去探讨。如采用什么数据库,是SQL界的MySQL还是NoSQL界的Redis/TFS,两者有何优劣?采用什么方式进行数据分片(Sharding)?是水平分片,还是垂直分片?据网上资料显示,weibo.com和taobao图片存储中曾采用的架构是Redis/MySQL/TFS+Sharding+Cache。该架构解释如下:前端Cache是为了提高响应速度;后端数据库则用于数据永久存储,防止数据丢失;而Sharding是为了在多台机器间分摊负载。最前端由大块的Cache组成,要保证至少99%(该数据在weibo.com架构中的占比是编者推测的,而在taobao图片存储模块是真实的)的访问数据落在Cache中,这样可以保证用户访问速度,减少后端数据库的压力。此外,为了保证前端Cache中的数据与后端数据库中的数据一致,需要有一个中间件异步更新(这是因为同步代价太高。请思考,异步有缺点,如何弥补?)数据。另外,为了分摊负载压力和海量数据,会将用户的微博信息经过分片(即Sharding)后存放到不同的结点上。

这种架构的优点非常明显——简单,在数据量和用户量较小时完全可以胜任。但其扩展性和容错性差、维护成本高,尤其是数据量和用户量暴增之后,系统不能通过简单地增加机器解决该问题。

于是,新的架构便出现了,即前面讲到的“Google的三驾马车。

1)GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,提供容错功能。现在开源界有Hadoop分布式文件系统(Hadoop Distributed File System,HDFS),该文件系统虽然弥补了数据库+Sharding的很多缺点,但自身仍存在一些问题,例如,由于采用master/slave架构,因而存在单点故障问题;元数据信息全部存放在master端的内存中,因而不适合存储小文件,或者说如果存储的大量小文件,那么存储的总数据量不会太大。

2)MapReduce是针对分布式并行计算的一套编程模型。其最大的优点是编程接口简单、自动备份(数据默认情况下会自动备三份)、自动容错和隐藏跨机器间的通信。在Hadoop中,MapReduce作为分布计算框架,而HDFS作为底层的分布式存储系统,但MapReduce不是与HDFS耦合在一起的,用户完全可以使用自己的分布式文件系统替换HDFS。当前MapReduce有很多开源实现,如Java实现Hadoop MapReduce、C++实现Sector/sphere等,甚至有些数据库厂商将MapReduce集成到数据库中。

3)BigTable俗称“大表”,用来存储结构化数据。编者个人认为,BigTable在开源界最火爆,其开源实现最多,包括HBase、Cassandra、levelDB等,使用也非常广泛。

除了Google的这“三驾马车”以外,还有其他一些技术可供学习与使用。

1)Dynamo:亚马逊的key-value模式的存储平台,可用性和扩展性都很好,采用分布式散列表(Distributed Hash Table,DHT)对数据分片,解决单点故障问题。在Cassandra中,也借鉴了该技术,在BT和电驴中,也采用了类似算法。

2)虚拟结点技术:该技术常用于分布式数据分片中。具体应用场景是:有一大堆数据(maybe TB级或者PB级),需按照某个字段(key)分片存储到几十(或者更多)台机器上,同时想尽量负载均衡且容易扩展。传统的做法是“Hash(key)mod N”,这种方法最大的缺点是不容易扩展,即增加或者减少机器均会导致数据全部重新分布,代价太大。这时便可以使用上面提到的DHT(现在已经被很多大型系统采用)。还有一种是对“Hash(key)mod N”的改进:假设要将数据分布到20台机器上,传统做法是“Hash(key)mod 20”,而改进后,N的取值要远大于20,如20000000,然后额外采用一张表记录每个结点存储的key的模值,例如,

这样当添加一个新的结点时,只需将每个结点上的部分数据移动给新结点,同时修改一下这个表即可。

3)Thrift:它是一个跨语言的远程过程调用协议(Remote Procedure Call Protocol,RPC)框架。RPC的使用方式与调用一个普通函数一样,但执行体发生在远程机器上。跨语言是指不同语言之间进行通信,例如C/S架构中,Server端采用C++编写,Client端采用PHP编写,若要让两者之间通信,则thrift是一种很好的方式。

对于这一节开始提出的几道笔试题,都可以通过上面介绍的知识点来加简答,例如:

1)关于高并发系统设计,主要有以下几个关键技术点:缓存、索引、数据分片、锁粒度尽可能小。

2)问题2涉及现在通用的分布式文件系统的副本存放策略。一般是将大文件切分成小的块(如64MB)后,以块为单位存放三份到不同的结点上,这三份数据的位置需根据网络拓扑结构配置。一般而言,如果不考虑跨数据中心,可以这样存放:两个副本存放在同一个机架的不同结点上,而另外一个副本存放在另一个机架上,这样从效率和可靠性上都是最优的(Google公布的文档对此有专门的证明)。如果考虑跨数据中心,可将两份存在一个数据中心的不同机架上,另一份存到另一个数据中心。

3)问题4涉及BigTable的模型。主要思想是将随机写转化为顺序写,进而大大提高写速度。具体方法为:由于磁盘物理结构的独特设计,其并发的随机写(主要是因为磁盘寻道时间长)非常慢,考虑到这一点,在BigTable模型中,首先会将并发写的大批数据放到一个内存表(称为“memtable”)中,当该表大到一定程度后,会顺序写到一个磁盘表(称为“SSTable”)中,这种写是顺序写,效率极高。说到这里,可能有读者问,随机读可不可以这样优化?答案是:看情况而定。通常而言,如果读并发度不高,则不可以这么做,因为如果将多个读重新排列组合后再执行,则系统的响应时间太慢,用户可能无法接受,而如果读并发度极高,也许可以采用类似机制。

面试笔试经验技巧7 如何解决求职中的时间冲突问题

对于求职者而言,求职季堪比个“赶场季”,一天少则几家、十几家企业入校招聘,多则几十家、上百家企业招兵买马,企业多,选择自然也多,这固然是一件好事情,但由于招聘企业实在是太多了,自然会导致另外一个问题的发生——同一天企业扎堆,且都是自己心仪或欣赏的知名企业。如果不能够提前掌握企业的宣讲时间、地点,则很容易迟到或错过。但有时候即使掌握了宣讲时间、笔试时间、面试时间,还是有可能错过,为什么呢?时间冲突,人不是神仙,不可能具有分身术,也不可能同一时间做两件不同的事情,所以,就必须有所取舍。

到底该如何取舍呢?到底该如何应对这种时间冲突的问题呢?在此,编者将自己的一些想法经验与分享出来,以供读者参考。

1)如果多家心仪企业的校园宣讲时间发生冲突(前提是只宣讲、不笔试),此时最好的解决方法是和同学或朋友商量好,各去一家,然后大家进行信息共享。

2)如果多家心仪企业的笔试时间发生冲突,此时只能选择其一,毕竟企业的笔试时间都是考虑到了成百上千人的安排,需要提前安排考场、考务人员、阅卷人员等,不可能为了一个人而轻易改变。所以,最好选择自己更有兴趣的企业参加笔试。

3)如果多家自己心仪企业的面试时间发生冲突,求职者不要轻易放弃。对于面试官而言,面试任何人都是一样的,因为面试官谁都不认识。而面试时间也是比较灵活的,一般可以通过电话协商。求职者可以与相关工作人员(一般是企业的人力资源师)进行沟通,给出不能参加面试的原因,让其调整时间。但一般要接到面试通知后的第一时间联系相关工作人员变更时间。

那如果多家企业的校园宣讲时间、笔试时间、面试时间发生冲突,到底是去宣讲会,还是去笔试,或是去面试呢?大原则是选择自己最有兴趣的企业。但也要灵活处理,如果仅仅只是宣讲而不涉及笔试,则完全可以不去,可寻求同学或是朋友的帮忙,回来后信息共享即可。如果可以协调面试时间,那就打电话给相关工作人员,换个不冲突的时间去面试,笔试一般时间比较固定,需要协调的事情很多,所以调整时间的可能性也不大,此时如果协调得当,基本能够保证不放弃任何一个机会。

正如世界上没有能够包治百病的药物一样,以上这些建议在应用时,很多情况下也做不到全盘兼顾,当必须进行多选一时,求职者就要对此进行评估了,评估的项目可以包括对企业的中意程度、获得录用通知的概率、去工作的可能性等。评估的结果往往具有很强的参考性,求职者依据评估结果做出的选择一般也会比较合理。

面试笔试经验技巧8 如果面试问题曾经见过,是否要告知面试官

其实在面试中,大多数题目都是有章可循的,只要求职者肯花时间,复习得当,基本上在面试前都会见过相同的或类似的问题(当然,很多知名企业每年都会推陈出新,这些题目是很难完全复习到位的)。所以,在面试中,求职者遇到自己见过的问题也就不足为奇了。那么,一旦出现这种情况,求职者是否要如实告诉面试官呢?

选择不告诉面试官的理由比较充分:首先,面试的题目60%~70%都是重复以前的,见过或见过类似的不足为奇,难道要一一告知面试官吗?如果那样,估计就没有几个题不用告知面试官了。其次,即使曾经见过该问题,也是自己辛勤耕耘、努力奋斗的结果,很多人复习不用功或方法不到位,也许从来就没见过,而这些题也许正好是拉开求职者差距的分水岭,就是面试官用来区分求职者实力的内容。

同样,选择告诉面试官的理由也比较充分:第一,如实告诉面试官,不仅可以彰显出求职者个人的诚实品德,还可以给面试官留下良好的印象。第二,有些问题,即使求职者曾经复习过,但也无法保证完全回答正确,如果向面试官如实相告,或许还可以规避这一问题,避免错误的发生。第三,求职者如果见过该问题,也能轻松应答,题目简单倒也无所谓,一旦题目难度比较大,求职者却对面试官有所隐瞒,就极有可能给面试官造成一种求职者水平很强的假象,导致面试官的判断出现偏差,后续的面试有可能向着不利于求职者的方向发展。

其实,仁者见仁,智者见智,这个问题并没有固定的答案,需要根据实际情况来决定。

面试笔试经验技巧9 再被企业拒绝后是否可以在申请

很多企业为了能够在一年一度的招聘季节中,提前将优秀的程序员招至“麾下”,往往会“先下手为强”。他们通常采取的措施有以下两种:第一种,招聘实习生;第二种,多轮招聘。

对求职者来讲,招聘开始后,往往是几家欢喜几家愁,提前拿到企业“绿卡”的,可谓是对酒当歌、欢天喜地;而没有被选上的,担心从此与这家企业无缘了,忧心忡忡。难道一次失望的表现就会被企业拉入“黑名单”了吗?难道一次失败的经历就会永远被记录在个人历史的“耻辱柱”上了吗?

答案当然是否定的,对心仪的女孩表白,即使第一次被拒绝了,还可以一而再再而三地表白,多次表白后成功的案例比比皆是,更何况是求职找工作。一般而言,企业是不会“记仇”的,尤其是知名的大企业,对此都会有明确的表示。如果在企业的实习生招聘或在企业以前的招聘中不幸被淘汰了,一般是不会被拉入企业的“黑名单”的。在下一次招聘中,和其他求职者,具有相同的竞争机会(有些企业可能会要求求职者等待半年到一年时间才能再次应聘该企业,但上一次求职的糟糕表现不会被计入此次招聘中)。

对心仪的对象表白被拒绝了,不是一样还可以继续表白吗?也许是在考验,也许是在等待,也许真的是拒绝,但无论出于什么原因,求职者都不要对自己丧失信心。工作也是如此,以编者身边的很多同学和朋友为例,很多人最开始被一家企业给拒绝了,过了一段时间,他们也成了该企业的员工。所以,即使被企业拒绝了,也不是什么大不了的事情,以后还有机会。有志者自有千计万计,无志者只感千难万难,关键是看你愿意成为什么样的人了。

面试笔试经验技巧10 如何应对自己不会回答的问题

在面试的过程中,求职者对面试官提出的问题并不是每个问题都能回答上来。计算机技术博大精深,很少有人能对计算机技术的各个分支学科都了如指掌,而且抛开技术层面的问题,在面试那种紧张的环境中,回答不上来的情况也容易出现。在面试中遇到自己不会回答的问题时,错误的做法是保持沉默或者支支吾吾、不懂装懂,硬着头皮胡乱说一通,这样会使面试气氛很尴尬,很难顺利进行。

其实面试遇到不会的问题是一件很正常的事情,没有人是万事通,即使对自己的专业有相当的研究与认识,也可能会在面试中遇到感觉没有任何印象、不知道如何回答的问题。在面试中遇到实在不懂或不会回答的问题,正确的办法是本着实事求是的原则,态度诚恳地告诉面试官自己不知道答案。例如,“对不起,不好意思,这个问题我回答不出来,我能向您请教吗?”

征求面试官的意见时可以说说自己的个人想法,如果面试官同意听,就将自己的想法说出来,回答时要谦逊有礼,切不可滔滔不绝。然后应该虚心地向面试官请教,表现出强烈的学习欲望。

所以,当遇到自己不会的问题时,正确的做法是:“知之为知之,不知为不知”,一定要实事求是,坦然面对,起码应该给面试官留下诚实、坦率的好印象。

面试笔试经验技巧11 如何应对面试官的“激将法”语言

“激将法”是面试官用以淘汰求职者的一种惯用方法,它是指面试官采用怀疑、尖锐、咄咄逼人的交流方式来对求职者进行提问的方法。例如,“我觉得你比较缺乏工作经验”“我们需要活泼开朗的人,你恐怕不合适”“你的教育背景与我们的需求不太适合”“你的成绩太差”“你的英语没过六级”“你的专业和我们不对口”“为什么你还没找到工作”“你竟然有好多门课不及格”等,很多求职者遇到这样的问题,会很快产生“我是来面试而不是来受侮辱”的想法,往往会被“激怒”。千万要记住,面试的目的是要获得工作,而不是与面试官争个高低。所以对于此类问题,求职者应该巧妙地回答,一方面化解不友好的气氛,另一方面得到面试官的认可。

具体而言,受到这种“激将”时,求职者首先应该保持清醒的头脑。企业让你来参加面试,说明你已经通过了他们第一轮的筛选,至少从简历上看,已经表明你符合求职岗位的需要。其次,做到不卑不亢,不要被面试官的思路带着走,要时刻保持自己的思路和步调。此时可以换一种方式,如介绍自己的经历、工作、优势,来表现自己的抗压能力。

针对面试官提出的“非名校毕业”的问题,求职者可以给出巧妙的回答,例如,“比尔盖茨也并非毕业于哈佛大学,但他一样成为了世界首富,成为举世瞩目的人物”;针对缺乏工作经验的问题,不妨回答:“每个人都是从没经验变为有经验的,如果有幸最终能够成为贵公司的一员,我将很快成为一个经验丰富的人”;针对专业不对口的问题,可以回答:“专业人才难得,复合型人才更难得,在某些方面,外行的灵感往往超过内行,他们一般没有思维定势,没有条条框框”。面试官还可能抛出“你的学历对我们来讲太高了”这样的问题,此时也可以很巧妙地回答:“今天我带来的三张学历证书,您可以从中挑选一张您认为合适的”。针对“性格内向”的问题,可以回答:“内向的人往往具有专心致志、锲而不舍的品质,而且我善于倾听,我觉得应该把发言机会更多地留给他人”。

面对面试官的“挑衅”行为,如果求职者回答得结结巴巴,或者无言以对,抑或怒形于色、据理力争,那就掉进了对方所设的“陷阱”,所以当求职者碰到此种情况时,最重要的一点就是保持头脑冷静,以平常心对待。

面试笔试经验技巧12 如何处理“与面试官持不同观点”这个问题

在面试的过程中,求职者不可能所有的观点都与面试官保持一致,甚至很有可能在对某个问题的看法上相差甚远。

出现这种情况时,应该委婉地表达自己的真实想法,不妨对其观点的某些方面予以肯定,然后在此基础上说明自己的观点。

面试笔试经验技巧13 什么是“职场暗语”

以往常规的面试套路,已经被众多“面试达人”们挖掘出了各种“破解秘诀”,形成了类似“求职宝典”的各类“面经”(面试经验)。所谓“道高一尺,魔高一丈”,面试官们也纷纷升级面试模式,制作了更为隐蔽、间接、含混的面试题目,让那些早已流传开来的“面试攻略”毫无用武之地,一些蕴涵丰富信息但以更新面目出现的问话屡屡“秒杀”求职者,让求职者深感困惑,例如“面试官从头到尾都表现出对我很感兴趣的样子,营造出马上就要录用我的氛围,为什么我最后还是没有被录用?”“为什么人力资源师会问我一些与专业、能力根本无关的怪问题,我感觉回答得也还行,为什么最后还是被拒了?”。其实,这都是没有听懂面试“暗语”,没有听出面试官“弦外之音”的表现。“暗语”已经成为一种测试求职者心理素质、挖掘求职者内心真实想法的有效手段。理解这些面试中的暗语对于求职者而言是不可或缺的。

以下是一些常见的面试暗语,求职者一定要弄清楚其中蕴含的深意,不然很可能铩羽而归。

1)“请把简历先放在这,有消息我们会通知你的”。面试官说出这句话,表明他对你已经“兴趣不大”了。

2)“我不是人力资源的,你别拘束,咱们就当是聊天,随便聊聊”。

一般来说,能当面试官的人都是久经沙场的“老将”,所以,求职者应该时刻保持高度警觉,认真对待面试官不经意间问出来的问题,因为这些问题看似随意,很可能是他最想知道的。所以千万不要把面试过程当作聊天,当作朋友之间的闲谈,而应该仔细思考每一个问题,认真回答,切忌随意地接话和回答。

3)“是否可以谈谈你的要求和打算”。面试官在翻阅了求职者的简历后,说出这句话,很有可能是对求职者有兴趣,此时求职者应该尽量全方位地表现个人水平与才能,但也不能“王婆卖瓜”,以免引起对方的反感。

4)“面试时只是‘例行公事’式的问答”。如果面试时只是“例行公事”式的问答,没有什么激情或主观性的赞许,此时希望就很渺茫了。但如果面试官对你的专长问得很细,而且表现出一种极大的关注与热情,那么此时希望会很大,求职者一定要抓住机会,将自己最好的一面展示给面试官。

5)“你好,请坐”。一般而言,面试官说出此话,求职者回答“你好”或“您好”不重要,重要的是求职者是否“礼貌回应”和“坐不坐”。有的求职者的回应是“你好”或“您好”后直接落座,也有求职者回答“你好,谢谢”或“您好,谢谢”后落座,还有求职者一声不吭地坐下去,极个别求职者回答“谢谢”但不坐下来。前两种方法都可接受,通过问候语,可以体现一个人的基本修养,直接影响在面试官心目中的第一印象。

6)面试官向求职者探过身去。在面试的过程中,面试官会有一些肢体语言,了解这些肢体语言对于了解面试官的心理情况以及面试的进展情况非常重要。例如,当面试官向求职者探过身去时,一般表明面试官对求职者很感兴趣;当面试官打呵欠或者目光游移不定,甚至打开手机看时间或打电话、接电话时,一般表明面试官此时有了厌烦的情绪;而当面试官收拾文件或从椅子上站起来,一般表明此时面试官打算结束面试。针对面试官的肢体语言,求职者也应该给出恰当的回应:当面试官很感兴趣时,应该继续陈述自己的观点;当面试官厌烦时,此时最好停下来,询问面试官是否愿意再继续听下去;当面试官打算结束面试,领会其用意,并准备好结束语,尽快结束面试。

7)“你从哪里知道我们的招聘信息的?”面试官提出这种问题,一方面是在评估招聘渠道的有效性,另一方面是想知道求职者是否有熟人介绍。一般而言,熟人介绍总体上会有加分,但是也不全是如此。如果是一个在单位里表现不佳或者其推荐的历史记录不良的熟人介绍,则会起到相反的效果。而大多数面试官询问这一问题,主要是为了评估自己企业发布招聘广告的有效性。

8)“你念书的时间还是比较充裕的”。表面上看,这是对他人的高学历表示赞赏,但同时也是一语双关,如果“高学历”的同时还搭配上一个“高年龄”,就一定要提防面试官的质疑:如有些人因为上学晚或是工作了以后再回来读的研究生,毕业年龄明显高出平均年龄。此时一定要向面试官解释清楚,否则,面试官如果自己揣摩,往往会向不利于求职者的方向思考,如求职者年龄大的原因是高考复读过、考研用了两年甚至更长时间或者是先工作后读研等,如果面试官有了这种想法,很可能会影响最终的求职结果。

9)“你有男/女朋友吗?对异地恋爱怎么看待?”一般而言,面试官都会询问求职者的婚恋状况,一方面是对求职者个人问题的关心,另一方面,对于女性而言,绝大多数面试官不是看中求职者的美貌、温柔贤惠,也并非特意来窥探你的隐私,很有可能是在试探你是否近期要结婚生子,将会给企业带来什么程度的负担。“能不能接受异地恋”,很有可能是考察你是否能够安心在一个地方工作,或者是暗示该岗位可能需要长期出差,试探求职者如何在感情和工作上做出抉择。与此类似的问题还有,如果求职者已婚,面试官会问是否生育;如果已育,可能还会问小孩谁带?所以,如果面试官有这一层面的意思,尽量要明确表态,避免将来的麻烦。

10)“你还应聘过其他什么企业?”面试官提出这种问题是在考核你的职业生涯规划,同时顺便评估下你被其他企业录用或淘汰的可能性。当面试官对求职者提出此种问题,表明面试官对求职者是基本肯定的,只是还不能下决定是否最终录用。如果你还应聘过其他企业,则最好选择相关联的岗位或行业回答。一般而言,如果应聘过其他企业,则一定要说自己拿到了其他企业的录用通知,如果其他的行业影响力高于现在面试的企业,则无疑可以加大你自身的筹码,有时甚至可以因此拿到该企业的顶级录用通知,如果行业影响力低于现在面试的企业,若回答没有拿到录用通知,则会给面试官一种误导——连这家企业都没有给你录用通知,我们如果给你录用通知了,岂不是说明我们不如这家企业。

11)“这是我的名片,你随时可以联系我。”在面试结束,面试官起身将求职者送到门口,并主动与求职者握手,提供给求职者名片或是自己的个人电话,希望日后多加联系,此时,求职者一定要明白,面试官已经对自己非常肯定了,这是被录用的表示。

12)“你担任职务很多,时间安排得过来吗?”对于有些职位,如销售等,学校的积极分子往往更具优势,但在应聘研发类岗位时,却并不一定是这样。面试官提出此类问题,有可能认为求职者因大量的社交活动占据学业时间,从而导致专业基础不牢固。所以,针对上述问题,求职者在回答时,一定要告诉面试官,自己参与组织的“课外活动”并没有影响到自己的专业技能。

13)“如果有消息,我们会通知你的。”一般而言,面试官让求职者等通知,有多种可能性:没戏了;给你面试的人不是负责人,无最终决定权,还需要请示上级;公司对你不是特别满意,希望再多面试一些人;公司需要对一次面试通过的人进行重新选择,可能会安排二次面试。所以,当面试官说这句话时,表明此时成功的可能性不大,至少这一次不能给出肯定的回复。

14)“我们会在几天后联系你。”一般而言,面试官说出这句话,表明了面试官对求职者还是很感兴趣的,尤其是当面试官仔细询问你所能接受的薪资情况等相关情况,否则他们会尽快结束面谈。

15)面试官认为该结束面试时的暗语。一般而言,求职者自我介绍之后,面试官会相应地提出各类问题,然后转向谈工作内容。面试官先会把工作、内容、职责介绍一番,接着让求职者谈谈今后工作的打算和设想,然后,双方会谈及福利待遇问题,谈完之后,求职者就应该主动做出告辞的姿态,不要盲目拖延时间。

面试官认为该结束面试时,往往会说以下暗示的话语来提醒求职者:

①“我很感激你对我们公司这项工作的关注”。

②“真难为你了,跑了这么多路,多谢了”。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载