一个javaer面试Python | Attempt

Python初面

一、初面缘由

​ 今天是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楼,还好有电梯,不然真的要累成狗。

进到公司,第一步必然是填表,记得有位哲学家曾经说过人这一生,从一出生就伴随着填表,不是在填表,就是在填表的路上。而且第一次面试前意外的发现,所谓的填表,本质上还是我们在之前问卷上需要填写的问题:诸如姓名、年龄、籍贯、校级荣誉、证书、技能等等,总之很多都是套话。

很快就招呼到我去面试了,面试官大概二十五六岁的样子,看着挺年轻的。

很快面试开始了:

  1. 问:那我们的面试就正式开始了,先做个简单的自我介绍吧!

答:面试官你好,我是xxx大学的大xx的学生…….(由于此段真的毫无看点,所以略过)

其实到这里就已经算是真的进入了面试环节

第一问:

  1. 问:好的,我看你的简历上好像基本都是关于Java的,之前有了解过Python方面的东西吗?

答:恩,有了解过,我知道Java和Python两者都是面向对象的编程语言。他们都是解释型语言。(这个地方个人来说回答的并不好,面试官问这个问题很明显是希望我说出Python的一些优势和不足)

总结:主要是关于Python的一些特点与不足(主要是从语言层面来说)

  • Python的语法是比较简单的,对编程初学者十分友好,并且对代码的格式要求并没有那么严格。

  • Python是开源的,Python的源代码面向所有的用户开放,这个地方有两个含义:程序员使用Python编写的代码基本上是开源的,Python的解释器和模块都是开源的(像比较常见的一些库,比如web2py webpy等)

  • Python是一门高级语言,封装了很多的底层细节,不像C或者C++那样需要自行管理内存的申请与释放,使用方便不需要关注细枝末节

  • Python是一门面向对象的语言,面向对象的特性在常见的大型应用开发中都非常常见。但是面向对象的特点意味着并不像面向过程那样容易让人理解,毕竟事物都是有两面的。

  • Python也是能够跨平台的,同时也具有很强的扩展性,拥有大量的类库和第三方库可以供我们使用

  • Python由于是解释型语言,所谓的解释型语言就是对源代码一边翻译,一边运行,运行速度就比较慢,不像编译型语言,直接将源代码整体进行翻译之后一并运行。

  • Python的代码加密困难,主要症结还是在于解释型语言的特性,编译型语言的源代码会直接将源代码编译成可执行文件,而Python是直接运行源代码。加密比较困难,

第二问:

  1. 问:那你说说Python的主要应用领域吧

答:就我所知的Python的主要运用领域是在人工智能和大数据领域,因为它的语法相比其他语言来说要简洁很多。

总结:回答应用领域+具体的原因

  • 首先是人工智能领域,之所以在人工智能领域比较火热有一个方面的原因是语法比较简洁(另一方面来说,Java也能应用于人工智能领域),其次在于它拥有一个非常完善的生态库,里面拥有着大量的库给予人们使用,最后在于非常简单,可移植,可以让研究人员更多的把精力放在算法设计方面
  • 其次是web开发,Python拥有很多免费数据函数库、免费web网页模板系统、以及与web服务器进行交互的库,可以实现web开发,搭建web框架,目前比较有名气的Python web框架为Django。从事该领域应从数据、组件、安全等多领域进行学习,从底层了解其工作原理并可驾驭任何业内主流的Web框架。
  • 再次是自动化运维,Python是一门综合性的语言,能满足绝大部分自动化运维需求,前端和后端都可以做,从事该领域,应从设计层面、框架选择、灵活性、扩展性、故障处理、以及如何优化等层面进行学习。
  • 最后是进行数据挖掘和数据分析,在未来,谁掌握了数据,谁就掌握了主动权,并且Python拥有很多进行科学计算的第三方库。

第三问:

  1. 问:其实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”形式来达到相似于接口的目的。

第四问:

  1. 问:我看到你的简历上说你熟悉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操作系统进行办公的小伙伴们可以尝试一下,推荐使用的原因主要有三个方面:

  1. 这是由我国深度科技自主研发的桌面环境,具有自主知识产权。
  2. 由于是我国深度科技自主研发的,所以相比其他的桌面环境(如GNOME、KDE等),个人认为更符合国人的使用习惯。(界面UI类似于Windows+MacOS)
  3. 随着深度操作系统越来越受欢迎,部分主流Linux发行版直接集成深度桌面环境和深度系列应用。

第五问:

  1. 问:那你能说说常见的MySQL的索引类型有哪些吗?

答:主键索引还有……….(这个问题真没答上来,主要是因为索引这方面平时用的也不多,因为数据量实在太小了,只知道有一个主键索引,但是用的也不多,毕竟索引虽然快是快,但是也有很明显的弊端)

总结:MySQL常见的索引类型有哪些?

  1. 普通索引,是最基本的索引,他没有任何的限制,值可以为空,仅仅是为了加快查询而已。可以通过以下方式创建和删除索引:
  • 直接创建索引
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
  1. 唯一索引,与普通索引类似。不同点在于,**索引列的值必须唯一,并且允许有空值。**简单说就是唯一索引:加快查询+列值唯一(可以有null)
  • 创建唯一索引
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
  1. 主键索引,是一种特殊的唯一索引,一个表只能有一个主键,并且不允许有空值,简单来说就是:加快查询+列值唯一(不可为null)+表中只有一个

一般是在建表的时候同时创建主键索引

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` ) 
  1. 组合索引,是指在多个字段上创建的索引,只有在查询条件使用了创建索引的第一个字段,索引才会被使用。使用组合索引遵循最左前缀集合

组合索引是多列值组成的一个索引,专门用于组合搜索其效率大于索引合并。

ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);
  1. 全文索引,主要是用于查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。全文索引是对文本的内容进行分词,进行搜索。
  • 直接创建全文索引
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的索引、表、各种锁是面试高频问题,很难,也很多。

第六问:

  1. 好的,那你知道数据库事务的四大原则吗?

答:主要是指的是ACID原则,原子性、持久性、隔离性….(这里想了半天也没想出来,最后面试官提醒了一下是一致性原则。该死,这个也能忘了,算是easy模式了)

总结:数据库事务的四大原则:

  1. A(Atomicity):原子性,是指一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了。
  2. C(Consistency):是指事务的运行并不改变数据库中数据的一致性。例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
  3. I(Isolation):是指两个以上的事务不会出现交错执行的状态。因为这样可能会导致数据不一致,更加具体的来讲,就是事务之间的操作是独立的。
  4. D(Durability):是指事务执行成功以后,该事务对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。

拓展:事务的隔离级别有那些:

1.读未提交(Read uncommitted);这是并发最高,一致性最差的隔离级别。可能会读到不一样的数据,即出现脏读

2.读已提交(Read committed);可以避免脏读的出现

3.可重复读(Repeatable read),数据库默认开启;可避免 脏读 、不可重复读 的发生。(不可重复读就是指对于数据库中的某个数据,一个事务范围内的多次查询却返回了不同的结果,这是由于在查询过程中,数据被另外一个事务修改并提交了。)

4.串行化(Serializable );可避免 脏读、不可重复读、幻读 的发生。(幻读指事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读)

隔离级别由低到高。级别越高,执行效率越低。

第七问:

  1. 问:简历上说熟悉非关系型数据库,能说说具体了解到了哪些吗?

答:主要是包括了非关系型数据库中的Redis缓存数据库,以及文档型数据库MongoDB

问:好的,那你能说说redis中的缓存穿透、缓存击穿和缓存雪崩吗?简单说说就好。

答:这个缓存穿透呢,主要是指频繁请求缓存数据库中没有的数据,因为缓存中没有所以必须要去持久层数据库去查询,因此造成频繁的请求持久层数据库并且在数据库中也查询不到,直到拖垮数据库,导致服务器宕机。

缓存击穿,是指某一个时刻热点数据失效,而此时拥有大量请求该数据,因为缓存中的数据已经失效,导致直接跳过缓存数据库,去大量请求持久层数据库,造成服务器宕机。

缓存雪崩,主要是某一时刻大量的缓存数据集中过期,此时又有大量数据请求数据库造成宕机。

总结:对应的解决方案

  • 对于缓存穿透而言:
    • 对请求参数进行校验,不合理直接返回
    • 查询不到的数据也放到缓存,value为空,如 set -999
    • 使用布隆过滤器,快速判断key是否在数据库中存在,不存在直接返回
  • 对于缓存击穿而言:
    • 设置key永远不过期,或者快过期时,通过另一个异步线程重新设置key
    • 当从缓存拿到的数据为null,重新从数据库加载数据的过程上锁
  • 对于缓存雪崩而言:
    • 分析用户行为,尽量让失效时间点均匀分布。避免缓存雪崩的出现
    • 采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力。

第八问:

9.问:(看了看简历)熟悉SSM框架,那你能说说SpringMVC中的三个字母:MVC分别代表什么吗?

答:M表示Model表示数据模型,V表示View,表示用户视图,C表示Controller,表示控制器

问:好的,你知道Java有SpringMVC的三层架构,那你觉得Python可以实现MVC三层架构吗?

答:我个人觉得Python其实也是可以实现MVC三层架构模型的,因为MVC本质上是属于一种架构,是一种思想,本质上并不依赖于某项具体的语言,语言只是工具,思想才是解决需求的重中之重。

总结:Python本质上也是可以实现MVC架构的,例如比较著名的Python web框架:django,其中就运用到了MVC的分层思想,将数据和对应的控制、视图等进行分离,层次清晰,各司其职。编程的学习本质上学习的还是设计的思想,语言语法只是其次的。

第九问:

  1. 问:学过MVC,说说post和get的区别吧

答:get请求主要将参数值放在URL中,post主要不显示参数值。并且get主要用于查询一些数据,根据指定参数传。post主要用于网页表单提交,因为有些value值是不可见的。(感觉答到区别了,又好像没有)

总结:Post和Get的主要区别

  1. GET提交的数据放在URL中,POST则不会。这是最显而易见的差别。这点意味着GET更不安全(POST也不安全,因为HTTP是明文传输抓包就能获取数据内容,要想安全还得加密)
  2. GET回退浏览器无害,POST会再次提交请求(GET方法回退后浏览器再缓存中拿结果,POST每次都会创建新资源)
  3. GET提交的数据大小有限制(是因为浏览器对URL的长度有限制,GET本身没有限制),POST没有
  4. GET可以被保存为书签,POST不可以
  5. GET能被缓存,POST不能
  6. GET只允许ASCII字符,POST没有限制
  7. GET会保存再浏览器历史记录中,POST不会

第十问:

  1. 问:你能简单说说冒泡排序吗?

答:(这个完全没答上来,之前是学过冒泡排序,还用Java实现过,但是由于很长时间没有接触了,很多都忘记了)

总结:冒泡排序算法

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 重复步骤1~3,直到排序完成。

算法是一个痛点也是一个难点,力扣的题目是不能停的,并且基本的排序和二分查找是必须要掌握的,面试很多时候都会问,这里实习面试也问到了最基本的冒泡排序算法。

第十一问:

12.问:我看你简历上学得都是Java,未来想从事Java还是Python的工作呢?

答:(思考了几秒钟)大概率是java吧(虽然我知道这是送命题,他希望我回答的是python,但我还是回答了Java,对,永远Love Java)

总结,其实这个问题还挺有深意的,因为面试的岗位是Python,但是我只知道Python的一些基本的知识,很明显不符合岗位的要求,但他还是问了Java还是Python的问题,可能是在给我提个醒,要面试Python岗位,就需要掌握更多的Python方面的知识。(个人猜测)

第十二问:

  1. 问:你还有什么要问的吗?

    答:(莽撞了)我想了解一下贵公司的福利待遇是怎么样的?
    问:这个呢,要根据实习生的具体的工作来定,而且我们是周末双休的。还有什么要问的嘛?
    答:额,暂时没有了。
    问:好,那我们今天的面试就结束了。
    答:好的,谢谢!(出来了,感觉已经凉了。因为自己感觉答得不是很好)

Over,面试结束,感觉凉透了。稍微总结一下:

  1. 重视基础,基础基础基础,重要的事说三遍,面试实习要求有项目经验也不太现实,因此基础就非常重要,所以什么是基础,笔者认为基础就是:数据结构和算法、操作系统、计算机组成原理、计算机网络还有自己学的语言的基本语法(这个必须要烂熟于心!!!!)
  2. 面试其实也是一场心理战,不要过度紧张,否则真的很影响发挥。
  3. 一定要准备一下,不能不准备就去面试,否则会让面试官和你都很尴尬(我这次面试就是这样的)。**面试造火箭,入职拧螺丝。**至少现实是这样的大趋势。
  4. 简历非常关键,制作简历的时候心里要有个底,如果是满分100分,自己的水平是在哪个区间段上,同时简历上要注意措辞的严谨性,精通这个词最好不要出现,因为感觉太不谦虚了,至少对这个行业而言,熟悉已经是最接近天花板的措辞了。
  5. 面试时候的仪容仪表要干净整洁,要给面试官一种朝气蓬勃的感觉,毕竟谁也不希望以后跟自己一起工作的年轻小伙子或者靓女,一个个萎靡不振,真的很影响工作的心情。
  6. 最后就是个人认为不要觉得面试官懂得很多,其实很多时候未必,不要给自己形成一种面试官可以实现降维打击的感觉,仔细想想如果你成功过了面试,你们以后就是同事了,水平差别其实也没有那么大,除了某些真的是技术大牛,这个另说,如果真的遇到,那真的是一次不错的学习机会呢。

面试的结果和我自己预想的一样,没有通过,不过问题不大,第一次实习面试,重要的是积累经验,查缺补漏,面试官指出的很多时候可能真的是自己需要重视的地方,可能下次面试还会再问,所以要及时总结复盘。(虽然我这确实是有点晚了,但是仍旧记忆犹新。)

最后,希望我们都能做到:
知我所能,我所能者,尽善尽美。知我所不能,我所不能者,虚怀若谷

往期回顾

Linux概述
Linux磁盘与启动程序
Linux下的目录结构
OpernEuler的保姆级安装
基于deepin的MySQL安装

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月26日
下一篇 2023年12月26日

相关推荐