程序猿面试

找新工作的念头是在今年6月开始萌发的,其实当时已经开始投简历了,结果因为种种原因(主要是忙?)拖到这会儿才真正开始面试。投简历的平台是boss直聘,简历用的jobDeer的模板,用md写好,生成pdf和doc格式,挂在自己的网站下,方便下载和浏览。

现状

从上周开始疯狂投简历,目前收到了ABCDE公司的面试邀请,并且已经拿到了2个OFFER。目前还在等2家公司的面试,但愿到时候能正常发挥吧!

感悟

企业面试主要是考察面试者的能力,编码能力固然重要,但是也请不要忽略沟通交流能力的重要性,即获取信息和表达信息的能力,类似代码里的get()echo()一样,能够准确的获取对方想要表达的重点(key),并且能够用最简单的言语或者图形表达出自己string,自然是极好的!

当然,扎实的编码能力也是不能丢下的,大到能够规划一个网站的架构,小到用js写一段ajax请求,都需要自己一点一点的学习和积累。这里老高给做技术的同学们一个建议,最好有自己的独立博客,不论是用gayhub,还是自己买服务器,最差也要在CSDN开一个账户,写一写自己的开发中遇到的问题以及解决方案,或者自己对一些东西的研究,日积月累下来肯定会自己有很大的提升,不论是表达能力还是编码能力,同时你的文章也可能帮助到大家,这种一箭双雕的事情真的可以搞一搞!

最后,从反面出发,要意识到自己的不足,从而针对自己的不足进行强化。

面试题

由于老高记性不太好,所以赶紧把自己能够回想起来的面试题复盘一下,给PHPer后来面试的时候有一个参考!简单的回答我会写,复杂的慢慢补。一时间答不上来赶紧自己Google之。

ps. 基本的PHP用法一定要掌握!从INI配置到PHP面向对象的用法,不能说完全掌握,最起码见到一个概念能够说出来个123。

pps.Linux的技能水平也不能落下,连LAMP都没玩过,谁给你的勇气去面试?

下面试题不分先后顺序,老高想到哪儿写到哪儿!

  • composer都解决了什么问题?
依赖
  • tcp长连接如何保活?
重试
心跳
  • php如何接受二进制数据?
php://input

$GLOBALS['HTTP_RAW_POST_DATA']

  • 分布式系统如何追踪请求?
Google Dapper
  • 微服务之间如何保证数据一致性?
可靠事件
对账
TCC(Try-Confirm-Cancel)
  • PHP如何实时生成Excel并下载?
# 大数据量最好使用id去分段,并且设置合理的导出超时时间
$fp = fopen('php://output', 'a');
fputs($fp, 'strings');
....
fclose($fp)
  • 分表的策略?
垂直和水平
取模
hash(crc32)
一致性hash
  • php提高文件发送性能?
x-sendfile
  • nginx和apache的不同?nginx高性能体现在哪儿?
点有很多
apache每个事件消费者独占一个进程资源,nginx只是被事件分发者进程短期调用而已。
  • nginx如何解决惊群?
同一时间只有一个work进程监听请求,使用锁实现
  • CAP原则?
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。
  • PG 和 Mysql的对比?

PostgreSQL 与 MySQL 相比,优势何在?

很多,SQL标准的支持,更多的字段,jsonb(json的各种骚操作,建索引,Nosql),性能抖动低,商业友好。

不好分区,有真空操作影响性能,没有MySQL流行 
  • PHP的劣势?
对比Golang,非静态语言,需要编译(JIT有一定的缓解),包的概念推出较晚。
  • PHP垃圾回收机制?
初期采用引用计数法,5.3后引入根缓存区,主要解决了循环引用,让内存溢出保持在一个范围内。
  • 如何解决ajax跨域?
jsonp
服务器响应头Access-Control-Allow-Origin
iframe
  • PHP如何获取客户端IP?
从`$_SERVER`中获取,REMOTE_ADDR和HTTP_X_FORWARDED_FOR,需要区分有没有使用代理
  • redis排行榜怎么使用?
# sorted set,步骤
# 添加分数
ZADD key score1 member1 [score2 member2]
# 查询排名
zrevrank key user3
# 获取所有
zrevrange key 0 -1 withscores
  • nginx负载均衡怎么做?
添加upstream
用语法proxy-pass指向这个upstream
nginx的负载均衡有4种模式:

1)、轮询(默认) 
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 
2)、weight 
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 
2)、ip_hash 
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 
3)、fair(第三方) 
按后端服务器的响应时间来分配请求,响应时间短的优先分配。 
4)、url_hash(第三方)
  • MySQL优化步骤?
- 优化字段类型,优化sql,索引和慢查询(针对存储引擎优化)
- 适当的做一些冗余(可选)
- 加入缓存,减轻DB压力
- 加入读写分离,用中间件或者在代码层处理
- 预估数据增量和读写比,准备合适的分表策略
- 垂直业务拆分
- 水平分表
  • 解决脏读、不可重复读、幻读的办法?
主要考察事务的隔离级别,
READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE READ
SERIALIZABLE
并发性能递减
  • 悲观锁,乐观锁?
悲观锁也就是排它锁,for update,注意表锁和行锁。
乐观锁加入了版本管理的概念,
update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
  • 简单的抽奖?
我的思路是把预先奖品放到redis的队列中。
  • redis的分布式锁?
参考很有名的Redlock,分为单点和集群。思路还是比较简单的,就是要注意有些操作需要原子操作(考虑的真多啊,比如有死机,gc等情况)。
  • 未完待续

老高给你出的题(加分题)

  • SSO 和 Oauth 都是什么?有什么不同?
  • RESTFUL 常用的请求方法,如何处理版本?常用的状态码?302和301的区别?
  • 你是通过什么途径获取新的知识的?
  • 用过视频转码的工具吗?
  • 你做过爬虫吗?简单的描述一款爬虫框架?
  • 你的职业规划是什么?

后记

从这次面试下来,老高的感触确实很多,首先就是觉得自己的技能还有很高的提升空间,至于如何弥补和大佬们的差距呢?老高觉得要从下面几点入手:

  • 阅读经典,读的书不在多,在于精,读完能消化才能算真正的读书,以往老高读书的目的性太强,哪里不会读哪里,哪里有意思读哪里,虽然也看了不少技术书籍,其实真正能消化的不多。之后老高会在博客中记录读书笔记,欢迎阅读!
  • 要有大局观,提升自己的抽象能力。这种能力书本里是学不到的,需要自己培养和积累。举个例子,知乎上有一个问题,问为啥核武器为什么能形成威慑力,答主用宿舍间的裸照做类比,生动形象的表达出了核武器国家之间的矛与盾,真的是很佩服!
  • 阅读大型项目,比如从redis,disque(redis作者重新实现的队列,估计下个版本要合并到redis),beanstalk等简单的项目看起,这些常用的软件看似简单,但是却隐藏了很大的智慧在其中,不学习一遍真的是很遗憾!

最后老高想说的是,真没想到这次面试能够如此多的收获,在此与君共勉!