距离上次写《四次面试经历足以…》,已经过去了差不多一百天, 撰写此篇文章,想记录一下属于2020年春天独有的假日,自己实习和面试的真实状况,也希望能为读者提供一些面试的知识点,以及自己在此过程的心得。 假期的第一次面试是图森科技,面试的岗位应该是Golang运维。年前HR就约我面试,最终因为疫情原因拖到了年后。 大概的意思就是开启了占据足够系统空间的携程,再开启会不会被运行。答案是不会运行。然后过了一段时间,携程被释放了,还能否开启新的携程。 当时投递这家公司纯冲着远程实习和高薪水去的,感觉工作强度应该不小,趁机历练一下。方向是后台开发,python/golang,相对来说比较对口。 之后第一次面试就结束了,总体上没出什么大问题,但不会的地方也挺多的。 第二周,收到了通过面试的信息。正式开始远程实习直到今天。 想学python 服务端开发可以跟着实习期带我的技术大佬:https://live.bilibili.com/9037650 虎牙就比较凄惨了,年前投的golang运维简历,年后又不长心投了C++后台开发 上学期海投之后,上课挂掉了腾讯的电话,之后被捞起来了。 第一次被捞:初试 就算不这么讲,腾讯初试的面试官也会带着你把后花园走一遍,但自主性就没那么强了。 最后往往面试官会问你一些非技术问题,比如以后期望的城市、自己平时如何学习、平时的业余爱好。往往到这个时候就可以松一口气了,一般不通过面试好像不会问这些问题… …下次再写吧今天太晚了
还记得写上次那篇博客的时候,是在去桂林的火车上,不知不觉间,一百天转瞬即逝,我欣赏了故乡甜美的桃花,领略了白洋淀大堤的盎然春意,看过了岭南的溶洞和山水,也尝试着用简单的文字和镜头,学习记录生活的点点滴滴。
实习前
旅游结束回到家,心情还算不错
准备小公司实习。当时唯一一份简历是某小公司的测试岗,利用假期,结合自己设计的项目,完成过一段时间的postman+newman、jmeter。自动化测试脚本的编写,测试逻辑的设计,以及对于自己设计的在线平台压力测试。
提前与公司取得联系,希望提前能了解一些公司的业务。
我计算机基础知识并不牢固,数据结构掌握的也并不扎实,算法更是软肋。唯一能拿的出手的也就是一些实际开发的项目了,所以总结了经验:如果想在面试中时刻保持控制权,一定要明确自己的优势在哪里,不要让面试官拖着走,而应该尽可能往自己熟悉的地方靠拢。如果你算法非常扎实,就可以在简历里明确写出自己的长处,如果你数据结构、C底层理论掌握很好,看过源码并作出过分析,完全可以将这些着重写在简历里面,吸引面试官的眼球。
而我专业技能上没什么优势…也没参加过算法竞赛,只能用项目经历来充数。但项目经历是非常好聊的,而且聊起来会很有意思。项目经历中涵盖一些算法、高级数据结构、甚至一些底层实现逻辑,连起来会显得非常有知识的广度。
第一波实习面试
– 图森科技(北京)
当时对于运维没有丝毫的概念。
先介绍项目,之后面试官表示对项目没有兴趣。开始问我关于操作系统的知识。
简单的我还能答上来。稍微涉及情景的我就晕菜了…
其中有一道题目,面试官手敲了一段golang代码、印象中大致伪代码如下:count := system.MaxProcessTime();//拿到最多能开启的线程数 for i := 0; i < count; i++{ go func(){}()//开启足够多的的携程,当时这里是耗时函数 } go sample();//再开启某携程 //而这一携程并没有被打印,或者说是没有被运行。
大概的意思是这样,因为过去太久远了,细节忘记了。大概是考操作系统的知识。
进而又在耗时函数里面加上print函数…
我开始懵逼了…不知道面试官是什么意思。
之后根据这里聊到线程进程携程的关系、进而聊到祭祖课程学到的段页式管理、内存分配机制、golang垃圾回收机制。
之后出了个算法题:两个字符串最长公共子序列,用DP做。
第二天收到了感谢信,虽然题不难但我回答错了好多。– 北京某投资公司
当时我还不知道乐观锁机制,因为项目中有关于用户缓存的设计,被问到如何在开启多线程操作数据,保证对于缓存数据的修改不冲突。
当时想到的是加标记的方式,类似于加锁,每次请求写内存开一个随机字符串用于记录最后一次请求的标识,之后进行比对。
面试官说这样如果出现两个相同的标记怎么办。
我说可以用时间戳,利用时间戳的递增性,每次线程修改数据后需要保留时间戳,再次修改如果时间戳新于当前时间戳则抛出异常。其实就是类似于乐观锁机制。
我说可以将写缓存和写磁盘作为原子操作,加锁保证一致性
也想到了增加标记,增加时间戳
结合祭祖的知识,想到了增加脏位,将读写异步地进行。
后来了解了一些关于innodb引擎的骚操作,比如二次写之类的。
首先问我在什么场景用到channel,我说实时通讯、后台向前端发起通知、事件监听等
问我channel什么时候会阻塞:读写受阻并且缓冲区已满的情况相爱
在应用场景下,如果channe缓冲区有数据,但chennel挂掉了(我不懂为啥会挂掉),应该如何把数据取出来:我认为channel内部是一个缓冲区双向链表,可以通过offset来取出来对应的数据。
后面的面试,有问到关于channel底层实现的内容。我发现golang常考的点大都集中在这里,往往每次面试必考。关于线程携程、阻塞、切换、通信。而channel又是go语言很有代表性的数据结构,弄清楚底层链表、缓冲、go程挂载的机制十分重要。
因为项目中涉及用户容器,所以限制用户容器的操作在生产环境上尤为重要。
后来这个问题也被腾讯面试官询问过,我还是没答出来。但面试官引导我可以往信息安全方面思考。我回答了jwt认证机制(token生命周期)、sql注入在golang开发过程中如何避免(预编译)、以及xss跨站脚本攻击等。
这些似乎和容器安全没什么直接关系,但面试时候不会就往相关领域靠着说,会减少不会的影响。
我尴尬地说写过:那段时间正有兴趣读论文,正好用python结合作者源码复现了一篇论文的结论,索性就说写过python。
他问我用过什么框架,我说不好意思只用python算过数,没做过开发,但我说觉得应该差不多吧,反正都是那些东西… (面试官:‘哦’
我没想到会有
第二次面试是笔试(开发考试),给我一天的时间,登到公司远程某容器内部,要求我开发一款账单处理系统。
这可能是我至今为止参加过最爽的笔试了。那是真的开心。
给我规定好的数据源和数据结构,让我从数据源收集订单数据,之后进行简单的业务逻辑。
一整天时间,够我好好折腾了。而且还要求了关于用户相似度评判的处理接口,恰巧当时在阅读协同过滤相关的论文,还使用了一些简单的策略。
写了大概一下午的时间,提交后很快就接收到了通过的消息。
大概是询问我在项目中扮演的角色,之前的开发流程。
最后聊到了希望从实习中获得什么,希望对哪个领域进一步了解。
我问了一个问题,在实习过程中,会不会有很多很难的东西需要我现学,项目经历说会的。
虽然面试过程全程都围绕着golang展开,但实习至今有两个多月了,我在公司一行golang代码都没写…公司后台几乎全是用python写的T_T
不得已只能慢慢熟悉python框架,用的最多的还是轻量级的flask,了解python微服务的架构。发现和golang后台源码就像两个亲兄弟,只不过大哥python比小弟golang丑了好多(嘿嘿)
实习过程中接触到的东西:
然鹅我是个不愿意写python的菜鸡,从一开始就不愿意写(现在也不愿意,我爱golang)– 虎牙
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 -> 容器编排与安全 -> 微服务架构/分布式开发(最后问的我一脸懵逼)
总之找到自己的思路,能把自己用到的技术栈串联起来,在技术栈中穿插自己接触过的应用场景,带着面试官在自己的后花园探险。
除了这些开发技能、面试官还会问:信息安全、网络拆包装包优化、简单数据结构、简单算法的问题。对于我一个算法水平非常差的人…也可以把初试的算法写出来。大概也就是实现一个集合、实现一个映射、写一写快速排序、归并排序等等简单算法。第二波实习面试(小米、阿里、腾讯)
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算