埃森哲✅
- 业务领域: 跨国管理咨询、信息技术服务、企业数字化转型、全行业系统集成
- 技术栈: Vue 3、React、Angular、TypeScript、Node.js、Webpack/Vite、微前端
- 团队规模: 全球超70万人,大中华区技术交付团队数千人
- 办公地点: 大连、上海、北京、广州、深圳、成都、武汉
- 公司性质: 跨国咨询外企(Fortune Global 500)
- 薪资水平: 校招15-25万,社招20-45万
岗位类型
- 前端开发工程师 - 负责国际知名企业数字化转型项目、海外电商、大型中后台系统研发
- 全栈开发工程师 - 负责 Node.js BFF 接口聚合、云原生 Serverless 部署与微服务对接
- 前端 Tech Lead / 架构师 - 负责跨国项目技术选型、架构设计、代码评审与离岸敏捷团队管理
技术特色
- 全球化协同与规范化敏捷交付: 严格遵循标准敏捷(Scrum)开发模式与 CI/CD 自动化流水线,强调代码审查(PR Review)与单测覆盖率。
- 多框架生态包容性: 咨询项目兼顾遗留系统与现代技术栈,同时服务于 Angular(企业级重型系统)、React 与 Vue 多样化生态。
- 高标准安全与多语言国际化 (i18n): 针对跨国企业合规要求,严格执行 GDPR 隐私保护、WCAG 无障碍访问及复杂动态多语言切换。
面试流程概览
校园招聘
- 简历筛选 → 在线英语与逻辑能力测评 → 专业技术面试 → 经理综合面(含英语交流) → HR面试
- 总流程约3-4周
- 难度: 3.5/5星
- 通过率: 约15%
社会招聘
- 简历筛选 → 技术一面(基础功底与框架原理) → 技术二面/项目经理面(项目落地与架构设计) → 英语能力评估 → HR面试
- 总流程约2-3周
- 难度: 3.5/5星
- 通过率: 约20%
题库
P0 必考知识点
观察者模式(Observer)与发布-订阅模式(Pub-Sub)的核心区别与代码实现?
答案
核心结论
两者都用于解耦对象间的一对多依赖关系,但耦合度与消息调度机制不同:
- 观察者模式:Subject(目标)和 Observer(观察者)直接相互引用,Observer 注册在 Subject 内部,调度由 Subject 直接驱动,属于松耦合(Loose Coupling)。
- 发布-订阅模式:发布者(Publisher)与订阅者(Subscriber)互不知晓对方存在,全部依赖独立的事件通道/事件调度中心(Event Channel / Event Bus)进行事件派发,属于完全解耦(Decoupled)。
规范手写发布-订阅模式(EventEmitter)
class EventEmitter {
constructor() {
this.events = Object.create(null)
}
on(eventName, listener) {
if (typeof listener !== 'function') throw new TypeError('Listener must be a function')
if (!this.events[eventName]) this.events[eventName] = []
this.events[eventName].push(listener)
return this
}
emit(eventName, ...args) {
if (!this.events[eventName]) return false
const listeners = [...this.events[eventName]]
listeners.forEach(fn => fn.apply(this, args))
return true
}
off(eventName, listener) {
if (!this.events[eventName]) return this
if (!listener) {
delete this.events[eventName]
} else {
this.events[eventName] = this.events[eventName].filter(fn => fn !== listener && fn.originalListener !== listener)
}
return this
}
once(eventName, listener) {
const wrapper = (...args) => {
this.off(eventName, wrapper)
listener.apply(this, args)
}
wrapper.originalListener = listener
this.on(eventName, wrapper)
return this
}
}
面试官视角
面试官考察候选人对面向对象设计原则的掌握,重点追问 once 的包装与解绑技巧,以及在真实框架(Vue 响应式 vs DOM CustomEvent)中的具体映射。
复杂可视化组件设计:画布拖拽、组件联动与实时预览设计方案?
答案
核心结论
可视化拖拽低代码平台的核心在于Schema 数据驱动视图。通过将画布状态抽象为一个标准化 JSON 数据树(包含组件类型、ID、定位布局属性、属性配置与事件交互配置),实现左侧物料拖入 → 中央画布渲染 → 右侧属性修改联动 → JSON Schema 导出与预览渲染。
关键设计架构
- 物料区与画布拖拽交互:
- 采用 HTML5 Drag and Drop API 或鼠标指针事件(
pointerdown/pointermove/pointerup)。 - 物料节点携带组件元数据
dragStart({ type: 'Button', defaultProps: {...} })。 - 画布容器监听
dragover(阻止默认行为)与drop,计算落点相对于画布的相对坐标(x, y),生成唯一uuid并插入到页面组件列表中。
- 采用 HTML5 Drag and Drop API 或鼠标指针事件(
- 状态统一管理与撤销重做(Undo/Redo):
- 使用 Pinia/Redux 维护全局画布状态。
- 维护快照历史堆栈(
snapshotStack)与指针索引,在每一步拖拽放置或属性修改时推入深拷贝快照,实现一键撤销与重做。
- 属性面板与动态组件联动:
- 选中某个组件时,右侧属性面板根据组件 Schema 动态渲染表单输入控件(ColorPicker、Input、Select)。
- 修改属性直接双向绑定更新该组件的
props对象,中央画布响应式同步刷新。
延伸阅读
考察重点速览
- 必考知识点: JavaScript 原生基础(闭包、原型链、隐式类型转换)、经典设计模式(观察者、单例、策略)、常见 CSS 布局。
- 高频面试题: 敏捷开发流程理解、发布-订阅模式实现、低代码画布设计、Vue 双向绑定与 Angular 脏检查机制对比。
- 编程挑战: 手写 EventEmitter、数组去重与快速排序、类型转换输出分析。
备考建议
针对性准备策略
- 展现良好英语沟通与表达逻辑: 咨询外企非常注重邮件书写、口语沟通和规范敏捷工作习惯。
- 强调工程规范与交付意识: 面试中多阐述编写单元测试、CI 规范、代码 Review 与客户沟通技巧。
推荐准备资源
差异化准备建议
- 校招生: 扎实掌握英语能力、计算机基础与学习自驱力。
- 社招生: 突出大型交付项目把控能力、跨国团队沟通与端到端敏捷落地经验。