【软件开发面经】大厂面试经验

目录

校招面经

百度一面面经-小度

1、简单的自我介绍

包括但不仅限于学习经历、求学经历以及工作经验相关

1.1、描述一下项目经验
1.2、你主要在这个项目中负责哪些模块功能的开发
1.3、这些界面的数据以及通信是怎么实现的?用的哪些协议或者哪些数据库
1.4、解析完的数据后续要怎么处理

面试官:你的页面其实是一个数据的承接和展现的一个功能,通过TCP协议拿到数据,然后对拿到的数据包进行解析之后,进行进一步的数据展现。

1.5、除了展现数据之外,有变更和操作相关的功能吗

面试官:其实更像是使用QT做了一个端页面,然后给操作人员去使用的一个测控系统,在这个测控系统上进行查看和编辑

2、描述一下你的其它项目

2.1、描述的时候尽量挑一些你主要实现的功能,整个的大项目我不太关心,主要就是想了解这是一个什么系统,你在这个项目里负责了哪些模块
2.2、你做这样一个web服务器是为了什么场景下而去做的
2.3、你是基于Nginx项目还是哪个开源项目进行开发的?用什么语言开发的?
2.4、你这个项目最终做完之后,压测情况能抗到多大的并发量?硬件配置大概是什么情况?
2.5、你了解过在业内或者商业上使用的其它的web服务器的话,它的QPS大概在什么情况?在做这个开发项目之前,对开源项目有调研过吗?
2.5、你这个web服务器是把哪些开源项目的功能都实现了呢,还是只实现了GET和POST?
2.6、你在压测的过程中,是使用了什么样的一个请求?是一个代理,还是一个静态文件,还是一个已经承接的web服务?

面试官:相当于一个GET请求对于图片的一个压测

2.7、你当时实现web服务的初衷是什么?项目需求、工作、学习?有学习过其它开源项目再进行开发吗?业内比较出名的开源项目了解过哪些?它们是基于什么进行开发的?
2.8、你的项目和这些开源项目之间有哪些区别?以及你的项目会对比它有什么优势,或者它比你更优一些什么优势?
2.9、你有没有思考了一下,然后希望优化它的一些功能?某些细微场景的优化有吗?
2.10、你了解Nginx吧?你看他们那些开源项目的时候,进程之间的调度,以及守护进程是怎么处理的。你的整个项目的调度是怎么实现的,主进程、线程的调度?你了解那个开源项目以及Nginx项目,它们是怎么做的?

推荐你看一些项目的源码,可能对你有跟多帮助

3、其它的还有一些什么项目

3.1、Redis大概支持哪些数据结构存储

4、还有其它的项目经验吗

5、你会其它一些语言吗?比如说java、go之类的?

6、简单写几个排序

6.1、实现一下快排和选择排序
6.2、十大排序都有哪些
6.3、快排和选择排序的时间复杂度

7、Nginx有了解吗?Redis有了解吗?还使用了哪些数据库?

7.1、MySQL有哪些引擎
7.2、它们有什么区别?在什么场景下使用哪个会好一些?
7.3、大概是哪个版本开始默认使用Innodb?

MySQL5.5版本开始默认使用InnoDB

7.4、如果我是高并发下的读,你建议我使用哪个引擎?

建议使用MyISAM,因为这种场景下只需要进行频繁的查询操作,MyISAM在这种场景下查询效率更高并且占用内存更少,因为没有了事务以及锁等信息,MyISAM会更专注与查询数据,效率相较之下就更快,MyISAM使用的是非聚集索引,非叶子节点记录的是对应的索引 + 指针,所以B+树相较之下占用的磁盘空间更小

7.5、高并发下的写,建议用哪个引擎?

建议使用InnoDB,因为InnoDB支持事务隔离机制以及行级锁,在需要对数据进行频繁更新的情况下,可以保证数据的安全性

7.6、那Innodb是可以把MyISAM替换掉了,还是说MyISAM有哪些其它的使用场景?
7.7、如果有一个数据量比较大的库(上千万),有没有什么处理可以降低我慢查询的频次?
7.8、猜测如果要优化查询速度的话,可以从哪些方面进行优化?任何方面都可以,发散一下思路
  1. 数据结构的优化,也就是表结构的优化
  • 选用合适的数据类型:比如在存储年龄,没必要使用INT这么大范围的字段
  • 适当的拆分:一张表的字段不能超过30,不要试图把所有字段都放在一张表里
  • 字段尽量设置成NOT NULL,尽量带有默认值,执行查询的时候,数据库不用去比较NULL值
  1. SQL语句优化
  • 尽量使用索引,尽量避免全表查询,提高查询速度
    • 查询语句当中包含有 MAX (), MIN () 和 ORDERBY 这些命令的时候,性能提高更为明显
    • 索引应建立在那些将用于 JOIN, WHERE 判断和 ORDER BY 排序的字段上
    • 尽量不要对数据库中某个含有大量重复的值的字段建立索引
  • 不能无限制的建立索引,维护索引也会影响性能
  • 尽量避免在 where 子句中对字段进行 Null 值判断
  • select 的时候,使用具体的字段代替 * 号
  • 避免返回大量数据,增加分页
  1. 减少数据库的访问
  • 可以通过增加本地缓存或者分布式缓存的方式,将热点数据存储到缓存中,以减少数据库的访问
  • 对于一个不合理的需求,我们可以拒绝做这个需求,这样也算是"减少了数据库访问"
  1. 读写分离
  • 主库用于写,从库用于读,将读写分散在不同的数据库上,利用多台机器的资源,来提高数据库的可用性和性能
  1. 分库分表
  • 采用一定的路由规则,将数据保存到不同的数据库中
7.9、如果在数据库中设置了太多索引,但是在查询的过程中优先使用到了你最不希望的那个索引(查询效率最差的)
  1. 首先进行分析查询执行计划,在查询指令前添加explain关键字,查看在查询的过程中,使用到的是哪个索引
  2. 检查并且合理的减少不必要的索引,太多的索引可能会导致数据库在查询时产生额外的开销,不同的查询可能需要不同的索引来获得最佳性能
  3. 在查询语句中使用索引提示,明确指定希望数据库使用的索引
  • SELECT * FROM table_name USE INDEX (index_name) WHERE ...
  • SELECT * FROM table_name IGNORE INDEX (index_name) WHERE ...
  • 强制选择索引可能会导致其它查询性能下降,一般情况下还是依赖MySQL查询优化器自动选择最佳索引
  1. 尝试重写查询,添加或者修改WHERE条件,或者采用JOIN来改变查询逻辑
  2. 数据库统计信息更新
  • 确保数据库的统计信息是最新的。数据库优化器根据统计信息来估计执行计划的成本,并根据成本选择最优的索引。如果统计信息过期或不准确,优化器可能会做出错误的选择
  1. 使用Redis内存缓存
  2. 分区表
  • 对于特别大的表,可以考虑将其分为更小的分区表,然后针对查询的模式设置合适的索引。这样可以减少索引的数量,提高查询性能

8、你如果用Redis除了刚才说的用于一些缓存方案上,还了解到它会在哪些场景下使用?

  1. 会话存储(Session Store): Redis 可以用作会话存储,将用户会话数据保存在内存中,以提高性能和扩展性。由于 Redis 具有高速的读写能力和数据持久化选项,它比传统的基于文件的会话存储更加可靠和高效。

Token会被服务器缓存在Redis中,并且Redis会设置过期时间

  1. 发布/订阅系统(Pub/Sub): Redis 提供了发布/订阅功能,允许不同的客户端之间通过消息通信。这在实时通信、实时事件处理、聊天应用程序等场景中非常有用。

  2. 计数器(Counter): Redis 的原子性操作和高速读写使其成为计数器的理想选择。可以用 Redis 实现网站的访问计数、点赞计数等功能。

  3. 排行榜(Leaderboard): Redis 的有序集合数据结构可以用于创建排行榜,例如游戏中的玩家积分排行榜、社交媒体的用户粉丝数排行榜等。

  4. 地理空间数据处理: Redis 支持地理空间数据处理,可以存储和查询地理位置信息,用于位置服务、附近的人功能等。

  5. 任务队列: Redis 的列表数据结构可以用作任务队列,支持先进先出(FIFO)的任务处理,实现异步任务处理,例如后台任务的处理、消息队列等。

  6. 缓存失效处理: Redis 提供了 Key 过期功能,可以在设置 Key 的时候指定过期时间,适用于缓存失效处理,当数据过期后自动删除,从而减少缓存占用的内存。

  7. 分布式锁: Redis 的原子性操作可以用来实现分布式锁,保证在分布式系统中对共享资源的互斥访问。

  8. 全文搜索: Redis 可以结合外部搜索引擎(如 RediSearch)来实现全文搜索功能,用于实时搜索和检索大量文本数据。

8.1、有哪些成熟的方案或者架构会使用负载均衡?
8.2、如果你使用负载均衡,打到了一个机房,机房里有成百上千个服务器,再怎么DNS呢?

9、有没有哪些知识点你所擅长的,我没有问到的,你可以说一下?

防止我对你的优点没有采集到

10、为什么没有考虑去其它厂进行实习呢?学习压力还是什么原因?

11、反问环节


快手一面 面经

1、手撕算法 LeetCode 单词拆分II

2、十大排序的平均时间复杂度

3、lambda表达式的用法

4、三种智能指针以及使用场景?

4.1 weak_ptr除了解决循环引用的场景,还有哪些场景会使用到?

5、虚函数的用法,以及在什么时候需要使用到虚函数

6、下面两种遍历方式有什么区别

vector result;

for(C c : result)

for(C& c : result)

7、线程同步的几种方式

8、反问环节

快手二面 面经

1、自我介绍

2、简单说一下设计模式中的单例模式

3、写一个单例模式-懒汉模式

4、解释一下在双重校验机制下,为什么要再次进行加锁?

5、C++空类默认会添加哪些函数?

构造函数、析构函数、拷贝构造、拷贝赋值

5.1、说明一下拷贝构造与拷贝赋值两者发生的时机是什么?

6、A* instance = A::getInstance(); 这个时候会创建出一个实例对象吗?为什么?

7、讲一下Qt的信号槽机制,从设计模式方面来看,信号槽机制属于那种设计模式?

属于观察者模式

8、简单说明一下广播模式?

9、写一个算法题

10、反问环节


西安三星电子研究所 一面 面经

1、英文自我介绍

2、select、poll、epoll之间的区别是什么?

3、进程、线程的上下文以及上下文切换

4、操作系统中的页表

5、TCP数据传输中的粘包问题,如何解决?

6、说明一下Redis的缓存问题

7、简要说明Redis数据的过期删除策略

8、Redis持久化有哪几种方式?简要分别说明一下

9、CPU占用率过高问题,说明一下问题发生的原因,以及如何解决的?

10、简单说明一下冒泡、快排、堆排之间的区别,时空复杂度,以及如何实现的?

西安三星电子研究所 二面 HR面经

1、英文自我介绍,主要介绍家庭情况

2、问一些科研情况、项目情况、工作预期等情况(HR问题)


西安诺瓦星云提前批 一面面经

1、简单自我介绍

2、进程和线程的概念,以及两者之间的区别与联系

3、进程调度算法有哪些

4、进程间的通信方式有哪些?

4.1、共享内存和内存映射之间的区别

5、C++中的多态底层是如何实现的?绑定子类对应override函数发生的时机在什么时候?

5.1、你的项目中有使用过多态吗?具体用在什么场景,介绍一下
5.2、构造函数可以是虚函数吗?
5.3、析构函数可以是虚函数吗?如果不声明为虚函数会出现什么问题?

6、C++中的深拷贝和浅拷贝的区别

7、STL中map的底层结构是由什么来实现的?平均查找效率是多少?map可以使用其它方式实现吗?

7.1、unordered_map底层哈希出现哈希碰撞该如何解决?map和unordered_map两者的优缺点
7.2、二叉搜索树、平衡二叉搜索树、红黑树三者之间的区别以及优缺点

8、B树和B+树的区别,与平衡二叉树和红黑树之间的区别

8.1、1000w条数据,对应的B树和B+树分别有几层?

9、TCP四次挥手,TIME_WAIT出现在哪一端?TIME_WAIT过多会出现什么问题?

10、介绍跳表项目,跳表的插入数据如何实现的?

11、select、poll、epoll之间的区别是什么?

12、反问环节


海康威视一面 面经

1、指针的大小一般是多少?最终是由什么决定的?

答:在大多数32位 操作系统上,指针的大小通常是4字节,而在64位操作系统上,指针的大小通常是8字节。

有些特定的编译器 、操作系统或编译器选项可能会导致指针大小有所不同,但通常情况下,上述的规则是适用的。在编写跨平台的代码时,最好使用sizeof运算符来确定指针的大小,而不是假定固定的大小

2、结构体的大小会由哪些因素决定?

成员变量的数据类型、成员变量的数量、内存对齐要求

3、你对TCP是基于字节流的协议是如何理解的?

TCP是基于字节流的协议,而不是基于消息的。这意味着数据在传输过程中没有明确的消息边界,而是按照字节流的方式进行传输 。TCP不会将数据分割成消息,而是将数据视为一连串的字节,并在接收端重新组装成有意义的消息这种特性使得TCP适用于传输各种类型的数据,包括文本、图像、音频和视频等

相关推荐
木小同22 分钟前
JAVA基础之NIO
面试·java基础·nio
李老头探索1 小时前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
考试宝10 小时前
国家宠物美容师职业技能等级评价(高级)理论考试题
经验分享·笔记·职场和发展·学习方法·业界资讯·宠物
面试鸭12 小时前
离谱!买个人信息买到网安公司头上???
java·开发语言·职场和发展
测试199814 小时前
2024软件测试面试热点问题
自动化测试·软件测试·python·测试工具·面试·职场和发展·压力测试
马剑威(威哥爱编程)14 小时前
MongoDB面试专题33道解析
数据库·mongodb·面试
程序员勋勋16 小时前
【自动化测试】如何在jenkins中搭建allure
职场和发展·jenkins·测试覆盖率
独行soc17 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
咕咕吖17 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
理想不理想v17 小时前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试