# 新冠假期 - 实习/面试经历分享(1)

距离上次写《四次面试经历足以…》,已经过去了差不多一百天,
还记得写上次那篇博客的时候,是在去桂林的火车上,不知不觉间,一百天转瞬即逝,我欣赏了故乡甜美的桃花,领略了白洋淀大堤的盎然春意,看过了岭南的溶洞和山水,也尝试着用简单的文字和镜头,学习记录生活的点点滴滴。

撰写此篇文章,想记录一下属于2020年春天独有的假日,自己实习和面试的真实状况,也希望能为读者提供一些面试的知识点,以及自己在此过程的心得。


实习前

  • 1月15日
    旅游结束回到家,心情还算不错
  • 过年后
    准备小公司实习。当时唯一一份简历是某小公司的测试岗,利用假期,结合自己设计的项目,完成过一段时间的postman+newman、jmeter。自动化测试脚本的编写,测试逻辑的设计,以及对于自己设计的在线平台压力测试。
    提前与公司取得联系,希望提前能了解一些公司的业务。
  • 接到通知,延期开学
  • 尝试开发自己的项目,并和所在GoOnline团队一起线上协同开发。
  • 开启新一轮实习面试——Golang服务端开发
    我计算机基础知识并不牢固,数据结构掌握的也并不扎实,算法更是软肋。唯一能拿的出手的也就是一些实际开发的项目了,所以总结了经验:如果想在面试中时刻保持控制权,一定要明确自己的优势在哪里,不要让面试官拖着走,而应该尽可能往自己熟悉的地方靠拢。如果你算法非常扎实,就可以在简历里明确写出自己的长处,如果你数据结构、C底层理论掌握很好,看过源码并作出过分析,完全可以将这些着重写在简历里面,吸引面试官的眼球。
    而我专业技能上没什么优势…也没参加过算法竞赛,只能用项目经历来充数。但项目经历是非常好聊的,而且聊起来会很有意思。项目经历中涵盖一些算法、高级数据结构、甚至一些底层实现逻辑,连起来会显得非常有知识的广度。

第一波实习面试

- 图森科技(北京)

假期的第一次面试是图森科技,面试的岗位应该是Golang运维。年前HR就约我面试,最终因为疫情原因拖到了年后。
当时对于运维没有丝毫的概念。
先介绍项目,之后面试官表示对项目没有兴趣。开始问我关于操作系统的知识。
简单的我还能答上来。稍微涉及情景的我就晕菜了…
其中有一道题目,面试官手敲了一段golang代码、印象中大致伪代码如下:

count := system.MaxProcessTime();//拿到最多能开启的线程数
for i := 0; i < count; i++{
	go func(){}()//开启足够多的的携程,当时这里是耗时函数
}

go sample();//再开启某携程
//而这一携程并没有被打印,或者说是没有被运行。

大概的意思就是开启了占据足够系统空间的携程,再开启会不会被运行。答案是不会运行。然后过了一段时间,携程被释放了,还能否开启新的携程。
大概的意思是这样,因为过去太久远了,细节忘记了。大概是考操作系统的知识。
进而又在耗时函数里面加上print函数…
我开始懵逼了…不知道面试官是什么意思。
之后根据这里聊到线程进程携程的关系、进而聊到祭祖课程学到的段页式管理、内存分配机制、golang垃圾回收机制。
之后出了个算法题:两个字符串最长公共子序列,用DP做。
第二天收到了感谢信,虽然题不难但我回答错了好多。

- 北京某投资公司

当时投递这家公司纯冲着远程实习和高薪水去的,感觉工作强度应该不小,趁机历练一下。方向是后台开发,python/golang,相对来说比较对口。

  • 第一次面试,电话面,时间大概一小时。聊我的GoOnline项目。其中有几个印象比较深刻的题目,而且这个题目在我之后的面试过程中频频出现。
  1. 关于如何保证多线程读写的问题
    当时我还不知道乐观锁机制,因为项目中有关于用户缓存的设计,被问到如何在开启多线程操作数据,保证对于缓存数据的修改不冲突。
    当时想到的是加标记的方式,类似于加锁,每次请求写内存开一个随机字符串用于记录最后一次请求的标识,之后进行比对。
    面试官说这样如果出现两个相同的标记怎么办。
    我说可以用时间戳,利用时间戳的递增性,每次线程修改数据后需要保留时间戳,再次修改如果时间戳新于当前时间戳则抛出异常。其实就是类似于乐观锁机制。
  2. 关于如何保证缓存和磁盘数据的一致性
    我说可以将写缓存和写磁盘作为原子操作,加锁保证一致性
    也想到了增加标记,增加时间戳
    结合祭祖的知识,想到了增加脏位,将读写异步地进行。
    后来了解了一些关于innodb引擎的骚操作,比如二次写之类的。
  3. 关于channel高级使用的问题。
    首先问我在什么场景用到channel,我说实时通讯、后台向前端发起通知、事件监听等
    问我channel什么时候会阻塞:读写受阻并且缓冲区已满的情况相爱
    在应用场景下,如果channe缓冲区有数据,但chennel挂掉了(我不懂为啥会挂掉),应该如何把数据取出来:我认为channel内部是一个缓冲区双向链表,可以通过offset来取出来对应的数据。
    后面的面试,有问到关于channel底层实现的内容。我发现golang常考的点大都集中在这里,往往每次面试必考。关于线程携程、阻塞、切换、通信。而channel又是go语言很有代表性的数据结构,弄清楚底层链表、缓冲、go程挂载的机制十分重要。
  4. 问了关于容器安全的问题:我当时没有回答上来
    因为项目中涉及用户容器,所以限制用户容器的操作在生产环境上尤为重要。
    后来这个问题也被腾讯面试官询问过,我还是没答出来。但面试官引导我可以往信息安全方面思考。我回答了jwt认证机制(token生命周期)、sql注入在golang开发过程中如何避免(预编译)、以及xss跨站脚本攻击等。
    这些似乎和容器安全没什么直接关系,但面试时候不会就往相关领域靠着说,会减少不会的影响。
  5. 问我写过python么。
    我尴尬地说写过:那段时间正有兴趣读论文,正好用python结合作者源码复现了一篇论文的结论,索性就说写过python。
    他问我用过什么框架,我说不好意思只用python算过数,没做过开发,但我说觉得应该差不多吧,反正都是那些东西… (面试官:‘哦’
  6. 问我对kafka队列了解程度如何,我简单讲了一下机理,被评价为:“不是很了解”

之后第一次面试就结束了,总体上没出什么大问题,但不会的地方也挺多的。
我没想到会有

  • 第二次面试
    第二次面试是笔试(开发考试),给我一天的时间,登到公司远程某容器内部,要求我开发一款账单处理系统。
    这可能是我至今为止参加过最爽的笔试了。那是真的开心。
    给我规定好的数据源和数据结构,让我从数据源收集订单数据,之后进行简单的业务逻辑。
    一整天时间,够我好好折腾了。而且还要求了关于用户相似度评判的处理接口,恰巧当时在阅读协同过滤相关的论文,还使用了一些简单的策略。
    写了大概一下午的时间,提交后很快就接收到了通过的消息。
  • 第三次面试:一面的技术大哥和团队项目经理一起面的
    大概是询问我在项目中扮演的角色,之前的开发流程。
    最后聊到了希望从实习中获得什么,希望对哪个领域进一步了解。
    我问了一个问题,在实习过程中,会不会有很多很难的东西需要我现学,项目经历说会的。

第二周,收到了通过面试的信息。正式开始远程实习直到今天。
虽然面试过程全程都围绕着golang展开,但实习至今有两个多月了,我在公司一行golang代码都没写…公司后台几乎全是用python写的T_T
不得已只能慢慢熟悉python框架,用的最多的还是轻量级的flask,了解python微服务的架构。发现和golang后台源码就像两个亲兄弟,只不过大哥python比小弟golang丑了好多(嘿嘿)
实习过程中接触到的东西:

  • kafka队列、订阅分发等操作
  • 数据库优化
  • python的函数修饰器缓存真的神奇
  • python的各种开源库
  • 以及很多运维知识:gitlabci、自动化对账、promethus系统、graphna前端、
  • k8s各种实战骚操作:后来面试时候拿去小米腾讯发现根本不值一提…
  • 以及好用的容器调试工具okteto

想学python 服务端开发可以跟着实习期带我的技术大佬:http://live.bilibili.com/9037650
然鹅我是个不愿意写python的菜鸡,从一开始就不愿意写(现在也不愿意,我爱golang)

- 虎牙

虎牙就比较凄惨了,年前投的golang运维简历,年后又不长心投了C++后台开发
C++开发问题都挺要命的,那种看着很简单自己就是忘记了的感觉特别酸爽。
面试时候是C++部门约的面试,我还傻傻地问为啥是C++还是golang…

  • 一面就挂了两个部门(真实)
    一开始谈项目,吹各种技能还好。到面试官问我我就傻了。
    他问我有没有了解过C++的map,我说了解过redis的map、golang的map、把散列表以及扩容的机制讲给他听。
    他不满意,问我了解过C++的没有,我说没有。
    他又问我,了解过STL没有。我说有,写算法很爱用list、vector。
    他问我vector的底层实现是什么…
    我说我知道golang里面slice的底层实现,需要cap、lenth、以及指针。他说他问的是C++,我傻了。
    我说原理都差不多(hhh)他没理我。
    后来,荣幸地收到了C++后台开发和golang运维两份感谢信…
- 腾讯

上学期海投之后,上课挂掉了腾讯的电话,之后被捞起来了。
约面试,超级紧张。因为之前面大厂只面过字节跳动,而且被挂的剧惨(至今有心理阴影)。第一次面腾讯手都是抖的。

  • 第一次被捞:初试
    前前后后经历了3次腾讯的捞尸和8次腾讯的面试,最终荣幸拿到了offer,感觉我对于腾讯面试流程已经烂熟于心了。那么我就将每一次面试抽象起来
    对于初试来说,应该带着充分的自信去面试。因为初试的题目真的不难,面试官很和蔼。初试就是为了了解你适不适合这个部门,或者是对于某一个方面是否了解的深入,所以问题的广度有所体现,但问题并不深入,所以大可放心。
    上来必然先自我介绍
    我喜欢先大致介绍下自己的情况,之后一个一个介绍我参加过的项目。
    介绍项目的过程中,愿意听下去的面试官会回应你,或者默默地边听边记录。不愿意听下去的会直接打断你。大多数面试官会听下去。介绍的过程中,他会问你关于某个知识点的问题。
    比如我用到了redis,他会考察我redis的应用场景、redis的读写一致性、redis数据结构的的底层实现、redis的多主机同步机制(到现在也不会)、redis的持久化等问题。
    比如用到了websocket,他会从websocket长链接、问到channel、问到go程…
    在这个过程中,回答完一个问题如果面试官没有继续问下去,你大可不必停下来,自己把自己和这个技能有关的东西统统讲出来。
    对于golang语言,我发现了一个非常有趣的技能链表,一旦进入网内完全可以带着面试官穿梭自如。
    这个网有很多的起点,而起点就在你的项目中:比如websocket、比如go程、比如微服务通信。
    大致引导流程如下(思路就是从操作系统聊到计算机网络,再从计算机网络聊到数据库优化):
    操作系统知识 -> 线程进程go程(线程之间的通信、信号量、锁等内容)-> 多线程引发的问题:死锁、悲观乐观锁、并行并发 -> 线程池/携程池 -> 实际应用场景ws、信号量 ->ws引入http协议 -> 七层网络模型就开始介绍 -> TCP/UDP协议 -> 拥塞控制、应用场景 -> 如何在项目中高效传递数据 ->如何高效并发存储 -> 如何优化存储模块 -> 缓存机制 -> 数据分层、索引等数据库优化机制 -> 联系工程中应用场景 -> 各种引擎的优缺点…
    还总结了一条链表是golang后端专属由浅入深的:
    ip/http -> TCP/UDP -> RPC -> ORM -> redis -> rabbitmq -> kafka -> k8s -> 容器编排与安全 -> 微服务架构/分布式开发(最后问的我一脸懵逼)
    总之找到自己的思路,能把自己用到的技术栈串联起来,在技术栈中穿插自己接触过的应用场景,带着面试官在自己的后花园探险

  • 就算不这么讲,腾讯初试的面试官也会带着你把后花园走一遍,但自主性就没那么强了。
    除了这些开发技能、面试官还会问:信息安全、网络拆包装包优化、简单数据结构、简单算法的问题。对于我一个算法水平非常差的人…也可以把初试的算法写出来。大概也就是实现一个集合、实现一个映射、写一写快速排序、归并排序等等简单算法。

  • 最后往往面试官会问你一些非技术问题,比如以后期望的城市、自己平时如何学习、平时的业余爱好。往往到这个时候就可以松一口气了,一般不通过面试好像不会问这些问题…

第二波实习面试(小米、阿里、腾讯)

…下次再写吧今天太晚了

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值