东方财富服务端开发暑期实习面试,已拿offer!!

212 阅读10分钟

这是一位球友投稿的东方财富服务端开发暑期实习面经,问的内容还是比较多的,难度也相对比较大。下面是正文。

最近参与了东方财富服务端开发暑期实习的招聘,并最终收获了 Offer。整个过程持续了大约一周,从技术一面、技术二面到最终的 HR 沟通,体验下来感觉公司非常注重候选人基础知识的广度与深度,同时也对实际问题的解决能力有较高要求。在此,我将整个面试过程进行复盘,希望能为志在东财或相关岗位的同学提供一些有价值的参考。

背景介绍

  • 面试岗位: 服务端开发实习生 (Java)
  • 面试流程: 技术一面 -> 技术二面 -> HR -> Offer
  • 面试形式: 线上/线下均有,我经历的是线下面试

技术一面

一面的面试官非常和蔼,整体氛围比较轻松。面试时长约一小时,主要围绕 Java 基础、中间件、数据库等核心技术栈进行提问,考察知识的广度。问题由浅入深,覆盖面很广。

Java 基础与 JVM

  • 面向对象: 我从封装、继承、多态三板斧切入去聊了挺多,面试官整体比较满意。
  • 重载与重写: 我从方法签名、编译/运行期、以及与多态的关联等角度进行了解答。
  • 集合与并发
    • hashCode()方法的作用是什么?它和equals()方法有什么关系?我回答了其在哈希表中的作用,并强调了两者需要同时重写的原则。面试官追问了哈希冲突的解决方案,我提到了链地址法和开放地址法。
    • TreeSet是如何实现排序的?我解释了其底层基于红黑树,并需要对象实现Comparable接口或在构造时传入Comparator
    • LinkedBlockingQueueConcurrentLinkedQueue的区别?这个问题有点难了,考察了对 JUC 包的熟悉程度,我主要从是否阻塞、内部实现(前者基于 ReentrantLock,后者基于 CAS)、容量是否无界这三个角度去回答。
  • JVM 内存模型与垃圾回收
    • “介绍一下 JVM 的运行时数据区”,我按照线程共享和私有的方式进行了划分和介绍。
    • “为什么要进行垃圾回收?” 这是一个引导性问题,之后面试官深入问了 CMS 和 G1 回收器的核心区别,我从应用场景、回收目标(停顿时间 vs 吞吐量)、内存布局(连续 vs 分区)等方面做了对比。

数据库

  • 事务特性与隔离级别: “谈谈数据库事务的 ACID 特性是如何实现的?” 我分别解释了原子性(Undo Log)、持久性(Redo Log)、隔离性(锁/MVCC)和一致性(由其他三者保证)的底层原理。紧接着,面试官让我说明了 SQL 标准的四种隔离级别以及它们分别解决了哪些并发问题(脏读、不可重复读、幻读)。
  • 索引与调优: “B+树的结构是怎样的?为什么数据库索引常用它?” 我从非叶子节点只存索引、叶子节点存储数据且形成有序链表等角度,分析了其在范围查询和 I/O 效率上的优势。面试官还让我分享了一些 SQL 调优的实际经验。
  • 分布式锁: “如果让你用 MySQL 设计一个分布式锁,你会怎么做?” 我提出了利用主键或唯一索引的唯一性约束来实现,并简单介绍了具体的方案。

缓存

  • 高可用与持久化: “Redis 如何保证高可用?” 我介绍了主从复制、哨兵(Sentinel)机制和集群(Cluster)三种模式。接着,面试官问了 RDB 和 AOF 两种持久化策略的优劣和适用场景。
  • 缓存生产问题: 经典缓存三件套(穿透、击穿、雪崩)的成因和解决方案是必考题。我结合布隆过滤器、缓存预热、热点数据永不过期、加锁更新、以及限流降级等策略进行了解答。
  • 数据结构与热点 Key: “ZSet 的底层数据结构是什么?” 我回答了跳表(SkipList)和压缩列表(ZipList)。面试官进一步问了热点 Key 问题的解决方案,我提到了多级缓存、本地缓存以及将热点 Key 打散等方法。

其他

  • RocketMQ: “请介绍一下 RocketMQ 的整体架构和核心组件”,我说明了 NameServer、Broker、Producer 和 Consumer 的作用。
  • 网络与框架
    • HTTP 与 HTTPS 的核心区别是什么?我从安全性、证书、端口和连接过程等方面进行了解答。
    • Nginx 常用的负载均衡算法有哪些?我列举了轮询、加权轮询、IP 哈希等。

算法手撕

  • 题目: 零钱兑换 II (LeetCode 518)
  • 要求: 给定不同面额的硬币和一个总金额,计算可以凑成总金额的硬币组合数。
  • 分析: 这是一道典型的完全背包问题,考察动态规划能力。我定义了dp[i]为凑成金额i的组合数,并写出了状态转移方程。虽然一开始有些紧张,但在面试官的引导下最终完成了代码。

一面小结

一面主要考察候选人技术栈的广度和对基础知识的掌握牢固程度,问题多但通常不会无限深入。建议准备时要全面复习,对每个知识点都要有清晰的理解。

技术二面

二面在一天后进行,面试官看起来是部门的技术负责人,气场很强。这一轮不再局限于八股文,而是更侧重于对项目经验的深入挖掘、对技术原理的抽象理解以及解决复杂场景问题的能力。

项目与实习经历深挖

面试官花了大量时间在我的实习经历和项目上,问题非常细致:

  • “介绍一下你参与的那个秒杀项目,它的整体流程是怎样的?”
  • “在你的项目中,分库分表是如何实现的?基于哪个中间件(如 Sharding-JDBC)?分片键是如何选择的?”
  • “秒杀场景下如何解决超卖问题?库存一致性是如何保证的?”
  • “你负责的模块中,遇到过最有挑战性的问题是什么?你是如何分析和解决的?”
  • “你们的系统 QPS 和响应时间大概是多少?做过压力测试吗?”

这一环节不仅要求你对项目了如指掌,更要展现出你在项目中的思考和成长。

框架

  • “谈谈你对 Spring 框架的理解”,这个问题非常开放,我从 IOC 和 AOP 两个核心思想切入,阐述了它们如何解耦和简化企业级开发。
  • “Spring AOP 是如何实现的?” 我回答了基于 JDK 动态代理和 CGLIB 两种方式,并说明了它们分别针对接口和类的代理机制。面试官追问:“动态代理只能用反射吗?”
  • “Spring Boot 加载配置文件的优先级了解么?”我只提到当前项目根目录下 config/ 子目录的配置文件优先级最高,其他的有点忘了。

分布式

  • “在分布式系统中,如何生成全局唯一的 ID?”,我列举了 UUID、数据库自增、Redis 生成以及雪花算法(Snowflake)等方案,并重点分析了雪花算法的构成和优缺点。

编程语言

  • “Java 里有协程(Coroutine)这个概念吗?你了解过其他语言的协程实现吗?” 这个问题考察了技术的视野和前瞻性。
  • “除了 Java,还学习过其他语言吗?掌握程度如何?”

算法手撕

  • 题目: 合并两个有序数组,并求出中位数 (类似 LeetCode 4. 寻找两个正序数组的中位数)
  • 要求: 时间复杂度需要达到 O(log(m+n))。
  • 分析: 这道题的难点在于时间复杂度的要求,暴力合并再找中位数是无法满足的。正确解法是利用二分查找的思想,在两个数组中寻找合适的分割线。这道题对算法思维的要求比一面高出不少。

二面小结

二面是压力最大的一轮,面试官非常聪明,能迅速抓住你回答中的关键点并进行延伸。这一轮的核心是考察你的项目真实性、解决问题的能力以及技术思考的深度。单纯背诵八股文很难过关,必须有自己的理解和沉淀。

HR 沟通与总结

二面的技术部分结束后,HR 进行了简短的沟通,主要是一些常规问题:

  • 对工作地点有什么要求?
  • 对金融和证券行业有什么了解?
  • 未来的职业规划是怎样的?
  • 目前有拿到其他公司的 Offer 吗?

整个过程比较轻松,主要是为了了解候选人的稳定性和求职意向。

参考资料

下面这几篇文章基本涵盖了上面提到的绝大部分面试题的参考答案(注:这部分为 Guide 补充):

最终感想与建议

从这次面试经历来看,我总结出东方财富在招聘时比较看重以下几点:

  1. 扎实的基础: 无论是 Java、JVM、数据库还是网络,基础知识都是面试的重中之重。
  2. 深入的理解: 不仅要知其然,更要知其所以然。对框架、中间件的底层原理有深入理解会非常加分。
  3. 真实的项目经验: 项目经历是展示你解决问题能力的最佳舞台,一定要准备充分,能够清晰地阐述项目的背景、难点和你的贡献。
  4. 优秀的编码能力: 两轮技术面都有算法题,说明公司对候选人的编码基本功有明确要求。

最后,希望这篇复盘能对大家有所启发。求职之路不易,保持学习,不断沉淀,祝愿各位都能拿到心仪的 Offer!