31

前言

前一篇文章讲述了我在三月份毫无准备就去面试的后果,一开始心态真的爆炸,但是又不服气,一想到每次回来后家人朋友问我面试结果的期待脸,越觉得必须付出的行动来证明自己了。

面经传送门:一个1年工作经验的PHP程序员是如何被面试官虐的?

下面是我花费两个星期做的准备,主要分三部分:

  • 有计划——计划好每天要复习的知识模块(内容较多)
  • 高效率——从整体到细节,着重把知识点“手写”到自己的电脑记录本
  • 优简历——展示你的项目亮点,难点
下面的文章和网站链接我都会注明出处,如果有问题请联系我,我会及时修改或撤销

有计划

反思:为什么好多知识看过后不能记住,面试一紧张更加想不起?一方面自己没有深入学习,另一方面复习过程杂乱,和写代码一个道理,如果你的业务逻辑和其他乱七八糟的都放在控制器上,代码一多你要调用某个方法可能就会让你抓狂,所以一般采取controller和server分层,同理,我们最好提前做好计划,分种类,分层次来学习。

复习前如果很迷茫,可以网上Google一下面试知识点,看到的无非都是操作系统,计算机网络,数据结构,mysql,设计模式,Linux,Redis,再者根据你所学语言方面的知识和简历,例如我求职PHP,简历上有写Larvel框架,那就再加PHP基础,框架Laravel,服务器nginx。

第一天:操作系统

如果你是科班出身,那应该对操作系统不陌生,至少在高校里面是学过这门课程的。但估计很多人像我一样,后悔没去好好学这门课,或者工作上用不上就抛弃它了(PHP更是如此),我要说的是操作系统很重要,就以我面试了几家公司来说,基本如果你答出操作系统相关知识点基本都是加分的。

  1. 进程和线程的概念,以及两者的区别
  2. 什么是上下文切换
  3. 多进程和多线程各自的优势(可以Google一下有关php-fpm和nginx进程)
  4. 进程通信方式
  5. 进程基本状态
  6. 抢占式调度和非抢占式调度
  7. 进程线程同步,死锁
  8. 理解协程

附加帮助我整理这些知识的网站和博客文章:

小土刀的面试刷题笔记——操作系统

并发技术·笔试面试知识整理

这里推荐有精力的朋友可以看下《Linux高性能服务器编程》,粗略看下8,9,10,13,14章,以及《深入理解计算机系统》的第1章和第12章,我就是结合这两本书,记住并理解简单的知识点,后续我还要花时间去深入阅读。

第二天:计算机网络

计算机网络可以说是大多数程序员需要学习的大课程,特别是PHPer这些web打交道的程序员。当然,计算机网络太底层的东西很枯燥很难懂,我只针对一些比较常见,比较基础的知识面来学习。

  1. 计算机网络体系包括TCP/IP体系结构,五层协议体系结构
  2. TCP,UDP
  3. 三次握手,四次握手(过程要熟悉,能清晰描述)
  4. TCP协议如何保证可靠传输(包括重传,流量控制,拥塞控制,定时器等知识点要了解)

附加帮助我整理这些知识的网站和博客文章:

小土刀的面试刷题笔记——网络

TCP协议·笔试面试知识整理

复习完这些基础的知识后,试着要去了解稍微底层一点的东西,因为很多面试官喜欢由浅入深地问,如果能答出一两点基本都是加分的

推荐一篇很好的文章,仔细读完会有很大的收获:

TCP 的那些事儿(上)

第三天:数据结构

很多人在大学里面都学过这门课程,也是很多程序员的启蒙课程,自然很重要,(大学唯一一次挂科就是它了。。。)

从事PHP工作的朋友应该都用不上它,所以这也是一个很容易被忽视的基础知识点,自然有很多大公司面试的时候很注重这方面的基础,特别是应届毕业生。我复习这方面的知识是重新翻开我大学的课本,把其中比较重要的东西手写几遍。

我不久前面试过一家要我手写链表,结果早就忘了,没写出来
  1. 队列,循环队列,栈,单链表等,要理解,最好多手写几遍
  2. 树和图,着重复习二叉树方面的知识,例如前中后遍历;B树,B+树,红黑树最好要了解一下
  3. 排序算法,冒泡排序必须很熟悉,其他几种常见的算法:简单选择排序,直接插入排序,快速排序也要知道
冒泡排序可以了解下如何优化改进,有些面试官会问,如果答不出他会提示你怎么做,考察你的思考能力

关于数据结构的参考资料基本Google一下就有很多(顺便说下,21世纪程序员还是少用某度),大学的课程书是最好的,一般大学的数据结构都是面向学生的,还是很基础,很好理解的。

第四天:数据库mysql

说实话,我觉得绝大多数程序员都是在CURD,学那么多东西很大方面也是为了辅助最后的curd。所以数据库知识的重要性毋庸置疑,后面我打算买本《高性能MySQL》来提升自己这方面的能力。

  1. 基础的增删改查操作
  2. 存储引擎MyISAM和InnoDB
  3. 理解索引数据结构,即B+树方面的知识 参考:InnoDB索引实现·MySQL索引背后的数据结构及算法原理·看云
  4. mysql语句优化,着重索引优化,explain查看索引情况 参考:Mysql索引优化
  5. 事务四大特性
  6. 隔离级别
  7. 脏读,不可重复读,幻读
  8. 了解共享锁,排他锁,死锁
  9. 了解主从复制原理,分库分表

第五天:nginx和PHP-fpm

nginx和php-fpm应该算是PHP程序员接触比较多,但是可能没有去深入了解过,有些面试官喜欢结合nginx,php-fpm和操作系统进程方面的知识来考察。

  1. 日常用到的nginx配置语法,常用的变量
  2. nginx常见的参数优化 参考:Nginx高并发下的优化
  3. nginx负载均衡,访问控制,防盗链,设置静态文件过期时间等
  4. php-fpm工作流程
  5. php-fpm进程管理(静态和动态)

可以Google了解下php-fpm和nginx各自的进程管理模式,参考文章:Nginx内部有使用多线程吗?

面试过程可能会问到网站负载低,访问慢怎么排查,参考:论坛偶尔出现负载低但是访问很慢排查思路

第六天:redis

工作项目不大,用到redis的地方并不多,所以一直也没去学习redis,但是从面试情况看来,被问到redis的概率还是很大的,毕竟这款基于内存的数据库功能强大,市场占用率很高。

  1. 与memcached的区别
  2. 5种基本的数据结构以及各自的使用场景,最好能结合自己项目来描述
  3. 持久化,RDB和AOF 参考: 面试中经常被问到的 Redis 持久化与恢复
  4. 如何与mysql保持数据一致 参考:Redis和mysql数据怎么保持数据一致的?

第七天:Laravel

由于我自己是一直用Laravel框架开发的,简历里面的项目也多处标明Larvel,所以这里就介绍Larvel相关的知识,你对哪个框架熟悉就去做相应的复习,基本Google和手册都有。

  1. Laravel生命周期
  2. 什么是服务容器,服务提供器,Facade门面
  3. 依赖注入
  4. 中间件,异常处理,ORM等手册上的知识

第八天:设计模式

看一个人的代码水平,可以从是否灵活使用设计模式看出来的。写代码也是一门艺术,好的代码低耦合,易扩展,设计模式的理解和使用也决定了你的代码水平。这里推荐一本《大话设计模式》,目前我只看了一点点,对于我这样的菜鸟觉得还不错,后面需抽点时间好好看看。

  1. 六大原则,着重理解,最好能清晰口述
  2. 结合你的项目经验描述几个设计模式。常见的有单例,三大工厂,观察者,策略等
有一次面试官问我简单工厂模式是不是符合六大原则之一开闭原则?我答不出来,随便选了个符合。。。实际简单工厂是不符合开闭原则的,这就涉及到你开闭原则的理解。

第九天:PHP内核基础知识

真正要读懂PHP内核的人应该很少,大多数人都没时间和精力去研究底层,毕竟PHP一直以开发效率高著称,只要底层有人写好给广大程序员用就好了。确实是这样,但是我记得有个面试过我的大佬跟我说,很多东西不要只会用,要多想想为什么可以这样用,PHP语言我觉得也是一样,虽然现在能力有限,但我可以提前把一些比较基础,容易理解的底层知识学习一下,这不也是一种自我提升?面试的时候你也可以拿出来炫一下,说错也没关系,至少你展示出你的好学,你的认知层面。

  1. PHP的生命周期和zend引擎
  2. 变量存储结构
  3. 写时复制和引用

参考文章:

深入理解PHP内核

PHP内核剖析

第十天:根据你的简历内容做复习

面试都是拿着你的简历来问问题的,你的简历内容会直接影响面试内容的走向,所以简历写完还要做响应的复习。

我的简历有涉及rabbitMQ,elasticsearch等知识,我就对其进行简单的复习。

另外很重要的一点:提前想好怎么描述你做过的项目,其中遇到什么问题,怎么解决,尽量把你好的一面展示出来,这些都可以提前写下了的,好记性不如烂笔头,下面第二部分会说到。

高效率

复习的内容实在是太多了,单单写上一部分内容都快把我的键盘打烂,手写断了。虽然有了十全的计划,但如何高效率去记住上面那么多东西是一个大问题,看看我是怎么做的。

  • 例如第一天复习操作系统的知识,我是早上Google了一下有关操作系统的面试知识点,然后打开几个标签页,选取内容比较齐全的。所谓“好记性不如烂笔头”,没有烂笔头,只有烂键盘,所以我选择把这些知识点一一整理到自己的电脑上,自己平时有写博客,用markdown比较多(推荐Typora),所以每天就用一个md文件把知识整理下来,基本都是手打的,很少复制黏贴。这样做,一方面让自己印象深刻,另一方面锻炼自己摘取核心内容,描述能力,这也是我能写下这么多内容的原因。
  • 每天晚上计划好明天的复习内容,可以选择睡前回顾今天学习的知识,也可以在第二天早上回顾一遍
  • 最好选择一个安静的地方,能让你认真学习的环境,我由于提交了离职申请需要一个月才能走,交接项目也很快,所以每天都在公司有计划的复习(远离手机)

总之,真想要离职,找一份好工作,必须对自己狠一点,找到心仪的工作再好好去放松几天。其实有不少人一直在埋怨大环境不好,确实是,但有何用,想为自己菜,自己不努力找一个借口?王小波说的好:人的一切痛苦,本质上都是对自己无能的愤怒。当然运气也很重要,保持乐观,别轻易放弃。

优简历

简历不用多说,就是很重要,怎么写?其实我也是参考一篇文章的:我本以为你们会写简历

概括一下:

  1. 基本的,用PDF格式,个人信息写完整,别写精通
  2. 技能亮点,围绕 熟悉 , 有所 , 掌握 , 了解 , 有一定心得

    不要这样:

    熟悉PHP , 熟悉YiiLavarel框架 ( 复制粘贴 , CURD , 就是干! )
    熟悉Linux使用 , 可以搭建XXXX环境 ( 会敲cd , ls命令 , 会apt install nginx )
    熟悉git或svn版本管理的使用 ( 会git push , 会git pull )
    熟悉MySQL以及对数据库的优化 ( 会select update 和 delete , 会添加索引 )
    熟悉Redis或Memcache的使用 ( 会set key , 会get key )

    最好这样:

    PHP : 熟悉PHP语法 , 熟悉PHP面向对象 , 可以根据业务逻辑结合合适的设计模式 . 熟悉PHP SPL标准库 , 对PHP的一些高级用法有所心得体验 , 诸如pcntl多进程模块 , socket模块 . 对SWOOLE所有涉猎 , 有一些自己的积累和经验 . 对于底层 , ZendVM如何如何 。
    Redis : 熟悉Redis常用数据结构的使用 , 可结合业务场景选择合适的数据结构 . 熟悉Redis集群 , 对集群实现方案原理有一定掌握 , 对于市面常用的集中集群方案的优缺点比较了解 . 对于底层 , 对Redis SET等底层数据结构的实现有所掌握。
  3. 一定要写项目亮点和难点

    大多数人都是这么写的 : 负责用户登录注册模块 , 后台管理 , 多角色权限控制 , 负责广告业务模块的管理和筛查(太普通,太泛了)
  • 亮点 . 你觉得这个项目中哪一部分值得自豪或学到新东西了 . 比如项目中用到ECDH , 使用了MySQL中间件等等。
  • 难点 . 你觉得这个项目哪一部分当时难了你几天 , 然后你通过自己努力解决了以及解决方案是什么。

总结

面试并不简单,不要太轻敌,做好准备,打好基础是关键。毫无准备就去投简历面试大多是浪费时间,甚至浪费进入好公司的机会。还是那句话程序员应该脚踏实地,不要眼高手低,用实际行动证明自己。

我是即将入职广州一家游戏公司PHP开发岗位的程序员,2018年毕业,毕业到现在确实收获了不少,也让我看清自己,需要恶补的知识还有很多很多。欢迎大家关注我的个人博客https://zgxxx.github.io/,比较简陋,还是希望能和万千大神交流技术问题,一起成长。


自行脑补
1k 声望57 粉丝