虚言妙诀终虚见,面试躬行是致知,Python技术面试策略与技巧实战记录
2021年,对于正在找工作的朋友来说,笼罩在新冠肺炎疫情之下,今年的就业季显得更加具有挑战性,更有意思的是,每当这个时候,各种面试经验分享就如同过江之鲫一般,俯拾皆是,因为例子过多,兹不细举。然而这些面试经验大部分都停留在理论阶段,这就造成了一个问题:理论和实际,到底有多大出入?我国古代大名仕曾文正公曾经说:“天下事,在局外呐喊议论,总是无益,必须躬身入局,挺膺负责,方有成事之可冀。”革命先烈李大钊先生也曾感叹:“凡事都要脚踏实地去作,不驰于空想,不骛于虚声,而惟以求真的态度作踏实的工夫。以此态度求学,则真理可明,以此态度做事,则功业可就。”所以本次我们来进行一次真实的线上面试,正所谓空谈误国,实干兴邦,能够检验真理的也只有实践这一条路。
首先打开某著名垂直招聘app软件,寻找我们的猎物:
可以看到,我们找到了北京某企事业单位的高级python开发岗位,正所谓不打无准备之仗,在正式面试之前,我们需要对该岗位进行分析,尝试推测出面试中可能会被问到的问题,首先该岗位要求有flask/django/tornado的经验,那么可以肯定,web开发必定是主要工作,尤其是flask,很有可能是该职位的主力框架,所以我们需要准备python基础、网络协议、以及flask和django的一些相关知识用来应对。其次,要求对mysql/pgsql/es/redis等数据库有使用经验,那么可以推测出对数据库要熟练使用,特别是pgsql,要准备pgsql与mysql的异同,同时注意到文中提及es,那么对于全文检索相关的知识点也需要有所准备,最后redis相关的nosql数据库知识点也必须巩固,以备不时之需。最后,该职位提及需要熟悉linux常用命令以及docker生态体系,同时有关于selenium自动化测试经验。由此可以推断出:该岗位有可能需要参与运维或者部署工作,同时也有很大机会参与到自动化测试项目中去,所以对于docker和selenium相关知识点的筹备刻不容缓,除此之外,如果还能准备一些深度学习的案例和项目那就更是锦上添花了。
万事俱备,择一黄道吉日,我们开始面试:
面试官:请您做一下自我介绍?
面试者:您好,我是15年毕业的,在内蒙古民族大学学的计算机,毕业之后呢,教了两年的高中计算机课程,干了两年多以后在我们本地找了一家公司做微信小程序开发,然后我们这个前端是用的这个mp-vue框架,后端就是用Django,写的是一个C端的电商平台,最近日活维持在5万左右。
我主要负责的就是后端的Django的一些接口逻辑开发,主要和业务打交道,另外也接触过持续交付部署,我们采用的是这个容器式部署(docker),还有灰度的测试以及监控以及一些日常的sql语句提取数据小bug修复这类的工作,最近就是我看咱们公司的这个职位里要求这个selenium,
最近我也研究了一下selenium,并且写了一个小脚本,就是可以自动化上传表单数据。这就是我最近的一些工作。
其实自我介绍最忌讳的就是说废话,比如姓名、年龄这些简历中都有体现,所以我们要说点简历中没有的,比如自己的项目过往,取得的成就与建树(日活5万,日活是一个非常重要的指标,对于增长后期的产品,一个关键的提升指标就是做活跃,虽然5万日活还无法变现,但它是一个从0到1的过程,是百万日活的基础),甚至有意无意的,谈论的技术点可以往岗位描述上倾斜,比如岗位描述中出现过的django、部署、docker、selenium等技术,都可以在面试的自我介绍中再次出现,暗示自己与该岗位珠连璧合,相得益彰。需要注意一点的是,面试过程中最好全程使用敬语:您,以示尊敬。
面试官:好的,你简单说下这个es全文检索,
面试者:es是这样,就是当时我们就是想做一个这个检索功能嘛,但是这个老板要求是他这个响应时间要比较短,所以我们就采用这个es,es本身就是他就是这个基于内存它的这个响应速度比较快,第二它是基于这个倒排索引,速度上要比那个mysql的那个正向索引,io操作要损耗的小一些,所以当时我是结合结巴分词不知道您听没听说过?
面试官:略有耳闻。
面试者:我们可以理解为,将用户搜索的语句进行分词操作,给它切词切完词之后呢,我按照词性做这个索引,我就是举个简单例子,比如说他要搜这个超薄笔记本,但实际上超薄和笔记本一个是形容词,一个是名词,那其实我是把这个词性作为这个搜索等级,形容词优先级为2;名词作为优先级为1。在es里做那个分层索引,按照优先级来去检索数据。
开始正式进入技术面试,首先面试官问了岗位描述中出现过的技术点:es全文检索,我们可以先简单介绍一下项目背景、底层原理,同时在适当时候,进行反问,反问的意义在于,避免枯燥的一问一答模式,能够增加互动,调节气氛,最后在技术细节上,最好举例子,而不是泛泛而谈,这里既是以用户搜索“超薄笔记本”为例子,详细阐述后端es的检索策略,关于检索策略,其实本质上讨论的是搜索词权重(术语权重,也称作Term Necessity,Query Term Weight)问题,属于检索词解析的一部分。熟悉倒排索引的朋友都知道,文档通常以词的粒度建立索引。所以对于词的解析,在检索解析中属于非常重要的工作,其中,不仅仅包括正确识别目标词,还包括围绕目标词的各种特征提取,所以,当检索词文本中包含不止一个词时,问题的复杂程度就发生指数级的增长。用户的搜索有更具体的需求,最直观的体现于文本长度增长,围绕目标词有了更多的补充、限制。同时语序也相较文章类文本更加自由,解决方案就是通过结巴分词对检索词进行切词操作,当检索词存在多个词时,每个词的重要程度是不同的,在基于词召回的基础上,对词设立优先级(基于词性),以此达到近似用户原始需求的语义级别。
面试官:那请再谈谈系统的登录模块。
面试者:登录模块一开始做了一个相对简单的校验功能,那么后续我是做了一下优化,就改成了这个openldap,不知道您听没听说过,就是一个基于层级架构的统一管理系统。
面试官:好像没有听说过。
面试者:它有点像es,检索速度非常快,也是便于统一管理,也是为了便于扩展,防止以后有多个项目即陆续上线重复造轮子,同时,B端如果新上线一些项目的话,方便我做single sign on,就是单点登录。这也是我自己个人后续改造的一个小系统,可以理解为统一认证,就是把登录这个东西作为微服务给它抽离出来。
登录模块对于大部分应用来说,都是最基础的模块。看似简单,却与相当多的产品功能用户使用场景交织在一起,受到产品类型、用户定位、业务逻辑、使用场景、用户操作等不同因素影响,所以此时我们需要上升产品高度,避免流水账式的描述,而是点出统一认证(openldap)和微服务架构,同样使用反问来试探对方的知识体系深浅,最后基于统一认证体系,点出最终功能实践:Single Sign On(单点登录)。
面试官:ok,了解,你们后台权限管理是怎么设计的?用过xadmin吗?
面试者:后台权限系统是我们是自己研发的,当然了,一开始技术选型的时候也考虑过xadmin,但是它里面系统设计您应该也了解过,就是它本身二开的时候,门槛比较高,因为逻辑设计的比较复杂,如果说我想去改他的模板,或者说我想在他中间键里边做一些扩展,有点麻烦,所以我是单独把他单独抽出来自己做的。
面试官:能具体谈谈吗?
面试者:我是改造了xadmin的那个权限系统就是用了一套位运算的系统,我不知道您了解没了解过位运算。
面试官:就是类似二进制的运算?
面试者:对,我是将不同的系统节点的对应到每一个二进制位的位上,然后我针对用户带过来的权限节点,对相应的位做这个位与运算,来获取相关权限,进行授权操作则使用位或运算。
其实关于权限系统,无非就是权限模型的使用(acl/rbac/abac),但是如果你在权限设计的形式上做出一点创新,那么就像黑火药时代里突然诞生的核弹一样,一定会给面试官留下深刻印象,比如说计算机最底层的基础:位运算。众所周知,运算速度快、效率高、节省存储空间、对权限控制非常灵活。所有语言都提供了位运算符,包括Python,我们可以在不同语言实现的系统、甚至数据库中使用位运算实现对用户权限的管理。当然了,位运算也会带来一些局限性,随着权限码增加,数据长度也相应的增长。这就要求权限码不能超过计算本身运算长度,在数据库中存储权限码时,权限码长度也不能的超过所使用数据类型。如:在32位系统中,权限节点数量不能多于32个。而如果基于mySQL数据库的BIGINT,其存储空间为8Byte,使用BIGINT存储存储码时,权限数不能多于64个。
面试官:好的,能说说离职原因吗?
面试者:我是这么考虑的,我其实就是觉得人嘛,应该是往更高的追求去发展,更大的环境,更大的市场来锻炼自己,对吧?
面试官:嗯。
面试者:当然这是我个人认为啊,而且现在我觉得现在的情形是逆水行舟,不进则退,因为现在北京疫情还是挺严重的,但是我觉得这是我的真正的机会,我应该抓住。
面试官:好的,那你4号能来公司吗?
面试者:可以,我买好机票了已经。
面试到了这个阶段,基本上技面已经结束,剩下就是人资问题了,关于离职原因很多朋友喜欢说诸如公司倒闭、搬迁、裁员等是由,但实际上,这些理由并不是面试官“想”听的,那么从人力资源管理的角度出发,面试官到底想听点什么呢?他想要一些主动而正面的原因,而不是一些被动的原因,因为裁员、搬迁和倒闭这些都是被动的,你“被迫”离开原公司。所以说白了,他需要你给他一点企图心,企图心是指一个人做成某件事情,或达成既定目标的意愿。 企图心的强烈程度,取决于意愿的大小,如果意愿越强烈,说明企图心越大,成功的可能就越高,所以,理所当然的,你需要向他证明你是带着企图心来面试的。
面试官:好的,那回头见?
面试者:好的,非常感谢您给我这次面试的机会
面试官:别那么客气,88
面试者:好的,再见
最后,我们需要以一个感谢来结束整个面试,无论面试成功与否,一个真诚的致谢会给面试官留下好的印象,感谢对方的同时,也感谢自己的努力。关于整个面试流程的视频,请移步:
结语:就像《双城记》里面写的那样:这是最好的时代,这是最坏的时代;这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂,人们正在直下地狱。在这个疫情反复无常的年代,有时让人们觉得有无限期待,有时又让人陷入无限的绝望,但无论如何,我们总要直面困难,开启新的征程,与其坐而论道,不如起而行之,在生活中学会生活,在面试中学会面试。