针对 Java/后端开发岗位,重点考察核心技术能力、项目经验以及系统设计能力
个人介绍
面试官您好,我叫肖树德,毕业于华南农业大学计算机专业
毕业后一直从事 Java 后端开发的岗位
上一家公司是做供应链金融的
主要负责 toB 相关的一些 SAAS 业务的开发
21 年五月份加入分期乐 公司主业务是做消费贷的
我在公司先后参与了借钱业务迭代 以及营销平台建设
目前主要工作内容还是营销平台这块
有一些独立项目经验的积累,其中包括有偏业务方向的,也有底层支撑的工具系统
离职原因分析
- 主观原因
- 在分期乐积累了三年项目经验(业务方向和底层支撑工具系统)
- 希望寻求更大平台,拓展技术视野
- 期望更好的薪资待遇
- 客观原因
- 业务健康度不理想,个人发展受限
- 营销系统基本完成闭环,进入常规迭代阶段
- 团队架构调整,业务方向转变(冲量、科技赋能Saas、企微系统)
核心项目:Matrix 营销系统
项目背景与定位
从0到1参与设计开发及灰度上线的精细化运营体系
- 业务诉求:
- 受众人群分层
- 营销策略自动化部署
- 全链路数据回收
系统架构设计
MermaidOpen SVG
核心挑战与解决方案
1. 业务复杂度高的通用抽象设计
- 挑战:集团级通用营销能力,涉及多业务方,策略组合多达上百种
- 方案:自研流程引擎,实现策略灵活编排与高效扩展
- 成果:策略部署周期从5天缩短至1小时内完成
2. 高并发系统吞吐量与稳定性保障
- 挑战:策略消费能力跟不上,消息大量堆积(上百万数据跨天消费)
- 方案:人群底座优化、监控告警、策略节点补偿重试机制
- 成果:系统吞吐量提升一个量级
技术亮点:自研流程引擎
设计原理
- 基本模式:圈选用户 → AB分流 → 人群筛选 → 业务操作(发奖/触达) → 结束
- 执行结构:树状多叉结构执行
MermaidOpen SVG
实现细节
- 线程池选择:ThreadPoolExecutor而非原生Executor(避免OOM风险)
- 设计模式:模板方法模式,顶层抽象类统一数据上报和异常处理
- 架构原则:单一职责、开闭原则,节点聚焦内部逻辑,无依赖,并行开发
- 策略执行上下文存储:json序列化之后放到MySQL中
开源框架选型考量
Flowable/Activiti/Camunda vs. 自研
- 决策因素:
- 业务场景覆盖度(功能及吞吐量要求)
- 迭代灵活性
- 自研原因:
- 营销流程视图复杂(策略转化率等流程节点指标展示)
- C端高流量场景,开源框架缺乏生产实践支撑
- 重写框架研发人力成本高
性能优化专项
人群决策性能优化
MermaidOpen SVG
关键优化点
-
配置预编译优化
- 人群配置解析前置到管理端
- 标签去重
- 表达式预转换(Google Aviator格式)
-
嵌套人群递归优化
- 问题:人群层层引用导致递归执行,IO开销大
- 解决:深度遍历解析配置,将嵌套结构平铺,批量预取标签值
- 效果:避免串行IO,减少网络往返
-
缓存策略优化
- 调整缓存粒度:接口维度 → 单个人群ID维度
- 缓存命中率提升:40% → 99%
- 引入Caffeine二级缓存减少分布式缓存网络IO
-
缓存一致性保障
- 监听Binlog日志,人群配置变更后旁路异步刷新缓存
- 接受分钟级延迟更新
稳定性专项治理
-
策略执行异常处理
- 线程池打爆补救
- 策略节点补偿重试机制
-
业务线隔离
- 不同优先级Topic隔离
- 通过动态配置中心,调整消费线程数和批量拉取消息数
-
加锁场景优化
- 用户维度策略执行流水写入优化
- 乐观锁实现
工程价值与个人贡献
-
产品前瞻性思考
- 主动识别业务潜在诉求和痛点
- 预留拓展点(用户侧执行流水记录、核心流程节点解耦)
- 支持后期并行开发
-
工程效能提升
- 推进系统工具建设,提升团队效率
- 建立需求预评审机制,防止后期留坑
- 推动核心链路时序图等工程化规范
-
技术栈沉淀
- DDD领域驱动设计实践
- 工具箱能力沉淀
- 合理挑战不合理产品设计
技术深度问题解析
Redis Lua脚本限流原理
- 基本原理:原子性执行评估请求、计数和判断逻辑
- 优势:
- 原子性保证
- 减少网络往返
- 执行效率高
- 潜在问题:
- 复杂脚本可能阻塞Redis
- 需考虑分布式一致性
乐观锁实现用户策略执行流水
- 业务场景:营销画布执行记录(可达20M+JSON数据)需并发安全
- 实现方式:版本号控制,CAS更新
- 性能影响:减少数据库锁竞争,提高并发能力
研发流程与最佳实践
- 敏捷开发:2周一个Sprint,每个迭代产出可工作软件
- DDD实践:领域驱动设计,聚焦业务建模
- 架构设计原则:
- 清晰理解架构设计概念、本质和目的
- 遵循通用设计原则
- 标准化设计流程
- 深入理解架构模式
性能优化通用原则
-
减少重复数据库查询
- 方法间传递已查询结果
- ThreadLocal临时缓存
-
并发处理
- 将串行操作并行化
- 示例:两个3秒查询,串行需6秒,并行仅需3秒
-
非核心操作异步化
- 子线程异步执行
- 消息队列实现
-
减少数据量
- 使用高效序列化库(如Kryo)
- 实例:数据体积缩小1倍,处理时间从700ms降至200ms
-
合并查询
- 批量ID查询替代单条查询
- 减少数据库请求次数和全表扫描
