原文转载自「刘悦的技术博客」https://v3u.cn/a_id_183

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
面试者:好的,再见

最后,我们需要以一个感谢来结束整个面试,无论面试成功与否,一个真诚的致谢会给面试官留下好的印象,感谢对方的同时,也感谢自己的努力。关于整个面试流程的视频,请移步:

https://www.bilibili.com/video/BV1da4y1J7yE

结语:就像《双城记》里面写的那样:这是最好的时代,这是最坏的时代;这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂,人们正在直下地狱。在这个疫情反复无常的年代,有时让人们觉得有无限期待,有时又让人陷入无限的绝望,但无论如何,我们总要直面困难,开启新的征程,与其坐而论道,不如起而行之,在生活中学会生活,在面试中学会面试。

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_183

虚言妙诀终虚见,面试躬行是致知,Python技术面试策略与技巧实战记录的更多相关文章

  1. 谷歌技术面试要点(Google面试)(14年5月20日交大专场)

    技术面试的主题 1.简要自我介绍: 姓名.学校.专业 做过的项目与实习 个人主要成就 2.技术评估: 构建与开发算法 编程 计算机基础知识 数据结构 现实世界问题解决能力 设计问题(主要针对博士生) ...

  2. KVM 介绍(8):使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机 [Nova Libvirt QEMU/KVM Live Migration]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  3. C++对象的内存布局以及虚函数表和虚基表

    C++对象的内存布局以及虚函数表和虚基表 本文为整理文章, 参考: http://blog.csdn.net/haoel/article/details/3081328 http://blog.csd ...

  4. KVM(八)使用 libvirt 迁移 QEMU/KVM 虚机和 Nova 虚机

    1. QEMU/KVM 迁移的概念 迁移(migration)包括系统整体的迁移和某个工作负载的迁移.系统整理迁移,是将系统上所有软件包括操作系统完全复制到另一个物理机硬件机器上.虚拟化环境中的迁移, ...

  5. c++ 虚函数和纯虚函数

    在你设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的.从设计的角度讲,出现在基类中的虚函数是接口,出现在派生类中的虚函数是接口的具体实现.通过这样的方法,就可以将对象 ...

  6. C++ - 虚基类、虚函数与纯虚函数

    虚基类       在说明其作用前先看一段代码 class A{public:    int iValue;}; class B:public A{public:    void bPrintf(){ ...

  7. C++ 虚函数与纯虚函数

    #include<iostream> #include<string> using namespace std; class A{ public: virtual void f ...

  8. c++中虚函数和纯虚函数定义

    只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声 ...

  9. c/c++ 基金会(七) 功能覆盖,虚函数,纯虚函数控制

    1.功能覆盖 ClassA , ClassB ,其中ClassB继承ClassA 类的定义如下面的: #ifndef _CLASSA_H #define _CLASSA_H #include < ...

随机推荐

  1. vue - Vue路由(扩展)

    忙里偷闲,还在学校,趁机把后面的路由多出来的知识点学完 十.缓存路由组件 让不展示的路由组件保持挂载,不被销毁 在我们的前面案例有一个问题,都知道vue的路由当我们切换一个路由后,另一个路由就会被销毁 ...

  2. java_简单学习笔记

    java_study笔记 前言: 所有笔记均总结自狂神的java基础视频 https://www.bilibili.com/video/BV12J41137hu?p=1 idea小技巧 psvm+回车 ...

  3. Python技法:浮点数取整、格式化和NaN处理

    1. 取整的三种方法 1.1 强转int类型 这种方法会直接对浮点数的小数部分进行截断(无论是正还是负). print(int(2.7)) # 2 print(int(-2.7)) # -2 1.2 ...

  4. forms组件补充与ModelForm简单使用与cookie与session

    目录 forms组件钩子函数 forms组件字段参数 字段参数 validators详解 choices详解 widget详解 forms组件字段类型 ModelForm简单使用 cookie与ses ...

  5. 安装Sonarqube到CentOS(YUM)

    SonarQube 是一个用于代码质量管理的开源平台,用于管理源代码的质量. 通过插件形式,可以支持包括 java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groo ...

  6. linux-ext4格式文件误删除,该如何恢复?

    在开始进行实验之前,我已经新建了一个空目录/data,并将该目录挂载了一块新硬盘,将硬盘分区格式化为ext4的格式,所以当我操作/data目录下的文件及文件夹的时候,实际上就是针对新挂载的硬盘进行数据 ...

  7. DAST 黑盒漏洞扫描器 第二篇:规则篇

    0X01 前言 怎么衡量一个扫描器的好坏,扫描覆盖率高.扫描快.扫描过程安全 而最直接的效果就是扫描覆盖率高(扫的全) 怎么扫描全面,1 流量全面 2 规则漏报低 流量方面上篇已经讲过,这篇主要讲扫描 ...

  8. Bean Validator

    Bean Validator 关于Jakarta EE 2018年03月, Oracle 决定把 JavaEE 移交给开源组织 Eclipse 基金会,并且不再使用Java EE这个名称. 因此jav ...

  9. Python3 filter()函数和map()函数

    filter(function or None,iterable) 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换. 该接收两个参数,第 ...

  10. junit 5 - Display Name 展示名称

    本文地址:https://www.cnblogs.com/hchengmx/p/14883563.html @DisplayName可以给 测试类 或者 测试方法来自定义显示的名称.可以支持 空格.特 ...