《剑指Offer》 学习笔记

1.面试的流程

微软 STAR 简历模型

初级程序员 基本功 数据结构和算法 高级程序员 专业技能和项目经验

了解公司近况 项目情况

准备好合适的问题向面试官提问

放松 不要太紧张

不要急于编码 要先搞清楚要解决的问题 可以和面试官沟通一下 然后做 一个整体的规划和设计 这有 利于提高代码的正确性和高可读性

写完代码之后不要马上提交 最好先做一下 code review 并借助一些测 试用例跑一遍代码 找出可能出现的错误

  • 电话面试

千万不要不懂装懂 答非所问 这是面试的大忌 如果是英语电话面试 听不懂一定要敢于说 Pardon

共享桌面远程面试 良好的代码命名和缩进对齐会让面试官认为应聘者有大型项目的开发经 验 开发后测试表明具备专业的软件开发经验 开发前测试的程序员实在是太 稀缺了

当应聘者发现代码运行不正确的时候 也是面试者关注的重点 应聘者此刻 的反应将暴露其调试功底 如果应聘者能够熟练地设置断点 单步跟踪 查 看内存 分析调用栈 迅速找到问题的根源并最终解决 那么面试官将会认 为应聘者有丰富的开发经验并在面试报告中不会吝啬溢美之词 因为调试 技巧是书上学不到的 只要在大量的项目开发实践中才能积累起来

  • 现场面试

准时 穿着干净得体 补充体力和精神 事先准备好一些问题 现场面试是最关键的 综合考察了应聘者的沟通能力 学习能力 编程能力 等 面试的三个环节

  1. 行为面试
    开始的 5至 10 分钟 会注意性格特点 一般不会提问技术难题 属于暖 场阶段 可用于调整自己的情绪喝状态

自我介绍不要太多 30s~1min 即可 因为面试官从手里的简历中已 经了解了最想知道的大部分 所以简单的介绍下自己的学习 工作 经 历就可以了

简历中的项目经验 应该按照 STAR 模型进行书写(详见 第 6 页) 关键词有:Situation Task Action Result 注意事项有:“参与”和“负责”要诚实回答 因为很容易露馅而失去很 多印象分

自己的贡献可以详细描述 最好附上数据 而项目的背景可以一笔带过

在描述自己的技能时 要特别注意 “了解” “熟悉” 和 “精通”的用 词 (详见第 8 页)“熟悉”是最常使用的 熟悉的意思是 使用该技术 做了一定时间的开发 能按照手册独立解决大部分问题

简历中通常不建议把肤浅了解的技能写上去 除非应聘的职位确实 需要 此外 也切忌轻易用精通描述自己的技能 除非你能回答出来该 领域绝大多数问题 否则将适得其反

回答“为什么跳槽”时 在不流露出负面情绪的前提下 可以大胆如实 回答 因为每个人原因都不可能一样 所以并没有标准答案 但为了成 功拿到 offer 毕竟这才是面试的最终目的 所以要尽量避免如下回 答:老板苛刻 同事不好相处 加班太多 工资太少等把原因归结在非 自身因素上面

对于工资太少 虽然是大部分人的真实原因 但更好的回答是:我只 管努力干活 工资公司看着给 我相信公司肯定不会亏待勤奋的员工

此外 面试的过程不是谈工作的时候 谈工资可以留到谈 offer 阶段 再说

对于跳槽的原因 主要的回答方向应该是积极的 最好同时夸奖了面 试公司 也展示了自己更高的追求 比如说:上一份工作已经干了一 段时间 该职位上已经积累较多的经验 一是不如当初那么有激情 二 是上一份工作的重心在xxx 以我现在的水平如果还想进一步提升还 需要学习 xxx 方面的知识 但那块我不是很擅长 而我对 xxx 也感兴 趣 所以现在想寻找一份更有挑战的工作 这样也能更好地提升自己 的能力

“而众所周知 xxx公司在这一方面有很强的实力 所以我才到xxx来寻 求机会 这是我期望的工作”

  1. 技术面试环节

面试官在此环节普遍会关注以下 5 个方面:

基础知识扎实全面 包括数据结构 算法 和 编程语言
能编写出正确的 完整的 鲁棒的高质量代码
能思路清晰地分析 解决复杂问题

能从时间 空间复杂度两方面去优化算法的效率
具备良好的沟通 学习能力 和发散思维能力

其中解决复杂问题的能力可以体现在画图 举具体例子分析 分解复 杂问题为几个小问题 理清思路再编码等行为上

沟通能力可以体现在遇到不懂的向面试官提问上

学习能力可以体现在将面试官问的前一个问题的解决思路迁移到后 面的提问当中

3.高质量的代码

代码的容错处理能力 对特别的输入如何考虑并处理?

不能容忍对代码只是针对一种假想的“正常值”进行处理 不考虑异常情况 也不考虑资源的回收问题 如何判断两个小数是否相等?(由于精度的原因 因为计算机在表示小数 的时候都会有误差 所以不能使用 == 判断 而是通过比较两者之差的绝对 值是否在一个极小的范围内 若是 则认为它们相等 反之则不等)

最不能容忍功能错误 不考虑边界情况 输入参数的检查 错误与异常处理 命名方式

对于没有工作经验对学生 正确性以外的错误基本上都能容忍 但希望经过 提示后能够尽快处理 而对于有工作经验的人 不难容忍考虑不周全 有明 显的鲁棒性错误

代码的规范性:书写 布局 命名

确保代码完整性的测试用例:功能测试 边界测试 负面测试(非法输 入)

如何存储大数问题?(借助数据结构 比如字符串 数组等)

在软件开发领域 永远不会变的就是需求一直会变 如果代码中尽可能地 把将来的各种需求考虑进去 尽可能减少需求改变时代码的改动 这就是向 面试官展示了自己对程序扩展性和可维护性的理解

处理错误的三种方式:返回值 全局变量和异常(详见 106)

鲁棒性和防御性编程

细节

递归在本质上就是一个栈结构 能通过栈解决的问题往往也能用递归来实现

递归本身也是函数调用 而函数调用是有时间和空间的损耗的 每一次函数 调用都将在内存栈中开辟空间以保存参数 返回地址和临时变量 而且压栈 出栈都需要时间 所以 从这个角度看 递归的性能不如循环

递归能使代码看着更加整洁 但是尤其需要注意当函数调用层级过深时候 栈溢出的问题 因为进程/线程的内存栈容量是有限的 从这个角度上看 显 式地用栈基于循环的代码的鲁棒性比递归要好一些

重复计算是性能杀手 递归的本质是将一个问题分解成多个小问题 如果小 问题之间有重复计算的部分 那么递归的性能就不如循环

本文最后修改时间: 2016-01-28 17:02:44 +0000 (完) CC BY-NC-ND 3.0

若您发现文章中的错误,并愿告知于我,或想与我交流,我的联系方式在: Contacts


上一篇 关于 Linux 的运行级别

All The Best

下一篇 《People Ware》读书笔记