还自认为很牛逼...简直就是什么都不知道!6年的软件测试 怕不是白瞎了???

Posted 测试萌萌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还自认为很牛逼...简直就是什么都不知道!6年的软件测试 怕不是白瞎了???相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
最近看了很多简历,很多候选人年限不小,但是做的都是一些非常传统的项目,想着也不能通过简历就直接否定一个人,何况现在大环境越来 越难,大家找工作也不容易,于是就打算见一见。

在沟通中发现,由于年限不小,他们的定位基本都是高级及以上,毕竟,年限摆在那里,面个中级也不体面。

面试时我打算聊点基础的,先打开一下话题,结果发现对于一些开发中很基本的问题,比如:

Git的分支你们是怎么管理的?

接口保证幂等性是基本的要求,那么幂等性你们是怎么做的?

你们有用@Transactional来控制事务是吧,那么能不能说出一些事务不生效的场景?

上面几个问题没有一个是“造火箭”的,结果发现,这些很基本的问题,他们普遍都答得很模糊,或者支支吾吾。其中,一个候选人的反问,令我印象特别深刻,他说:

上面的问题我虽然都不懂,但是我都工作这么多年了,如果我不能胜任工作,那你告诉我,我这几年经验是怎么来的?

再说了,做Java开发,说到底,还不是产品输出原型,对着原型进行数据库建表,然后CRUD吗?

遇到问题网上搜索一下,再不行就群里问一下,我又不找什么中间件的团队,Java开发,不都是这样吗,还能有什么别的花样?

听完我沉思了良久,做为一个高级开发,如果连Git分支如何管理都没思考过,幂等性名词的含义都解释不清,事务注解打上就完事,连生不生效的场景都不知道,只会对着产品原型CRUD,测试不提bug,代码都不想复盘多看一眼,试问谁又愿意和这样的“高级大佬”一起干活?

在这里插入图片描述

其实我想了一下,他之所以有这样的想法,很大程度取决于他的经历,长年在传统行业,或者“小作坊”,平时就两三个Java开发,大家都是“难兄难弟”的水平。让他认为,Java开发,就是对着原型CRUD,年限上去了,就是高级开发。思维一旦形成,就很难改变。但是,互联网是个瞬息万变的行业。从BAT等各种大厂的应届生招聘薪水就可以看得出,现在应届生的水平越来越6,如果还以为大家都是一样的,都是对着原型CRUD,有问题就把报错信息网上一搜,群里一丢等回复这种方式,迟早给淘汰。即使不做中间件开发,基本的原理、源码还是要了解的!

4-6年经验应该具备哪些技能

首先,简单的聊一下我认为的4-6年经验左右、优秀的 Java 程序员应该具备的技能有哪些,按“专业技能”和“项目”两块,包括但不限于以下内容。

专业节能方面

基础:JDK 常用类的原理、源码、使用场景。

设计模式:常用几种的原理、使用场景,单例、动态代理、模板、责任链等。

数据结构:数组、链表、栈、队列、树。

网络:TCP、HTTP、HTTPS、负载均衡算法。

框架:Spring IoC 原理、Spring AOP 原理和使用、Spring 常用的扩展点、MyBatis 的核心流程。

中间件:常用中间件的核心原理与最佳实践,并对其中的 1 到 2 个有深入的学习,Redis、Kafka(RocketMQ、RabbitMQ)、Dubbo、Zookeeper。

数据库(mysql):索引原理、隔离级别、锁机制、分库分表、慢 SQL 定位及优化、线上问题解决。

Netty:NIO 原理、核心组件、I/O 多路复用(epoll)、零拷贝。

JVM:运行时数据区、垃圾回收算法、垃圾回收器(CMS、G1)、常用配置参数、线上问题定位及解决。

稳定性保障:隔离、限流、熔断、降级等。

Linux:基本命令的使用、快速定位和排查问题。

分布式理论:CAP、BASE、2PC、3PC、TCC。

项目方面

能独立完成一个复杂模块的需求分析、方案设计和最终落地实现。

能不断思考,寻找更优的设计和解决方案,积极优化慢 SQL、慢服务。

具备排查问题的能力,遇到线上问题能及时定位和修复上线,例如:数据库死锁、服务器宕机、服务器 Full GC 频繁等。

具备难题攻关的能力,能不断解决项目遇到的挑战,能给予初级工程师技术上的指导。

初步具备带领团队(1-3人左右)的能力,能合理分配需求,做好进度把控、风险评估、Code Review。

不制造任何焦虑,学习需要的也不是一腔热血,需要的是长期的规划,这里分享一个思维导图,大家可以自行进行查漏补缺和规划:

面试内容

下面介绍下一些常见的面试内容,其中的面试题不一定是我真实遇到的,有可能是从别人的面试题中收集的,也有可能是我自己觉得重要的知识点,仅供参考。

1、项目

项目对于一个定位中、高级的开发来说是非常重要的,面试官也非常看重这一块。这个经验的开发基本是各大公司的编码主力,因此面试这个年限的候选人,通常项目是很重要的一块。面试官通常会让你先自己介绍下自己参与度最高(或者最牛逼)的项目,然后从中进行提问。常见的如以下:

介绍下你参与度最高的项目

画下项目的架构图

如果核心流程处理到一半,服务器崩溃了,会怎么处理

项目中遇到过哪些挑战或问题,怎么解决的

项目的稳定性和可用性怎么保障

数据安全这块怎么设计

项目的技术选型,为什么选这些

2、场景题

越到后面的面试官,越喜欢问场景题,场景题比较考验候选人平时的积累和解决问题能力。这个环节很容易挂掉一批人,特别是容易紧张的同学,很容易脑子会一片空白。场景题的核心一般是处理大数据量的问题、解决性能方面的问题。

场景题本质上是比较开放的,没有什么标准答案,只要自己的方案能够解决问题,能够“自圆其说”就行。

这个环节面试官可能会将线上真实的场景拿出来提问,我自己就遇到过。

3、专业技能

集合

经常用到哪些 Map

这几种 Map 的区别

CocurrentHashMap 怎么保证线程安全

CocurrentHashMap 在 JDK 1.8 前后的锁有什么区别

聊下 HashMap 的原理

HashMap 在 Put 时,新链表节点是放在头部还是尾部

HashMap 扩容时的流程

HashMap 在 JDK 1.8 有什么改变

CocurrentHashMap 在 JDK 1.8 有什么改变

TreeMap 的原理

Map、List、Set 分别说下你知道的线程安全类和线程不安全的类

多线程、锁

线程池使用的是哪种

线程池参数怎么配置

线程池各个参数的作用

线程池的参数配置要注意什么

线程池的工作流程

JDK 中的并发类知道哪些

AQS 的底层原理

介绍下悲观锁和乐观锁

使用过哪些锁

synchronized 和 Lock 的区别、使用场景

synchronized 原理

synchronized 作用于静态方法、普通方法、this、Lock.class 的区别

为什么引入偏向锁、轻量级锁,介绍下升级流程

死锁的必要条件,如何预防死锁

介绍下 CountDownLatch 和 CyclicBarrier

介绍下 CAS,存在什么问题

介绍下 ThreadLocal,存在什么问题

网络

HTTPS 是怎么加密的

普通 Hash 和一致性 Hash 原理

一致性 Hash 的缺点

TCP 三次握手过程,为什么需要三次握手

为什么 TIME_WAIT 状态需要经过 2MSL 才能返回到 CLOSE 状态

TCP 的拥塞控制

TCP 如何解决流控、乱序、丢包问题

为什么会出现粘包和拆包,如何解决

Spring、Mybatis

Mybatis 中 # 和 $ 的区别

怎么防止 SQL 注入

使用 Mybatis 时,调用 DAO(Mapper)接口时是怎么调用到 SQL 的

介绍下 Spring IoC 的流程

BeanFactory 和 FactoryBean 的区别

Spring 的 AOP 是怎么实现的

Spring 的事务传播行为有哪些,讲下嵌套事务

什么情况下对象不能被代理

Spring 怎么解决循环依赖的问题

要在 Spring IoC 容器构建完毕之后执行一些逻辑,怎么实现

@Resource 和 @Autowire 的区别

@Autowire 怎么使用名称来注入

bean 的 init-method 属性指定的方法里用到了其他 bean 实例,会有问题吗

@PostConstruct 修饰的方法里用到了其他 bean 实例,会有问题吗

Spring 中,有两个 id 相同的 bean,会报错吗,如果会报错,在哪个阶段报错

Spring 中,bean 的 class 属性指定了一个不存在的 class,会报错吗,如果会报错,在哪个阶段

Spring 中的常见扩展点有哪些

MySQL

MySQL 索引的数据结构

为什么使用 B+ 树,与其他索引相比有什么优点

各种索引之间的区别

B+ 树在进行范围查找时怎么处理

MySQL 索引叶子节点存放的是什么

联合索引(复合索引)的底层实现

MySQL 如何锁住一行数据

SELECT 语句能加互斥锁吗

多个事务同时对一行数据进行 SELECT FOR UPDATE 会阻塞还是异常

MySQL 使用的版本和执行引擎

MySQL 不同执行引擎的区别

MySQL 的事务隔离级别

MySQL 的可重复读是怎么实现的

MySQL 是否会出现幻读

MySQL 的 gap 锁

MySQL 的主从同步原理

分库分表的实现方案

分布式唯一 ID 方案

如何优化慢查询

explain 中每个字段的意思

explain 中的 type 字段有哪些常见的值

explain 中你通常关注哪些字段,为什么

JVM

运行时数据区

服务器使用的什么垃圾收集器

CMS 垃圾收集的原理

G1 垃圾收集的特点,为什么低延迟

有哪些垃圾回收算法,优缺点

哪些对象可以作为 GC Roots

有哪些类加载器

双亲委派模式,哪些场景是打破双亲委派模式

线上服务器出现频繁 Full GC,怎么排查

定位问题常用哪些命令

介绍下 JVM 调优的过程

Kafka

为什么使用 Kafka

介绍下 Kafka 的各个组件

如何保证写入 Kafka 的数据不丢失

如何保证从 Kafka 消费的数据不丢失

Kafka 为什么性能这么高

零拷贝技术使用哪个方法实现

Java 中也有类似的零拷贝技术,是哪个方法

Kafka 怎么保证消息的顺序消费

Kafka 怎么避免重复消费

什么是 HighWatermark 和 LEO

什么是 ISR,为什么需要引入 ISR

Redis

项目中使用的 Redis 版本

Redis 在项目中的使用场景

Redis 怎么保证高可用

Redis 的选举流程

Redis 和 Memcache 的区别

Redis 的集群模式

Redis 集群要增加分片,槽的迁移怎么保证无损

Redis 分布式锁的实现

Redis 删除过期键的策略

Redis 的内存淘汰策略

Redis 的 Hash 对象底层结构

Redis 中 Hash 对象的扩容流程

Redis 的 Hash 对象的扩容流程在数据量大的时候会有什么问题吗

Redis 的持久化机制有哪几种

RDB 和 AOF 的实现原理、优缺点

AOF 重写的过程

哨兵模式的原理

使用缓存时,先操作数据库还是先操作缓存

为什么是让缓存失效,而不是更新缓存

缓存穿透、缓存击穿、缓存雪崩

更新缓存的几种设计模式

Zookeeper

Zookeeper 的使用场景

Zookeeper 怎么实现分布式锁

Zookeeper 怎么保证数据的一致性

ZAB 协议的原理

Zookeeper 遵循 CAP 中的哪些

Zookeeper 和 Eureka 的区别

Zookeeper 的 Leader 选举

Observer 的作用

Leader 发送了 commit 消息,但是所有的 follower 都没有收到这条消息,Leader 就挂了,后续会怎么处理

分布式

CAP 理论

BASE 理论

分布式事务 2PC 和 TCC 的原理

TCC 在 cancel 阶段如果出现失败怎么处理

Paxos 算法、Raft 算法

4、Hr 面

如果你一路过五关斩六将,最终来到了 Hr 面,那么恭喜你,你已经离 offer 非常非常近了。可以开始畅想自己升职加薪,当上总经理,出任 CEO,迎娶白富美,走上人生巅峰的场景了。

Hr 面主要是了解候选人的一些通用素质,经常会问的问题如下:

介绍下自己投入最多的项目(当时我就惊了,Hr 也开始问项目了)

离职的原因

当前的薪资、绩效

当前在面试的其他公司的情况

平时有没有学习的习惯,怎么学习的,现在在学习什么

未来的规划

关于这些问题,没有什么标准答案,但是很重要的原则是,在整个过程中要保持积极向上的态度,不能有负面的情绪。

关于当前薪资的问题,由于诸多的原因,可能有些人会想着稍微多报一点,对于这种做法我持中立态度,但是要把握好度,毕竟大厂基本都有背景调查。大厂对于诚信问题一般是零容忍,而且可能会拉黑名单,进黑名单意味着你再也无缘这家公司了。
在这里插入图片描述

一些经验心得

先挑几个小公司找下面试感觉,太久没面,需要找找面试的感觉,我自己一开始就面的不太好,就很慌张。

面试时紧张是正常的,但是不要过于紧张,如果面试官问完你大脑瞬间一片空白,你可以跟面试官说自己要思考下,然后回答的时候语速可以慢点,但是要条理清晰。

在面试的过程中回答面试官问题是一方面;另一方面,你要在回答的过程中让面试官感受到你身上一些优秀的特质,例如:有潜力、很灵活、热爱学习、学习能力强、解决问题能力强、基础扎实等等。这些特质都会影响面试官对你的评价。

平时项目中遇到难题要积极去解决,解决问题的过程能让人快速成长,并且解决的问题可能会成为你面试时的亮点,特别是对于那些项目没什么亮点的。

准备项目时,挑几个自己做过最牛逼的功能、或者解决过最有挑战的问题,并且要对这些内容理解的非常透彻,不能在给面试官介绍的时候“支支吾吾”。

框架也好、中间件也好,必须要有几个特别深入研究过的,也就是说你除了“广度”之外,还必须在某些方面有足够的“深度”。面试时经常碰到的问题是:你对哪个框架或中间件理解的最深。然后面试官会在这个方向上一直问下去,如果你很多东西只是看了个大概,在这边就很有可能会被问倒。

自己讲出来的每个功能点、知识点,都要做好“被挑战”的心里准备,因此对于每个功能点、知识点都要多思考。

如果问的问题是线上实际的场景,有时候面试官会给出他们当前线上的解决方案,如果你能在这个时候给出一些自己的思考和观点,可能会给面试官留下不错的印象。

判断自己是否已经准备好的一个比较简单粗暴的方法:自己是否能将看到的面试题回答个 9 成左右,例如本文上面“专业技能”列举的这些题目。

如果你是真想跳槽,或者说你已经裸辞了,那么在收到电子 offer 前都不要停止面试,即使收到口头 offer 也不稳,特别是在这个寒冬。

在平时工作中多思考,无论是写代码还是方案设计,多思考更优的解决方案。特别是工作年限越久之后,思考对于我们的职业发展越重要。

面试前的准备非常重要,但更重要的是平时工作的积累,4 年经验问的问题很多是无法通过临时准备的,很多都是需要你不断去积累,才能有好的方案。

专注于自身的成长,不要轻易受到别人的影响,只要你不断的积累,总有一天你也能成为你眼中的那些大神。

学如逆水行舟,不进则退。不要停下学习的脚步,特别是趁着自己还年轻,趁着自己还是个单身狗的时候,逼自己一把,将来的你一定会感激现在拼命的自己。

程序员是一份很单纯的工作,不需要搞什么花里胡哨的,只要你付出努力了,你通常就能收获回报。

对于没有大厂背景,并且处于传统行业,想直接进入大厂比较难,除非你踩了狗屎运,但是这种几率不大,我觉得比较现实的途径是先找一个互联网独角兽沉淀一段时间。

大公司的部门非常多,各部门的招聘通常都是独立的,如果想进大公司可以多投,每个部门的需求紧张度不同,如果碰到急需招人的,可能就是一个非常好的机会。

大公司的面试通常会有存档,面试官可能会看到你之前的面试评价。如果你经常一轮游,肯定会给面试官不好的印象。因此请做好准备再去面试,不要轻易浪费机会。

2020 年互联网行业开年不太好,也有可能接下去会一直这样,特别是对于没有大厂背景的朋友来说,所以请记住一个很重要的原则:不要裸辞。

针对以上这些大厂面试常问技术点,本人这边专门整理了一套对应的Python自动化面经pdf文档复习资料,所含内容覆盖极广,特别适合一些即将面试或准备跳槽的Python自动化测试开发者查缺补漏。

资料领取方式:点赞+关注小编后进我的一个学习交流群:902061117 获取!

合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

下面是我在做自动化对于技术一些归纳和总结,希望能帮助到有心在技术这条道路上一路走到黑的朋友!

在这里插入图片描述

在这里插入图片描述

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

关注我的微信公众号:【伤心的辣条】免费获取~

我的学习交流群:902061117 群里有技术大牛一起交流分享~

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

好文推荐:

35岁之后软件测试工程师靠什么养家?我能继续做测试!

App公共测试用例梳理

Python简单?先来40道基础面试题测试下

阿里二黑叹息:越来越多的年轻人从职场撤退了?

从一名开发人员转做测试的一些感悟

以上是关于还自认为很牛逼...简直就是什么都不知道!6年的软件测试 怕不是白瞎了???的主要内容,如果未能解决你的问题,请参考以下文章

会stm32单片机就以为自己很牛逼了?

统治了 20 年的 Java,依然很牛逼!

今天拍了一张摄影作品,自认为很不错

为什么CTO技术总监架构师都不写代码,还这么牛逼?

我们公司使用了6 年的分布式锁,很是牛逼啊!

cad的一些自认为很重要的操作第一篇