一、概述
7月20号决定从杭州辞职到北京找工作,在这一段时间里,我大概面试了20家左右的公司,其中有线下面试也有线上的视频面试。
有百度,新浪微博之类的公司,也有好未来,作业帮这样的公司,以及一些不太出名的公司。最后也拿到了两个offer,也还有一些等待复试的。这次想总结一下面试的简单问题,以及自己的未来学习规划。
二、面试的问题
1.数据结构
数据结构这块,可能由于我是web开发,基本上问的不会特别深,也就限制在基本排序和查找,或者链表的基本操作。时间复杂度,空间复杂度,各种排序的应用场景。链表反转,链表是否有环,只有一个公司让写二叉树的反转。所以,我的总结是数据结构不必花大量时间在刷题上,只有对常用常见的熟悉就好,应该把更多时间和精力放在其他部分。
2.操作系统
基本上现在都是使用Linux系统。会问一些Linux你常用的命令,还有日志查找。由于现在的网站,并发都是很大的概念。所以都会问一些进程和线程的概念。还有多路复用,select,poll,epoll区别。还有nginx apche的常用配置。进程和进程之间怎么通讯。再难一点会问到死锁的概念。也不需要花大量时间在这上面准备。
3.网络
网络基本上会问你知道哪些协议。TCP和UDP区别,TCP为什么是可靠的,三次握手四次握手是解决什么问题。TCP和UDP分别用在哪些地方。这个不会问太深。但是由于web开发基本上玩的就是HTTP,所以对HTTP要求会比较高一点。比如HTTP概念,为什么无状态,怎么解决。HTTP常见错误码。HTTP长连接是解决什么问题? 会一直连接吗?什么时候会断开之类的。还有HTTP header头如何获取。然后就是HTTPS,HTTPS一整套流程是什么?采用了什么加密算法,就需要把HTTPS一整套流程搞透。也不会要求理解太深。
4.mysql
数据库是很重要的,基本上会要求对常用命令的熟练应用。还要对一条SQL运行机制比较详细的了解。然后最少要了解mysql存储引擎,对innodb有较好的理解。了解事务是什么?解决什么问题?各个隔离级别不同SQL执行的结果。还有mysql索引的底层数据结构,索引到底是怎么执行的?普通索引是怎么使用主索引的。可以花较大时间在数据库上。
5.redis
redis基本上在web开发并发场景下,是第一选择的中间件。需要理解redis解决了什么问题,为什么使用redis。redis五种基本数据结构的应用场景以及底层C的具体实现。以及找一个比较恰当的例子说一下自己使用redis解决的某一个问题。比如用redis实现分布式锁之类的。也可以了解过期删除策略,AOF和RDB持久化。redis哨兵机制,redis主从复制产生的问题,如何配置解决。
个人觉得应该在redis放较大功夫。
6.PHP (其他语言可以参考)
这个熟练使用肯定是基本要求。还有就是PHP的基本数据类型的底层实现,包括数组的具体实现,要深入了解。还有PHP内存的管理。还有就是nginx 和 fpm的通信机制,fpm的设置,fastcgi的优势。PHP的瓶颈,可以采用什么方式来解决,比如采用swoole或者换go来处理之类的。建议也不需要花大量时间在这上面。
三、面试官想要什么样的人,或者说公司想要什么样的人(个人理解)
1.小型公司
对于创业公司,我觉得需要的是一个能够对一整套web开发流程很熟悉的人,不需要了解原理,但是要能够快速开发一整套。包括从购买服务器开始,到域名备案,https证书配置,对产品需求的深入理解,然后数据库设计,代码开发等。
2.中型公司
我觉得这些公司需要一个程序员能够对某一个领域,比如刚才说的6块的其中之一有深入的理解以及解决过项目中实际很难处理的问题,能够遇到某方面问题时短时间找出问题并能够解决。
3.大型公司或者巨头
这些公司,我面试基本都失败了,个人理解,如果想去这些公司,需要基础扎实,比如计算机操作系统,计算机网络,数据结构,编译原理这些大学的课程都掌握的比较好。然后在加上上面说的6个方面的 其中多个方面比较精通,比较有可能进入一家大的公司。
四、如何去学习
1.从平时的代码开始
在平时写代码实现业务需求的时候,要以更严格的方式要求自己,尽量追求代码效率,而不只是代码效率。也可以对常用的一些功能进行自己的封装。比如写一些小的代码生成器,正则匹配类库等。
2.看书
我觉得能够出版书,应该要比网上的博客更值得信赖,比较权威。例如redis可以看下《redis设计与实现》,Linux可以看鸟哥的私房菜等。结合书籍加上自己的思考,然后对自己比较深入理解的部分进行博客的书写。
3.写博客
写博客建议不要看了一两页书或者看了一篇博客就去写,而应该在真的对某一个部分内容特别理解了,再去写博客,这样也方便自己后期学习,也不会误导他人。
4.多和领导和同学朋友进行交流
三人行,必有我师。不要觉得只有 C语言之父或者某些业内顶级人员才是自己值得交流,值得学习的对象。其实最值得学习的可能是身边的人。如果你能够学习到领导的东西,学习到身边人大家的长处,自己也会更上一层楼。
5.做实验
大部分我们对一个东西的理解不深刻,都是因为在工作中没有碰到那样的问题,或者碰到了也只是google一下,直接改掉,而没有深入思考。应该在以后遇到问题时进行深入思考,为什么会这样。如果有些东西真的工作不太能接触到,应该通过模式的方式去进行,例如各种分布式等。
五、总结
这篇博客主要是写给自己的,如果有人恰巧看到了,也希望我们一起能够进步。何凯文说人和人的差距就是以注意力的长短而拉开的。的确是这样,我们很难认真的做一件事情,看电影也要看弹幕,看书看半小时就想喝杯水吃点水果。我们应该让自己的注意力更长,在看书的时候,认真看书,在恋爱的时候,认真恋爱,在工作的时候,认真工作。未来,我们一起加油。