前言
本文为个人看过的书(剑指 offer)、社区面经等摘要总结,将持续更新。
注意事项
- 如果在面试的时候没有听清楚或者听懂面试官的问题,千万不要不懂装懂、答非所问。
- 当不确定面试官的问题的时候,一定要大胆地向面试官多提问,直到弄清楚面试官的意图为止。
面试前的准备
在去公司参加现场面试之前,应做好以下几点准备:
- 在网上查找该公司的面试资料,逐条记下来。
- 注意面试邀请函里的面试时间、地点,导航查询出行路线(截图保存在相册里) 并估算出行时间。(重点:不要迟到!!!)
- 准备好得体的衣服。
- 准备几个面试通用的问题
面试环节
- 行为面试
- 技术面试
- 应聘者提问
行为面试环节
自我介绍:用30秒到1分钟的时间介绍自己的主要学习、工作经历即可。
项目经验
描述项目的 STAR 模型
- Situation:简短的项目背景。比如项目的规模,开发的软件的功能,目标用户等。
- Task:自己完成的任务。在用词上要注意区分 “参与” 和 “负责”。
- Action:为完成任务做了哪些工作,是怎么做的。 基于什么工具在哪个平台下应用了哪些技术。
- Result:自己的贡献。最好能用数据展示。如果是参与功能开发,则可以说按时完成了多少功能;如果是做优化,则可以说性能提高的百分比是多少;如果是维护,则可以说修改了多少个bug。
示例:Winforms 是微软.NET中的一个成熟的 UI 平台(Situation)。本人的工作是在添加少量新功能之外主要负责维护已有的功能(Task)。新的功能主要是让 Winforms 的控件风格和 Vista、Windows 7 的风格保持一致。在维护方面,对于较难的问题,我用 WinDbg 等工具进行调试(Action)。在过去两年中,我共修改了超过 200 个 bug(Result)。
其他相关的常问的问题:
- 你在该项目中碰到的最大问题是什么,怎么解决的?
- 从这个项目中你学到了什么?
- 什么时候会和其他团队成员(包括开发人员、测试人员、设计人员、项目经理等)有什么样的冲突,你们是怎么解决冲突的?
掌握的技能
描述技能掌握程度要注意 “了解”、“熟悉”、“精通”。
- 了解:指对某项技术看过书或是查阅过资料,但没做过实际的项目。通常不建议在简历中列出,除非这项技术应聘的职位的确需要。
- 熟悉:在实际项目中使用某项技术较长时间,通过查阅相关的文档可以独立解决大部分问题。
- 精通:深入底层原理,可对其hack以满足某些特殊需求。
离职原因
通用答案:现在的工作做了一段时间,已经没有太多激情了,因此希望寻找一份更有挑战的工作。
技术面试环节
应聘者需具备的素质:
- 扎实的基础知识 (扎实的基本功是成为优秀程序员的前提条件。)通常基本功在编程面试环节体现在
3个方面:编程语言、数据结构和算法。 - 高质量的代码 (除了完成基本功能,还会关注应聘者是否考虑了边界条件、特殊输入及错误处理。)
- 清晰的思路(遇到难题 3 种办法分析、解决复杂问题:画图 使抽象问题形象化、举例 使抽象问题具体化、分解 使负责问题简单化。)
- 优化效率的能力(时间效率和空间效率两方面进行优化。)
- 优秀的综合能力(除了展示自己的编程能力和技术功底 ,还需要展示自己的软技能,如沟通能力和学习能力。)
考察应聘者的学习能力方法:
- 询问应聘者最近在看什么书、从中学到了哪些新技术。
- 抛出一个新概念,观察应聘者能不能在较短的时间内理解这个新概念并解决相关的问题。比如要求应聘者计算第 1500 个丑数。
应聘者提问
- 技术团队的规模(前端,后端各多少人)
- 目前在使用什么技术栈
- 负责什么工作