Canva 的 Backend Software Engineer 面试整体流程是三轮技术面,走下来感觉整体偏实战型,不太追求特别 tricky 的算法,重点是你写得是否健壮、思路是否清晰,以及你对系统设计和多线程模型的理解有没有落地经验。他们主要用 Java,所以用 Java 来写代码是加分项。
第一轮是纯 coding,难度大概在 Leetcode 中等偏简单的范围。我那轮碰到的题是类似 Leetcode 228 Summary Ranges 的题目,不过题干稍微变了一点点,不是直接照搬。题目会给你一串整数,要求你找出连续区间的表达形式,比如 [0,1,2,4,5,7] 输出成 ["0->2","4->5","7"] 这种格式。虽然题不难,但 test case 有不少隐藏的 corner case,比如空数组、重复元素、负数、数组没排序等等。重点是你写完之后,能不能自己意识到这些 case,然后在面试中主动补上。面试官不会帮你测,只会看你跑完了哪些 case。你可以在自己本地 IDE 里写,然后屏幕共享给他们看,整个过程还是比较轻松的。
第二轮就稍微有点挑战性了,是实现一个线程安全的 producer-consumer 模型。没有现成的 test case,你需要手写逻辑,然后跟面试官解释你的思路。比如你是打算用 wait/notify,还是 BlockingQueue,或者更高级点的 ReentrantLock + Condition。他们会追问一些细节,比如你这个设计能不能避免死锁?多个 producer 和多个 consumer 同时跑的时候,会不会丢消息?shutdown 的时候线程怎么退出?这一轮其实看重你对并发模型的理解,代码本身可能不多,但你要说得明白,说明白。能主动提到 signal 顺序、内存可见性、spurious wakeup、lock 粒度这种关键词,会让你加不少分。
第三轮是系统设计题,我们遇到的是“设计一个支付系统”。场景其实很贴近真实业务,比如支持用户付款、交易记录、对账、失败重试等等。你要从整体架构开始说,比如前端怎么接入,后端怎么划分服务,支付请求怎么走流程。然后面试官会 zoom in 某些点问你细节,比如:
总的来说,Canva 的面试比较实在,不会问你特别偏的理论,而是希望你能用工程师的角度来思考问题。写代码方面不需要特别花里胡哨,代码清晰、考虑全面就行;系统设计这块则是他们最看重的环节,毕竟招的是 Backend 工程师,能扛起服务架构才是关键。整个过程氛围比较轻松,不是那种高压 push 的面试风格。准备的时候多练练多线程和实际项目里的设计经验会比较有帮助。