实习面试题汇总

2024.6.24 海康技术主管面

2024.6.13 谐云技主管面

  1. 讲一讲和算法相关的经历
  • 专利:基于异构图网络的情绪支持对话
  • 项目:LLM应用开发
  1. 这个项目都在使用别人开发好的技术,那么你在其中有什么贡献?
  • 目前很多开源项目只停留在科研方面,如何落地到具体项目中,就比如 LLM 出现错误宕机的时候,重启容器化运行的 LLM 实例并采用一致性轮询方法,访问其他正常运行的容器
  1. 做过最大的项目
  • 实习的时候做的数据中台项目
  1. 对未来的计划
  • 作为一个刚进入工作的学生,要不断学习拓宽自己的技术面

2024.5.22 华为主管面

2024.5.21 谐云技术面

并发

2024.5.10 华为技术面

  • 让我调了下摄像头,好展示我的颜,然后自我介绍
  • 手撕算法(由于太紧张写代码一直在絮絮叨叨)
业务发送数据到对端,由于网络原因会出现概率丢包;现发送1W条数据到对端,指定输入N为丢包数量,随后列出丢包数据的具体位置;你有机会进行补包,M为可补包的数量,请返回补包后最大可连续发送数据的数量

无需实现交互式输入,只需实现如下函数
int maxContinuousPackages(int n, int[] lostPackages, int m)

测试样例


示例1:
3
1 5 10
1
-----
9995
本示例中,丢包数量N为3,丢包位置分布为第1、5、10三个位置,补包数量M为1;在第10个位置补包后可连续发包数量最大,为10000 - 5 = 9995

示例2:
4
4 6 20 9990
2
-----
9994

示例3:
4
1500 4100 5000 8000
2
---
6499

示例4:
4
4 699 700 9990
2
---
9985

示例5:
6
100 2700 5100 7498 7499 7500
2
---
7397

AC 代码,中途写错了还考虑了动态规划,导致三十分钟用满了,说是最多 30 min 再满一点我就 GG 了

int maxContinuousPackages(int n, int[] lostPackages, int m) {
int len = lostPackages.length, ans = 0;
int[] data = new int[len+1];
data[0] = lostPackages[0]-1;
data[data.length-1] = 10000 - lostPackages[len-1];
for (int i=1; i<data.length-1; i++) {
data[i] = lostPackages[i] - lostPackages[i-1] - 1;
}

m++;
int sum = 0;
for (int i=0; i<m; i++) {
sum += data[i];
}
ans = sum;
for (int i=m; i<data.length; i++) {
sum -= data[i-m];
sum += data[i];
ans = Math.max(ans, sum);
}

return ans+m-1;
}
  • 算法思路讲一遍,中间做错了删掉的代码也要讲为什么做错了,然后把代码截了个图
  • 说一下自己的技术栈

Java基础、JUC、JVM、SpringBoot、MySQL

  • 挑一个自己熟悉的讲一讲,选了 MySQL 索引

B+ 树结构,聚簇索引、二级索引、和 B 树的对比

  • 如果让你建一张表,你会如何设计索引

联合索引、覆盖索引、前缀索引

  • IOC 容器的理解

代理所有单例的创建,防止频 GC

  • 那为什么不直接用单例模式而用 IOC 容器的 Bean

还能实现 Bean 的生命周期管理,可以实现 AOP

  • 用 Python 能否实现 AOP

我说不能,AOP 实现需要操作字节码,他说行,我道歉

  • 设计模式讲一下

讲了 SpringMVC 中 HanderAdapter 用到的适配器模式

  • Rest 和 Rpc 有什么区别

首先说了实习的时候 Rpc 底层有用到 Rest 传输数据包,而这没有本质区别

http 头部冗余,效率低;但 http3 效率挺好但没普及

Rpc 更适合后台内部调用,效率高;Rest 适合所有场景,适配做的好

  • OS 为什么需要虚拟地址

没复习到的八股,说了下虚拟地址映射到物理地址,页的映射,道歉

  • 会什么语言

还会点 Python,不懂 C

  • 反问,进去需要什么技术栈

Java 微服务开发等

2024.4.29 小红书一面

以后有机会的话可以问问 HR 这个部门是干什么的,再做相应的准备,不然临时抱佛脚可能抱错佛了。

他温我哭,面试官又帅又贴心,看到我紧张也不催我。但是他一直在叹气,搞得我压力好大。面试总共30min,后续手撕了一道算法题20min,已经好几次算法题读题不准确了,连续字串和子序列最容易理解错

  1. 自我介绍

  2. 深入讲一下实习经历(完全没想到会问这个)

数据中台项目

  • 了解项目架构,微服务和多模块开发,数据流过程
  • 尝试开发字典结构
  • AOP 日志:运行时间、调用接口、速度、ip
  • 调用微服务获取运维大屏数据,并展示:线程池、CompletableFuture 线程先后调用关系
  1. 日志 AOP,能不能查找、过滤逻辑,为什么不用 ELK。如果有监控平台的话,为什么不存到监控平台里(看得出来面试官很奇怪怎么只有 AOP 记录日志,没有其他的相关功能)

Leader 安排的,直接存到 MySQL 中即可(搪塞一下)

  1. AOP 底层原理

CGLib、Java 原生,SpringBoot 中只使用 CGLib 代理(一定要说 Spring 是可以配置的)

  1. 行,继续说(我超,怎么说啊说啥啊)

扯到 Rpc 服务端接口代理;底层原理,编译成字节码,读入 JVM 前做一层代理

  1. 有 A 类中的 BC 方法。B 方法使用注解代理,再用 C 方法通过 this.B() 调用,会出现什么逻辑

会直接调用 B 方法

  1. 那如何让 this.B() 的代理生效呢

获取到被代理的 Bean,再调用 B 方法【如何获取被 AOP 代理的 Bean?】

  1. 修改一个数据,存储层、缓存层一起用的话怎么办

双删一致性

  1. 单例模式实际应用场景,Spring 底层的设计有哪些用到了单例模式

Spring 单例模式的实现

public static sychronize Singleton getInstace(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null) instance=new Singleton();
}
}
return instance;
}

底层针对单例模式的使用:IOC 容器、BeanFactory、工具类、线程池、ApplicationContext自身、

  1. 底层创建 Bean 是线程安全的吗?一定会用到 synchronized 吗?
  2. 启动时直接把所有 Bean 都创建好,可不可以保证线程安全?

Bean 生命周期中,初始化和依赖注入是两个阶段,不会相互影响,因此是安全的

  1. MySQL 的索引机制

聚簇索引;相比于跳表,B+ 树可以有效降低树的高度;【InnoDB 的 B+ 树到达四层的情况下能装下多少数据?】

  1. B+ 和 B 树的区别

顺序访问叶子节点;中间节点不会存到下层节点

  1. MySQL 乐观锁和悲观锁

MVCC 时间戳或版本号字段;间隙锁行锁表锁【悲观锁底层如何实现的?】

  1. update 用的是行锁还是表锁

在 update 语句的 where 条件没有使用索引,就会全表扫描,于是就会对所有记录加上 next-key 锁(记录锁 + 间隙锁),相当于把整个表锁住了

  1. 二级索引、联合索引、最左前缀匹配原则
  2. Redis 怎么实现过期删除策略(不是内存淘汰策略)
  3. 缓存穿透

太紧张了,回答成缓存雪崩了

  1. Redis 大 Key 问题的定义,解决方法
  2. 线程池的核心线程池的个数是如何设置的?

线程等待时间所占比例越高,需要越多线程;线程计算时间所占比例越高,需要越少线程;

  • CPU密集型任务:N+1
  • IO密集型任务:2N

手撕算法:【300. 最长递增子序列】一开始贪心没写出来,后面用 dp 写出来的

int n = in.nextInt();
int[] data = new int[n];
for(int i=0; i<n; i++) {
data[i] = in.nextInt();
}

int ans = 0;
int[] dp = new int[n];
for (int i=0; i<n; i++) {
dp[i] = 1;
for (int j=0; j<i; j++) {
if (data[j]<data[i]) {
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
ans = Math.max(ans, dp[i]);
}

System.out.println(ans);

总结QA

Q:JDK 动态代理和 cglib 的底层实现的区别?

A:JDK:目标类加载后,使用 Native 方法在运行时动态生成代理类,将切面织入到代理类中;CGLib:目标类加载后,字节码构建框架 ASM 构建字节码文件,并生成目标类的子类,将切面逻辑加入到子类中;AspectJ:编译期间,将切面织入代理类中,得到代理后的字节码;

Q:类上有 AOP 注解,如何分别获取被代理前和代理后的这个类呢?

A:代理前:直接 new 一个对象;代理后:通过 ApplicationContext@Autowired 注解来获取代理 Bean 对象,即容器中只会存放被代理过的类

Q:单例模式 Bean 是线程安全的吗?

A:主要取决于 Bean 是否是无状态的,即 Bean 中是否包含可变的状态信息;

Q:MySQL 如何实现乐观锁和悲观锁?

A:乐观锁:版本号或时间戳字段;悲观锁:InnoDB 所有的行锁算法都是基于索引实现的,锁定的都是索引或索引区间;

Q:update 用的是行锁还是表锁【TODO】

A:Where 条件判断有索引就走索引,走索引就锁索引,索引锁了就是行锁,不然就是表锁

Q:Redis 怎么实现过期删除策略

A:惰性删除+定期删除(不采用定时删除)

Q:Redis 大 Key 问题的定义,解决方法

A:从应用服务、持久化角度分别作答

定义:某个 key 所对应的 value 过大。具体来说,对于 String 类型的数据,如果其大小超过 10KB,一般被认为是大 key;而对于 set、zset、hash 等集合类型的数据,如果其包含的元素数量超过 5000 条,也通常被视为大 key。

解决办法

  • 把大 key 拆分成一个一个小 key;
  • 将大 Key 拆分成多个小 Key 并用 Hash 结构存储;
  • 定时检查 Redis 是否存在大 key ,如果该大 key 是可以删除的,不要使用 DEL 命令删除,因为该命令删除过程会阻塞主线程,而是用 unlink 命令(Redis 4.0+)删除大 key,因为该命令的删除过程是异步的,不会阻塞主线程;

造成的不良影响:

  • 应用服务:Redis 是单线程的,大 Key 写入和删除会阻塞其他命令;内存分布不均,失去内存时空局部性特性;网络阻塞,IO 压力大;
  • 持久化:Always 参数下数据同步到硬盘时会阻塞主线程;经常性触发AOF 重写机制;AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过 fork() 函数创建一个子进程来处理任务,会导致阻塞父进程(主线程);集群模式下内存分布不均

2024.4.10 恒生一面

虽然面试只有 17min,但感觉再长一点我真的要蚌埠住了,哭(在杭电十二教线下面的)

反思:自我介绍准备不足,都要开始面试了还在考虑怎么改(其实也怪他们面试通知太晚了,不怪我嘻嘻)平时学的不扎实,说不出 AQS 的底层实现原理我可以接受,但连 AQS 都没提到实在是太蠢了,果然还是准备的不够充分。谢谢恒生一巴掌拍醒了我,认清了自己还是个小菜鸡。摆正心态,继续努力!!!

  1. 自我介绍

面试官看了简历,说“不愧是软件工程内容比别人多多了”,面试官真的是很认真的把简历从头看到尾(泪目)

  1. Rpc 项目具体是什么

因为自我介绍里说了为什么要做 RPC 项目,面试官顺势问了。

简单说了上段实习中用到了自定义 Cluster 集群策略,因为 Dubbo 自带的 ClusterRules(广播、失败立刻返回)没有涉及到轮询检查离线任务是否完成的功能,所以 Leader 让我利用 Dubbo 的 SPI 机制做了一个查询微服务的计算过程是否完成的方法,然后挂载在 META-INF/dubbo 下就 Dubbo 框架就可以直接调用该集群执行方式(当时说的并没有这么清晰,还是太菜了呜呜)

  1. 如何分析 dump 文件

感觉简历里唯一吸引面试官的就是如何处理 OOM Crash 了。

测试报服务异常,线程池等待队列过长;Leader 带我用 jstack 获得线程的状态;发现该线程池中的所有线程都处在阻塞状态,并且都阻塞在父线程;查看父子线程调用关系和 Executors.newFixedThreadPool(25) 底层原理,发现 FixedThreadPool 使用了无限长的阻塞队列,父线程未执行完成,且子线程只能在队列中等待,造成死锁所以队列一直在变长

  1. synchronized Reentrantlock 的具体使用场景有什么不同

只知道底层实现原理不同且都是可重入锁,并不知道具体使用场景的区别(哪来的这么真实业务多场景啊喂)

  1. MySQL 调优

愚蠢的我只知道构建索引、优化表结构和增大 BufferPool,好在后续上网也没找到什么很好的方法。或许预编译 SQL 语句是个不错的想法,根据 MySQL 运行过程推出的优化方法。

面试 Prepare

自我介绍

由于错误使用 Dubbo 注解导致的 JVM 异常问题;Rpc 中间件采用 Netty 传输数据、Zookeeper 注册服务;调度各微服务,聚合并缓存数据;我还和同事一起分析解决了线上告警事故;

面试官您好,很荣幸能来参加华为的面试,我叫王哲文,目前在杭州电子科技大学读研,本科就读于浙大城市学院。

本科期间我加入了黑胡桃实验室,参与了智慧实验室和时间序列预测等项目,还在实验室举办的 2020 年谷歌开发者大会上分享了自己的项目经验。我在浙江华坤道威数据科技有限公司实习期间,主要负责日志切面和运维大屏的开发,在这期间我积累了企业级分布式微服务项目的开发经验。

在读研期间,我加入了大数据与城市计算实验室,主要负责三友阴极板项目的后端开发和某涉密项目的大语言模型应用开发。在项目开发过程中,我不仅更加深入掌握了 SpringBoot、MySQL、Redis 等主流技术,还了解了 Langchain、PyTorch、Milvus 等前沿技术。在工作之余,我还学习了 Rpc 中间件的架构和设计思想,并开发了一个简易的轻量级 Rpc 中间件。此外,我还搭建了个人博客网站,定期发布学习笔记和技术总结,不断沉淀自己的开发经验。

最后,我非常希望能有机会加入华为,将所学知识应用到实际工作中,并与优秀的团队一起共同成长。谢谢!

项目困难/解决方法

实习

  • 分布式微服务架构复杂 === 请教前辈、打断点弄明白数据流;
  • 多线程并发,编排任务执行流程 === 美团技术博客 CompletableFuture 原理和实践;
  • 沟通协作,和同事交流,理解别人的想法的同时清楚地表达自己的想法;让领导清楚自己在做什么,工作量和重难点在哪 === 多沟通多交流,先理清自己的想法再和同事、领导沟通;

LLM 应用开发

  • LLM 部署,技术选型 FastChat、FastApi、VLLM 加速 === 实践尝试,选择最合适的方法;
  • 思考如何实现需求 === 参考别人发表的经验和思路,比如看论文、技术博客、线上宣讲会、开源项目等,在针对需求改进和优化;
  • Prompt 构建,数据切分、数据集构建:分词、分段、Embedding 计算

RPC 中间件

  • Netty 数据传输
  • RPC架构==Bean 生命周期,分布式注册中心:zk(CP、zab算法)

三友

  • 数据库缓存一致性设计
  • 新需求的开发

Q&A

华为核心价值观

  • 以客户为中心,以奋斗者为本,长期艰苦奋斗,坚持自我批判

说说自己对于艰苦奋斗的看法(精神上的)

  • 我认为艰苦奋斗是一种积极向上、不断进取的品质,是为了实现自身价值,努力过上充实且有意义的人生,而不仅仅是为了眼前的利益;
  • 结合我自己的经历来看,虽然中考失利了,但我仍保持努力拼搏的信念,在后续的高考、考研中不断超越自己,才有机会接触到了更多有挑战有意义的事情;

科研&项目:

  • 担任角色;负责的工作;项目背景;前期调研;创新点

  • 项目有哪些难点

  • 开发过程中遇到问题;如何解决

  • 科研过程中遇到问题;如何解决

    • 一开始对科研内容一窍不通,通过不断的学习试错总结慢慢积累了经验

接下来的一年里有什么计划

  • 专利修改,秋招找工作,写大论文+毕业答辩
  • 学习大数据技术栈(Hadoop、Map-Reduce、Hbase),出国旅行

未来职业规划

  • 进入优秀的团队中工作学习;
  • 前四年深耕技术,不断学习,沉淀技术栈,拓宽视野;
  • 抓住机遇,第六、七年应聘管理层,接业务,带团队,一个人的力量终究是有限的,只有激发团队的力量才能办成大事;

为了达成这些规划具体会做些行动

  • 学习大数据相关的技术栈;
  • 抓住现有机会,积极投身工作中,不断提升技术能力,扩大人脉。耐心地等待机遇,当机遇来临时果断抓住它;

绩点排名

  • 大一只有中游水平,后面几年排名逐年上升,大三拿到了学业奖学金并考研成功。在读研期间也能有中上游的绩点,拿到了学业奖学金;

如何看待华为公司?为什么想来华为公司进行实习?

  • 无论是在芯片、操作系统还是在手机、汽车等领域,华为都是中国的一线品牌,华为当下在做的事情相当于五十年前的核武器研究;
  • 参加华为举办的竞赛感受到华为的人文关怀做得很好,比赛场地布置的很用心,比赛结束后还举办了活动,吃了大餐,临走还送和一袋纪念品,包括所有人的合照;
  • 体验大厂的氛围和管理制度,和优秀的团队一起成长,努力工作,争取毕业留在华为;

能够实习多长时间?

  • 半年,立刻到岗

对什么感兴趣并做了什么努力?

  • 对大语言模型很感兴趣;LLM 的训练和微调对硬件和数据集的要求高,但实验室只有 A6000,更加适合 LLM 的应用开发,看了很多论文、开源项目和技术博客,最终让基于大语言模型实现一个具体需求的过程非常有成就感;

科研期间最大的困难

  • 对语言模型没有任何了解,实验室也是第一次接语言模型的项目,没有任何沉淀,一开始上手很艰难,只能不断重复去看网课和教程;

如何获取资料

  • 论文、技术博客、开源项目、社群宣讲会

什么东西起了很大的作用

  • 技术博客,因为它更加贴近实际落地的工作,大佬们留下的经验往往给我灵感

重大的挫折

  • 人生中最大的挫折应该是中考,我当初冲重高保底优高,最后发挥失常只考上了职高;
  • 高中 保持学习的劲头,稳扎稳打,高考超重点线;这段经历让我任何时候都不会轻言放弃,即使失败了也没事,总结反思之后再出发,家人和朋友一直都在,成功与否只是我自己的选择;

压力特别大的时候

  • 跑步、爬山、骑行

科研内容

应用背景:将知识图谱应用在大模型领域,提升 LLM 响应的准确性和逻辑性;

创新点:不同于目前流行 RAG架构 思想,并不是通过 Prompt 帮助模型获取外部知识,而是将知识图谱中的数据训练到模型中,微调后的模型不仅得到了图谱中的外部知识,还获取了图谱中节点之间的逻辑性(对话过程中的);

具体实现:

(1) 提出了动态策略模型,跟踪历史对话中用户语句多类特征的动态变化,抽取对话中深层次的关系和属性。

(2)设计了一个基于注意力机制的异构图网络,将用户的意图、历史策略和上下文对话进行交互,选择最优的支持策略以生成有效的支持响应。

(3)考虑到全局策略控制着整个对话流,DSA设计了监控全局策略信息的子任务和上下文到全局状态和全局状态到上下文的门限控制网络。

实验:应用于情感支持对话领域,将情感支持策略视作一种类型的知识图谱,同时引入常识性知识图谱,微调 BlenderBot 模型学习知识图谱的节点特征,提高模型的在 ESConv 数据集上的指标;

步骤

【3】

3 Method【2】

  • 3.1 overall

    • 提出xxx,有效解决xxx,比别人好在哪xxx。包含了三个模块,介绍xxx,数据流xxx,提高了哪些xxx;由于这三个特征不能有效表示xxx,所以用异构图网络xxx,可得到两个状态,xxx。因此,提出的模型,有一样也有有不一样【总分总】
  • 3.2 archieve

  • 3.3

  • 3.4

4 实验【3】

  • 指标,解释,为什么好,好在哪

5 结果【1】

6 总结【3】