最近略读了一遍盖尔拉克曼麦克道尔《程序员面试金典》(Cracking the coding interview 6th edition by Gayle Laakmann McDowell),感觉对程序员的面试和职业生涯挺有启发作用的。本篇博客就想简单记录自己的想法和文中要点。
哪里可以下载或者阅读
英文原版:
https://github.com/Avinash987/Coding/blob/master/Cracking-the-Coding-Interview-6th-Edition-189-Programming-Questions-and-Solutions.pdf
中文版:微信读书APP可免费阅读!!!
为什么这本书值得一读或者反复阅读
总的来说,我认为有三方面原因
- 内容方面,书本对程序员求职面较为全面的系统的阐述和整理。这其实是比较难得的一点,尤其在这个碎片化的时代。作者从谷歌资深面试官的经验出发,介绍了面试流程、面试官幕后的考虑及可能提出的问题,硅谷几个大公司面试的特点,行为和技术面试的准备,算法面试189道编程题目及解决方案等。从面试的原因,面试的题目一直到面试的准备,层层递进,颇具逻辑性。
- 个人职业方面,个人觉得对日常的工作也是挺有指导意义的,认真地讲,工作的每一天其实都是在接触书中某一方面。分析的问题,代码能力和沟通技巧是工作和求职共通的点。日常即面试!
- 算法方面,面试算法题不需要一步到位,重要地是思路和表达!书中给出了一套可行地步骤来拆解面试算法题地回答方法,这样面试者可以按照步骤练习和准备。日常工作编程其实也是这个逻辑!
要点
面试流程
- 大声说出来,解释你的解题思路
- 候选人地衡量标准
分析问题的能力
代码能力
技术知识和计算机基础
经验方面,好的技术决策,挑战及相关的技术
文化的匹配度:沟通能力,个性与公司的匹配度 - 公司的角度
人才被拒是正常的事情
解决问题的能力很有价值
基本数据结构和算法是必备的 - 面试的重点:算法,编程,设计问题
一些大公司的面试特点
非国内公司,暂时跳过
面试的特殊情况
- 对于有经验的开发者,架构设计项目经验容易被问到
- 测试人员,需要准备核心测试的一些问题,也要练习写代码,也要练习代码测试的基本技能。
- 测试人员转开发的建议,转型不容易,需要保持代码和算法技能,并在两年内转为开发
- 经理,需要处理模糊能力,保持客户为中心的态度,需要具备多层次沟通的能力。
如何为盲人设计一个告警钟?
向你的奶奶解释什么是TCP/IP协议
技术热情,为什么你会对微软感兴趣?
团队协作及领导力
当团队成员未及时地完成他们工作的时候,怎么处理? - 开发领导
领导力
优先级:问正确的问题,要达到的目标
沟通
完成事情的能力 - 面试者
问中等或者较难的问题
找具有多个层次的问题,问题可以有一系列的知识点,要点及优化点
问难的问题,而不是难的知识
避免数学概率底层细节性的问题
正面反馈 有趣? 很好? 的确是这样的?
较深的行为面试的问题
指导候选人: 概念性的分析代码,暴力法解决以及优化提示
给予面试者时间思考问题
问题类型: 基本,较好的问题解决的能力,专家(Java 机器学习),代理(核心知识)
面试前的准备
- 获得合适的经验
参加大型项目课程
实习
开展个人项目
转变成编程的工作
使用晚上或者周末的时间搞点有意思的项目 - 撰写简历:包括2~4个重要的项目
- 1年准备
关注meaty项目
阅读本书
学习并掌握big0
做模拟面试
练习面试问题
申请公司
行为面试题
- 项目总结表:挑战 失误 享受的点 领导力 冲突 反思
- 你的弱点
- 你对我们公司有哪些问题要问?
- 熟悉你自己的项目
特定的
限制细节
专注自己而不是团队的贡献
结构化回答:Situation--Action--Result - 团队沟通
出发点领导力 解决问题的动机
共情 了解对方的感受和处境
同情 感受别人的情绪
谦虚
团队协作 帮助别人 - 自我简介
现在的角色
大学经历
现在的角色
工作以外
总结
兴趣 技术方面的 - 问问题
天才问题:感受在公司工作的每一天
测试,开发,项目经理的人员比例?
正常的沟通方式是什么样的?
最近的项目计划是如何规划的?
是什么因素吸引你加入贵公司的?
什么对于你们是最具挑战性的?
深入问题
使用某个技术,你是如何处理某个问题的?
为什么选择这个协议而不是另外一个协议?
热心的问题
我对系统的可伸缩性感兴趣,贵公司会提供什么样的机会?
我不怎么熟悉技术X,听起来是一个有趣的解决方案,可以稍微介绍一点不?
Big O
- 类比
硬盘文件传输
文件的大小
传输方法:邮件?飞机?开车? - 时间复杂度
数字传输 O(s)
飞机传输 O(1)
O(log N)
O(NlogN)
O(N)
O(N^x)
O(2^N) - 空间复杂度
ToDo
算法面试
-
如何准备技术问题?
尝试自己解决问题,考虑空间和时间的复杂度
在纸上写下代码
测试代码,覆盖一般用例,基本用例,异常用例等
写下电脑可编译运行的代码,注意你犯的一些编程错误 -
尽可能多的做这样的模拟面试
-
你需要知道的: 核心的数据结构和算法及概念
数据结构 | 算法 | 概念 |
---|---|---|
Linked List | Breadth-First Search | Bit manipulation |
Tree, Tries, Graphs | Depth First Search | Memory (Stack Vs Heap) |
Stack & Queues | Binary Search | Recursion |
Heaps | Merge Sort | Dynamic Programming |
Vectors/ArrayLists | Quick Sort | Big 0 time & space |
Hash Tables |
- 对上述表格里面的主题,确保能够理解,知道如何实现,如何运用,及时间空间的复杂度
练习实现数据结构和算法 在纸上或者电脑上
散列表是特别重要的主题,确保熟悉这个结构 - 扩展性和内存的数据
2^N | 值 | 大概值 | 内存 |
---|---|---|---|
7 | 128 | ||
8 | 256 | ||
10 | 1024 | 一千 | 1KB |
16 | 65536 | 64KB | |
20 | 1048576 | 一百万 | 1MB |
30 | 1073741824 | 10亿 | 1GS |
32 | 4294967296 | 4GB | |
40 | 1099511627776 | 1兆 | 1T |
- 问题解决流程图
听 特殊信息& 全部信息
画图 一个例子
暴力解决 没关系 时间空间复杂度如何
优化 BUD
过一遍 理解算法 白板展示很慢 知道变量及其变化
实现:模块化代码 错误检查 使用类或者结构体 变量命名
测试: 概念测试 奇怪的代码 重要的点 小规模的测试用例 特殊用例 - 测试中重要的点
递归中的基本用例
整数除
二叉树中的空节点
遍历的起点和终点 - BUD
瓶颈 没必要的步骤 重复的步骤 - 如何处理错误的回答
- 当你面试到遇到的问题时候,告诉他们我知道这个问题
- 面试的代码语言: 相关,可读,冗余
- 好的代码 正确 高效 简单 可读 易于维护
大方的使用数据结构
复用代码
模块化
灵活 健壮
错误检查 - Never give up!!! 不要放弃!
录用通知及其他注意事项
- 处理被拒的情况
- 评估offer