记第一次面试
想着这个大三暑假在合肥本地找个实习,就在实习僧投了好几家 Java 实习生,可等了三天都没反应。。然后听说 Boss 直聘比较好,于是又上 Boss 直聘投了两家。可信息全部有去无回。。
不过说来运气也好,周五的时候,Boss 直聘上就有位面试官主动联系到我,招 Python 爬虫工程师,真是意外之喜。
然后今天电话里聊了聊,也没做啥准备,下午就进行了一次简单的面试。感觉答的还挺好的,面试官问的也简单,(远没网上各 BAT 面经那么恐怖)下面我简单地回顾一下,就只写我还记得的了:
-
什么是 OOP?
这个我答得很菜,不知道怎么解释。。就大概说了 OOP 是把数据和方法绑到一起,然后又说了继承的一些东西。。但是感觉自己解释地很不清楚。 -
Java 中的 Over Load 是什么?
方法重载,同名的方法,也能通过传入参数的不同(方法签名),调用不同的方法。 -
你现在 Java 学到了什么程度?
我回答说目前正在学框架,应该是能花一个星期把框架学好,到能做简单的后台的程度。 -
你说你 Python 是看英文文档学的,为什么会想看英文文档?
我当时就回答了英文资料最前沿。
但是现在看应该能说得更清楚:Python 官方文档没有中文的,而要学好 Python,官方文档是不可避免的。日常写代码,我都会习惯到 Github 上找找是不是已经有相关的项目了,而这些开源项目也大部分只有英文说明。
因此或早或晚都是要接触英文的,所以就选择提早接触了。 -
什么叫关系数据库?和非关系数据库有何差别?如何确定你需要哪种类型的数据库?
关系数据库,也就是以关系为核心来组织数据的数据库。它的理念是把数据尽可能拆分成多个表,然后不同的表之间通过某种关系来连接起来。这样的好处是如果数据的某一部分需要变动,只需要变动该数据所处的表就行,而不会需要重新设计整个数据库。
非关系型数据库,好像基本都是指 键值数据库。以键为索引来存取数据。键值数据库的好处是简单,没有关系数据库那样复杂的约束。因此速度快,性能更优。
一般情况下关系数据库就够了,在需要高性能的情况下,需要考虑使用非关系数据库。 -
你有没有使用过什么非关系数据库?
没有,我只是了解过。 -
那你知道有哪些非关系数据库?
我记得的有 redis、mongoDB。 -
LEFT JOIN 和 RIGHT JOIN 有什么区别?
LEFT 或是 RIGHT,是用来指示以哪个表为主表的。被作为主表的,表内的所有行都会出现在结果集内,而对应的另一表若没有对应的参数,值就为空。 -
http 是不是有状态的协议?
http 是无状态的协议,当客户端发起请求,服务端处理信息后响应该请求,然后一次 http 连接就结束了,下一次的请求和上一次从协议层面上看,是没有任何关系的。
而且 http 连接只能由客户端发起,如果服务端需要向客户端推送消息,一般做法是由 客户端发起一个长连接,服务端等到有消息需要推送时,才发回响应。
可这种做法会对服务器而言,开销太大。因此最近出现了 websocket 协议。(面试时回答地没这么条理清晰,不过说的内容差不多是这样。其实还应该引申一下 cookie 的) -
udp 是不是有连接的协议?
不是,udp 是无连接的,发送方甚至无法知道发出的包是送达了还是丢失了。 -
Python 的 GC
这个我没了解过。 -
Python 的多线程多进程有没有用过?
用过 threading 和 multiprocessing,不过只是在个人的项目中,因此没遇到过大并发的情况。
另外 multiprocessing 有一个多线程子模块:multiprocessing.dummy,该模块的 API 和 multiprocessing 完全一致,但是实现的是多线程。因此如果不确定多线程多进程哪个合适的话,可以先用 multiprocessing.dummy 实现,然后和用多进程比较一下,哪个好就用哪个。 -
异步函数和普通函数有何差别?
之前有了解过异步,因为 python3 最近增加了一个 asyncio 异步库。但是还只限于了解的程度,没有深入。 -
Python Web 开发了解多少?
因为之前一直在学 Java Web,Python 还是用来玩居多,所以没特别了解过。 -
Python 爬虫有没有学过?
只是玩过使用 requests 模拟登录知乎 和 下载 bilibili 视频。没有专门学过爬虫框架。 -
下载 b站 视频的话,视频链接应该是动态的吧。你是怎么抓到视频链接的?
我并没有直接解析 b站 的网页,而是参考了 Gtihub 上已有的 youtube-dl 和 you-get 的代码,发现它们使用的是 b站提供的内部 api,然后就照搬了过来。(忘记补充 b 站的反盗链:referer 字段了) -
有没有了解过 selenium?
用 selenium 模拟浏览器开销也很大,一般来说能不用就不用。而且之前主要还是学 Java,没考虑过爬虫,就没怎么了解过这个。 -
http 和 https 有何差别?
http 是明文通信,假设我在我寝室的路由器上安装了嗅探工具,那通过该路由器的所有 http 信息,都能被该嗅探工具抓到,而且讯息内容都是明文。
而 https 呢,是在 http 上添加了一个安全层协议,请求开始时,会先通过 http 交换公钥,然后才开始真正的通信,讯息是加密的,中间人只能看到密文,而得不到明文。(这里答得不太清楚,其实我也有点忘记 https 证书这些东西了。另外其实还可以说一下用 https 会增加一定的性能开销。) -
你既然说了 websocket,那你对它了解多少?
我只知道 websocket 是先通过 http 协议建立连接,然后再切换到 websocket 协议层的,具体的用法,还没有了解过。 -
冒泡排序是怎么排的?
这个这么简单的问题,我却发现我不太会表述,总之很笨拙地回答了。内容应该不需要说了。。复杂度是 n 的平方(居然忘记把排序算法全补充一遍了。。) -
二分查找是怎么查找的?
每查一次,查询范围就减少一半。复杂度是log N -
为啥报了声学专业?
这个好像是开始的时候问的,我说选声学是高中的时候看科幻小说,小说里描绘地很好,脑子一热就填了。然后现在专业课学得很差。。
后面面试官提到他做 .net 八九年了,以前学的是化学专业哈哈。 -
工作问题
面试官提到公司做的是提供给中小公司的财务税务平台,后端用的是 .net ,前后端分离。而我需要负责的,是爬取财务报表,然后再上传一些报表信息。 -
工作中遇到困难怎么办?
面试官说干软件这一行的,大部分都内向,其中有些人,有问题了也只会憋着,自己胡乱想方法,或者到最后出问题了才说出来。
我说我有问题的话,一般会先搜索,看看 stackoverflow 或者 知乎、或者博客 上是不是已经有现成的比较好的解决方法。如果没有,自己又想不出来好办法的话,会向有经验的同事请教。 -
如果工作中遇到特别急的工作,工作量又特别大,还没有人能抽出手来帮你忙,你怎么办?
我回答了没体验过不清楚,然后被追问,我想工作再多那也只有强上了啊,不然咋办?所以就这么答了。 -
你觉得你有什么特质使你很适合当程序员?
一个是对编程的兴趣。还有就是重视模块化,习惯于把功能拆分成小函数来实现。重视注释,会尽量把注释写得清楚简洁。
然后就是说到工作制,是早8点半到晚5点半,中午休息一小时(八小时),休息日是单双周轮休。实习期是三个月,福利需要等到我拿到毕业证再说,也就是这一年内是没有员工福利的(这个正常么?)。
还有性格问题,团队协作问题,稍微聊了聊。
问到以后的打算,是否会在这边长期工作时。我觉得福利好,能学到东西,工资也能达到我的心理预期的话,我会很愿意长期工作。
最后面试官问我有啥想问的,我说我第一次面试,不知道有啥可问的。。
然后想到他在招聘上写的是招有一年以上经验的 Python 工程师,而我啥经验都没,就问了一下。他说我底子不错学起来快,而且工作其实也不难,就是爬个数据再上传个数据。
写得有点乱。。最后面试官说过两天给答复。
第一次面试,感觉答得还算可以。希望能面上。
6.27. 已经拿到 offer