原文链接:http://codeshold.com/2017/01/cracking_interview.html
《程序员面试金典》 1-7章的总结
相关读物《金领简历:敲开苹果、微软、谷歌的大门》(Cayle Laakmann McDowell 盖尔 拉克曼 麦克道尔)careercup.com
面试流程
- 筛选面试 screening interview
- 电话面试的可能性大
-
现场面试 on-site interview
- 准备时间表
- 面试评估流程
- 一旦进入大型科技公司的面试环节,你之前的工作经验就不是特别重要了,但它可能会左右面试官对自己的看法
- 答题情况
- 考量最终的解法是否最优,用时多久,代码整洁与否
- 常见的十大错误
- 只在计算机上练习
- 不做行为面试题演练(用心回顾以往的项目和经历)
- 不做模拟面试训练
- 试图死记硬背答案
- 不大声说出自己的解题思路
- 过于仓促
- 代码不够严谨
- 不做测试
- 修正错误漫不经心
- 轻言放弃
- 常见问题解答
- 碰到熟悉的问题应该如是相告?
- 应该使用哪种编程语言?
- 面试结束后没有收到回复,是被拒了吗?
- 被拒之后能否重新申请?可以的
面试揭秘
-
微软面试
-
亚马逊面试
-
谷歌面试
-
苹果面试
- Facebook面试
- Etherpad或其他共享文档工具写些代码
- 雅虎面试
特殊情况
- 有工作经验的求职者
- 在系统设计和架构架构方面应在简历中突出一些,面试的时候这方面的要求也应该高一些
- 说说碰到过的棘手的bug?
-
测试人员及SDET
- 项目经理与产品经理
- 处理含糊情况(面对含糊情况不会手忙脚乱、不知所措)
- 以客户为中心(态度层面)-- 站在客户角度来判断问题
- 以客户为中心(技术层面)
- 多层次交流能力(怎么向祖母及时TCP/IP的问题)
- 对技术的热情
- 团队合作/领导能力(说说自己是怎么处理团队成员没能按进度完成工作的情况。)
- 创业公司
- 最好的申请方式是内部推荐
- 简历--能够在创业环境中卖力地工作
- 大公司注重在软件开发上的整体职业素养,创业公司更注重自己的个性契合度、技术技能和此前的工作经验
面试之前
- 积累经验
- 找实习,“微软探索者”、“谷歌编程夏列营”
- 开拓一些业务或项目,自己的想法,然后主动的做
- 人际网
- meetup.com
- 主动和人打招呼
- 助人为乐
- 写好简历
- 有针对性
- 一张纸
- 项目经历 2-4个
- 编程语言 java(非常熟练), C++(熟练), JavaScript(有过使用经验)
行为面试
1. 准备
-
常见问题 项目1 项目2 项目3 项目4 最难的部分 有什么收获 最有意思的部分 最难解的bug 最享受的过程 与团队成员的冲突 - 针对问题,回想小故事并将小故事浓缩成几个关键字
- 项目失败的经历
- 你需要说服团队成员的事例
- 你有哪些缺点
- “有时候我可能对细节不够重视。好的一方面是我反应迅速、执行力强,但不免会粗心大意而犯错。有鉴于此,我总会找其他同事帮忙检查自己的工作,确保不出问题。”
- 项目中最难处理的问题是什么
- 应该问面试官的问题
- 真实的问题
- “你每天有多少时间花在写代码上?”
- “你一周要开几次会?”
- “整个团队中,测试人员、开发人员和项目经理的比例是多少?他们如何互动的?团队怎么做项目规划?”
- 有见地的问题
- “我注意到你们使用了X技术,请问你们是如何处理Y问题的?”
- “为什么你们的产品选择使用X协议而不是Y协议,对然有……好处,但存在……问题,很多公司并未采用该协议。”
- 富有激情的问题
- “我对可扩展性很感兴趣。请问你从事过分布式系统方面额工作吗?有哪些机会可以学习这方面的知识?”
- “我对X技术不是太熟悉,不过听上去是个不错的解决方案。你能给我多讲讲它的工作原理吗”
- 真实的问题
2. 应对
-
力求具体,切记自大(具体的故事)
- 省略细枝末节
- “在研究最常用的用户行为并应用Rabin-Karp算法后,我设计了一种新算法,在90%的情况下搜索操作的时间复杂度由O(n)降至O(logn)”
- 回答调理清晰
- 主题先行(直接先说结果)
- S.A.R.法(情景、行动、结果)
技术面试
1. 准备
-
在纸上写算法代码,在纸上测试代码,将代码原样输入计算(记录犯过的错误),模拟测试(mock interview, careercup.com)
- 必须掌握的知识
- 数据结构:链表、二叉树、单词查找树(trie)、栈、队列、向量/数组列表、散列表等
- 算法:广度优先搜索、深度优先搜索、二分查找、归并排序、快速排序、树的插入/查找等
- 概念t:位操作、单例设计模式、工厂设计模式、内存(栈和堆)、递归、大O时间
- 记忆幂表
- 2^10, 1K, 近似一千, 1024
- 2^20, 1MB, 近似一百万, 1048576
- 2^30, 1GB, 近似十亿
- 2^40, 1TB, 近似一万亿(trillion)
- 一个将每个32位整数映射为布尔值的散列表可以把一台计算机的内存填满(2^32=4GB)
- 其他编程语言知识(参考公司的要求)
2. 应对
- 提问
- 以消除题目的疑义
- 例如就“设计一种列表的排序算法”可连续提问
- 设计算法
- 考虑时间复杂度、空间复杂度
- 大量数据的情况、算法的限制
- 是否善用了“特定数据”(面试官指定的)
-
先编写伪代码
- 编写代码
- 多用数据结构
- 有条不紊、参数检测
- 测试
- 先理清代码失效的原因
- 极端用例(0、负值、空值、最大值、最小值)
- 用户错误
- 一般用例
3. 算法题解法
- 举例法
- 求任意时刻时针和分针之间的角度
- 模式匹配法
- 一个有序数组循环移动后,找出其中最小的元素
- 简化推广法
- 从一本杂志里剪下一些单词可以拼凑成一封勒索信,如何判断该勒索信是否由某本杂志里的单词组成
- 简单构造法
- 递归,打印某个字符串所有可能的排列组合
- 数据结构头男风暴
- 随机生成一些数字,并保存到一个数组中,如何跟踪数组中的中位数
4. 好代码的建议
编写一个函数检查某个二进制数(以字符串形式传入)是否等于以字符串表示的十六进制数
- 多用数据结构(如多项式的加减)
- 适当重用代码
- 模块化
- 灵活、健壮(面试官要求编写代码检查谁是三连棋的赢家,但可以假定其实NxN的棋盘)
- 错误检查
面试结果
- 录用
- 可申请延长回复期限(若还在苦等其他公司的回音)
- 拒绝录用,可以阐明自己做当下最佳选择的原因
- 被拒
- 询问什么时候可以再申请
- 再申请时或下次面试时,需要注意哪些事项
- 薪酬
- 签约奖金、搬家费及其他一次性津贴(总和除以预期服务的年限)
- 各地生活成本差异(估算)
- 年终奖(打听平均数)
- 股票期权与补助金(收入除以预期服务年限)
- 谈判
- 给出具体的“要价”,具体的金额
- 开出比预期稍高的价码
- 不要只盯着薪水(这往往不好改),可要求更多的期权或签约奖金
- 使用合适的方式谈判,如电话
- 先了解公司的等级制度,一定的级别对应一定的薪资范围
- 职业发展
- 该公司能否增加履历的份量?
- 是否提供了切实可行的转岗通道?
- 幸福指数
- 产品:什么样的产品?和哪些人共事?
- 经理和队友
- 企业文化(如何做决策到整体氛围以及公司的组织架构,问问未来的同时如何描述)
- 工作时常,每周会有多少,一天能用来写代码的时
入职准备
- 指定时间表,不要“温水煮青蛙”
- 打造人际网络
- 向经理寻求帮助,开诚布公的告诉主管自己的心迹