订阅更新

面试官追问"为什么这样设计"你答不上来:技术选型怎么讲

项目实战表达 13 讲 · 第 6 讲 约 22 分钟读完

本文目录
  1. 开篇:两种常见的"0分选型回答"
  2. 先说结论
  3. 四维选型法详解
  4. 完整示范:EMR vs Databricks vs Spark on K8s 三方案评估
  5. 面试讲选型的标准话术
  6. 常见选型场景的标准回答
  7. 进阶技巧:怎么把"跟着用的技术"讲成"经过思考选的技术"
  8. 面试回答分层——60 vs 75 vs 90 分
  9. 面试高频追问
  10. 总结
  11. 下一篇

开篇:两种常见的"0分选型回答"

我面试别人时经常问这个问题:"你们为什么选 Flink 不选 Spark Streaming?"

然后听到两种让人无语的回答——

版本A:

"公司就在用这个。我来的时候技术栈就定了,我是跟着用的。"

版本B:

"Flink 比较流行嘛,我看网上资料说 Flink 在流处理方面做得更好。"

这两个回答都是 0 分。

版本A 的问题——你放弃了思考,把技术决策推给了"公司既有选择"。面试官心里已经打上标签——"这人没做过技术决策,只是个执行者。"

版本B 的问题——你讲的是网上共识,不是自己的判断。每个技术博客都说 Flink 更好,但这不等于你的场景需要 Flink。面试官会追问"你们什么场景必须要 Flink 而 Spark Streaming 满足不了?"——然后你继续卡壳。


"为什么选这个技术"是面试中出现频率仅次于"介绍一个项目"的高频题。几乎每个项目讲完都会被问到:

  • 为什么选 Flink 不选 Spark Streaming?
  • 为什么选 Doris 不选 ClickHouse?
  • 为什么选 Databricks 不选 EMR?
  • 为什么选 Airflow 不选 DolphinScheduler?
  • 为什么选 Parquet 不选 ORC?
  • 为什么选 MaxCompute 不选自建 Hadoop?

每一个"为什么"后面,面试官想听的是你的思考过程、评估维度、权衡理由——而不是一句"好用"或"流行"。


我在某出海硬件品牌做 EMR→Databricks 迁移时,真正让面试官印象深的不是迁移本身,而是我的选型评估过程——对比了 EMR 原地升级、Databricks、Spark on K8s 三个方案,做了 TCO 对比、POC 验证、团队能力评估。面试讲这段时,面试官经常追问比迁移本身还多的细节。

这篇我会讲透四维选型法——一个通用的选型回答框架。用 EMR→Databricks、Flink vs Spark、Doris vs CK、Airflow vs DS、Parquet vs ORC 等真实选型场景做完整示范。看完这篇,你能做到——哪怕你只是用了公司既有技术栈,也能讲出像样的选型思考。


先说结论

技术选型用四维评估法:

  1. 业务需求(能不能用)—— 功能是否满足?性能是否达标?
  2. 团队能力(会不会用)—— 学习曲线?团队是否有经验?
  3. 生态兼容(合不合得来)—— 和现有技术栈集成?数据格式兼容?
  4. 运维成本(养不养得起)—— 部署复杂度?社区活跃度?长期成本?

面试时不需要四个维度都展开——讲清楚 2-3 个最关键的考虑因素就够了。关键是面试官能感受到你考虑过多个维度、有对比、有权衡。


四维选型法详解

维度一:业务需求(能不能用)

这是选型的起点——技术再好,满足不了业务需求就是废铁。

评估要点:

  • 功能匹配度:这个技术能不能做到业务要的事?
  • 性能要求:在我们的数据量级下性能是否达标?
  • 规模承载力:未来 3 年的数据增长能扛住吗?
  • 关键特性:业务有没有特殊需求只有某个技术能做?

举例——实时项目选 Flink 还是 Spark Streaming?

"业务需求上我们的核心要求是——秒级端到端延迟 + Event Time 精确处理(风控场景必须按事件实际发生时间判断)+ Exactly-Once 语义(金额相关不能丢不能重)。

Spark Streaming 虽然也能做实时,但它是微批模型——最小批次 100ms,通常配成秒级。我们需要 200ms 级别的响应,微批不够用。Flink 是原生流模型,单条记录处理,天然支持毫秒级延迟。

Event Time 处理上 Flink 的 Watermark 机制比 Spark Structured Streaming 更成熟——侧输出流、allowedLateness、自定义分配策略都原生支持。

光这一维,业务需求就逼我们选 Flink 而不是 Spark。"

这段回答的硬核点——没有说 Flink 笼统地"更好",而是明确指出 3 个业务需求 + 对比两个框架在这 3 个需求上的具体差异。

维度二:团队能力(会不会用)

这是最容易被候选人忽略的维度,但面试官最爱考这一点——因为它反映你是否从工程实际出发做决策。

评估要点:

  • 团队现有技能:团队会什么?不会什么?
  • 学习曲线:新技术需要多久才能上手?
  • 招聘难度:这个技术在市场上好不好招人?
  • 知识沉淀:出了问题团队能不能自己解决?

举例——为什么选 Databricks 不选 Spark on K8s?

"Spark on K8s 理论上最便宜——没有 License 费,自建灵活度最高。但我们团队根本没有 K8s 运维经验——平台就我一个人,我会 Spark 但不精通 K8s。

算笔账:

  • Spark on K8s License $0/月,但需要招一个 K8s 运维工程师——上海市场 K8s 运维年薪 40-60 万,月成本约 $5000-7500
  • Databricks License $15K/月,但全托管,0 额外人力
  • 净成本对比:Databricks 反而便宜 $7500-10000/月

更大的风险在于 K8s 出问题时——我一个人解决不了,团队也解决不了,只能找外部顾问,成本不可控。

所以团队能力这一维直接否决了 Spark on K8s——不是 K8s 不好,是我们用不起。"

这段回答的硬核点——把技术成本和人力成本一起算进 TCO(总拥有成本),而不是只看 License 费。这是成熟工程师的思维方式。

维度三:生态兼容(合不合得来)

新技术永远不是孤立存在的——它要和已有的存储、调度、BI、权限系统打通。生态兼容是选型的软约束。

评估要点:

  • 上下游对接:和现有系统能不能无缝打通?
  • 数据格式:能不能读写我们现有的数据?
  • 认证授权:能接入公司的 SSO/LDAP/权限体系吗?
  • 监控告警:能不能接入现有的 Prometheus/Grafana?

举例——为什么选 MaxCompute 不选自建 Hadoop?

"某短剧出海公司整个基础设施在阿里云上——ECS、RDS、OSS、DataWorks、Hologres——全栈阿里云生态。

如果自建 Hadoop:

  • 认证授权要重新打通——阿里云的 RAM 账号体系和自建 Kerberos 认证不兼容
  • 数据存储要双写——业务数据在 RDS,自建 Hadoop 要再同步一份到 HDFS
  • 调度平台要重写——DataWorks 的任务要迁到 Airflow 或者自建
  • 监控要重建——云监控和自建集群监控要合并

选 MaxCompute:

  • RAM 账号直接复用
  • RDS 数据同步原生对接
  • DataWorks 直接用
  • 监控告警一体化

生态兼容这一维度上 MaxCompute 的集成成本几乎为零,自建的集成成本要占迁移总工时 50%。"

这段回答的价值——展示你理解生态成本往往比技术成本更高。很多候选人只看技术指标,忽略了生态集成的隐性成本。

维度四:运维成本(养不养得起)

长期运维成本 = 部署复杂度 + 故障处理成本 + 升级维护成本 + 社区活跃度风险。

评估要点:

  • 部署难度:全托管 vs 自建自管
  • 故障频率:组件稳定性如何?
  • 升级成本:版本迭代维护方便吗?
  • 社区活跃度:Github Star、PR 数、文档质量
  • 生产案例:有没有同体量公司在生产使用?

举例——为什么选 Databricks 不选 EMR 升级?

"EMR 的运维痛点我们已经很清楚了:

  • NameNode 不稳定:每月 1-2 次 GC 抖动,每次影响 10-20 分钟
  • YARN 调优复杂:内存、CPU、并行度要手动配
  • 版本升级痛苦:EMR 版本升级要停服 + 重跑 + 兼容性测试

估算运维成本——我一周 10+ 小时在处理 EMR 运维问题,按我的时薪算年化 $30K+。

Databricks 是全托管的:

  • 集群自动管理:NameNode、YARN 这些概念根本不存在
  • 版本自动升级:Databricks 每月推新版本,我们只管用
  • 故障 SLA 保障:出问题有 Databricks 支持团队处理

我估算 Databricks 之后的运维时间能降到一周 4 小时——节省 60%。

运维成本这一维度,Databricks 比 EMR 便宜 $20K/年(纯人力成本计算)。"

这段回答的核心——把运维成本量化成人力成本,这是说服老板和面试官的有效语言。


完整示范:EMR vs Databricks vs Spark on K8s 三方案评估

在某出海硬件品牌做迁移时,我评估了 3 个方案。下面是我当时做的四维对比表——面试时直接画白板画出来,冲击力最强:

维度 EMR(现状) Databricks Spark on K8s
业务需求 满足但性能不够 满足且性能更好(AQE+Delta) 满足但需自建整套
团队能力 团队熟悉,无学习成本 Notebook体验好,1-2周上手 需要K8s运维能力(团队没有)
生态兼容 AWS 原生深度集成 Delta Lake + Unity Catalog 强 需要自建存储+元数据层
运维成本 高(NN+YARN) 低(全托管) 极高(K8s+Spark都要维护)
月成本(纯云) $65K $55K (含 License) $40K
月成本(含人力) $70K(0.5 FTE) $56K(0.1 FTE) $48K(需 1 FTE K8s)
3年TCO $2.52M $2.02M $1.73M(但含招聘/磨合风险)

最终选 Databricks 的关键理由

"Spark on K8s 3 年 TCO 确实最低($1.73M),但这个数字有两个不可控风险:

风险一:K8s 运维人才不好招。K8s 精通 + 懂 Spark + 愿意来小公司——这个画像的候选人年薪 60万+,而且不好招,招到也不稳定。按招聘失败的风险算,实际 TCO 可能涨 20%。

风险二:团队磨合期风险。新人从入职到独立处理线上 K8s 问题通常要 6 个月。这 6 个月里出任何严重故障,成本都比节省的那点钱多得多。

Databricks 虽然 TCO 比 K8s 高 $290K(3 年),但它是'买确定性'——

  • 全托管,故障 SLA 有保障
  • 零学习曲线(团队已经熟悉 Spark)
  • 生态开箱即用(Delta/Unity Catalog)

对一个只有 1 个平台工程师的小团队,确定性比绝对最低成本更重要。

最终选择 Databricks——这不是最便宜的方案,是风险调整后的最优解。"

这段表达的硬核点——讲清楚了"为什么最便宜的方案不是最优的"。这是技术决策的最高境界——不是选数字最好看的,是选风险最可控的。


面试讲选型的标准话术

把四维法讲成面试话术,有个万能公式:

"我评估了 [N] 个方案——[A]、[B]、[C]。

从 业务需求 看 [都能满足 / 只有 X 能满足]——[具体差异]。 从 团队能力 看 [XX 我们有经验 / YY 我们没经验]——[影响]。 从 生态兼容 看 [XX 和现有技术栈集成最好]——[集成成本对比]。 从 运维成本 看 [全托管 vs 自建 的 TCO 差异]——[人力成本量化]。

综合权衡,[2-3 个关键因素] 是决定性的,所以最终选了 [方案]。"

示范——Flink vs Spark Streaming 选型:

"我评估了 Flink 和 Spark Structured Streaming。

从业务需求看——我们要秒级延迟 + Event Time 精确处理 + Exactly-Once,Flink 的原生流模型比 Spark 的微批模型更匹配。

从团队能力看——团队既有 Spark 又有 Flink 经验,学习成本都可接受。这一维不是决定因素。

从生态兼容看——Flink 和 Kafka/Doris 的 connector 更成熟,社区案例更多。Spark Streaming 在实时 OLAP 场景 connector 相对薄。

从运维成本看——Flink 常驻作业模式,需要单独的 JobManager/TaskManager 集群;Spark 如果已经在跑离线就可以复用集群,运维成本略低。这一维 Spark 略优。

综合下来,业务需求是决定性的——必须毫秒级延迟,必须原生 Event Time,这两个 Spark 做不到。即使运维成本略高也选 Flink。"


常见选型场景的标准回答

选型问题 决定性维度 回答要点
为什么选 Doris 不选 ClickHouse? 业务需求 多表 JOIN + 并发查询是刚需,CK 不擅长
为什么选 Flink 不选 Spark Streaming? 业务需求 秒级延迟 + Event Time + EOS 是刚需
为什么选 Airflow 不选 DolphinScheduler? 团队能力 + 业务需求 团队 Python 强 + 需要动态 DAG
为什么选 Parquet 不选 ORC? 生态兼容 Spark/Databricks 生态对 Parquet 支持更好
为什么选 MaxCompute 不选自建 Hadoop? 运维成本 + 生态兼容 小团队养不起自建 + 阿里云生态集成
为什么选 Kafka 不选 Pulsar? 生态兼容 + 团队能力 上下游对接成熟 + 团队熟悉
为什么选 Databricks 不选 EMR? 运维成本 全托管省人力,TCO 更优
为什么选 Iceberg 不选 Hudi? 生态兼容 引擎无关性好,多个查询引擎都支持

下面展开两个最常被问到的选型:

高频选型1:Doris vs ClickHouse

"我们项目选 Doris,因为三个业务需求:

1. 多表 JOIN 是刚需。 交易事实表要 JOIN 用户维度、礼物维度、渠道维度——运营看数据都是'某渠道某类礼物的用户画像'这种复合分析。Doris 的 MPP 架构原生支持多表 JOIN(Broadcast Join、Shuffle Join、Colocate Join),性能稳定。CK 是宽表设计理念,多表 JOIN 场景性能下降很多。

2. UPDATE 语义是刚需。 用户画像表需要根据最新行为更新——Doris Unique 模型原生支持主键 UPDATE,相同主键数据自动覆盖。CK 的 MergeTree 不支持 UPDATE,ReplacingMergeTree 虽然能做但最终一致性延迟不可控。

3. 高并发是刚需。 运营、产品、风控、BI 同时查——几百 QPS 的并发。Doris 的并发能力比 CK 强很多,CK 单查询快但并发上不去。

不选 CK 的反向理由——CK 更适合'单表大宽表 + 低并发 + 超快分析'(日志分析、漏斗分析),不适合我们这种'多维度业务分析 + 高并发'。

如果业务场景变了(比如做 APM 日志分析),我可能会选 CK 而不是 Doris。技术选型永远是场景驱动的。"

高频选型2:Airflow vs DolphinScheduler

"团队能力 + 业务需求双维度选 Airflow。

业务需求上——我们需要动态 DAG。广告业务有几十个平台配置,每个平台是一个独立的 DAG。Airflow 用 Python 代码定义 DAG,可以用循环批量生成;DolphinScheduler 是 UI 拖拽式,几十个 DAG 要手动配几十次。

团队能力上——团队 Python 熟,Java 薄。Airflow 是纯 Python 生态,写 DAG 就是写 Python;DolphinScheduler 二次开发要 Java。如果要自定义 Operator 我们用 Python 20 行搞定,DS 二开成本高很多。

不选 DS 的反向理由——DS 的优势是 UI 友好、国产化、中文社区活跃。如果我们是运营或分析师为主的团队,DS 的拖拽式 UI 反而更合适。但我们是数据工程师团队,Python + 代码化优先。

这是典型的'技术没有绝对好坏,只有场景匹配'——同一个选型题,不同团队的答案可以完全不同。"


进阶技巧:怎么把"跟着用的技术"讲成"经过思考选的技术"

很多候选人觉得——"我没做过技术决策啊,公司就是用这个,我是跟着用的"。

其实你不需要真的做过选型决策,也能讲出选型思考。核心是——事后补完选型评估。

补完评估的四步法

第一步:列出当时的业务场景

"我们公司做的是 XX 业务,数据量 YY,日均 ZZ 条。场景特点是 AAA。"

第二步:列出几个可能的候选技术

"对于这个场景,市面上主要的候选技术有 A、B、C 三个。"

第三步:用四维法对比

"从业务需求看 [对比],从团队能力看 [对比],从生态兼容看 [对比],从运维成本看 [对比]。"

第四步:给出当时选择的理由

"我们当时选了 A,我理解的核心原因是 [2-3 个关键维度]。"

示范:我是跟着用 Kafka 的——怎么讲成选型思考?

反例(0 分):

"公司一直用 Kafka,我进去就是用这个。"

正例(85 分):

"我们项目用的是 Kafka。虽然不是我主导选的,但我理解为什么选 Kafka:

场景:实时数据总线,日均 5000 万条消息,需要支持 Flink、Doris、风控系统多个消费者。

候选方案:Kafka、Pulsar、RocketMQ。

业务需求:三者都满足——高吞吐、持久化、多消费者。 团队能力:Kafka 是事实标准,运维文档最多、问题好排查;Pulsar 团队没有经验;RocketMQ 国内多但英文资料少。 生态兼容:Flink、Spark、Doris 的 Kafka Connector 都是一等公民;Pulsar 的 connector 稍弱;RocketMQ 在国际化业务里 connector 选择少。 运维成本:Kafka 3.x 移除了 ZooKeeper 依赖(KRaft 模式),运维简化了。

所以选 Kafka 是'事实标准 + 生态成熟 + 团队熟悉'的综合考虑。如果我们是在 2018 年做选型,可能会更看重 Pulsar 的架构先进性;现在 2024 年 Kafka 的工程成熟度在绝大多数场景下赢过 Pulsar。"

这个回答的关键——诚实承认"不是我主导选的",但展示你理解这个选型。面试官不期望每个人都做过大型技术决策,但期望你对自己用的技术有为什么这么选的思考。


面试回答分层——60 vs 75 vs 90 分

60 分回答(甩锅型)

"公司就是用这个的,我不是那时候做的决定。"

面试官内心OS:"这人不思考,只会执行。"

75 分回答(有对比但浅)

"Flink 比 Spark Streaming 好,延迟更低,流处理更原生。所以选了 Flink。"

面试官内心OS:"有对比但都是网上共识,没有结合自己场景讲。"

90 分回答(四维法完整)

按四维法对比 + 明确决定性维度 + 给出 trade-off + 承认反例

"我评估了 Flink 和 Spark Streaming。

业务需求上……(Event Time 精确、Exactly-Once、毫秒级延迟是刚需) 团队能力上……(两个都懂,非决定因素) 生态兼容上……(Flink 的 Connector 更成熟) 运维成本上……(Flink 需要单独集群,Spark 能复用离线集群,Spark 略优)

业务需求是决定性的——毫秒延迟 + Event Time + EOS 这三个 Spark Streaming 做不到。即使运维成本略高也选 Flink。

反过来说,如果业务只需要分钟级延迟(比如小时级汇总报表),Spark Streaming 甚至 Spark Batch 都够用,那时候选 Flink 就是过度工程。

选型永远是场景驱动的,不存在绝对最优。"

面试官内心OS:"这人真在思考技术决策,不是被动用。可以聊更深的架构话题。"


面试高频追问

追问1:如果重新选你还会选同一个方案吗?

这是反思题 + 趋势观察题。诚实回答,展示你对技术趋势的关注。

加分回答:

"会选 Databricks,但理由会调整。

2 年前选 Databricks 的核心理由是——全托管 + Delta Lake 生态 + 团队没有 K8s 能力。这些理由今天依然成立。

但我会新增两个考虑:

1. 流批一体方向。如果今天做选型,我会更重视'一套代码同时支撑实时和离线'的能力。Databricks 虽然也在布局(DLT 等),但相对偏批处理。如果场景实时+离线并重,我会认真评估 Paimon + Flink 的流批一体方案。

2. Vendor Lock-in 风险。2 年过去,对 Databricks 生态的依赖越来越深——Delta Lake 存储格式、Unity Catalog 权限、Notebook 开发方式。一旦 Databricks 涨价或服务缩水,迁移成本巨大。这是当时没充分评估的风险。

所以答案是——会选,但会增加流批一体和开放性的考虑维度。

一个技术决策是否正确,要放在当时的上下文里看。当时 Databricks 是最优解,现在可能也是,但权重会变化——这很正常。"

追问2:你怎么说服团队/老板接受你的方案?

这考的是'技术决策落地能力'——选型不只是想清楚,还要推动落地。

90 分回答:

"我做了三件事:

第一件:写选型评估文档。把 3 个方案的四维对比、TCO 对比、风险评估写成一份 10 页文档,发给团队和老板提前看。文档比口头讨论有效 10 倍——老板可以反复看、可以转给其他人看、可以在脑子里慢慢消化。

第二件:做 POC 验证。挑了 10 个典型 Spark 作业,实际迁到 Databricks 跑一周,对比性能数字——ETL 时间降 35%、查询延迟降 70%。POC 数据比任何理论分析都有说服力——老板看到 7 天跑出来的真实数字,比看 10 页文档更信服。

第三件:算 TCO 对比表。前面展示过的那张——EMR $70K/月、Databricks $56K/月、3 年节省 $500K。用财务语言讲给老板,老板不需要懂技术,只看数字就能拍板。

三步下来,老板同意 + 团队信服,项目立项通过。

选型的硬实力是技术评估,软实力是如何把评估结果'翻译'给不同受众——技术同事看四维对比、老板看 TCO、业务方看性能数字。"

追问3:有没有选型失败的经历?

加分题。承认失败 + 提炼教训,展示成长心态。

90 分回答:

"有,很惨痛的一次。

在某元宇宙社交应用初期,我们选了自建 Crontab 做调度——当时觉得任务少(20-30 个),Crontab 够用了,不想搞复杂的 Airflow。

结果3个月后任务涨到 50+ 就完全失控了:

  • 依赖管理失败:A 作业依赖 B 作业完成,Crontab 只能按时间排——B 慢了 A 就用上旧数据
  • 失败重试缺失:作业挂了没人发现,第二天才知道
  • 状态追溯困难:不知道哪个作业跑成功了、哪个失败了、运行了多久
  • 代码不可读:几十行 crontab 配置谁都看不懂

最后不得不花 2 周迁到 Airflow——重写所有调度逻辑、改造监控告警、培训团队。

教训:即使规模小,调度这种'基础设施'类技术也应该选成熟方案。技术债迟早要还,而且规模大了之后利息更重。

从那之后我有个原则——'存储、调度、监控'三类基础设施类技术,哪怕规模小也要用成熟方案。业务类技术可以敏捷迭代,基础设施类不能。"

追问4:你了解最新的技术趋势吗?

考的是技术视野。不要泛泛而谈,讲具体的观察和判断。

90 分回答:

"实时计算方向——Flink SQL 持续普及、流批一体(Paimon/Iceberg)越来越成熟、Flink 2.0 引入 Disaggregated State 架构将带来重大变化。我们团队今年的规划是评估 Paimon 替代现在的实时数仓架构。

OLAP 方向——湖仓一体(Lakehouse)势头很猛,Iceberg + Doris / StarRocks / Dremio 这种架构在国内有大量落地案例。ClickHouse 最近也推出了 CH-DB 做湖仓对接。

数据治理方向——OpenLineage 成为数据血缘的开源标准,DataHub/Amundsen/OpenMetadata 三足鼎立。我们团队正在评估接入 OpenMetadata。

AI + 数据方向——Databricks 收购 MosaicML、Snowflake 主打 Cortex、所有主流数据平台都在接入 LLM 能力。长期看数据平台 + AI 融合是不可逆趋势。

我每周会看一小时行业 newsletter(Data Engineering Weekly、The Pragmatic Engineer、Databricks/Snowflake 官博),保持技术敏感度。"

这个回答的价值——不是罗列一堆新技术名词,而是展示你对技术趋势的系统思考 + 个人学习习惯。


总结

技术选型是面试中出现频率最高的追问类型,也是区分"执行者"和"决策者"的最有效试金石。核心要点——

  • 四维选型法:业务需求(能不能用)+ 团队能力(会不会用)+ 生态兼容(合不合得来)+ 运维成本(养不养得起)
  • 面试讲 2-3 个决定性维度:不是四维都展开,是指出哪 2-3 维决定了选型
  • TCO 思维:运维成本要把人力成本算进去——License $0 但要招 $6K/月运维的方案,实际不便宜
  • 事后补完选型:哪怕不是你主导的选型,也能用四维法讲出思考——事后理解也是理解
  • 承认反面场景:好的选型回答一定包含"如果场景变了我可能会选别的"——展示场景意识
  • 失败选型故事:Crontab 故事、K8s 故事这种反面案例比成功案例更加分
  • 说服三步法:选型文档 + POC 验证 + TCO 对比——这三件是技术决策落地的硬实力
  • 面试策略:选型是差异化的绝佳机会——99% 的候选人答得很肤浅,只要你用四维法 + 有对比 + 有 trade-off,就能把"好用"党甩到身后

下一篇

刷题进度保存在当前浏览器