知乎 算法工程 一面
一、八股
JVM
1.你实习时线上部署的容器是什么配置?是几核几G?
一上来就给我问蒙了。
2.(1)有关注项目的GC吗?假如说我有个项目是8核16G的,用JDK17,只部署一个进程,让你去配置它的参数,你会怎么配?比如堆大小、选用什么垃圾回收器等等。
这里确实没动手实操过,只能扯到堆大小应该在合理的范围内越大越好,尽量避免Full GC影响用户体验。
(2)一个Region分配多大比较合理?
实话实说,确实没真实用过。
3.(1)讲一下G1的原理吧?
讲了一下G1回收的全过程,中途提了一下通过引用计数或可达性算法来判断对象是否可以被回收。
(2)面试官追问,可达性分析算法是怎么实现的?
通过GC Root形成引用链,若对象可达,则不可被回收。
(3)这个描述比较简单,但是可达性底层也不可能一个一个挨着去算,这样也比较费时,它有什么优化的方式吗?
确实不清楚,面试官提示可以通过RSet结构体,每个Region都会维护一个Rset,方便做可达性分析。
4.(1)G1 GC其实粗略地看,可以分为四个阶段,请你分别讲一下,并说明哪个阶段会有STW?
初始标记:标记GC Roots引用的标记为存活;
并发标记:将第一步中标记的对象引用的对象标记为存活;
最终标记:标记一些引用改变漏标的对象,不管新创建、不再关联的对象,这里会有STW;
并发复制清理:将存活对象复制到别的Region,不会产生内存碎片。
这里都说上来了,但是也是快忘干净了,把初始标记忘了,认为并发标记是第一阶段了,被提示了后才纠正过来。
(2)第三阶段有一个SATB的结构或策略,你有了解过吗?
实话实说,没有。
5.你觉得G1和CMS的差异是什么?简单说一下
这是真忘了。
Redis
1.(1)我看你用过Redis,我有一个场景,如何用Redis去统计一个搜索接口的搜索频次Top 10的词,用哪种数据结构,怎么统计?
可以直接用Hash,或者是Redis提供的现成的ZSet。
(2)那你了解ZSet实现的原理吗?底层?
记得点评里面讲过,但这里确实是忘了。
2.(1)讲一下Redis的两种持久化吧,以及差异。
RDB,Redis Database Backup file,它是通过将内存中的所有数据都记录到磁盘中,bgsave命令会fork一个子进程,读取内存数据并写入RDB文件。
AOF,Append Only File,通过逻辑方式,即记录Redis中的写命令进行数据的持久化。
差异可能是前者侧重于物理内存的快照,后者则是通过逻辑命令进行持久化。
(2)那在实践中,你会更倾向于选哪一种?
这里的选的RDB,一是因为对内存数据的复制比单单记录逻辑命令来的更准确、可靠;第二点则是RDB在Redis的主从同步方面也有作用。
结果面试官说应该是两种结合比较合理😄。
二、实习
介绍了一下实习的项目
1.先看向量搜索的部分吧,文档的切chunk,转embedding是你做的吗?
讲一下数据清洗,对数据的降噪操作,以及调用embedding模型转向量的过程。
2.这里的embedding model是你们算法同学维护的?这里为什么选用Redis,而不用ES?你的考量是什么?
直接通过Ollama部署的。讲了一下原因,而且RS在性能上应该是要比ES好的。
3.说一下这两个检索的差异吧,RS用的是什么算法,ES又用的是什么算法?
讲了一下混合检索的原理,但底层确实不清楚。
这里面试官讲了一下常见的算法,并进行了推测。
4.这里为什么要用MQ优化多线程?最让你觉得有必要进行优化的点是什么?
多线程只能在单实例上运行,而MQ则可以在多台实例上一起跑,进行竞争消费。
5.后续还问了一下其他项目的细节,但对大家帮助不大,这里不做赘述。
三、项目
介绍了一下项目
1.你做这个项目时,是参考了Open Claw的设计理念吗?
是的。
2.聊一聊这里的短期、长期记忆你是怎么设计的?
讲了一下对记忆处理的策略,这里主要是参考的Claude Code,当上下文窗口过大,调用大模型,对之前的对话历史生成摘要。
3.(1)你怎么做到,让Agent能记住你半个月前跟它说的事情?
我一开始没听清,以为是隔半个月重新打开,所以讲了一下持久化的机制。这里面试官纠正,是半个月一直在同一个窗口对话。
由于大模型存在Lost in the Middle的特性,所以如果上下文窗口过长,在目前的设计下,可能没有办法保证能够确保还记得半个月前的事情。
(2)明白,你知道Open Claw是怎么处理这个问题的吗?
应该是提供了Skill的能力,对之前的上下文生成一份总结或摘要,可能是MD格式,实现回忆的效果。
四、手撕
合并多个升序的链表
直接用的txt,共享屏幕
思路出的挺快的,但是最后实现还是有点问题,好久没手敲过了,最后算是通过伪代码实现了吧。
五、反问
问了一下过去具体会做什么业务,会用到的技术栈都有哪些。
感觉稍微有点难,好多算法、底层方面确实没了解过,也没办法。很多忘了的有点可惜,就在嘴边但是说不出来。还有就是要加强手撕能力,避免这种思路有了但是磨磨唧唧半天才写出来的情况。
面试官人不错,答不出来也会给提示,循循善诱。
我从小就玩知乎,不过感觉这次是寄了。
JVM
1.你实习时线上部署的容器是什么配置?是几核几G?
一上来就给我问蒙了。
2.(1)有关注项目的GC吗?假如说我有个项目是8核16G的,用JDK17,只部署一个进程,让你去配置它的参数,你会怎么配?比如堆大小、选用什么垃圾回收器等等。
这里确实没动手实操过,只能扯到堆大小应该在合理的范围内越大越好,尽量避免Full GC影响用户体验。
(2)一个Region分配多大比较合理?
实话实说,确实没真实用过。
3.(1)讲一下G1的原理吧?
讲了一下G1回收的全过程,中途提了一下通过引用计数或可达性算法来判断对象是否可以被回收。
(2)面试官追问,可达性分析算法是怎么实现的?
通过GC Root形成引用链,若对象可达,则不可被回收。
(3)这个描述比较简单,但是可达性底层也不可能一个一个挨着去算,这样也比较费时,它有什么优化的方式吗?
确实不清楚,面试官提示可以通过RSet结构体,每个Region都会维护一个Rset,方便做可达性分析。
4.(1)G1 GC其实粗略地看,可以分为四个阶段,请你分别讲一下,并说明哪个阶段会有STW?
初始标记:标记GC Roots引用的标记为存活;
并发标记:将第一步中标记的对象引用的对象标记为存活;
最终标记:标记一些引用改变漏标的对象,不管新创建、不再关联的对象,这里会有STW;
并发复制清理:将存活对象复制到别的Region,不会产生内存碎片。
这里都说上来了,但是也是快忘干净了,把初始标记忘了,认为并发标记是第一阶段了,被提示了后才纠正过来。
(2)第三阶段有一个SATB的结构或策略,你有了解过吗?
实话实说,没有。
5.你觉得G1和CMS的差异是什么?简单说一下
这是真忘了。
Redis
1.(1)我看你用过Redis,我有一个场景,如何用Redis去统计一个搜索接口的搜索频次Top 10的词,用哪种数据结构,怎么统计?
可以直接用Hash,或者是Redis提供的现成的ZSet。
(2)那你了解ZSet实现的原理吗?底层?
记得点评里面讲过,但这里确实是忘了。
2.(1)讲一下Redis的两种持久化吧,以及差异。
RDB,Redis Database Backup file,它是通过将内存中的所有数据都记录到磁盘中,bgsave命令会fork一个子进程,读取内存数据并写入RDB文件。
AOF,Append Only File,通过逻辑方式,即记录Redis中的写命令进行数据的持久化。
差异可能是前者侧重于物理内存的快照,后者则是通过逻辑命令进行持久化。
(2)那在实践中,你会更倾向于选哪一种?
这里的选的RDB,一是因为对内存数据的复制比单单记录逻辑命令来的更准确、可靠;第二点则是RDB在Redis的主从同步方面也有作用。
结果面试官说应该是两种结合比较合理😄。
二、实习
介绍了一下实习的项目
1.先看向量搜索的部分吧,文档的切chunk,转embedding是你做的吗?
讲一下数据清洗,对数据的降噪操作,以及调用embedding模型转向量的过程。
2.这里的embedding model是你们算法同学维护的?这里为什么选用Redis,而不用ES?你的考量是什么?
直接通过Ollama部署的。讲了一下原因,而且RS在性能上应该是要比ES好的。
3.说一下这两个检索的差异吧,RS用的是什么算法,ES又用的是什么算法?
讲了一下混合检索的原理,但底层确实不清楚。
这里面试官讲了一下常见的算法,并进行了推测。
4.这里为什么要用MQ优化多线程?最让你觉得有必要进行优化的点是什么?
多线程只能在单实例上运行,而MQ则可以在多台实例上一起跑,进行竞争消费。
5.后续还问了一下其他项目的细节,但对大家帮助不大,这里不做赘述。
三、项目
介绍了一下项目
1.你做这个项目时,是参考了Open Claw的设计理念吗?
是的。
2.聊一聊这里的短期、长期记忆你是怎么设计的?
讲了一下对记忆处理的策略,这里主要是参考的Claude Code,当上下文窗口过大,调用大模型,对之前的对话历史生成摘要。
3.(1)你怎么做到,让Agent能记住你半个月前跟它说的事情?
我一开始没听清,以为是隔半个月重新打开,所以讲了一下持久化的机制。这里面试官纠正,是半个月一直在同一个窗口对话。
由于大模型存在Lost in the Middle的特性,所以如果上下文窗口过长,在目前的设计下,可能没有办法保证能够确保还记得半个月前的事情。
(2)明白,你知道Open Claw是怎么处理这个问题的吗?
应该是提供了Skill的能力,对之前的上下文生成一份总结或摘要,可能是MD格式,实现回忆的效果。
四、手撕
合并多个升序的链表
直接用的txt,共享屏幕
思路出的挺快的,但是最后实现还是有点问题,好久没手敲过了,最后算是通过伪代码实现了吧。
五、反问
问了一下过去具体会做什么业务,会用到的技术栈都有哪些。
感觉稍微有点难,好多算法、底层方面确实没了解过,也没办法。很多忘了的有点可惜,就在嘴边但是说不出来。还有就是要加强手撕能力,避免这种思路有了但是磨磨唧唧半天才写出来的情况。
面试官人不错,答不出来也会给提示,循循善诱。
我从小就玩知乎,不过感觉这次是寄了。
全部评论
想问下大佬大概什么时间投递的呢?
太难了
相关推荐
查看15道真题和解析 点赞 评论 收藏
分享
点赞 评论 收藏
分享
