今天是2022年的6月18日,广州,中雨转阴。(非天气预报)我怀揣着紧张而有激动的心情趁着周末悄悄去面试了一次,说是去面试,其实也和玩差不多(公司的工作氛围很不错,空调很凉,零食很多,但是我没有心情享用)。附上一张当时的随手照,真的证明我当时真的有去面试!
为什么说是去玩呢?主要有三点原因:
一、16日收到面试通知,距离面试两天时间不到。(想尝试去准备,但是无奈知识点太多,索性摆烂)
二、想要面试的岗位是Python助理工程师(实习),这个岗位之前是没有任何的了解的,几乎都不知道它是做什么的,但是第一印象应该是和数据分析或者数据挖掘有关吧(在我看来Python似乎这些领域使用的最多)。看到这里可能有人要问了:你不是学Java的吗?怎么就去找Python的岗位了。这个我下一点再说。
三、面试的机会当然是来自于我的母校,该公司是我们校招的合作企业。当时记得是发了问卷来填报实习申请,后续安排面试。当然我是填了问卷了,我找了一圈也没有找到与Java有关的,只有唯一的一个技术岗,就是实习Python助理工程师。当时我也是心急,特别想去找实习,想去多接触真正的企业级开发,于是就报了Python。
然而让我意外的是我竟然过了初筛,并且收到了面试通知。(如下图所示)
当时可把我激动坏了,因为我原先就不抱什么希望的,没想到我也能过初筛。
但是很快我又发愁了:Python助理,面试会问什么呢?我也没有真的具体的去了解过Python的知识体系(唯一的接触可能就是之前上过公选课吧,电脑上安装了PyCharm不算吧)。于是我选择最保守也就是最蠢的办法:只选择复习了最基础的Python语法(我觉得实习生应该也不会问得太难。)
临近面试,也就是17号晚上,我无意间翻到了岗位的要求(具体的来源貌似是来自学校的就创业公众号的推文信息),原本平静的心,又再一次凉透了,来看看具体的岗位要求吧!
当我看到只招聘两个人的时候,我就知道这次面试99%的概率是在陪跑。大概看一下,真的好Python,对数据采集能力要求非常高。再看看自己,Java虽然也写了不少的项目,但是很多都是类似于支付业务、商城项目等传统架构的项目。匹配度几乎为0啊!
但是自己转念一想,虽然自己可能匹配度不会很高,但是毕竟这也是自学道路上的第一次面试技术岗的机会,值得一试,于是我硬着头皮去面试了。于是就有了开头的一幕。
When your dreams come alive you’re unstoppable,Take a shot chase the sun find the beautiful,We will glow in the dark turning dust to gold
.And well dream it possible ,It possible…………Delacey美妙的歌声吵醒了,没错,已经是18号的早上7点了,今天要去面试!
今天应该是大学生涯起得最早的一天了,于是闹钟一响,我很快就爬起来了,因为我不想我今天的第一天面试就迟到,毕竟也不是一个人去的,还组了个团,不过我那朋友面的不是技术岗,也就不会和我形成竞争了hhhh
很快我弄好了一切,真的是逝者如斯夫,不舍昼夜,很快就到了8点20了,于是打滴滴就去了公司,真不巧,那天早上竟然下起了小雨,总之给人的感觉很不好,在去的路上也用手机搜了好多关于面试的一些知识点,关于面试如何更好地自我介绍,面试结束的时候需要怎么问问题等等。看了很多还是记不下来,一下滴滴就全忘记了。
下车后,雨更大了,于是开始了找面试地点,8楼,还好有电梯,不然真的要累成狗。
进到公司,第一步必然是填表,记得有位哲学家曾经说过人这一生,从一出生就伴随着填表,不是在填表,就是在填表的路上。而且第一次面试前意外的发现,所谓的填表,本质上还是我们在之前问卷上需要填写的问题:诸如姓名、年龄、籍贯、校级荣誉、证书、技能等等,总之很多都是套话。
很快就招呼到我去面试了,面试官大概二十五六岁的样子,看着挺年轻的。
很快面试开始了:
- 问:那我们的面试就正式开始了,先做个简单的自我介绍吧!
答:面试官你好,我是xxx大学的大xx的学生…….(由于此段真的毫无看点,所以略过)
其实到这里就已经算是真的进入了面试环节
第一问:
- 问:好的,我看你的简历上好像基本都是关于Java的,之前有了解过Python方面的东西吗?
答:恩,有了解过,我知道Java和Python两者都是面向对象的编程语言。他们都是解释型语言。(这个地方个人来说回答的并不好,面试官问这个问题很明显是希望我说出Python的一些优势和不足)
总结:主要是关于Python的一些特点与不足(主要是从语言层面来说)
Python的语法是比较简单的,对编程初学者十分友好,并且对代码的格式要求并没有那么严格。
Python是开源的,Python的源代码面向所有的用户开放,这个地方有两个含义:程序员使用Python编写的代码基本上是开源的,Python的解释器和模块都是开源的(像比较常见的一些库,比如web2py webpy等)
Python是一门高级语言,封装了很多的底层细节,不像C或者C++那样需要自行管理内存的申请与释放,使用方便不需要关注细枝末节
Python是一门面向对象的语言,面向对象的特性在常见的大型应用开发中都非常常见。但是面向对象的特点意味着并不像面向过程那样容易让人理解,毕竟事物都是有两面的。
Python也是能够跨平台的,同时也具有很强的扩展性,拥有大量的类库和第三方库可以供我们使用
Python由于是解释型语言,所谓的解释型语言就是对源代码一边翻译,一边运行,运行速度就比较慢,不像编译型语言,直接将源代码整体进行翻译之后一并运行。
Python的代码加密困难,主要症结还是在于解释型语言的特性,编译型语言的源代码会直接将源代码编译成可执行文件,而Python是直接运行源代码。加密比较困难,
第二问:
- 问:那你说说Python的主要应用领域吧
答:就我所知的Python的主要运用领域是在人工智能和大数据领域,因为它的语法相比其他语言来说要简洁很多。
总结:回答应用领域+具体的原因
- 首先是人工智能领域,之所以在人工智能领域比较火热有一个方面的原因是语法比较简洁(另一方面来说,Java也能应用于人工智能领域),其次在于它拥有一个非常完善的生态库,里面拥有着大量的库给予人们使用,最后在于非常简单,可移植,可以让研究人员更多的把精力放在算法设计方面
- 其次是web开发,Python拥有很多免费数据函数库、免费web网页模板系统、以及与web服务器进行交互的库,可以实现web开发,搭建web框架,目前比较有名气的Python web框架为Django。从事该领域应从数据、组件、安全等多领域进行学习,从底层了解其工作原理并可驾驭任何业内主流的Web框架。
- 再次是自动化运维,Python是一门综合性的语言,能满足绝大部分自动化运维需求,前端和后端都可以做,从事该领域,应从设计层面、框架选择、灵活性、扩展性、故障处理、以及如何优化等层面进行学习。
- 最后是进行数据挖掘和数据分析,在未来,谁掌握了数据,谁就掌握了主动权,并且Python拥有很多进行科学计算的第三方库。
第三问:
- 问:其实Python也有类的,那你能简单说说Python和Java的类之间有什么区别吗?
答:额……….(这个是真不知道,然后让面试官跳过了)
总结:简单比较Java和Python的类之间的区别(因为两个都是面向对象的语言)
- 首先是访问控制方面,Java的访问控制比较严格,主要有4种,private 、default、protected、public,权限由低到高,Python相比较而言,没有那么严格,python只有public/non-public两种限定,并且python没有明显的修饰符,以双下划线("_ _’)开头的属性为non-public,而其他则为public。
- 其次是类定义与编译单元(文件)的关系,Java中具有public class和class两种不同的形式,而python则没有关于类的限定,这个不同之处体现在工程上就是,Java中public类必须定义在同名文件中,因此一个文件只能定义一个public类。而python则没有这种限制,它可以在一个模块中定义多个类。
- 最后,继承方面,Java不支持多继承,而Python支持的是多继承,并且Python为了实现多态,采用"duck type”形式来达到相似于接口的目的。
第四问:
- 问:我看到你的简历上说你熟悉Linux操作系统,那你能说说几个常用的Linux操作系统的常用命令吗?
答:好的,常用的有cd ps chmod chown ./ …/ sync mkdir vim 等等
这一问算比较简单的,回答了一些比较常用的Linux操作系统的常用命令,感觉面试官对于这一部分还是比较满意的,和他还聊到了笔者现在正在使用的深度操作系统
深度操作系统,即deepin,是由武汉深之度科技有限公司在Debian基础上开发的Linux操作系统,其前身是Hiweed Linux操作系统,于2004年2月28日开始对外发行,可以安装在个人计算机和服务器中 [1] 。
deepin操作系统内部集成了Deepin Desktop Environment(中文通称:深度桌面环境),并支持deepin store、deepin Music、deepin Movie等第一方应用软件。
这里就不得不提及一下深度桌面环境,即DDE,在我之前的安装OpenEuler的推文中有比较详细介绍如何安装这一环境。
笔者推荐使用Linux操作系统进行办公的小伙伴们可以尝试一下,推荐使用的原因主要有三个方面:
第五问:
- 问:那你能说说常见的MySQL的索引类型有哪些吗?
答:主键索引还有……….(这个问题真没答上来,主要是因为索引这方面平时用的也不多,因为数据量实在太小了,只知道有一个主键索引,但是用的也不多,毕竟索引虽然快是快,但是也有很明显的弊端)
总结:MySQL常见的索引类型有哪些?
CREATE INDEX index_name ON table(column(length))
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
DROP INDEX index_name ON table
CREATE UNIQUE INDEX indexName ON table(column(length))
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
DROP UNIQUE INDEX index_name ON table
一般是在建表的时候同时创建主键索引
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
PRIMARY KEY(ID)
表示主键索引,同时可以使用ALTER创建主键索引
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
组合索引是多列值组成的一个索引,专门用于组合搜索,其效率大于索引合并。
ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);
CREATE FULLTEXT INDEX index_content ON article(content)
ALTER TABLE article ADD FULLTEXT index_content(content)
注意:
在MySQL 5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词.
总的来说自己在这一方面确实掌握的不够扎实,MySQL的索引、表、各种锁是面试高频问题,很难,也很多。
第六问:
- 好的,那你知道数据库事务的四大原则吗?
答:主要是指的是ACID原则,原子性、持久性、隔离性….(这里想了半天也没想出来,最后面试官提醒了一下是一致性原则。该死,这个也能忘了,算是easy模式了)
总结:数据库事务的四大原则:
拓展:事务的隔离级别有那些:
1.读未提交(Read uncommitted);这是并发最高,一致性最差的隔离级别。可能会读到不一样的数据,即出现脏读
2.读已提交(Read committed);可以避免脏读的出现
3.可重复读(Repeatable read),数据库默认开启;可避免 脏读 、不可重复读 的发生。(不可重复读就是指对于数据库中的某个数据,一个事务范围内的多次查询却返回了不同的结果,这是由于在查询过程中,数据被另外一个事务修改并提交了。)
4.串行化(Serializable );可避免 脏读、不可重复读、幻读 的发生。(幻读指事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读)
隔离级别由低到高。级别越高,执行效率越低。
第七问:
- 问:简历上说熟悉非关系型数据库,能说说具体了解到了哪些吗?
答:主要是包括了非关系型数据库中的Redis缓存数据库,以及文档型数据库MongoDB
问:好的,那你能说说redis中的缓存穿透、缓存击穿和缓存雪崩吗?简单说说就好。
答:这个缓存穿透呢,主要是指频繁请求缓存数据库中没有的数据,因为缓存中没有所以必须要去持久层数据库去查询,因此造成频繁的请求持久层数据库并且在数据库中也查询不到,直到拖垮数据库,导致服务器宕机。
缓存击穿,是指某一个时刻热点数据失效,而此时拥有大量请求该数据,因为缓存中的数据已经失效,导致直接跳过缓存数据库,去大量请求持久层数据库,造成服务器宕机。
缓存雪崩,主要是某一时刻大量的缓存数据集中过期,此时又有大量数据请求数据库造成宕机。
总结:对应的解决方案
第八问:
9.问:(看了看简历)熟悉SSM框架,那你能说说SpringMVC中的三个字母:MVC分别代表什么吗?
答:M表示Model表示数据模型,V表示View,表示用户视图,C表示Controller,表示控制器
问:好的,你知道Java有SpringMVC的三层架构,那你觉得Python可以实现MVC三层架构吗?
答:我个人觉得Python其实也是可以实现MVC三层架构模型的,因为MVC本质上是属于一种架构,是一种思想,本质上并不依赖于某项具体的语言,语言只是工具,思想才是解决需求的重中之重。
总结:Python本质上也是可以实现MVC架构的,例如比较著名的Python web框架:django,其中就运用到了MVC的分层思想,将数据和对应的控制、视图等进行分离,层次清晰,各司其职。编程的学习本质上学习的还是设计的思想,语言语法只是其次的。
第九问:
- 问:学过MVC,说说post和get的区别吧
答:get请求主要将参数值放在URL中,post主要不显示参数值。并且get主要用于查询一些数据,根据指定参数传。post主要用于网页表单提交,因为有些value值是不可见的。(感觉答到区别了,又好像没有)
总结:Post和Get的主要区别
第十问:
- 问:你能简单说说冒泡排序吗?
答:(这个完全没答上来,之前是学过冒泡排序,还用Java实现过,但是由于很长时间没有接触了,很多都忘记了)
总结:冒泡排序算法
算法是一个痛点也是一个难点,力扣的题目是不能停的,并且基本的排序和二分查找是必须要掌握的,面试很多时候都会问,这里实习面试也问到了最基本的冒泡排序算法。
第十一问:
12.问:我看你简历上学得都是Java,未来想从事Java还是Python的工作呢?
答:(思考了几秒钟)大概率是java吧(虽然我知道这是送命题,他希望我回答的是python,但我还是回答了Java,对,永远Love Java)
总结,其实这个问题还挺有深意的,因为面试的岗位是Python,但是我只知道Python的一些基本的知识,很明显不符合岗位的要求,但他还是问了Java还是Python的问题,可能是在给我提个醒,要面试Python岗位,就需要掌握更多的Python方面的知识。(个人猜测)
第十二问:
问:你还有什么要问的吗?
答:(莽撞了)我想了解一下贵公司的福利待遇是怎么样的?
问:这个呢,要根据实习生的具体的工作来定,而且我们是周末双休的。还有什么要问的嘛?
答:额,暂时没有了。
问:好,那我们今天的面试就结束了。
答:好的,谢谢!(出来了,感觉已经凉了。因为自己感觉答得不是很好)
Over,面试结束,感觉凉透了。稍微总结一下:
面试的结果和我自己预想的一样,没有通过,不过问题不大,第一次实习面试,重要的是积累经验,查缺补漏,面试官指出的很多时候可能真的是自己需要重视的地方,可能下次面试还会再问,所以要及时总结复盘。(虽然我这确实是有点晚了,但是仍旧记忆犹新。)
最后,希望我们都能做到:
知我所能,我所能者,尽善尽美。知我所不能,我所不能者,虚怀若谷。
Linux概述
Linux磁盘与启动程序
Linux下的目录结构
OpernEuler的保姆级安装
基于deepin的MySQL安装