作为全球领先的支付技术公司,Stripe 对软件工程师的招聘流程极其严谨且系统化。无论你是刚开始准备简历,还是已经拿到 Stripe 面试邀请,这篇全流程拆解都能帮你把节奏对齐、把准备做扎实。下面先讲四个阶段,再放一道 Onsite 高频真题。
一、Stripe 招聘四阶段
| 阶段 | 形式 | 重点 |
|---|---|---|
| Recruiter 电话初筛 | 电话 / 视频,非技术 | 背景、动机、对 Stripe 的了解、沟通与文化契合 |
| Behavioral Assessment | 在线测评 / 问卷 15–30 min | 团队协作倾向、工作风格、情境题 |
| Technical Phone | 技术电面 | 算法、数据结构、系统设计,实时写代码 |
| Onsite | 多轮 | 编程、系统设计、行为,深度评估 |
1)Recruiter 电话初筛
招聘流程的第一步,主要做初筛。Recruiter 会通过电话或视频,聊你简历上的经历、职业目标,以及你对 Stripe 的兴趣。这部分通常是非技术的,主要评估沟通能力和文化契合度。
2)Behavioral Assessment
通常是一个在线测试或问卷,用来评估候选人的行为特质和团队协作能力。目的在于了解你在团队中的表现,以及是否具备 Stripe 看重的特质。题目可能是情境题,比如「你如何处理团队冲突?」「在压力下如何保持高效?」也可能是性格测试。整段一般 15–30 分钟,相对轻松但很关键。
3)Technical Phone
考察技术能力和解决问题的思路,通常包括算法、数据结构、系统设计等,可能要求实时写代码或解题。
4)Onsite
对技术能力、团队协作和文化契合做深度评估,通常包括多轮:编程、系统设计、行为。编程轮考代码能力和代码质量,通常要你解决一道涉及算法、数据结构或真实应用场景的题。
二、Onsite 独家真题:解析 Accept-Language header
在 HTTP 请求中,Accept-Language header 描述了请求方希望返回内容所使用的语言列表,形式是逗号分隔的 language tag 列表。例如:
Accept-Language: en-US, fr-CA, fr-FR
表示读者愿意接受:美式英语(最偏好)、加拿大法语、法国法语。
我们的服务器需要根据这个 header 返回可接受的语言。服务器目前不支持所有可能被请求的语言,但有一个支持集合。
Part 1:按偏好顺序匹配支持的语言
写一个函数,接收两个参数:Accept-Language header 的值字符串,以及一个支持语言的集合;返回适合该请求的 language tag 列表,按偏好降序(与它们在 header 中出现的顺序相同)。
parse_accept_language(
"en-US, fr-CA, fr-FR",
["fr-FR", "en-US"]
)
# Returns: ["en-US", "fr-FR"]
parse_accept_language("fr-CA, fr-FR", ["en-US", "fr-FR"])
# Returns: ["fr-FR"]
parse_accept_language("en-US", ["en-US", "fr-CA"])
# Returns: ["en-US"]
实现思路很直接:按 header 顺序遍历,保留在支持集合里的 tag。用集合做 O(1) 查找,顺序天然由遍历保证:
from typing import List
def parse_accept_language(header: str, supported: List[str]) -> List[str]:
supported_set = set(supported)
result = []
for tag in (t.strip() for t in header.split(",")):
if tag in supported_set and tag not in result:
result.append(tag)
return result
复杂度 O(n),n 为 header 中的 tag 数量。注意去重——同一 tag 在 header 中可能重复出现。
Part 2:支持 q 权重与通配 *
Accept-Language 通常还会带不区分地区的 tag,比如 fr 表示「任意 French 变体」,以及带 q= 权重和通配 *。扩展你的函数支持这些:
# Example 1
parse_accept_language(
"fr-FR;q=1, fr-CA;q=0, fr;q=0.5",
["fr-FR", "fr-CA", "fr-BG"]
)
# Returns: ["fr-FR", "fr-BG", "fr-CA"]
# Example 2
parse_accept_language(
"fr-FR;q=1, fr-CA;q=0, *;q=0.5",
["fr-FR", "fr-CA", "fr-BG", "en-US"]
)
# Returns: ["fr-FR", "fr-BG", "en-US", "fr-CA"]
# Example 3
parse_accept_language(
"fr-FR;q=1, fr-CA;q=0.8, *;q=0.5",
["fr-FR", "fr-CA", "fr-BG", "en-US"]
)
# Possible order: ["fr-FR", "fr-CA", "en-US", "fr-BG"]
关键点:
- 每个 header 项可带
;q=权重,缺省视为q=1; - 裸语言 tag(如
fr)匹配该语言的所有变体(fr-FR、fr-CA、fr-BG…); *匹配所有未被显式匹配的支持语言;- 最终按 q 权重降序排,权重相同时保持 header 内出现顺序作为稳定 tiebreak。
from typing import List
def parse_accept_language(header: str, supported: List[str]) -> List[str]:
# 1) 解析每一项为 (tag, q),缺省 q=1
rules = []
for i, item in enumerate(t.strip() for t in header.split(",")):
if not item:
continue
if ";q=" in item:
tag, q = item.split(";q=")
q = float(q)
else:
tag, q = item, 1.0
rules.append((tag.strip(), q, i)) # i 作为出现顺序,稳定 tiebreak
# 2) 为每个支持语言求出它能拿到的最高优先级 (q, order)
scored = {}
for lang in supported:
base = lang.split("-")[0]
best = None
for tag, q, order in rules:
if tag == lang: matched = (q, order) # 精确匹配
elif tag == base: matched = (q, order) # 裸语言匹配变体
elif tag == "*": matched = (q, order) # 通配
else: continue
if best is None or matched > best:
best = matched
if best is not None and best[0] > 0: # q=0 表示明确拒绝
scored[lang] = best
# 3) 按 q 降序、出现顺序升序排序
return sorted(scored, key=lambda l: (-scored[l][0], scored[l][1]))
注意 q=0 的语义是明确拒绝——fr-CA;q=0 意味着即使被 * 命中也不应返回(实现时让精确匹配优先级覆盖通配即可)。
三、为什么 Stripe 爱出这种题
parse_accept_language 是 Stripe 的经典 Onsite 题,它表面是字符串解析,实质考的是:
- 真实协议建模:你要读懂 RFC 风格的规则,而不是套模板;
- 优先级与 tiebreak:q 权重、出现顺序、精确 vs 通配的覆盖关系,边界很多;
- 可扩展实现:Part 1 到 Part 2 是递进的,写死了 Part 1 就很难接 Part 2。
四、总结
Stripe 面试整体严谨:Recruiter → Behavioral → Technical Phone → Onsite 四阶段层层筛选。Onsite 编程轮偏真实工程题(如 Accept-Language 解析),重点不在算法技巧,而在协议理解、优先级处理与可扩展实现。把递进式题目当成「先跑通再加规则」的练习,最稳。
FAQ
Q1:Stripe 面试一共几轮?
四阶段:Recruiter 电话初筛、Behavioral Assessment 在线测评、Technical Phone 技术电面、Onsite 多轮(编程 + 系统设计 + 行为)。
Q2:Behavioral Assessment 要准备吗?
它是在线测评 / 问卷,15–30 分钟,考团队协作倾向与工作风格。不用刷题,但要保持回答一致、贴合 Stripe 看重的协作与正直特质。
Q3:Accept-Language 这题难点在哪?
不在解析本身,而在 Part 2 的优先级处理:q 权重降序、q=0 表示拒绝、裸语言 tag 匹配所有变体、* 兜底,以及权重相同时按出现顺序稳定排序。
Q4:怎么准备 Stripe Onsite 编程轮?
练「先跑通 Part 1,再增量加规则」的递进式解题;多做协议 / 规则类题(解析、匹配、优先级)。如需这道题的限时陪练与变体训练,可以发岗位 JD 先做题型预测。
正在准备 Stripe 面试?
Stripe Onsite 偏真实工程题,考协议理解、优先级处理与可扩展实现。oavoservice 提供 Stripe 全流程陪练:Accept-Language 等经典题的限时模拟、递进式解题训练、系统设计与行为演练。教练含前大厂资深工程师,熟悉 Stripe 评分风格。
立即添加微信 Coding0201,获取 Stripe 真题与陪练。
联系方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy