程序员如何准备技术面试
转载于:程序员如何准备技术面试
准备阶段
设定限期
面试准备不能无休止地进行下去,因为计算机知识永远都学习不完。可以给自己设立一个时间点,在时间点之后就开始投简历进行面试。例如你可以设立一个月的面试准备时间,然后再根据求职的岗位以及自己的实际情况去分配时间,把时间主要分给面试主要考察的地方。
技术准备
基础知识主要包括:编程语言基础,第三方工具基础(框架,中间件等),算法与数据结构,计算机网络,操作系统,数据库。我在程序员面试推荐书籍这篇文章中列出了面试常见的问题以及对应的解答书籍供大家参考,这里我列举一些面试常见的问题:
1. 编程语言基础
- 数据结构的实现细节以及比较:数组,链表,哈希表是如何实现的,底层内存分配是怎样的?插入与查找的时间复杂度是多少,分别有什么优缺点。
- 编程语言特性: Java 的字符串池是怎么实现的,垃圾回收的流程以及原理。
- 关键字特性:包括 Java 中的 static,final,Python 中的** init** 关键字的含义以及使用场景。面向对象的细节:类的封装,函数与变量继承,抽象类和接口有什么区别等。
- 多线程与多进程:线程如何同步,进程如何同步,wait() 函数使用场景以及常用的并发编程模式。
2. 第三方工具
- 整体架构:这个工具整体的架构是怎样的?主要由哪几个部分组成,它们之间是如何通信以及合作的。
- 实现原理:核心功能是如何实现的?对比另外一款工具做了哪些优化以及改进。
3. 算法基础
- 算法题:链表操作,二分查找,动态规划,DFS,BFS 等(可以使用 Leetcode 来进行学习)。
- 算法复杂度的分析:时间复杂度,空间复杂度,平均时间复杂度。
- 数据结构的实现:实现二叉查找树,Trie 树。
这里说一点题外话,可能有的同学有疑问,觉得这些平常工作都用不到,为什么还要花那么多时间在上面。其实不是的,第一,平常工作都能用到,无论从二分查找到复杂一点的前缀树。开发的过程中如果你知道这些算法/数据结构,就能根据自己的业务来选择最适合的算法/数据结构,减少整个项目的复杂度。 第二,数据结构和算法锻炼的是思维,就像 NBA 球员除了训练投篮和战术之外,还需要训练敏捷度,体力,耐力等其他方面。刷算法题的时候,可以从优秀的前辈中学习到一些有趣的,巧妙的方法。它们能扩展你的编程时思考的范围。即使你不准备换工作,我也建议每天都刷一道算法题,日积月累,一年下来你的算法基础一定能比同龄人高出不少。而且当你真正理解算法题的知识之后,写程序 debug 和花在 Stackoverflow 的时间就会大大减少,往往知道哪里可能有问题并且能大幅地增加工作效率。
4. 计算机网络
- 协议的基础组成与用途:HTTP 协议中不同头部,方法,状态码的含义。
- 协议的使用场景:DNS 协议,ARP 协议,SSH 命令的使用场景以及原理。
- 不同协议的区别:TCP 与 UDP 的区别,HTTP 与 HTTPS 的区别。
- 协议具体功能实现:TCP 三次握手原理,TCP 慢启动以及滑动窗口的原理与实现方式。
5. 操作系统
- 操作系统基础概念:进程,线程,虚拟内存,文件权限,信号量等概念考察。
- Shell 的基础使用:ls, find, top, ps 等命令的应用与原理。
- 常见功能的实现:进程调度,用户态与内核态的切换,系统调用的实现方式,select, epoll 的实现以及区别。
- 常用函数的实现:memcpy,strcpy,strstr 等常用库函数的实现方式与优化。
6. 数据库
- 基本概念:事务,存储引擎,隔离级别,索引等概念考察。
- 数据库基准测试与性能分析:基准测试的策略,性能剖析工具的使用和分析。
- 数据库设计与优化:范式和反范式,索引的类型,如何选择合适的索引,如何使用硬件优化。
- 数据库原理及高级特性:数据库分区分表,存储过程的使用,全文索引,主从热备等常用策略的使用与原理。
项目经验
- 公司的项目
简历中提到的项目需要认真回顾一遍,常见的问题包括:1)这个项目遇到了什么技术难点,你是如何解决的?2)这个项目你学习到了哪些技术知识点?即使你在项目做的只是一些看起来非常基础的工作,例如数据库的增删改查。你也可以通过在复习的时候深挖原理以及要点来展现能力,例如写入数据的时候如何防止丢失,如何保持最终一致性,要扩展的话如何分库分表?会增删改查的虽然多,但是懂得上面问题答案的求职者却很少,有了这些过硬的基础知识,面试官可能也会对你刮目相看。由于每个人对于每个系统的理解都不一样,涉及的业务以及遇到的问题也各不相同,所以面试中引导面试官向自己熟悉的技术点提问也非常重要了,具体的简历写法可以参考程序员如何写一份更好的简历。
2. 参与的开源项目或自己写的项目
如果有参与过一些著名的开源项目那么当然是很好,曾经阅读过它的源码,知道一些核心功能的实现原理也是加分项。自己的项目最主要是突显技术能力,能够说出自己遇到的一些问题是如何通过分析来解决以及优化的话,能够极大地提高印象分。