原文链接:http://codeshold.me/2017/01/cracking_interview.html

《程序员面试金典》 1-7章的总结
相关读物《金领简历:敲开苹果、微软、谷歌的大门》(Cayle Laakmann McDowell 盖尔 拉克曼 麦克道尔)careercup.com

面试流程

  1. 筛选面试 screening interview

    • 电话面试的可能性大
  2. 现场面试 on-site interview

  3. 准备时间表

  4. 面试评估流程

    • 一旦进入大型科技公司的面试环节,你之前的工作经验就不是特别重要了,但它可能会左右面试官对自己的看法
  5. 答题情况

    • 考量最终的解法是否最优,用时多久,代码整洁与否
  6. 常见的十大错误

    • 只在计算机上练习
    • 不做行为面试题演练(用心回顾以往的项目和经历)
    • 不做模拟面试训练
    • 试图死记硬背答案
    • 不大声说出自己的解题思路
    • 过于仓促
    • 代码不够严谨
    • 不做测试
    • 修正错误漫不经心
    • 轻言放弃
  7. 常见问题解答

    • 碰到熟悉的问题应该如是相告?
    • 应该使用哪种编程语言?
    • 面试结束后没有收到回复,是被拒了吗?
    • 被拒之后能否重新申请?可以的

面试揭秘

  1. 微软面试

  2. 亚马逊面试

  3. 谷歌面试

  4. 苹果面试

  5. Facebook面试

    • Etherpad或其他共享文档工具写些代码
  6. 雅虎面试

特殊情况

  1. 有工作经验的求职者

    • 在系统设计和架构架构方面应在简历中突出一些,面试的时候这方面的要求也应该高一些
    • 说说碰到过的棘手的bug?
  2. 测试人员及SDET

  3. 项目经理与产品经理

    • 处理含糊情况(面对含糊情况不会手忙脚乱、不知所措)
    • 以客户为中心(态度层面)-- 站在客户角度来判断问题
    • 以客户为中心(技术层面)
    • 多层次交流能力(怎么向祖母及时TCP/IP的问题)
    • 对技术的热情
    • 团队合作/领导能力(说说自己是怎么处理团队成员没能按进度完成工作的情况。)
  4. 创业公司

    • 最好的申请方式是内部推荐
    • 简历--能够在创业环境中卖力地工作
    • 大公司注重在软件开发上的整体职业素养,创业公司更注重自己的个性契合度、技术技能和此前的工作经验

面试之前

  1. 积累经验

    • 找实习,“微软探索者”、“谷歌编程夏列营”
    • 开拓一些业务或项目,自己的想法,然后主动的做
  2. 人际网

    • meetup.com
    • 主动和人打招呼
    • 助人为乐
  3. 写好简历

    • 有针对性
    • 一张纸
    • 项目经历 2-4个
    • 编程语言 java(非常熟练), C++(熟练), JavaScript(有过使用经验)

行为面试

1. 准备

  • 表格

    |常见问题|项目1|项目2|项目3|项目4| |:-------|:----:|:----:|:----:|:----:| |最难的部分||||| |有什么收获||||| |最有意思的部分||||| |最难解的bug||||| |最享受的过程||||| |与团队成员的冲突|||||

  • 针对问题,回想小故事并将小故事浓缩成几个关键字

  • 项目失败的经历
  • 你需要说服团队成员的事例
  • 你有哪些缺点
    • “有时候我可能对细节不够重视。好的一方面是我反应迅速、执行力强,但不免会粗心大意而犯错。有鉴于此,我总会找其他同事帮忙检查自己的工作,确保不出问题。”
  • 项目中最难处理的问题是什么
  • 应该问面试官的问题
    1. 真实的问题
      • “你每天有多少时间花在写代码上?”
      • “你一周要开几次会?”
      • “整个团队中,测试人员、开发人员和项目经理的比例是多少?他们如何互动的?团队怎么做项目规划?”
    2. 有见地的问题
      • “我注意到你们使用了X技术,请问你们是如何处理Y问题的?”
      • “为什么你们的产品选择使用X协议而不是Y协议,对然有……好处,但存在……问题,很多公司并未采用该协议。”
    3. 富有激情的问题
      • “我对可扩展性很感兴趣。请问你从事过分布式系统方面额工作吗?有哪些机会可以学习这方面的知识?”
      • “我对X技术不是太熟悉,不过听上去是个不错的解决方案。你能给我多讲讲它的工作原理吗”

2. 应对

  1. 力求具体,切记自大(具体的故事)

  2. 省略细枝末节

    • “在研究最常用的用户行为并应用Rabin-Karp算法后,我设计了一种新算法,在90%的情况下搜索操作的时间复杂度由O(n)降至O(logn)”
  3. 回答调理清晰

    • 主题先行(直接先说结果)
    • S.A.R.法(情景、行动、结果)

技术面试

1. 准备

  1. 在纸上写算法代码,在纸上测试代码,将代码原样输入计算(记录犯过的错误),模拟测试(mock interview, careercup.com)

  2. 必须掌握的知识

    • 数据结构:链表、二叉树、单词查找树(trie)、栈、队列、向量/数组列表、散列表等
    • 算法:广度优先搜索、深度优先搜索、二分查找、归并排序、快速排序、树的插入/查找等
    • 概念t:位操作、单例设计模式、工厂设计模式、内存(栈和堆)、递归、大O时间
  3. 记忆幂表

    • 2^10, 1K, 近似一千, 1024
    • 2^20, 1MB, 近似一百万, 1048576
    • 2^30, 1GB, 近似十亿
    • 2^40, 1TB, 近似一万亿(trillion)
    • 一个将每个32位整数映射为布尔值的散列表可以把一台计算机的内存填满(2^32=4GB)
  4. 其他编程语言知识(参考公司的要求)

2. 应对

  1. 提问

    • 以消除题目的疑义
    • 例如就“设计一种列表的排序算法”可连续提问
  2. 设计算法

    • 考虑时间复杂度、空间复杂度
    • 大量数据的情况、算法的限制
    • 是否善用了“特定数据”(面试官指定的)
  3. 先编写伪代码

  4. 编写代码

    • 多用数据结构
    • 有条不紊、参数检测
  5. 测试

    • 先理清代码失效的原因
    • 极端用例(0、负值、空值、最大值、最小值)
    • 用户错误
    • 一般用例

3. 算法题解法

  1. 举例法

    • 求任意时刻时针和分针之间的角度
  2. 模式匹配法

    • 一个有序数组循环移动后,找出其中最小的元素
  3. 简化推广法

    • 从一本杂志里剪下一些单词可以拼凑成一封勒索信,如何判断该勒索信是否由某本杂志里的单词组成
  4. 简单构造法

    • 递归,打印某个字符串所有可能的排列组合
  5. 数据结构头男风暴

    • 随机生成一些数字,并保存到一个数组中,如何跟踪数组中的中位数

4. 好代码的建议

编写一个函数检查某个二进制数(以字符串形式传入)是否等于以字符串表示的十六进制数

  1. 多用数据结构(如多项式的加减)
  2. 适当重用代码
  3. 模块化
  4. 灵活、健壮(面试官要求编写代码检查谁是三连棋的赢家,但可以假定其实NxN的棋盘)
  5. 错误检查

面试结果

  1. 录用

    • 可申请延长回复期限(若还在苦等其他公司的回音)
    • 拒绝录用,可以阐明自己做当下最佳选择的原因
  2. 被拒

    • 询问什么时候可以再申请
    • 再申请时或下次面试时,需要注意哪些事项
  3. 薪酬

    • 签约奖金、搬家费及其他一次性津贴(总和除以预期服务的年限)
    • 各地生活成本差异(估算)
    • 年终奖(打听平均数)
    • 股票期权与补助金(收入除以预期服务年限)
  4. 谈判

    • 给出具体的“要价”,具体的金额
    • 开出比预期稍高的价码
    • 不要只盯着薪水(这往往不好改),可要求更多的期权或签约奖金
    • 使用合适的方式谈判,如电话
    • 先了解公司的等级制度,一定的级别对应一定的薪资范围
  5. 职业发展

    • 该公司能否增加履历的份量?
    • 是否提供了切实可行的转岗通道?
  6. 幸福指数

    • 产品:什么样的产品?和哪些人共事?
    • 经理和队友
    • 企业文化(如何做决策到整体氛围以及公司的组织架构,问问未来的同时如何描述)
    • 工作时常,每周会有多少,一天能用来写代码的时

入职准备

  1. 指定时间表,不要“温水煮青蛙”
  2. 打造人际网络
  3. 向经理寻求帮助,开诚布公的告诉主管自己的心迹