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

目录

  • 校招面经
    • 百度一面面经-小度
      • 1、简单的自我介绍
        • 1.1、描述一下项目经验
        • 1.2、你主要在这个项目中负责哪些模块功能的开发
        • 1.3、这些界面的数据以及通信是怎么实现的?用的哪些协议或者哪些数据库
        • 1.4、解析完的数据后续要怎么处理
        • 1.5、除了展现数据之外,有变更和操作相关的功能吗
      • 2、描述一下你的其它项目
        • 2.1、描述的时候尽量挑一些你主要实现的功能,整个的大项目我不太关心,主要就是想了解这是一个什么系统,你在这个项目里负责了哪些模块
        • 2.2、你做这样一个web服务器是为了什么场景下而去做的
        • 2.3、你是基于Nginx项目还是哪个开源项目进行开发的?用什么语言开发的?
        • 2.4、你这个项目最终做完之后,压测情况能抗到多大的并发量?硬件配置大概是什么情况?
        • 2.5、你了解过在业内或者商业上使用的其它的web服务器的话,它的QPS大概在什么情况?在做这个开发项目之前,对开源项目有调研过吗?
        • 2.5、你这个web服务器是把哪些开源项目的功能都实现了呢,还是只实现了GET和POST?
        • 2.6、你在压测的过程中,是使用了什么样的一个请求?是一个代理,还是一个静态文件,还是一个已经承接的web服务?
        • 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?
        • 7.4、如果我是高并发下的读,你建议我使用哪个引擎?
        • 7.5、高并发下的写,建议用哪个引擎?
        • 7.6、那Innodb是可以把MyISAM替换掉了,还是说MyISAM有哪些其它的使用场景?
        • 7.7、如果有一个数据量比较大的库(上千万),有没有什么处理可以降低我慢查询的频次?
        • 7.8、猜测如果要优化查询速度的话,可以从哪些方面进行优化?任何方面都可以,发散一下思路
        • 7.9、如果在数据库中设置了太多索引,但是在查询的过程中优先使用到了你最不希望的那个索引(查询效率最差的)
      • 8、你如果用Redis除了刚才说的用于一些缓存方案上,还了解到它会在哪些场景下使用?
        • 8.1、有哪些成熟的方案或者架构会使用负载均衡?
        • 8.2、如果你使用负载均衡,打到了一个机房,机房里有成百上千个服务器,再怎么DNS呢?
      • 9、有没有哪些知识点你所擅长的,我没有问到的,你可以说一下?
      • 10、为什么没有考虑去其它厂进行实习呢?学习压力还是什么原因?
      • 11、反问环节
    • 快手一面 面经
      • 1、手撕算法 LeetCode 单词拆分II
      • 2、十大排序的平均时间复杂度
      • 3、lambda表达式的用法
      • 4、三种智能指针以及使用场景?
        • 4.1 weak_ptr除了解决循环引用的场景,还有哪些场景会使用到?
      • 5、虚函数的用法,以及在什么时候需要使用到虚函数
      • 6、下面两种遍历方式有什么区别
      • 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、简单的自我介绍

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

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适用于传输各种类型的数据,包括文本、图像、音频和视频等

你可能感兴趣的:(面试,职场和发展)