[分享] 大环境下瑟瑟发抖辞职的第二天,拿了两个 offer
Base:广州
公司:100+人做社交APP的互联网公司
应聘职位:Golang & PHP 后端开发
本人背景:6年PHP开发 & 2年Go开发
心得:
本来想找PHP的,误打误撞发现广州的Golang和PHP混合用的公司还蛮多,恰好约面试的都是Golang,挺纳闷的难道PHP真的萎靡了?不过有时候写Go结构体真的不习惯,这一点PHP的高级面向对象特性太香了。
面试过程:
1.看你简历里也有用过Go,Go和PHP在运行的时候有什么区别和优势?
答:PHP每个请求进来时都会创建fpm-worker进程,从而导致系统并发高时CPU会产生频繁创建进程的开销,而Go不会。
2.你刚刚说到PHP那既然是多进程,那怎么共享数据?
答:PHP既然是多进程,进程资源的地址和PCB空间都是独立的,没办法共享数据吧。
3.那我如果要在Go里实现共享数据,有什么方式?
答:我在项目里使用过协程,可以用channel
4.那channel的本质和底层是什么?
答:这个知识点有点模糊,我想想,如果没记错,我记得就是linux的管道吧
5.那linux的管道有什么特性?
答:管道的特性应该是只能等一边写完,另一边才能读,不知道我回答的对不对?
6.对你说得没错,那你觉得管道是用什么实现的?
答:不好意思,这题我不会
7.其实管道就是文件,那对文件操作就是加锁
答:对对对,我想起来了,其实这里涉及到资源的抢占,那系统对资源的抢占肯定就是加锁实现。
8.既然刚刚你也提到协程,可以描述下Go的协程原理吗?
答:Go的协程是基于CSP并发模型的GPM调度机制,M可以理解为处理机CPU,P就是Go底层用来管理Goroutine协程的。
9.(这个时候面试官拿了一张白纸过来)写一个二分查找的算法看看吧,用PHP或Go都可以
答:好,那我用PHP写吧(PS:这里我用的是递归法,要注意二分查找的临界问题)
10.嗯,算法没问题,问一点网络的吧,socket用过吗?
答:websocket用过,在做直播聊天室的时候会用到长连接
11.那你觉得websocket是基于什么协议?
答:是基于TCP协议的
12.TCP客户端和服务端是怎么建立连接通信的?
答:(ps:一开始答错了,我说是ack吧,面试官纠正是syn)然后我恍然大悟接着说,第一步是客户端发送syn,第二步是服务器应答syn+ack,第三步是客户端回复ack
13.那TCP握手是几次,断开是几次?
答:握手是三次,断开是四次(ps:有些面试官会问为什么断开要四次,这里涉及到半连接等待关闭,幸好没问)
14.假设我们现在要做一对一视频聊天,每日DAU可能达到几十万以上,后端怎么实现一对一匹配的算法?还有,怎么实现快速的匹配服务器不会有压力问题?
答:我想一下。用户登录的时候,如果未开始匹配,可以把用户放到redis里的set集合里,通过SRANDMEMBER命令随机抽取人出来就好了 ,至于redis的value最大可以保持512m数据,也就是理论上我们承载可以达到上千万上亿用户都不是问题,至于要保持redis的高可用,可以用rdb或aof做数据持久化,另外,redis也有哨兵模式,主redis挂了也可以选举抽取空闲的redis服务器顶上
15.mysql主从的时候有没有遇到过主从延迟同步的情况?是怎么解决的?
答:emmmmm,这个情况我还没遇到过。
16.你也知道我们是做社交APP的,如果我们要做一些兴趣推荐的内容或者人,你会怎样实现?
答:可以用ElasticSearch,我以前的项目有配合ik中文分词使用,缺点是比较吃机器内存。
总结:
面试完和面试官聊了聊,得知面试官是从YY出来的
从整个面试流程来看,面试官太会引导问题了,从应用层面一点点问出底层细节,也加予了适当的提示,这一点很值得学习
另外一个offer是医院体系下医疗行业,因为冲击较大未来盈利可能有困难,规模是20人,就不考虑接offer了,不过还是分享一下面试的内容
1、redis在项目里用过哪些数据类型?
2、怎么解决redis在并发下商品超卖的问题?
3、Golang长连接的时候是怎样做心跳机制的?
4、说一下你是怎么理解微服务的?
5、mq用过吗?在什么场景使用的?
完~
高认可度评论:
不装了,我摊牌了,这些面试题我一个都不会
明显第一个面试官更好,起码会点出你的错误,然后引导你一下,我面试的都是嗯嗯嗯嗯...
写的不错,总结就是大牛们都喜欢问一些基础的知识点
老哥,我也想转学go,没有工作中的应用环境怎么学啊,我跟着 gin 敲 demo 感觉很难受
一个真敢问,一个真敢答,php通过共享内存、信号量,消息队列就可以资源共享,再说channel它只是像一个管道,channel在底层是一个hchan结构体
面试都记得这么清楚哈,感谢分享
羡慕大佬,我也想去个GO和PHP混合用的公司,没勇气辞职,菜鸡一个 :sob:
摩拜大佬,作为技术渣渣的我每次看你们的帖子都是沉重的打击
感谢分享。 感觉靠谱的公司面试都是问的这些比较底层的知识点。
不装了,我摊牌了,这些面试题我一个都不会
不装了,我摊牌了,这些面试题我一个都不会
面得不难呀,膨胀了膨胀了
面试不难, 可惜我一道题都不会~
:+1: :+1: :+1:
其实现在php 不会go的都是假的php
我感觉我落后了,三年了,这些面试题我不会 :joy:
@Luckyhhy 我也是后面才学的,前几年我也不会😄
@ykennyy 向大佬看齐,学习 :+1:
我感觉我现在还是个菜鸟了
我還是重新學習吧...... 這些我都不會
经历也不差不多。 7 年 PHP 开发 & 1 年 Go 开发。 在郑州,现在在职,现在的工作是PHP,想转go。就抽了个空去面试下。 发了offer。工资1w+。但是还没考虑好去不去~ :joy: :joy: :joy:
不装了,我摊牌了,这些面试题我一个都不会
能把面试问答记得这么清楚,也是很厉害了,学习了楼主~
你好,兄弟,介意我把你分享的面试题,细化,然后写成2020版php与golang面试集合吗?
不装了,我摊牌了,这些面试题我一个都不会
我之前去面试也被问到 mq用过吗 我是这么回答的 用框架自带的队列
让我想起了mysql用mgr主从延时出bug的那个晚上
两个 offer 的薪资多少啊?
感谢分享。请问楼主贵庚?
第二题:你刚刚说到 PHP 那既然是多进程,那怎么共享数据?这属于操作系统的概念,最近在看操作系统的东西,操作系统有各种方法共享进程数据,网上搜下一大堆,当然最好还是找本操作系统的书看下。
再仔细看了下,基本上没有考语言本身的东西。
不装了,我摊牌了,这些面试题我一个都不会
原来我一个都不会 :joy: 老哥,我要向你学习。
第一题的回答不对吧,PHP-FPM 没有频繁创建进程,进程是可以复用的,而是某个进程在遇到 IO 阻塞时进程处于空闲状态,不能很好地利用 CPU ,导致吞吐量上不去。
参考 rango.swoole.com/archives/508
举手,我一个都不会
其他的不看了
主从不一致的问题 我在58沈剑的博客上看过 他给出的解决方法是 如果某个KEY 要被更新 记录在cache 里面 并设置超时时间
问这些面试题,薪资没有20K+就别考虑了
不装了,我摊牌了,这些面试题我一个都不会
主从延迟的话可以考虑在请求不频繁的时候停掉主库的写操作,等待主从同步; 也可以加机器,一般从库的机器配置较低,这也是导致主从延迟的原因; 另外从日常开发中,尽量避免长事务和很大的删除操作,都会让从库执行binlog时阻塞后边的binlog同步
你是不是录音了,怎么记得这么清楚。。
这些问题都是看啥书才能会啊,我一个半道出家敲代码的,完全看不懂这些啊
想知道老哥这些offer多少k
这些面试题都挺有针对性的,谢谢楼主分享了
Golang 和 PHP 混合用 是因为什么。。
看你简历里也有用过 Go,Go 和 PHP 在运行的时候有什么区别和优势?
答:PHP 每个请求进来时都会创建 fpm-worker 进程,从而导致系统并发高时 CPU 会产生频繁创建进程的开销,而 Go 不会。