Ray

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近略读了一遍盖尔拉克曼麦克道尔《程序员面试金典》(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可免费阅读!!!

为什么这本书值得一读或者反复阅读

总的来说,我认为有三方面原因

  1. 内容方面,书本对程序员求职面较为全面的系统的阐述和整理。这其实是比较难得的一点,尤其在这个碎片化的时代。作者从谷歌资深面试官的经验出发,介绍了面试流程、面试官幕后的考虑及可能提出的问题,硅谷几个大公司面试的特点,行为和技术面试的准备,算法面试189道编程题目及解决方案等。从面试的原因,面试的题目一直到面试的准备,层层递进,颇具逻辑性。
  2. 个人职业方面,个人觉得对日常的工作也是挺有指导意义的,认真地讲,工作的每一天其实都是在接触书中某一方面。分析的问题,代码能力和沟通技巧是工作和求职共通的点。日常即面试!
  3. 算法方面,面试算法题不需要一步到位,重要地是思路和表达!书中给出了一套可行地步骤来拆解面试算法题地回答方法,这样面试者可以按照步骤练习和准备。日常工作编程其实也是这个逻辑!

要点

面试流程

  1. 大声说出来,解释你的解题思路
  2. 候选人地衡量标准
    分析问题的能力
    代码能力
    技术知识和计算机基础
    经验方面,好的技术决策,挑战及相关的技术
    文化的匹配度:沟通能力,个性与公司的匹配度
  3. 公司的角度
    人才被拒是正常的事情
    解决问题的能力很有价值
    基本数据结构和算法是必备的
  4. 面试的重点:算法,编程,设计问题

一些大公司的面试特点

非国内公司,暂时跳过

面试的特殊情况

  1. 对于有经验的开发者,架构设计项目经验容易被问到
  2. 测试人员,需要准备核心测试的一些问题,也要练习写代码,也要练习代码测试的基本技能。
  3. 测试人员转开发的建议,转型不容易,需要保持代码和算法技能,并在两年内转为开发
  4. 经理,需要处理模糊能力,保持客户为中心的态度,需要具备多层次沟通的能力。
    如何为盲人设计一个告警钟?
    向你的奶奶解释什么是TCP/IP协议
    技术热情,为什么你会对微软感兴趣?
    团队协作及领导力
    当团队成员未及时地完成他们工作的时候,怎么处理?
  5. 开发领导
    领导力
    优先级:问正确的问题,要达到的目标
    沟通
    完成事情的能力
  6. 面试者
    问中等或者较难的问题
    找具有多个层次的问题,问题可以有一系列的知识点,要点及优化点
    问难的问题,而不是难的知识
    避免数学概率底层细节性的问题
    正面反馈 有趣? 很好? 的确是这样的?
    较深的行为面试的问题
    指导候选人: 概念性的分析代码,暴力法解决以及优化提示
    给予面试者时间思考问题
    问题类型: 基本,较好的问题解决的能力,专家(Java 机器学习),代理(核心知识)

面试前的准备

  1. 获得合适的经验
    参加大型项目课程
    实习
    开展个人项目
    转变成编程的工作
    使用晚上或者周末的时间搞点有意思的项目
  2. 撰写简历:包括2~4个重要的项目
  3. 1年准备
    关注meaty项目
    阅读本书
    学习并掌握big0
    做模拟面试
    练习面试问题
    申请公司

行为面试题

  1. 项目总结表:挑战 失误 享受的点 领导力 冲突 反思
  2. 你的弱点
  3. 你对我们公司有哪些问题要问?
  4. 熟悉你自己的项目
    特定的
    限制细节
    专注自己而不是团队的贡献
    结构化回答:Situation--Action--Result
  5. 团队沟通
    出发点领导力 解决问题的动机
    共情 了解对方的感受和处境
    同情 感受别人的情绪
    谦虚
    团队协作 帮助别人
  6. 自我简介
    现在的角色
    大学经历
    现在的角色
    工作以外
    总结
    兴趣 技术方面的
  7. 问问题
    天才问题:感受在公司工作的每一天
    测试,开发,项目经理的人员比例?
    正常的沟通方式是什么样的?
    最近的项目计划是如何规划的?
    是什么因素吸引你加入贵公司的?
    什么对于你们是最具挑战性的?
    深入问题
    使用某个技术,你是如何处理某个问题的?
    为什么选择这个协议而不是另外一个协议?
    热心的问题
    我对系统的可伸缩性感兴趣,贵公司会提供什么样的机会?
    我不怎么熟悉技术X,听起来是一个有趣的解决方案,可以稍微介绍一点不?

Big O

  1. 类比
    硬盘文件传输
    文件的大小
    传输方法:邮件?飞机?开车?
  2. 时间复杂度
    数字传输 O(s)
    飞机传输 O(1)
    O(log N)
    O(NlogN)
    O(N)
    O(N^x)
    O(2^N)
  3. 空间复杂度
    ToDo

算法面试

  1. 如何准备技术问题?
    尝试自己解决问题,考虑空间和时间的复杂度
    在纸上写下代码
    测试代码,覆盖一般用例,基本用例,异常用例等
    写下电脑可编译运行的代码,注意你犯的一些编程错误

  2. 尽可能多的做这样的模拟面试

  3. 你需要知道的: 核心的数据结构和算法及概念

数据结构 算法 概念
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
  1. 对上述表格里面的主题,确保能够理解,知道如何实现,如何运用,及时间空间的复杂度
    练习实现数据结构和算法 在纸上或者电脑上
    散列表是特别重要的主题,确保熟悉这个结构
  2. 扩展性和内存的数据
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
  1. 问题解决流程图
    听 特殊信息& 全部信息
    画图 一个例子
    暴力解决 没关系 时间空间复杂度如何
    优化 BUD
    过一遍 理解算法 白板展示很慢 知道变量及其变化
    实现:模块化代码 错误检查 使用类或者结构体 变量命名
    测试: 概念测试 奇怪的代码 重要的点 小规模的测试用例 特殊用例
  2. 测试中重要的点
    递归中的基本用例
    整数除
    二叉树中的空节点
    遍历的起点和终点
  3. BUD
    瓶颈 没必要的步骤 重复的步骤
  4. 如何处理错误的回答
  5. 当你面试到遇到的问题时候,告诉他们我知道这个问题
  6. 面试的代码语言: 相关,可读,冗余
  7. 好的代码 正确 高效 简单 可读 易于维护
    大方的使用数据结构
    复用代码
    模块化
    灵活 健壮
    错误检查
  8. Never give up!!! 不要放弃!

录用通知及其他注意事项

  1. 处理被拒的情况
  2. 评估offer
posted on 2023-03-24 12:32  RayChenCode  阅读(379)  评论(0编辑  收藏  举报