9月底,找工作接近尾声,笔者主要经历了2015年南京站百度、阿里、腾讯、美团、趋势科技、大众点评、华为的笔试、面试,其中拿到百度、美团、趋势科技、华为的软件研发offer。
找工作是幸苦的,笔者曾一天来回跑面百度、大众点评、趋势科技三家公司。一天面试4面是常见的,一大早出门,有时候连午饭都顾不上吃,回到学校就5点了,吃过晚饭,一天就过了。中间有很多打击和不确定因素,大家一定要经受住。
这一路走来,充满艰辛,值得回忆!每一次笔试和面试都是一次成长,每一次笔试、面试都能发现不足、学到东西。艰辛和打击是有的,但从未放弃,找工作就是要静得下心、沉得住气、经得住打击!每一次跌倒都要勇敢地爬起,既然选择了,就要永不倒下!感谢实验室和宿舍一起奋斗找工作的小伙伴们,还有上届的师兄、师姐,现在的导师,有了这一平台、基础和氛围才能静心学习、放手去博。感谢所有面试过我的面试官们,不仅是面试更是学习、请教和成长!一遍总结写了近3天,但还是坚持把它写下来了,当是给自己讲故事把,哈哈。于己于人,若有一点点帮助,足矣!
定位:软件研发(软件研发成长空间大,知识深度要求稍高),软件测试(成长空间相对较小,要求知识面广、深度要求稍低)
战略规划:基础+项目+实习+编程=nice offer
后来修正为:基础+项目(实习)+编程+技巧=nice offer(10字)
图1 战略规划
后来在一个群里看到别人分享了宝贝,在此分享一张360的面试评估表哈,互联网的要求应该相似的,大家可以参照着复习。
图2 面试评估表
经验:实习可以归为项目的一部分,若有互联网相关的实习当然更好,没有也无所谓,在项目里加强就行了。前期把没注意到面试还有那么多技巧,不管是答题还是交流还是问问题的,都有很多技巧的,这个也很重要的,好的面试技巧能将面试官导向你熟悉的地方,好的表达技巧能给面试官留下很好的印象。
学习工具:截图+百度云盘+360云盘+手机拍照+有道云记事本。看博客,电子书时,把不是很熟悉的内容都截图存在一个文件夹里,这真是一个好方法,方便后面的复习,截图再同步到手机里,知识点,通过手机就可以复习了。看纸质书时,看到重要的东西,拍个照,自动上传到云端,手机、电脑都方便查看复习啦!这个东东在后期才发现,确实很受用啊,因为以前经常看了很多东西好多都忘记了,有这东东,就不怕忘了啊!手机在手,随时可以看啊!哈哈。。。
基础知识方面:按照图1中的规划,前期从3月份开始,看了C++primer(很重要,里面STL后期用的很多,高级篇也要看)、数据结构与算法分析(很重要,是剑指offer和编程之美等算法题的基础)、数据库(主要是概念和My sql 必知必会)、计算机网络、大话设计模、程序员自我修养、STL源码剖析、linux鸟哥私房菜,后期面试中问到相关的问题,把C++深度解析对象模型(主要讲类的内存布局,虚函数表等)、effective C++(讲C++的条款)、unix坏境高级编程也看了下,没完全看完,但对面试还是有帮助的。
项目方面:把图1中所列的选项总结成文字。
编程方面:参加了微软编程之美挑战赛,把《剑指offer》上的题,一题题自己做了一遍,不会的再看答案,事实证明《剑指offer》确实是本好书,后期的笔试、面试好多题都是上面的。《编程之美》,题目比较难,主要看了数字之魅、结构之法,当然,后面面试中也有少部分题目是编程之美上的。九度OJ之前打算刷一些题的,后期实在是时间不够啊,没怎么上。
简历方面:从4月份开始做的简历,后期逐步发现了问题,修改了好多次。简历是入口,是问问题的入口,自己讲不清楚的东西不要写在简历上,简历既要突出优点重点,以及和岗位公司匹配的地方,又要不留盲点。
本来以为经过几个月的看书,自己的基础知识进面试应该还行,但阿里这次惨败的笔试深深打击了我。由于其他的事中间隔了2个月没看书编程(以前看过的也忘的差不多了),突然一次笔试感觉还没进入状态。阿里这次线上笔试自然而然的惨败了,这次惨败让我重新审视自己的基础知识和接下来的规划和战略。
本来的规划是在笔试时,这4方面(基础、项目、实习、编程)都达到预计的目标。但实际事与愿违,并非如此,书是看了,但也忘的差不多了,编程也练习了好多,但中间隔了1-2个月,就像做数学题一样,又突然生疏起来,找不到感觉。
可以说,阿里笔试之前,都是浮躁的,自认为,看过好多书,看过好多技术博客,基础知识应该还好,编程方面,也练习了好多,应该也还好。事实并非如此,自从阿里的笔试后,我发现了问题,静下心来,把以前看的书再扫荡了一遍,这次基本是1-2天一本。
暗自告诉自己,下面的笔试、面试一定要好好把握,从阿里惨败之后,真的静下心来了。计划是:1)把以前的基础知识再扫荡一遍,2)编程写代码,剑指offer上的题目一个个做,提高编程能力,3)项目的重难点、优缺点总结,4)看完近3个月的IT论坛上的面经(这个一般是晚上睡觉时在床上看的,这个对提供面试技巧确实有帮助)。
这4个都实施了,还是很有自信的去考了腾讯的笔试。腾讯的题目不太难,感觉答的也还行。结果,别人都收到面试通知的时候,xxx,我还没收到的,感觉是挂了的预兆。愈发的受打击啊,那个打击啊真的不小啊。准备了这么多,结果连笔试都挂了,感觉有点讽刺,都怀疑自己的战略是不是有问题,自己是不是不适合做软件啊。因为连面试的机会都木有了,准备再多,有毛用啊,连表现的机会都木有了。整个人软绵绵的,一点斗志都木有。不过,还好,休整下后又像打了鸡血的,战斗起来。后来还是收到了腾讯的面试通知,想想还是自己太急了,找工作还是要淡定的。
早就听闻美团的笔试全是大题(8个大题,2个小时),听到这个感觉自己都不一定做得完,刚开始也木有多大的自信。不过还是和室友们废了半条命赶到九龙湖去笔试。不过有点意外的是,我靠,8大题竟然做了7个大题。晚上11:30的时候,手机响了,湖南的号码,还以为是什么骚扰电话,接了电话就说了句“你谁啊,有事吗?”。对方竟报出了我的名字,说是美团的约我第二天11点南大仙林xx中心面试。我当然喜出望外的答应了啊!
第二天6点多起来了,冲到实验室,把以前整理的知识点复习了一遍。好了到了上午9:30了,和舍友张玮准时出发前往南大仙林,到了那边已经10:30。到了南大又找不到面试的地点,太囧了,问了几个人,都说在活动中心。我和张玮找到了活动中心,空无一人。打了几次昨晚打给我的那个号码,就是没人接,问了N多人,都不知道在哪儿面试。靠,我和张玮愈发觉得自己被骗了,正准备打道回府,最后想了想还有个同学在这边。打了电话问了他,他说是不是在就业指导中心。又冲向了就业指导中心,走到附近就看到了美团的宣传海报,我勒个去,还真是的。差点就错过了。到了面试的地点刚好11点。
上来我问“要自我介绍不?”。面试官一上来说不用了,先写几段代码吧!然后,第一题:给你两个字符串str1,str2,找出str2在str1中的位置。我一看题目心中暗喜,这个好做,好歹都写过求两个字符串的最长公共子串,求一个字符串的重复子串,求一个字符串的最长回文串。这个题比这几个都简单,小case,啪啦啪啦一下子写好了。给面试官看,并给他介绍了下,第一题通过。
接着又问,“阿?!你还实习过啊,还搞的云计算啊。那你讲讲你实习把”。有备而来啊,我就啪啦啪啦一遍讲一遍画,在纸上把cloudstack的架构和原理,说了一通。并且还把我实习时,写过的shell脚本(cloudstack环境自动部署)拿出来给他看了下,还把其中用到的一个小的交互和他讲了下。面试官说,教父级的啊!我说还好,我在虚机上测试过多次,可以正常运行。再把实习做的事和他说了下,这方面算是认可了。又问了关于项目的,这方面难不倒我,哥都准备好了,兵来将挡,水来土掩,讲的清清楚楚。
紧接着又问了,计算机网络懂不?我说懂点,那我问你啊,在浏览器里输入美团网的URL,会经历哪些过程和设备啊?心里又窃喜啊,这类题目在那儿见过的,啪啦啪啦,从DNS、代理服务器、路由器、负载均衡、服务器,各种UDP、TCP等等讲了一通。他也很认同,轻松又创了一关。
然后,又问,操作系统懂不,我说懂点。那你说说进程和线程有什么区别啊,这个都是被面试官问烂了的问题,我还能不会吗?劈里啪啦的讲了一通。面试官点头嗯嗯。又问,进程、线程间通信方式有哪些各有什么特点啊,这个又是被问烂了的题目,自然轻松过关啊,看我这么有激情地说,套接字常用在远端进程通信,他突然打断了我“那本地可以用不?”这个当然可以啊,一般服务器和客服端调试不都这样吗,我说,不过,这有点小材大用啊。面试官连忙点头,嗯嗯!
“那,再给你出个问题哈”,我说“好的”。“你怎么统计南京市有多少辆出租车?”我靠,这个怎么整啊,我想都没想就蹦出一句,“找交管部门查呗!”。他说,“不能查!”。这个我得想想了,刚开始还是从计算公路上的车的流量来算,后来想想车都是移动的,这怎么整呢?结果灵机一动,这不是再考我样本估计总体的思想吗?然后,我就告诉面试官,我有两种方案,不过都是用样本去估计总体的思想。一个是按人口和车辆的比,一个是按面积和车辆的比,最后有补充了点儿,各地方的人口密度和车辆密度是不同的,所以选几个典型的样本区统计,求平均去估计总体。减少误差。这个思想也被认同了,好了,总算一面过了,和一面官的聊天还是挺哈皮的。结束时,他说,我这边你过了,去休息室准备二面。
上来就让我介绍了项目,说到决策树相关的,介绍完了,还说这是你想出来的啊?我说看到数据结构和算法里的,借鉴过来的。紧接着出了个题吗,1000!末尾有多少个0,看了题目,有点晕啊,这怎么算呢,一点思路都木有。二面官人还蛮好的,一边说题目,一边说,你可以先算个10!,100!看看。顿时就有了思路,其实就是看因子里有2*5的个数,其实只需看因子5的个数就可以了,2的个数一般比5的个数多的,只需看5n%5==0,m=5n/5,算出5的倍数中因子5的个数就可以了。
接着出了一个三角矩阵的题目,每次只能向下和向右下走。刚开始还木有思路,最后竟然想到将矩阵转换为二叉树,对二叉树进行先序遍历。二面官说你还能想到这个啊。那你编程实现以下。我靠,这个还要建二叉树啊,不是很好弄啊。面试官说,那你写个二叉树求和最大时的路径吧。好吧,这又转到剑指offer上了,劈里啪啦就写好了。然后面试官看了下,不错,二面就结束了,二面结束已经将近1点了,还没吃午饭啊,又困又饿啊。下午3点还有腾讯的面试,这个可不想错过啊,上去和HR说了下,HR人还蛮好的,直接把我的简历拿到最上面。
三面那个囧啊,嘴里塞了一嘴面包,HR喊的时候,直接就去了,忘了带水。见到三面官的时候,我还在嚼面包,想吐出来,又不知道往哪儿吐,想吞进去,又咽不下去,哎。。。那个囧态简直难以忘记啊!三面官看到此态,笑了,说你是不是要喝点水啊。我马上说是的啊,他向我指了一个地方,那儿有水。靠,救星啊,倒了两杯水,给面试官也倒了一杯。一起拿过去先把水给面试官了。三面官说,你先喝点水,不急,我看看你简历和资料。
就这样三面开始了,刚开始是闲扯啊,又讲实习的项目,讲了一半,他貌似看到以前面试的评语,说这个是不是以前说过的啊?我说,是的啊,他说,说过的就不用再说了。然后就让我回忆你有哪些优点了,我先把本科的一个故事给他讲了。然后他还在问,可能你平时没注意,你再想想还有什么事能表现你的一些优点的。我想啊想,又把研究生的一个故事给他讲了。然后还在问,还有不,你再想想。我就在想啊,这面试官真不错啊,人太好了,一直在挖掘人的长处啊。我每讲一个故事,他都在纸上做记录,满满地写了几张纸啊!感动啊!
故事讲完了,又问我,你一般在网上看技术文章不?我说看,他说在哪儿看啊。我说CSDN,博客园。他也在做记录,然后问,那你有博客账号不?我说有,他说,那你能给个链接不?我说,链接不记得了,那给个搜索关键词吧,我就给了。我还以为3面就这样聊聊就好了呢。没想到,又出了两道题,一个是写个乘法的宏定义,果然是没注意啊,要加3个括号#define multply(m,n) ((m)*(n)),这样才对啊。哎。。。我只加了一个,在面试官的提示下,才想到加3个。确实觉得面试官人不错啊,大美团确实不错啊。又问了,宏定义和内联函数有什么区别吗,分别在什么样的场景下应用啊。我答了内联函数在编译时,将调用处进行函数替换,避免调来调去压榨出栈的时间开销,以空间换时间,还有内联函数有类型检测,宏替换没有类型检测,内联函数只是向编译器申请,若内联函数体内有循环递归等,申请会失败,系统会当初普通函数处理。又问了如果设计一个string类,要注意什么问题。我答了,注意内存泄露啊。如果是继承,基类的析构函数要设计成虚函数。拷贝构造函数和赋值函数要注意异常安全,还有不能拷贝指针。然后就是3面结束了,等通知。
总结:美团的面试官给我很好的印象,都是比较严谨,平易近人的那种。还有就是面试官多是以发现者的眼光去面试一个人,有很强的包容性,这一点,我很喜欢!
百度的笔试又是在九龙湖,来回又折腾了半条命,11点多睡觉了,睡在床上睡不着,12点多了,忍不住去看看手机,一看有个未接电话,3分钟前打的,直接回拨过去了。电话那边是个女的(以为是HR,后来才知道就是我的一面官),说是百度招聘的,约我次日9:00或11:00面试,我当然选了11:00的。
次日11:00点准时到达中央饭店,敲门时,一妹子开门,我一惊,第一次遇到一个女面官。女面官人很好,很热情的招呼我做下,先做了个自我介绍。然后问了下计算机网络,在浏览器里敲入一个网址,会发生哪些过程、经历哪些设备啊?这个在美团问过了啊,我劈里啪啦的讲了。她中途打断了我,你说慢点,就深入问了下细节,说传输的时候为什么要从运输层到数据链路层,路由的详细过程是怎样的?路由的详细过程看过,但真的不怎么记得,就和她说,这个我了解大致的过程,详细的细节记得不大清楚了。然后问我多进程和多线程用过没,我说用过,那死锁听说过没?我说听说过啊。她说那你写个多进程、多线程死锁的程序。我靠。。。这怎么写啊,心想,平时只懂一些概念啊!憋了一会,不知道怎么搞,就告诉她:“这个多进程、多线程的API记的不大清楚”。她说:“那你用伪代码”。这下,好了,我就用伪代码,表达了下意思,然后给她讲了下,她笑了下,就算过了。总之面试中不管遇到什么样的问题,即使自己不太会的,也要换个角度,努力下,不要轻易放弃啦!
接下来,就问项目了,把项目的架构讲了下,她问:“你这个项目的优点和缺点是什么啊”,我说:“优点是,数据库我优化了下,主要是分区优化的”。她说:“怎么分区的啊”。我说:“按时间分区的,一个月为单位”;她笑了下说:“你这是南京市的数据,那若是全国呢,你怎么办啊,你是不是要按天分区啊?”。然后,她又问:“那么,在高并发的时候,你怎么提高效率啊?”。我想了下:“说,数据库前面加一个缓存,采用数据分片,将大文件分成很多小块,并行的写入多个服务器上。读的时候也可以并行的读,然后整理成一个文件,这样把串行读写变成并行读写,提高效率”。她听了笑了下,表示认同,然后又深入了下:“若现在是10台服务器,现在要变成20台服务器,你设计一种方案,使服务不中断,不影响客户”。我说:“这个是数据迁移,现在的IT企业数据迁移一般放在凌晨,尽量减小对客户的影响,我的方案是,从某一时间点开始数据迁移,读数据从原来的10台服务器读,写数据写在新的20台服务器上,同时原10台服务器的数据向新的20台服务器迁移,等到数据全部迁移完毕,所有的读写都在新的20台服务器上”。她说:“那我,写入新的20台服务器上,突然又要读呢,怎么办?”。我说:“哦哦,这个忘了考虑,从数据迁移的时刻开始,对写入新的20台服务器的数据进行标记,每次访问数据时,若访问的是迁移时刻后的数据,就读新的20台服务器,否则读老的10台服务器”。她笑了,说:“方案可行,实施起来可能还有些问题”,然后笑了笑,又接着深入问了:“那你怎么保证数据的可靠性呢?”。这个好回答啊,正好看了类似的东西,说:“我看了些集群分布式文件系统的知识,这个可以借鉴下,就是多副本技术,数据片在不同的服务器上至少存2个副本,2个副本之间相互同步,若一个crash了,系统会向上report,会重新创建一个副本,这样可以提高数据的可靠性”。她笑了笑点了点头。
然后看了看我的笔试题,问了下,你觉得笔试题难不,我说不是很难?笔试有个题目,我有几种方法,之前只写了一种,我又把其他的方法和她讲了下。然后,她说,笔试考了个memorycpy,你给我写个strcpy把。我劈里啪啦地很快就写好了,然后给她看了,并且和她解释了下,各种可能的异常情况,比如无字符串结束符’\0’,内存区域重叠,内存区域重叠不是很确定,然后和她说:“memorycpy要考虑内存重叠,这个不知道会不会有,重叠了,之前不就会异常吗”,她说:“你回去好好想想”。
然后MM说,“我的问题差不多了,你有问题问我不?”,我说:“有,我说像我报的软件研发,在baidu,具体大概做什么啊?”,MM很热情地几乎把她们的所有业务都讲了一遍:“从流量、广告、搜索、支付、团购基本都讲了一遍,然后又说,我是做支付的”。然后又问:“还有不?”,我说:“有,以前听说百度未来主搞人工智能、大数据和云计算,这次正好遇到了,好好请教下,哈哈”。MM笑了下:“你说的也是的,做人工智能、大数据和云计算也是做未来的搜索,百度的流量大,自然需要大数据的处理”。看着MM这么热情,然后我又问了个问题:“说我对云计算比较有兴趣,之前接触过一段时间,可以问问baidu云计算主要做的是IAAS,paas还是saas啊,团队的规模又多大啊?”。这个还把MM难住了,MM说:“我不是云计算相关部门的,接触的不多,这问题,不好回答你啊,不好意思”。我说:“没事,好的”。MM说:“这次面试,到此结束,你保持手机畅通回去等下通知吧”,我看了看时间,11:50了,肚子饿了,想必MM也饿了,然后说了句:“谢谢您,您还没吃饭把,您幸苦了!”,然后MM送我到门口,说了彼此说了声再见,这么神奇的一面就这样结束了。感觉很好,聊的很哈皮,这次面试真是我这么多面试里最美好的一次。
不出所料,晚上8点多,接到百度2面的电话,约好时间是次日上午9点,一大早7点就起了,去实验室整理了下就骑车去了中央饭店。貌似那天没什么二面,好多都是一面的。约好的9点,一直等到10点二面。这次是男面官。上来让我挑一个项目介绍了下,因为项目中涉及到网络的问题。面试管顺势问到,:“网络序是什么大端模式还是小端模式啊,x86的本机序呢?知道什么叫大端模式和小端模式吗?”。我说:“知道,就把大小端模式的区别说了下”。他说:“那你写个小端模式转大端模式函数把”。这个以前还真没怎么想过啊,不太确定对不对,想了下就写了,因为要求输小端int,输出大端 int ,没深入地想,用了个最笨的方法,用% / 把int 数据的每个字节都取出来存入数组中交换顺序,写完给面试官讲了下,他也没说什么。后来想了下,不必这样用位运算&加移位运算就可以搞定了。和同学讨论了下,他提出了一种方法更简单,共用体union
Class Union
{
Int a;
Char b[4];
}
只需交换b中字节的顺序,int a 自动大小端转换了 这个方法好啊。
然后又问,命令执行的状态怎么看,我说看$?就可以了。命令执行失败$?为1,执行成功$?为0,然后说通过查看这个值,经常可以把shell脚本写成交互式的。
然后说你懂shell编程是吧,那现在给你一个日志文件,文件有3列,分别为iP,访问时间,内容。你用shell编程找出访问量最多的10个IP。想了下,这个用shell还真不会啊,就和面试官说了,我shell一般是配置文件,和自动安装rpm等,这个要到排序啊,用C++,我会啊,用shell真不会。
那出道编程题把,面试噼里啪啦在纸上画了棵二叉树,说找最低公共祖先。我一看这不是剑指offer上面的最后一题吗,我想了一下,把几种方法一一道来,果断搞定啊。
然后面试官看了下时间,说你有问题问我不,我说有啊,又把一面官的前两个问题问了一遍,哈哈,其实问什么问题不重要,重要的是通过问问题表现出我对百度的兴趣,和对未来工作的热情和关心。
百度3面大概等了3天,据说是要1,2面都结束,统一3面。3面约定的是上午11点,这次貌似是个boss,很有气场的样子,上来递过简历和笔试试卷。他看我的简历时,我说,需要自我介绍下不,他说,不需要。好吧,上来就说,你不是计算机系的,数据结构与算法分析,系统学过没啊?我说,学过啊,不过是自学的,看了几遍了。本科和研究生也学过部分计算机相关的课程。还有研究生的一些项目也和软件编程相关的。然后,他问那你是怎么学的啊,我说通过看书、看博客、编程实践、和实验室的同学讨论、还有实验室的一些项目也正好用到一些,就这样学的啊。
然后就出了个题目让我求时间复杂度:
Int i=0;
Int s=0;
While(s
S+=i++;
这个乍看还还不好看出来,我在纸上画了下,想了下,说时间复杂度是根号N。确实是的,他也认同了。
然后让我写了个二分查找,二分查找容易出现死循环,这个当然要注意了啊,其实还有二分,三分,递归实现和循环实现,都练习过了,所以很快就一气呵成的写出来了。然后给面试官讲了下,二分查找有多种实现方式,这里给出了一种,并且说了应注意的问题。面试官也认同了。
然后让我做了个逻辑题,100个人,100盏灯,每个人走在灯前,若的灯序号是人号的倍数的,把灯开关按下,之前灯都是关的,问最后哪些灯是开着的。这个题目做过多遍的,只要是灯序号是平方项的,就是奇数次开关灯啊,灯肯定亮着的啊,问题转换为看灯号是否是平方项,若是则亮的,否则是关的。
然后问了几个和技术无关的问题,比如,效率和质量出现冲突,你怎么解决。他说,比如你老板交给你个任务,要在某个时间点之前搞出来,但如果保证高质量,就任务就完不成。我说,效率第一,兼顾质量,先保证有,再保证好。说如果在时间节点之前不能交货,就是事故,要负责任的。但如果,能在时间节点交货,即使质量上还有些小问题,但后续还可以完善的。如果什么都没有怎么和客户交代呢。面试官也点头认同。
又问,在职场交流中,你有什么技巧啊。我说了相互尊重,分享、交流沟通、幽默感。相互尊重是一切的基础和前提,然后逐个举例论证了下,每个人可能会有一些新的想法或接触一些新的知识,可以和同事分享,这样慢慢的,团队的整个实力就会提高。
然后又问了下,你经常在网上看技术文章不,我说看啊,他说在哪儿看啊,我说csdn 博客园,他说,最近看过没啊。我说看过了,他说,最近看过啥啊,我说看过电商架构,他说,哦哦,那你把电商架构画一下。我噼里啪啦就大概的画了下,然后,他又问,最上层是负载均衡。那你给我讲下,什么叫负载均衡。我说负载均衡一般在4和7层上的。还没说完,他打断了我,说你给我讲什么叫负载均衡就行了。好吧,我说:“负载均衡有两种,一种是,讲海量的访问iP,导向不同的服务器;另一种是对于重载的单任务,将其分解为很多小任务,分配给不同的服务器,服务器处理完后,讲结构归并整理,得到总任务的结果。”
最后不小心扯到cdn,面试官又追问了,cdn的英文是啥啊?我靠,这个只知道用途啊,算是给自己挖了个坑啊,后来查了下,是content delivery network 一种智能网络。
总结:所以面试的时候,自己不太清楚的东西最好不要说,不要挖个坑把自己埋了,还不知道。
一面一上来问了我1个数据安全的问题,不是很懂,然后问了个http协议懂不懂,我说懂点。他说HTTP协议怎样保证安全呢?我说,现在不是有个https协议吗,银行和企业一般是采用这种协议,s是security的意思。他说,这个协议和http协议有什么区别啊?我说,https采用安全套接字ssl,链接过程需要认证,握手次数多于http中TCP链接的建立,要保证安全就必须手续复杂点啊,这个和我们的日常生活差不多啊,便利都意味着牺牲一定的安全性,需要在他们之间找到一个平衡点,还有http采用的是80端口,https采用是443端口。然后这个问题就算过了。
接着给以他们正在做的一个项目为背景,看我以前参加过趋势的比赛,就让我讲了下比赛的内容,对趋势的了解。然后出了一道题,让我写代码,说:“我们这边正在做一个邮件安全的项目,因为用户可能不注意把信用卡或者储蓄卡号放在邮件里发送出去了,这样会给用户带来很大的潜在安全问题,我们的任务是发现邮件里的信用卡或者储蓄卡号,用*替代。现在简化一下,给你一个string,你检测下是否有银行卡号,如有用*替代,若木有,不做处理”
我一听,貌似不是很难,和面试官交流了下要求,银行卡号的特征是:每4个数字一组,一共4组,每组中间用-隔开。然后又问了下能不能用STL啊,他说可以。
这个问题主要是检测数字,对数字出现的次数计数,对“-”出现的次数计数,判断是否是信用卡号,若是则用*替代。还有就是考虑异常情况。写完给面试官讲了下,异常情况我只判断了空串返回,面试官提示了下,你再想想还有哪些可能不是空串也可以返回呢,想了下不知道啊,说可以提示下不,他说如果字符串长度小于16呢,哦哦对了,小于16就不可能有信用卡号了。
接着,面试官又说,那你看看你的程序哪些地方还可以优化啊,我说对啊,如果剩下的长度小于16,且数字计数为0时,后面的也不用判断了。面试官说,嗯嗯,我觉得你还不错,去准备二面吧。
趋势科技的二面,是2对1,折腾了我将近1个半小时,不过确实学到了很多东西。下面一一道来啊。一上来,让我讲了(项目架构和应用场景)下实习做的东西,cloudstack架构啊,什么的大讲特讲啊,然后问了下,这个有哪些应用场景。这个说完了。
接着让我写了个strcpy的函数。先用循环写了。面试官又说,如果不用循环呢?,又用递归写了一遍,递归里用了个static变量保存dst的首地址。写完面试官又问,如果不能用static变量呢,再写一个看看,又想了下,又写了个版本,把return dst放在后面就行了。写完了,面试官又让我想想,有哪些情况和场景,strcpy会出现异常呢?我说字符串木有结束符,他说还有呢?我说,字符串长度太长,递归调用栈溢出。他说,还有呢?我说,指针有个为空,或者两个指针为同一个指针?我靠,还接着问还有呢?还有dst的内存区域小于src的内存大小,copy时,dst区域空间不够用,产生越界。那,还有呢?我靠。。。你想咋折腾啊?又想了想,还有dst和src有内存重叠,有一种重叠要从后面向前面复制。然后又解释了下,这种情况一般不会出现,一般dst和src是用户new出来的。如果内存不够,dst就会是空指针啊?然后面试官反驳了下:“谁告诉你,dst区域一定就是new出来的呢?”好吧,不一定是new出来的?“你只管写strcpy函数,你能控制用户怎么用你的函数吗?”,好吧,我不能,经过这几轮的轰炸,真的对这一小小的strcpy函数有了深入的理解。还是很感谢面试官的,让我写到了好多啊!
接着问,打开电脑,发现电脑速度慢,你怎么处理。我说,查看任务管理器,kill掉内存或cpu占用大的进程。他说,电脑还是慢呢?我说查看C盘,清出C盘的垃圾,看看C盘是不是太小了。他说,磁盘为什么会影响速度,我说内存一般有个虚拟内存,其实就是将部分硬盘作为内存使用,若发生缺页从再从硬盘内调入。内存要和磁盘频繁交换数据,磁盘当然会影响速度啊。他说,如果清除垃圾,电脑还慢呢?我说是不是硬盘有坏道,或者磁盘接口坏了。再往下真的不知道了啊,哎。。。这个问题就到这儿了。
接着又问了一个,打开浏览器,其他的网站都可以上,唯独新浪网上不了,你怎么处理啊?想了一下,我说:“是不是设置了代理服务器,代理服务器挂掉了,不对,代理挂了,其他的什么都不能访问了,有可能是新浪网是服务器挂了,这时可以看到状态码为500,server error”,他说,如果新浪的服务器没挂呢?我说,那有可能是浏览器不小心把新浪网加入黑名单了,换个浏览器试试,排除浏览器的问题?他说,如果又不是浏览器的问题呢?我靠,想玩死我啊,想了想说,那有可能是在某某单位上网,单位的交换机把新浪网屏蔽了,防火墙把新浪的ip过滤掉了,linux防火墙有iptable可以设置丢弃的ip。问到这儿,这个问题也结束了。
接着又问了个,如果给你两个host,ping不通,你怎么处理啊?我想了想说,先看看,这两台host的network 服务有没有打开,若没打开则打开它。再看看这两个host的ip是不是在同一网段,是不是同一网络的,同一个局域网的一般不会经过交换机啥的。如果是不同的网段,使用tracertroute 命令跟踪源ip到目的ip的中间站点,看看中间经过哪些路由器,哪个站点出问题了,再排查。然后说,这个细节不是很懂,然后他就没再追问。
然后2个面试官,走了一个,又来了一个新的面试官,我靠,问了几个关于测试的问题。问我报的研发还是测试,我说研发。然后他说,你觉得研发和测试的区别是什么啊?我言简意赅的说了句:“研发偏重深度,测试偏重广度,然后举例说了下,测试要懂好多测试工具,还要知道软件的需求设计测试用例,还要和研发人员沟通,要求知识面比较宽,所以偏广度。这只是我的看法,不知道对不对”,然后面试官说,你说的有一定的道理,确实是这样。然后又问了我一个关于测试的问题:“我现在有一个拷贝文件的程序,你打算怎么测试,能想到哪些场景?”我想了想问:“是linux还是windows下的啊”,他说都有可能。然后我说:“如果在linux下的话,要保证拷贝完毕的文件和原来的文件具有相同的用户权限和用户组合读写权限,linux下有权限问题,还有整个拷贝过程中不能破坏原来的文件。这是正常情况下,还有一些异常情景,首先,要保证如果拷贝过程中,若认为取消拷贝,已拷贝的部分要删掉,源文件要保证安全不被破坏。其次若拷贝过程中,由于断电、关机、磁盘容量不足等异常要保证源文件安全,同时要删除已拷贝的部分文件”。然后他也认同了
然后又问了个关于网络的问题,说你爸妈在家里上网,突然不能上网了,你在电话里怎么解决这个问题。我靠。。。这个奇葩的问题,还真没遇到啊。想了想,我说先看看网线是不是没插好,看那个信号灯闪不闪,先保证物理连接好,幸亏哥还是做过一点硬件的,这点还是懂的。然后打开网络适配器看看有木有获取正常的ip,说不定DHCP服务器挂了呢。他说,ip正常?那再看看防火墙配置,把防火墙先关掉试试,然后再看看浏览器配置,是不是设置了一个不存在的代理,或者浏览器安全级别太高了,把安全级别降低一点。他说:“安全级别太高了,会不能上网吗”,我想了想说,不会,安全级别高只会屏蔽一些不安全的网站,不会所有都不能上啊。他说,那如果你所说的都正常呢?我说,那再看看别人能不能上网,说不定是服务提供商的问题呢。他说我只想考察下你想问题的思路,其实这中间从哪一个过程出现问题都有可能。
好吧,折腾到现在,新来的面试官,问另一个面试官,C++和编程方面的问题问了没,我滴个神啊,心想,难道还要折腾吗,亲!另一个面试官说都问过了。然后面试官问我,你有问题问我不。我说有啊:“趋势是外企啊,请问下,在趋势工作的话,有没有可能出国啊”,他说可:“他说可能啊,一般是到台湾、日本、新加坡等”。心想,台湾算出国吗?不是祖国的吗?然后问了下,这个出国的机会多不,他说,这个看项目,如果有项目上的合作,出国的可能性大,我们这边做数据安全的,有很多和国外合作的项目,出国的机会还是挺多的。
三面是群面,7人一组,给定一话题,采用正反方辩论的方式,讨论问题,然后小组内部相互评论,面试官提问。整个过程1个半小时吧,一个小组3个面试官,全程记录各个同学的发言和表现。我们小组的话题是apple wath,觉得这个群面还是挺有意思的,挺锻炼人的,反映个人思想、团队合作、交流沟通能力。