关闭

#2013年Google官方技术求职大礼包#面试求职技巧篇

标签: google面试求职
1032人阅读 评论(0) 收藏 举报
分类:

转自:http://blog.sina.com.cn/s/blog_8740e0c30101cryd.html

在详细阅读本文之前,你需要明白Google并不是简单地需要你在经过良好的训练之后解决某些熟知问题,我们更看重你是否有激情和能力试着去解决一些从未见到过的问题。在本文中我们罗列了面试中可能会遇到的一些知识点,但面试的考查范围并不仅限于这些,我们强烈建议你对于那些我们在此没有提到的知识同样给予足够的重视。值得一提的是,在Google的面试中,除了针对知识本身进行评估外,我们同样会甚至更加看重对于你的系统化思维,快速学习能力,语言沟通能力以及个性的考察。 

1. 面试流程


每轮面试持续45分钟,面试官将是一位来自Google的软件工程师。面试官会考察你对于计算机专业基础知识(如数据结构,算法等)的掌握程度以及你在解决实际问题时如何利用它们。


面试内容包括:


  • 简单的自我介绍,之前做过的项目,所获的主要成绩以及你列在简历上的其它任何东西,尤其是当你自诩为某方面专家的时候(面试官会重点考察)。


  • 编码能力测试: 在面试中,你需要在白板上或者纸上完成代码(电话面试时需要在Google docs上完成)


  • 设计和开发复杂算法并分析其性能特征。


  • 计算机科学的基础知识:面向对象的设计和编程;常见数据结构如哈希表,栈,数组等;系统级的知识如操作系统,计算机网络,编译器等。


  • 解决实际问题的能力:利用计算机的知识解决全新的问题。


  • 设计问题:例如功能集,接口设计,类的继承,约束条件下的系统设计,系统的简单性和鲁棒性,折衷设计。


  • 开放性问题:面临的最大挑战,已知的最好/最坏设计,效率分析及优化,测试问题,如何改良一个已有产品的思路。


  • 语言能力(中英文):在我们的整个面试进程中,除了对你的技术能力和工作能力进行综合评价外,还会针对性地评估你的中英文沟通能力。面试官可能会选择用英文进行面试,或者跟你进行一些简单的对话,了解你的项目经验,教育或工作背景,展开技术方面的讨论,希望您可以花些时间,在语言方面也做好充分地准备。

2. 如何准备


编程


我们期待你在面试中能写出高质量且高效的,结构清晰的,无输入错误并且可被编译的代码。这是因为,Google的所有工程师(各个级别)会在同一个代码库中协同工作,让所有人的代码遵循统一的高标准对于提升代码审阅流程的效率至关重要。


你应该至少十分熟悉一种编程语言,如果熟悉C++  JavaPython或者Javascript更好,你需要在面试中写出逻辑和语法完全正确的代码。请注意,仅仅完成伪代码是不够的,你的代码还需要可以被成功编译执行。请尝试如此练习:你先在纸上写出完整代码,然后将其输入到电脑中试着编译(如果不能编译,你可能需要多加练习)。可以练习的题目包括:构建/遍历数据结构,实现系统流程,从大型数据集合中提取单个值,完成不同数据集合间的转换等。


数据结构和算法


用“O表示法”分析算法的时空间复杂度是必须掌握的。由于你将来可能参与构建非常复杂的产品,用“大O表示法”分析执行效率非常重要。你同样需要理解如链表,数组,树,哈希表,图,排序算法,NPC问题等基本概念。并且在面试中,你需要展现出自己有能力应用上述所有知识来解决碰到的问题,包括:利用“大O表示法”进行复杂度分析,排序和哈希算法,超大规模数据的处理以及在“编程”条目下列出的知识点。


  • 排序:你要懂得如何实现数据的排序,除了冒泡排序之外,你需要至少了解一种时间复杂度为nlog(n)的排序算法的细节,了解两种更佳(例如快速排序算法和归并排序算法)。另外,归并排序算法在一些快速排序算法不好用的情形下会非常有效,建议你对此进行深入了解。


  • 哈希表:可以认为,哈希表是所有已有数据结构中最重要的一种。你需要彻底了解它如何工作,并且能够在面试中用擅长的语言用一个数组来完整实现它。


  • 树:你需要了解树的构造,遍历和树的处理算法等基础知识,熟悉二叉树,n叉树以及字典树。你需要至少熟悉红黑树,伸展树和AVL树这三种平衡二叉树的一种,并知道如何实现它们。你需要了解树的两种遍历算法:BFSDFS,并且知道中序,后序和前序三种遍历算法的区别。


  • 图:图结构在Google中非常重要,你需要熟悉图的三种基本表示方法(对象箭头表示,邻接矩阵和邻接表),并能说出它们各自的优缺点。你需要了解两种基本的图遍历算法:广度优先搜索和深度优先搜索,知道它们的算法复杂度,它们各自的适用情形,以及如何在实际代码中应用它们。如果有机会的话,你可以试着去学一些更加巧妙的算法,如Dijkstra算法。


  • 其它数据结构:你应该尽可能地多学一些其它数据结构和算法,了解一些著名的NP完全问题,如旅行商问题和背包问题,并且能够在面试官在提及它们的时候认出它们,还要知道“NP完全”这个概念是什么意思。


数学


有的面试官会问到基础的离散数学、线性代数或其他一些数学问题,所以你可以在面试前花点时间复习/自学一下。请准备基本的组合学和概率论知识。你应该熟悉“n选k”问题(n-choose-k problems)及类似问题——越多越好。



系统设计


你需要熟悉2的各次幂并能以此来进行估算。例如,估计一个给定的设计需要多少台计算机。你需要了解Google的产品,并思考换做你会如何设计后端与前端。系统设计题考察的是你解决问题的能力。可能的主题包括:功能集、接口设计、类继承体系、分布式系统、约束条件下的系统设计、系统的简单性和鲁棒性、折衷设计。



操作系统


实际上面试内容包括但不限于操作系统,还可能包括其他内容,如网络、并行计算、编译原理等。这里仅以操作系统为例:你需要了解进程、线程和并发问题,熟悉锁(locks)、互斥量(mutexes)、信号量(semaphores)、监视器(monitors)以及它们的工作方式,理解死锁(deadlock)、活锁(livelock)以及如何避免。你需要知道进程和线程所需的系统资源,清楚上下文切换(context switching)的工作方式,并了解操作系统和底层硬件如何创建它们。你还需要对任务调度(scheduling)要有一些认识。世界正在迅速向多核迈进,所以请你了解一下“现代”并行架构的基础知识。


实际问题


有的面试官可能会问一些实际问题,以考察以下几个方面:思维过程是否清晰,能否提出创造性的解决方案并用多种方法解决问题,以及如何在探讨中选定解决问题的途径。因此你可以尝试提出一种算法,用这个算法写成解决方案的代码,分析代码的运行时性能,然后优化你的方案。

 

3. 在哪里热身和练习


我们强烈建议你在面试前练习编码和算法,以下是一些有用的资源:



4. 如何成功的面试


大胆说出你的想法和主动交流


多数情况下,你需要从面试官那里得到更多信息来分析和解答完整的问题。你思考的过程与最终的方案同样重要,因此我们鼓励你问更多的问题并说出你的想法。


  • 当需要作答的时候,请首先定义和框定你所听到的问题。

  • 当你不理解问题的时候——请让面试官帮忙说明它。

  • 如果你需要做一些假设——请确保它是正确的假设。

  • 请描述你打算如何解决问题的每个部分。

  • 请让面试官随时知道你的想法,因为对他/她来说,你的思考过程与最终答案同样重要。

  • 请认真倾听——在面试官试图帮你的时候不要遗漏掉提示。


了解面试官的期望


面试官会像关注答案一样地关注你解决问题的过程:


  • 求职者是否认真听并理解了问题?

  • 求职者在开始解题前是否询问了正确的问题?(重要!)

  • 求职者解题时是否使用了暴力解法?(不好!)

  • 求职者是否使用了未经检测的假设?(不好!)

  • 求职者是否听到并留意到了提示?

  • 求职者理解/解决问题是否缓慢?(不好!)

  • 求职者在选择最优方案前,是否乐于寻找更多解决方案?

  • 求职者是否探寻过新思路和新方法来解决问题?

  • 求职者在解决方案中是否有创造性和灵活性,能否接纳新的思路?

  • 面试问题能否推广到更复杂的情形?(译注:前提是求职者很好地解决了当前问题)


提问环节


在每次面试之前请准备一些你关心的问题。注:如果你有关于面试流程、薪酬或你的面试表现的问题,请直接咨询你的招聘HR。我们强烈推荐你做些关于Google和我们产品的功课:Google简介Google维基主页一位Google工程师的职业生涯


感谢你的阅读。最后,我们对你的面试着装没有特别要求,穿着舒适和自信就好。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:374097次
    • 积分:5083
    • 等级:
    • 排名:第5670名
    • 原创:135篇
    • 转载:48篇
    • 译文:4篇
    • 评论:47条
    最新评论