笔者是一名双非本科生,经过了百度北京互联网数据研发部的最后一轮面试。第一次写博客,写的很详细(实际上是罗里吧嗦),给本身记录一段面试经历,同时也但愿此次的面试给须要的同窗提供一点经验帮助吧。java
大三暑假末期,当时在一家B轮融资的金融互联网企业里面担任python爬虫实习生,可是实习期将满,想去大一些的平台学习,遂开始着手下一份工做的寻找。打开拉勾网,看到百度正好在那天发布了百度大搜——python实习生的招聘,看了招聘要求,了解到工做职责和百度的BaiduSpider和海量数据系统的处理和研发有关系,虽然在搜索引擎和系统架构这一块没有相关实习工做经历,可是对于职责要求里技术和能力都掌握的还能够,因而激动且担心的投了简历。python
投了简历以后实际上是比较担忧的,在我参加实习以前,投的第一家是京东的爬虫实习生岗位,可是在简历投递出去就被无情的淘汰掉了,缘由我猜应该是学历和实习经历都不够,虽然此次再战百度有了不错的实习经历,但依旧担忧重蹈覆辙。简历投递了四天,拉勾页面上才出现了一个‘简历被查看’的状态,又过了三天时间依旧没有反应,去上网看到,不少人在论坛里说拉勾上投的简历被查看后就没下文了,估计本身也是凉了,可是仍是但愿争取下机会,去拉勾里给查看我简历的hr主动发了个消息,说了句:‘您好,能给个面试机会吗?’ ,没想到就是这最后的主动的一句话换来了百度的一个面试机会,次日上班的时候,接到一个北京的电话,正是百度hr。linux
先是确认了下双方的身份,了解个人一些基本状况,而后和我聊了一些话后,告诉我说将个人简历给部门里看了,个人简历挺合适。接着她提了一下百度的实习安排和制度要求,获得个人赞成回答后,开始和我约面试时间,告知我面试事项。挂了电话后压抑着兴奋的心情开始了紧张的准备工做。面试
在面试前的几天时间里,白天快速把公司安排的任务作完,晚上一下班就马上回寝室准备面试的东西,而后一直搞到深夜。准备的知识包括数据结构,计算机网络,算法,linux,数据库,各种工具,以及python的各个易考知识点可是时间毕竟太少,不少东西都是大体过一遍。。同时,那几天发量以肉眼可见的速度减小。。。ajax
听hr和我讲,通常一面面试个人人就是我来到公司后带个人工程师,在面试那天向公司请了假,担忧室友活动影响到面试,提早在外面找了个安静的地方,令我印象深入的是,hr和我说的13:00面试,没想到面试官12:59打来了电话,我原本觉得百度这种大公司,面试官都很繁忙,时间可能会有比较大的误差。 面试总时长54分钟,值得一提的是,面试过程当中,面试官彷佛对个人项目经历很感兴趣,在这部分至少询问了25分钟,根据我简历上写的项目经验,一步步深刻的往下面问,细节,用到的技术,为何用这个技术,碰到了什么问题,怎么解决。算法
问:看你项目里用到了Redis、MongoDB、MySQL,讲一下为何一下用Redis,一下用MongoDB和MySQL,有什么讲究吗? 数据库
答:主要从这三个数据库的性能,在项目中怎么发挥做用的,还有结合公司的业务需求作了回答服务器
问:这个抓取招聘信息的项目是怎么开始实施的,讲一下网络
答:公司给了几张包括500强,上市公司,创投公司等几十万家公司名字的数据表,抓取他们这些公司的招聘信息。首先是选型,公司里数据分析师给了我智联招聘,boss直聘,中华英才网,前程无忧这四个网站,让我选取其中一个进行招聘信息的数据抓取。而后花了两三天时间,对这四个网站进行抓取难度,数据质量,每日可能抓取的最大数据量进行了研究和测试,最后综合对比出了前程无忧是最合适的。另外也给面试官说了下另外三网站的特色。数据结构
问:前面的智联招聘,boss直聘这些须要登陆的,验证码处理的网站你抓取不了吗?
答:公司给的这个项目是有时间周期的,不是不会,是为了尽可能减小经济和时间成本。为了证 明本身会,而后吧啦吧啦的讲了几个须要验证码和登陆处理的网站的处理方式,以及一些动态页面的抓取方法。
问:你这个项目里数据的清洗是怎么作的?
答:首先说了一下爬虫的去重问题,在coding的时候就编写好了一些防止出现重复和错误数据的代码,而后说了下抓取过程当中数据出现了哪些问题,如何找到问题,如何优化抓取策略,使得最后的爬虫系统趋于稳定,几乎没有再出现纰漏或者错误的数据。进一步的清洗是数据分析师在处理,接着说了一下,若是我是公司数据分析师,我会怎么处理。
问:你这个爬虫中用到的反爬策略有哪些
答:更改user-agent,动态ip,根据时间段设置访问频率,白天低速率低频率抓取,晚上高频 率抓取。而后另外提了几种不一样反爬页面的处理方法,好比js渲染或ajax加载。
问:你在作项目过程当中,碰到了哪些问题,怎么解决
答:吧啦吧啦。。。
问:你知道*%¥#吗?
答:(没听懂是个什么东西,总之好像是个英文单词),委婉的说了句这个不会(不过面试官也笑着说了下,这个是个概念性的东西,不会也正常)
问:对linux掌握程度怎么样(百度人好像都是在linux上面进行开发的)
答:我在公司主要是在Windows上面开发,而后代码迁移到linux执行,会些经常使用linux命令
问:说一下python的 多线程
答:这个能够用并发和并行来讲明,不少人认为python的多线程是鸡肋,它不像java,c等语言多个线程能够同时执行任务,python因为全局解释器锁(gil)的存在,使得python多线程没法同时执行任务,顶多就是一个线程执行完毕,另一个线程当即接着执行。java、c的多线程比如多我的使用多把铁锹同时工做,可是python多线程就是多我的用一把铁锹轮流工做。不过python多线程也不能彻底说是鸡肋,在python的计算行操做里,好比我在前面的招聘网站的页面抓取过程当中,若是使用python多线程进行抓取网页,数据解析这些计算型操做,速度不会明显增长。可是在I/O操做里,速度能够明显提高,好比在文件读写,数据库操做这些方面都是能够明显提升速度的,好比在前面的招聘信息的操做里,数据入库操做是十分耗费时间的,所以在这个项目最后的数据插入数据库部分,我用了8个线程,数据入库速度在单条线程的基础上提高了6倍(不过这里值得一提的是,python多线程会改变数据读写顺序,虽然加锁能够防止这一现象,可是加锁也大大下降了多线程速度,因此要用多线程进行数据操做,前提是对数据的顺序没什么要求。)
问:嗯,对多线程的理解还蛮透彻,说一下python线程变量注意事项
答:(当时傻了吧唧的没反应过来,我一直觉得是要我说多线程函数里变量的传递问题,强行解释了一波多线程的变量传递用法,他说不是这个,后来才知道他是想问局部变量,所有变量的问题)
问:咱们部门正好有个业务(就是全站抓取某个app,什么app就不说了,怕引发没必要要的事情,),若是这个任务给你,你会怎么作。
答:听到这个一瞬间有点懵,没仔细研究过这个app。。。硬着头皮,凭着本身对那个app的一丝丝印象,给了一个比较常见可靠的思路(面试官还蛮高兴,说这个思路很好,可是面试官让在想几个思路,想了一会,由于对那个app没怎么了解过,因此一时半会的也找不到新的骚操做,而后给了个我都不知道行不行的方法,他想了一下,说这个思路通常,让我继续想,后来实在想不到,我就说我想不到了。。。)
我简历里面写了大学在学校实验室里作过的项目和大学里拿的奖学金等荣誉,可是面试官就对其中一个国家级的比赛提了一下,对别的奖学金,成绩啥的彷佛没太大兴趣,不过这些可能在hr那里加了分。
最后环节面试官给我出了道算法题,给我了一个连接,让我在连接指向的页面的里写代码实现这个算法,面试官那边能够在线看到我写代码的实时状况,可是出了点意外,页面显示连接所在服务器出了问题,我怎么也进不去,最后就手写代码,而后把代码读给面试官听了。。。尴尬。
整个面试过程,两个问题没有答好,其余都还能够,面试差很少一个小时(hr也和我说过,百度的面试每轮通常都是一个小时),面试官说我项目经验很丰富。说去组里讨论一下,而后hr会给通知。(次日hr告知我面试过了)
本觉得百度面试将会是煎熬的时光,相反感受过的还算轻松,没有太大的压力,面试官对项目经验很在乎,大部分时间主要都是根据我简历上写的项目经验来展开询问。特别是细节问得比较多,让我讲我作的项目,我讲着讲着让我停一下,而后从我刚刚讲到的这个细节又开始展开询问。
一面知识关键词:python基础知识,计算机网络,linux,算法,项目经验,数据库,业务思路,coding能力
hr讲,这最后一面面试官是部门的leader。
通话前,真的贼紧张,双非学生第一次和这样的大佬通话,通了后,一个声音浑厚的声音传了过来,第一句是:‘***同窗吗?’,给人很平和的感受,紧张感消失大半。。。
问我大几,能够实习多久等之类的
这一面也问了项目,大概问了十几分钟的项目问题吧,有些问题和一面面试官相同,基本都挺不错的回答了出来,这里就不重复了。不过另外问了些业务问题。
好比:
大家公司代理哪来的,大家公司抓这些数据用来干吗呢,有什么用呢 , 公司是作什么的之类的
最后出了两道数学题(当时是有些慌的,讲真,我历来没想过会考数学。)
有9颗珠子,其中8颗重量相同,1颗比较轻,再给你一个左右平衡的秤,怎么最快找出最轻的一颗珠子。
我回答的是,先441 ,随意拿出一颗珠子,而后在秤的两边各方4个,若是两端平衡,那么拿出的这颗就是最轻的,此时一次性就能够找到最轻的;若是其中一端升起来,那么将升起的这端4颗珠子再拿出来,二二放在秤上,若是一端升起,再从升起的这端拿出两颗珠子再放秤两边,这个时候就能够获得最轻的。
面试官:这个方法还行,可是不是我想要的答案,有指望值更低的作法,你先算一下你这种作法,的指望值是多少。
我:指望值?(是啥,感受很熟悉,好像是高中学的几率里的东西,可是一时半会真的懵逼)
面试官:看来忘了吧,几率论里的东西
接着现场指点我指望值怎么算。。。想起来后,我说我这个作法的指望值是2.78,面试官说还有指望值更低的作法。而后让我继续想
想的过程当中,想到了333分配,可是以为跟441相比差了点,441有可能一次就找出结果。333至少要两次,指望值应该没有441的低,就没继续往下想。
而后后来面试官给我解答:就是333的作法,你刚刚嘴里念出来的可是没有继续往下算了。秤两边各方3个,手里3个,秤平衡,较轻的就在手里3颗中,若是不平衡,最轻的就在升起的3颗中,而后继续从肯定的3颗里,取两颗,秤两边各方一个。这个时候看秤平衡状态就能够知道哪颗最轻了。
听完后,以为这个方法绝了,让我再算指望值,这个作法的指望值是2。
有一个文本文件,里面有十几亿个电话号码,都是11位数的电话号码,可是电话号码的顺序是错乱的。如今须要将这十几个电话号码,从小到大排序,你怎么作。
讲真,那时候没有这样量级的数据处理经验和理论知识,面试前把各大排序算法回顾了一遍,可是十几亿条数据,用排序算法,那内存得卡爆。
见过的数据量最大的是当时在公司里接触的一张工商信息的表,两亿多条数据,打开都得十几分钟。
当时回答的时候,一种是分而治之的思想,这表这么大,先拆分红多个小的文本再处理,可是也仅此而已了,接下来不知道怎么操做。
这类海量数据处理的算法真不太会,最后回答了一种利用数据库自动索引排序的法子。
建十张数据表,写个多线程或者更高效率的文本读写和数据库插入程序,里面写10个判断条件,10数字开头号码插入一张表,11数字开头号码存一张表,12数字开头号码存一张表....一次,19开头号码插入一张表。而后数据插入完毕后,对这十张表利用数据表自带的排序功能进行排序,而后再合并到一个文本里。
见过的最大的表有2亿多条数据,并且一条数据里包含了十几个字段,每一个有些字段里数据是字符串,或者很长的中文。如今一个表里数据量不超过1亿条,并且每条数据只存储一个电话号码,因此在内存上应该是可行的。虽然这个法子勉强可行,可是效率却很低下,面试官但愿我用算法搞定。
这个问题也欢迎各位大佬留下本身的解决方法!愿意学习
最后时间快差很少到了一个小时,我问了下面试官个人表现(虽然前面部分回答的还行,可是后面两道数学题回答的都不是面试官很满意的答案,有点怂)。
面试官:看得出来你是个干实事的人,从前面你讲的的多线程操做,数据库操做,你应该是作过很多东西。可是基础知识比较薄弱,好比算法,计算机网络,数据结构,数学这些知识都要增强。如今大几?
我: 大三暑假
面试官:如今还来得及,赶忙补!
而后后面聊了几句就结束了,让我等通知!
一面面的很好,二面前面还能够,就是后面两道数学题,虽然给出了一些答案,可是都不是最好。面完后以为此次面试估计有危险!
可是次日hr打电话来,说我技术二面(也是最后一面)过了。可是后来也由于一些其余的缘由,就没有顺利去北京入职。
不过最终仍是留下一次十分深入的面试经历,虽然没去百度工做,可是第一次感受到双非学生距离顶尖大厂并非那么遥远,给我之后的工做和学习中增长了很多信心。也看到了本身的缺点,后来在慢慢的补习数学,数据结构,算法这些知识。