百度python面试经历记录

2,620 阅读16分钟

前言:

笔者是一名双非本科生,通过了百度北京互联网数据研发部的最后一轮面试。第一次写博客,写的很详细(其实是罗里吧嗦),给自己记录一段面试经历,同时也希望这次的面试给需要的同学提供一点经验帮助吧。

背景:

  大三暑假末期,当时在一家B轮融资的金融互联网企业里面担任python爬虫实习生,但是实习期将满,想去大一些的平台学习,遂开始着手下一份工作的寻找。打开拉勾网,看到百度正好在那天发布了百度大搜——python实习生的招聘,看了招聘要求,了解到工作职责和百度的BaiduSpider和海量数据系统的处理和研发有关系,虽然在搜索引擎和系统架构这一块没有相关实习工作经历,但是对于职责要求里技术和能力都掌握的还可以,于是激动且担忧的投了简历。

机会获取:

  投了简历之后其实是比较担心的,在我参加实习之前,投的第一家是京东的爬虫实习生岗位,但是在简历投递出去就被无情的淘汰掉了,原因我猜应该是学历和实习经历都不够,虽然这次再战百度有了不错的实习经历,但依旧担心重蹈覆辙。简历投递了四天,拉勾页面上才出现了一个‘简历被查看’的状态,又过了三天时间依旧没有反应,去上网看到,很多人在论坛里说拉勾上投的简历被查看后就没下文了,估计自己也是凉了,但是还是希望争取下机会,去拉勾里给查看我简历的hr主动发了个消息,说了句:‘您好,能给个面试机会吗?’ ,没想到就是这最后的主动的一句话换来了百度的一个面试机会,第二天上班的时候,接到一个北京的电话,正是百度hr。

hr面:

先是确认了下双方的身份,了解我的一些基本情况,然后和我聊了一些话后,告诉我说将我的简历给部门里看了,我的简历挺合适。接着她提了一下百度的实习安排和制度要求,得到我的同意回答后,开始和我约面试时间,告知我面试事项。挂了电话后压抑着兴奋的心情开始了紧张的准备工作。

面试准备

  在面试前的几天时间里,白天快速把公司安排的任务做完,晚上一下班就立刻回寝室准备面试的东西,然后一直搞到深夜。准备的知识包括数据结构,计算机网络,算法,linux,数据库,各类工具,以及python的各个易考知识点但是时间毕竟太少,很多东西都是大致过一遍。。同时,那几天发量以肉眼可见的速度减少。。。

一轮技术面试:

  听hr和我讲,一般一面面试我的人就是我来到公司后带我的工程师,在面试那天向公司请了假,担心室友活动影响到面试,提前在外面找了个安静的地方,令我印象深刻的是,hr和我说的13:00面试,没想到面试官12:59打来了电话,我本来以为百度这种大公司,面试官都很繁忙,时间可能会有比较大的偏差。 面试总时长54分钟,值得一提的是,面试过程中,面试官似乎对我的项目经历很感兴趣,在这部分至少询问了25分钟,根据我简历上写的项目经验,一步步深入的往下面问,细节,用到的技术,为什么用这个技术,碰到了什么问题,怎么解决。

   1.首先让做一个自我介绍。

   2.   项目部分:

问:看你项目里用到了Redis、MongoDB、MySQL,讲一下为什么一下用Redis,一下用MongoDB和MySQL,有什么讲究吗?  

答:主要从这三个数据库的性能,在项目中怎么发挥作用的,还有结合公司的业务需求做了回答

问:这个抓取招聘信息的项目是怎么开始实施的,讲一下

答:公司给了几张包括500强,上市公司,创投公司等几十万家公司名字的数据表,抓取他们这些公司的招聘信息。首先是选型,公司里数据分析师给了我智联招聘,boss直聘,中华英才网,前程无忧这四个网站,让我选取其中一个进行招聘信息的数据抓取。然后花了两三天时间,对这四个网站进行抓取难度,数据质量,每日可能抓取的最大数据量进行了研究和测试,最后综合对比出了前程无忧是最合适的。另外也给面试官说了下另外三网站的特点。

问:前面的智联招聘,boss直聘这些需要登录的,验证码处理的网站你抓取不了吗?

答:公司给的这个项目是有时间周期的,不是不会,是为了尽量减少经济和时间成本。为了证 明自己会,然后吧啦吧啦的讲了几个需要验证码和登录处理的网站的处理方式,以及一些动态页面的抓取方法。

问:你这个项目里数据的清洗是怎么做的?

答:首先说了一下爬虫的去重问题,在coding的时候就编写好了一些防止出现重复和错误数据的代码,然后说了下抓取过程中数据出现了哪些问题,如何找到问题,如何优化抓取策略,使得最后的爬虫系统趋于稳定,几乎没有再出现纰漏或者错误的数据。进一步的清洗是数据分析师在处理,接着说了一下,如果我是公司数据分析师,我会怎么处理。

问:你这个爬虫中用到的反爬策略有哪些

答:更改user-agent,动态ip,根据时间段设置访问频率,白天低速率低频率抓取,晚上高频 率抓取。然后另外提了几种不同反爬页面的处理方法,比如js渲染或ajax加载。

问:你在做项目过程中,碰到了哪些问题,怎么解决

答:吧啦吧啦。。。

  3.  基础知识部分

问:你知道*%¥#吗?

答:(没听懂是个什么东西,总之好像是个英文单词),委婉的说了句这个不会(不过面试官也笑着说了下,这个是个概念性的东西,不会也正常)

问:对linux掌握程度怎么样(百度人好像都是在linux上面进行开发的)

答:我在公司主要是在Windows上面开发,然后代码迁移到linux执行,会些常用linux命令

问:说一下python的 多线程

答:这个可以用并发和并行来说明,很多人认为python的多线程是鸡肋,它不像java,c等语言多个线程可以同时执行任务,python由于全局解释器锁(gil)的存在,使得python多线程无法同时执行任务,顶多就是一个线程执行完毕,另外一个线程立即接着执行。java、c的多线程好比多个人使用多把铁锹同时工作,但是python多线程就是多个人用一把铁锹轮流工作。不过python多线程也不能完全说是鸡肋,在python的计算行操作里,比如我在前面的招聘网站的页面抓取过程中,如果使用python多线程进行抓取网页,数据解析这些计算型操作,速度不会明显增加。但是在I/O操作里,速度可以明显提升,比如在文件读写,数据库操作这些方面都是可以明显提高速度的,比如在前面的招聘信息的操作里,数据入库操作是十分耗费时间的,因此在这个项目最后的数据插入数据库部分,我用了8个线程,数据入库速度在单条线程的基础上提升了6倍(不过这里值得一提的是,python多线程会改变数据读写顺序,虽然加锁可以防止这一现象,但是加锁也大大降低了多线程速度,所以要用多线程进行数据操作,前提是对数据的顺序没什么要求。)

问:嗯,对多线程的理解还蛮透彻,说一下python线程变量注意事项

答:(当时傻了吧唧的没反应过来,我一直以为是要我说多线程函数里变量的传递问题,强行解释了一波多线程的变量传递用法,他说不是这个,后来才知道他是想问局部变量,全部变量的问题)

  4.  业务思路问题

问:我们部门正好有个业务(就是全站抓取某个app,什么app就不说了,怕引起不必要的事情,),如果这个任务给你,你会怎么做。

答:听到这个一瞬间有点懵,没仔细研究过这个app。。。硬着头皮,凭着自己对那个app的一丝丝印象,给了一个比较常见可靠的思路(面试官还蛮高兴,说这个思路很好,但是面试官让在想几个思路,想了一会,因为对那个app没怎么了解过,所以一时半会的也找不到新的骚操作,然后给了个我都不知道行不行的方法,他想了一下,说这个思路一般,让我继续想,后来实在想不到,我就说我想不到了。。。)

  5.  大学经历

我简历里面写了大学在学校实验室里做过的项目和大学里拿的奖学金等荣誉,但是面试官就对其中一个国家级的比赛提了一下,对别的奖学金,成绩啥的似乎没太大兴趣,不过这些可能在hr那里加了分。

   6.算法和coding能力

最后环节面试官给我出了道算法题,给我了一个链接,让我在链接指向的页面的里写代码实现这个算法,面试官那边可以在线看到我写代码的实时情况,但是出了点意外,页面显示链接所在服务器出了问题,我怎么也进不去,最后就手写代码,然后把代码读给面试官听了。。。尴尬。

一面总结:

   整个面试过程,两个问题没有答好,其他都还可以,面试差不多一个小时(hr也和我说过,百度的面试每轮一般都是一个小时),面试官说我项目经验很丰富。说去组里讨论一下,然后hr会给通知。(第二天hr告知我面试过了)

  本以为百度面试将会是煎熬的时光,相反感觉过的还算轻松,没有太大的压力,面试官对项目经验很在意,大部分时间主要都是根据我简历上写的项目经验来展开询问。特别是细节问得比较多,让我讲我做的项目,我讲着讲着让我停一下,然后从我刚刚讲到的这个细节又开始展开询问。

一面知识关键词:python基础知识,计算机网络,linux,算法,项目经验,数据库,业务思路,coding能力

二面技术面试(终面)

  hr讲,这最后一面面试官是部门的leader。

  通话前,真的贼紧张,双非学生第一次和这样的大佬通话,通了后,一个声音浑厚的声音传了过来,第一句是:‘***同学吗?’,给人很平和的感觉,紧张感消失大半。。。

1.自我介绍 

2.情况确认,

    问我大几,可以实习多久等之类的

3.直入项目

  这一面也问了项目,大概问了十几分钟的项目问题吧,有些问题和一面面试官相同,基本都挺不错的回答了出来,这里就不重复了。不过另外问了些业务问题。

比如:

  你们公司代理哪来的,你们公司抓这些数据用来干嘛呢,有什么用呢 , 公司是做什么的之类的

最后出了两道数学题(当时是有些慌的,讲真,我从来没想过会考数学。)

第一道:

   有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打电话来,说我技术二面(也是最后一面)过了。但是后来也因为一些其他的原因,就没有顺利去北京入职。

不过最终还是留下一次十分深刻的面试经历,虽然没去百度工作,但是第一次感觉到双非学生距离顶尖大厂并不是那么遥远,给我以后的工作和学习中增加了不少信心。也看到了自己的缺点,后来在慢慢的补习数学,数据结构,算法这些知识。