最近几天面了 京东 – 网易 – 58 – 腾讯 四家,大致顺序如下。
岗位京东是C++,网易是测试开发,58是后台,腾讯是PC客户端 – 我真是多才多艺…
京东面试官比较注重SQL吧,恰好这一块我都不熟 – 所以很多问题都答得不好…虽然结果还没出,但是自己也清楚肯定是跪了。
网易的两个技术面试官人都挺好的…一面跟我聊了两句写了个代码就告诉我过了…另一位给我讲怎么做需求,怎么根据需求做测试样例…一个啥测试经验都没有的人…就这样强撑了…X分钟(我也记不得多久了)…然后再次放过。最后感谢HR给我完美解答了阿里月饼很“难”吃…虽然我这个博客用的是阿里云,但是我只能说 – 9.9而已。
58的面试就是正规的项目+代码了…项目提到了两个实习时分别做的东西,一个是MFC,还有一个压力测试工具。
二面也是问项目,Socket问的比较多,记忆比较深刻的问题是:Client和Server在通信的时候服务器断电了,Client会怎么样…事实还是TCP/IP原理没有看过…尴尬。
腾讯刚面完一面 – 逻辑题+基础题…目前是在等二面通知,嗯面完了二面,挂了 – 总觉得面试官不喜欢我的样子,最后答完了感觉是很多没答好的,比如二叉树的非递归遍历,比如IOCP – 完成端口,并没有发挥出自己的水平吧,最后问能不能指出不好的地方,让再补充一下,居然说不让…
接下来分条罗列:(京东直接省略,面试官把当时抄的题目收了,还跟我说不准带走。)
先讲讲58的吧-面的后台,一天面完。
一面在外面等着呢 – 然后听到一个代码题,手贱就开写。3张牌组成21点…
然后进去了-问项目 – MFC的考勤系统服务端,问了一个服务端压力测试工具。
问了为什么在不同的环境下测试结果不一样。
然后就是一个手写代码:找出数组中可以加起来为0的组合,必须是三个数。
数组是无序的,数据范围是int,数据量假设稍大。
解法的话就是,选择两个数,判断另外一个数是多少,有多少个,然后判断重复的情况等等,这里不详细说了。
这就是一面了。
二面先问了查找一个N长的文件内容中有没有某个特定的串,我说内存映射文件+KMP…然后直接说:我知道原理,但是KMP有写好的模板-直接调用的。
然后问我:
有几千万的数据,vector和list插入哪个更快。
我就问数据最少多少,最多多少。然后说其实这两个各有好坏,一定要比较出来吗?
他说是的,那就说:因为是速度,所以我会选Vector,虽然它会多次扩大空间导致数据大量移动耗时,所以我直接初始化一个1E的空间,肯定放得下。他说数据量是未知的。那我就跟着说,那就list,虽然慢一些,但是可以节约空间。他说内存不考虑,我就继续引论:那就肯定Vector啊,反正你说内存不考虑,我开1E的空间不就好了…
总之就这样耗着了,考虑内存,我就List,这样稍慢一些,不考虑我就直接开1E…
他就换了个问题问我:100个数据,我已经插入了58个,问插入第59个的时候,数组快还是链表快。
立马反应过来,是头插还是尾插(总不能在这里被坑了吧)…他说是双向链表,然后我就跟着说:哦,双向链表在STL内的实现是一个环。
然后说,那就是数组快,数组只要一次赋值,链表要申请空间,要起码6次指针移动。
问题继续换:
假设我们现在有一个用户区,华北区,用户1000W,要求显示top前100…实时刷新。
我们限定积分变动每天最多增减200(这个条件我当时没注意)
然后就提到了堆排序,但是实时刷新太慢了,问我怎么解决。然后又提到了Map<key,value>,我当时考虑的是value是一个数组,存放用户ID,key是积分……但是好像没解释清楚。
于是乎又在他的带领下回到了堆排序…我们每天取top100 和 与100名差200分以内的用户来进行堆排序维护…这样量就减少很多了…嗯 – 于是就这样过去了。
然后问到了MFC的多线程用了哪些地方,我说有一个操作很慢,我就用多线程把它改成异步的了。然后问有没有其他的,我就引到了测试工具,提到了工具的思路,提到了多线程。
他就开始问我“比较擅长”的网络问题,问了我recv函数内部是怎么回事,问我如果服务端断电了怎么办。
说的是,拔网线,断电,问客户端会不会关闭这个连接,什么时候关闭。提示是:在客户端看来这个连接是正常的。
说实话这个问题我是不会的,于是引出了TCP首部中的6个标志比特之一RST,表示重置连接、复位连接。嗯,他告诉我,就是这样的,客户端会在一段时间后认为这个连接可能是有问题的,会发送RST标志的包。但是时间可能会比较长。然后跟我说可以去看看TCP/IP详解的三卷。
然后最后的综合能力吧:问我,如果我写的一个模块,运行了几个月没问题,这时候忽然崩了,问我怎么排除BUG,假设这个模块导致了我们Web(比如58首页)的大面积功能失效,问我怎么办。
- 如何排除BUG
- 如何解决用户体验问题
首先解决用户体验的问题,说了很多方法…他似乎也还挺满意。其实我也不太懂,就是把平常自己见到的想到了说了下。
重点在如何排除这个BUG…提到了,如果用到了开源框架 – 可以去求助这个框架的作者。
然后接下来又是这些类似的问题:
- 租房子的问题,A房租贵,环境好周围都是大牛,B房租便宜,但是周围环境一般,都是快退休的人,假设其他因素都不考虑,问我租哪个,我说我选B,因为我平常都是一直在公司的,回来都直接睡了,不需要很好的环境,有张床睡觉就行了。
- 代码BUG问题,这时候准备下班了,但是忽然有人说你这个地方有个小BUG,属于无关痛痒的,不改也不会立马产生问题,但是就是有一个BUG,不知道能不能马上改正,可能要很久(比如调一天),可能几分钟。我就问了一些其他的问题,比如我会不会因为改这个BUG赶不上末班车(他说可能的),然后公司有床没(没有),电脑带回去看行不行(可能连不上公司的网络,无法测试),这个问题现在不解决是不是真的没问题(他说是一点问题都没有,你明天来改都可以的)。于是果断告诉他:回去睡觉!明天再说!他问我为啥,我说,反正今天也不一定能改好,明天来改也一样,既然只要几分钟,明天也一样。而且我晚上要是没有休息好,可能会影响第二天的工作,如果改BUG几分钟,我误了末班车,公司又没有床,这样就会导致一个恶性循环,对我个人状态,对公司的产出都会少很多。当然我知道这个问题是:解决问题,回去睡觉。他也这样提点我了,但是我就是觉得,公司没床,还会误末班车,还可能几分钟搞定剩下的时间就无奈了…不如回去睡觉明天再来。
最后HR问了我一些用3个词形容自己…我表示我做不到,于是再问别人怎么评价我的,然后谈了下个人价值观等等…
网易的:
一面:提到了测试工具,然后写代码 – 就说我过了?代码就是一个数组,求两个加起来等于n。
这里他告诉我要注意判断临界值。比如最小的两个加起来比N还大,最大的两个加起来比N还小。
二面:综合吧,以一个邮箱为例,问:现在邮箱点了登陆,没有反应,怎么排查这个问题。
刚开始没有状态,然后反应过来抓包。
如果有发送出去的包,说明客户端没问题,有返回的包说明服务端没问题。
嗯就是这样。
然后还是以邮件为例,假设我们要给“未读邮件数量”右边加上一个数值显示,然后告诉我,上一个版本没有,这一个版本要添加,然后让我和他交流进行需求评审。讨论出如何解决这个问题。
然后提到了一些…感觉就是他在一点一点教我怎么做…
比如:
- 展示形式 – 比如要加粗
- 点开算作已读 – 还是怎样算已读
- 邮件的副本与邮件的关系
- 刷新后变化还是实时变化 – 涉及到HTTP的长连接和短链接
- 数据量过大怎么显示,比如超过99,就显示99+
- 特殊数据,比如0,是显示还是不显示,我脱口而出:不显示啊,他当即告诉我:这个需求不是你定的,是要和需求方讨论的…然后我一下就笑了…哈哈哈真的是能学到东西的。
然后让我设计测试用例,来对它进行测试。真的是告诉我,怎么分类。
比如:分析有哪些操作会引起数值得变化,比如如何测试数值得刷新,等等…
最后一个问题是:假设我们要测试1W封未读邮件,问我该怎么办。
我说:额,写个JS发一万封,他问我怎么写,我说我不会,靠百度,他就说说JS是模拟用户操作,很慢,要考虑时间问题。而且邮件是有黑名单的,你这样可能发100封就进黑名单了。
于是又提出了各种扯淡方法:比如我给公司所有人都发一封邮件,请他们给XX邮箱发一封邮件…哈哈哈,他问我公司只有100人怎么办,请他们发100封?我就说我写好一个JS,打包发给他们…
他就告诉我,你都请这么多人帮忙了,干嘛不请后台的帮你加1W的数据进去…顿时懵逼!还能这样啊!然后还有可以自动化啊等等…
然后就HR了……
接下来是腾讯…刚收到二面短信了。一面没让带走草稿纸。
一面:
先问了个多线程基础问题,比如原语的作用,什么情况下多线程可以不加锁。
然后Qt界面库,MFC界面库,还有没有接触其他的开源界面库 – 没有。
然后问我了圆角问题…Qt界面九宫图设计
然后问1000个零件,找出一个轻的,最少几次。算错了,别问我怎么错的,加法算不好,数错的。
答案是3^7 = 3 9 27 81 243 729 2177,所以是7次
然后另一个问题是12个零件,一个是坏的,轻重不知,还是天平,问怎么称,得到最少称量次数。
然后问完这个了,就问了个:
虚函数表,虚析构,父类子类构造和析构顺序 – 都是和虚函数有关的。
然后问我,你觉得Windows PC客户端开发有前途吗?咳咳…Win32 -> Wp8 -> UWP很多路啊。
他说现在手机用的多,我说那台式机怎么还没有被淘汰?
然后问STL用的熟不熟,好吧,我实习面试完了啥都没干,就是干翻了STL的容器和迭代器 还有 Windows核心编程部分章节好么…六大组件- 稍微一想就记起来了好么。
问了容器有哪些,我顺便给介绍了一下配接器和迭代器…
然后问map的效率,我说查找是log(n),插入优化到了n*log(n),删除比较麻烦,没有关注。其实也是n*log(n),其实我是怕他问我删除的原理…我连四个旋转都快记不到了- 还怎么讲删除…
然后就告诉我过了… 关于那个12个零件的问题,其实我大二的时候 – 看过。
最后他问我为啥迟到,我说,说实话?嗯,我去面58的HR了,我跟他们说了要提前走的,但是还是让我面完的才准走。然后说,不用担心,腾讯是第一选择。他说,那你怎么不直接过来,我说,我总不能说,我不面了,先走了吧?那也太失礼了…
有匪君子,如切如磋,如琢如磨…
23:43 记于此…择日更新,有错请指正。
9-24 再来更新…这次主要补充一下腾讯二面的细节 – 顺便吐槽。
问题是以下几个:
字节对齐的概念
大端序 和 小端序
Volatile 关键字
二叉树的非递归怎么办 – 自己写一个栈
TCP和UDP的区别
timewait 的作用 – 2个时间片那个
代码编译执行的详细过程
内存 – Win32的空间分区 – 用户可用的空间大小
句柄的概念
磁盘 – 主分区,拓展分区,逻辑分区的概念
创建进程与创建线程的函数
C++的标准 C++11 C++14 C++17 让讲一下新的标准
MFC的文档/视图类
TCP做一个服务端的最简单流程
IOCP – 完成端口…说真的我根本不知道这个名词,如果你当时给我说网络模型的完成端口模型 – 我可以很顺利的告诉你原理和代码流程 – 可惜了,你就告诉我是IO多路复用,我以为是文件的IO多路复用,只能说-文件读写的IO模型,我不懂。
不过它的原理是:执行某个操作,操作完成后调用一个函数。
最后的一个问题是 社交网络的六度分隔理论,即任何两个人可以通过六个人联系到任意一个不认识的陌生人。
提到了怎么实现数据结构 – 怎么获取数据样本,等等。
说实话我真的觉得深搜和广搜都是可以的 – 当然最好的其实是:A* – 因为要找不同的人的寻找方向是不一样的,如果你想找奥巴马 – 却往内地不停找人,而忽略了国外的朋友,很明显是不对的。
所以A*可以通过相关度来做一个权值,反而是这里最好的解,不过,没机会说。哈哈哈哈。
启发式启发式…
最后 – 这次没过对我来说也是一个好事 – 直播是我很不喜欢的一个方向,比游戏尤有甚之…如果我真的入了这个行业,恐怕自己的心里也过不去。
就是这样了 – 希望能给读者带来一些东西吧。
最后的更新:
以上四个面试,58同城后台收到,网易测试开发收到。
目前是打算去网易了…其实我是很喜欢北京的,毕竟对帝都也是有莫名的好感,不过我觉得,可能选择网易能让我走的更远吧。
thx~