引擎、语言与技术选型
Category
production / retro 子树。节点定位:选型讨论的正确顺序——先固定约束(团队、品类、平台、周期),再看候选匹配;用不可逆性决定论证投入,用决策记录沉淀。
Definition
技术选型是团队里最容易吵起来、也最难吵出结果的话题。多数时候不是因为选项真的难分高下,而是讨论顺序反了:大家先争“用哪个”,却没有先固定“我们是谁、做什么品类、上什么平台、多少人、多长周期”。约束一旦缺位,讨论就会退化成各自列举自己熟悉的工具的优点,最后往往变成谁职级高听谁的。成熟的选型讨论通常反过来:先把约束写清楚,再看每个候选各自匹配哪些、牺牲哪些。
Problem
选型最难吵出结果,因为讨论顺序反了:先争「用哪个」,没固定「我们是谁、做什么、多少人、多长周期」。约束缺位,讨论退化成各自列举熟悉工具的优点,最后谁职级高听谁的。不可逆的决策论证不足、可逆的决策论证过度,投入就错配了。
先分清硬约束与软约束
比较稳妥的做法,是在争论方案之前先列两类清单:
- 硬约束:目标平台、品类对实时性的要求、团队现有技能结构、发布周期、商业与合规条款,这些通常没有多少讨论空间。
- 软约束:团队偏好、技术先进性、社区热度、个人经验,这些可以权衡,也往往被高估。
硬约束会直接淘汰一批候选。目标平台是小游戏平台,很多原生优先的方案就不再成立;团队全是某一语言的背景却强行引入没人用过的新语言,学习成本会吃掉大半个版本。选型会上很多看似技术性的分歧,本质是一方拿着硬约束、另一方拿着软约束在互相说服。先把这两层分开,讨论往往立刻有效得多。
引擎选型真正在权衡什么
引擎资料页上的渲染能力、物理特性,通常不是决定性因素。实际项目里,引擎选型更常被下面这些事左右:
- 品类与平台匹配度:2D 还是 3D、小游戏还是原生、单端还是多端。
- 团队存量经验:用熟悉的引擎稳定做出七十分产品,往往好过用陌生引擎冲击九十分。
- 内容生产管线:编辑器顺手程度、美术资源工作流、策划配置方式,这条管线决定的是量产产能。
- 商业条款:分成比例、源码可得性、版本升级节奏,引擎方的路线图会长期影响项目。
- 生态与招人:使用者规模决定了团队扩张时能招到什么样的人。
- 多端规划:立项时低估的多端需求,中途追加平台时才发现底座不支持。
引擎选型失败的案例,绝大多数不是输在跑分,而是输在内容管线卡产能、关键岗位长期招不到人,或者商业条款中途变化。原型阶段感觉不到这些问题,量产期会集中爆发,而那时候再换的代价已经完全不同。
服务端语言的权衡逻辑不太一样
客户端引擎在很大程度上替团队做了决定,服务端语言则要团队自己承担全部后果。常见的考虑包括:
- 运行时特性与品类是否匹配:长连接承载、并发模型、GC 停顿表现、调试与性能分析工具的成熟度。
- 生态完整度:协议库、存储驱动、可观测组件是否齐全,缺什么自己补什么,都是长期成本。
- 招人难度:语言冷门往往意味着团队规模有隐型天花板。
- 存量代码与团队技能:多数项目的服务端语言是被团队既有能力决定的,而不是反过来。
- 长期维护供给:运行纪律和排障能力的成熟度,往往比语言本身的先进性更影响长期成本。
服务端语言更换的代价极高,所以这个位置上的选择通常偏保守。常见的组合是:团队规模小时选一种全栈统一的语言来降低协作成本;规模上来之后再按模块引入更贴合负载特征的语言,而不是一次性重写。语言之争在服务端往往没那么大意义,真正拉开差距的通常是运行纪律和排障能力。
用不可逆性决定论证投入
不是所有选型都值得开三轮评审会。判断该投入多少论证,常用标尺是决策的不可逆程度:
- 引擎、核心语言、核心存储:一旦铺开极难回头,通常值得做原型验证和正式评审。
- 协议格式、模块划分、核心中间件:调整成本中等,值得写清理由,但不至于反复拉锯。
- 工具库、辅助脚本:可逆性强,小范围试错即可。
对不可逆的决策,常见的做法是用一个垂直切片去验证最大风险点:拿真实品类、接近真实规模的场景跑通核心链路,而不是研究官网的特性列表。验证得到的结论值得留档,哪怕原型代码本身最后被丢弃。
选型会怎么开才不空转
选型讨论最常见的失效方式,不是结论错误,而是会议本身没有边界。几个被验证过的会议纪律值得参考:
- 约束清单和候选材料提前发出,会上不带未读材料发言。
- 每个候选指定一位熟悉者陈述,并且要求讲清它不擅长什么。
- 分歧落到具体维度上比较,而不是停留在笼统的好与不好。
- 结论未定时,当场明确下一步验证什么、谁负责、什么时候回报。
常见的收尾动作是当场确认三件事:定了什么、没定什么、谁在什么时间验证什么。缺了这一步,下次会议往往会从争论的起点重新开始。
决策记录比结论更长寿
选型结论的背景,半年后就会被遗忘。比较持久的做法是留下一段简短记录,内容包括:
- 当时的硬约束是什么,哪些候选被考虑过。
- 每个候选为什么被否,放弃了哪些好处。
- 当初预期会出现什么问题,打算怎么观察。
这份记录的价值在两种时刻显现。一是半年后风险真的出现,团队可以快速分清是“当初判断错了”还是“前提变了”,两者的复盘方向完全不同。二是新成员接手时,不必靠考古代码和口口相传去理解“为什么是这一套”。决策记录写得差的项目,同一个选型争论往往每隔一两年就要重来一遍。
什么时候值得换底座
换引擎或换语言很少是突然决定,通常由一些持续恶化的信号累积触发。还有一种被动形态值得单独警惕:引擎方停止维护、关键中间件停止更新、平台规则调整使旧方案不再被支持。被动更换比主动更换危险得多,因为时间表不在自己手里,往往正好撞上版本压力最大的时期。主动的触发信号包括:
- 核心体验在现有底座上反复尝试仍然做不出来。
- 内容管线持续卡产能,团队大量时间耗在与目标无关的对抗上。
- 关键岗位长期招不到人,或者依赖的个别人一离职就停摆。
- 商业条款发生实质变化,继续使用的成本结构不再成立。
即便信号成立,渐进替换往往也比推倒重写更现实:新底座先承接增量模块,旧模块按维护节奏逐步迁移,随时保留可回退的位置。一次性重写最容易被低估的成本,是同时失去了旧系统里所有已经修好的暗坑。
常见误区
- 直接从方案清单里挑顺眼的,而不是先把项目自己的约束写清楚。
- 拿参数表和跑分做决策,忽略内容管线、招人和商业条款这些长期变量。
- 用软约束去说服硬约束,比如为了技术先进性牺牲平台匹配度。
- 对不可逆的决策投入的论证时间,反而少于对可逆决策的争论。
- 选型会开了很多轮,既没有结论也没有验证任务,下次从零开始。
- 选型做完不留决策记录,几年后同样的争论再演一遍。
选型这件事的产出从来不是“选对了”三个字,而是一套可以被复盘、被质疑、被后来者理解的决策过程。过程留得住,选错了还来得及纠正;过程留不住,选对了也说不清为什么对。
实战案例:一次「两轮会定下的新引擎,量产期产能掉了六成」的选型复盘排查
案例为教学示例(非摘自真实项目),数字经过取整简化。它把本页「先分清硬约束与软约束」「引擎选型真正在权衡什么」「用不可逆性决定论证投入」「选型会怎么开才不空转」「决策记录比结论更长寿」「什么时候值得换底座」用到深水区:一次立项选型欠下的论证,在量产期以产能、招人、重复争论三张账单到期。
背景与现象:某 12 人团队(客户端全员引擎 A 背景)立项一款多端项目,选型会开 2 轮就定了社区热度高、跑分漂亮的引擎 B——硬约束清单 0 页、候选对比材料 0 份、垂直切片 0 次,决策记录也 0 份。量产期第 4 个月账单到期:引擎 B 的美术资源入库要 9 步手工,单场景装配 2 天,周产能从 5 个场景掉到 2 个(掉 60%);关键岗位开放 3 个月,收 40 份简历里能上手引擎 B 的只有 3 份,到岗 1 人;第 5 个月确定追加小游戏平台,引擎 B 的导出链路不支持。复盘会上「当初为什么选它」没人说得清,同一场争论半年内重开 3 次、场场从零。
第一步:现象与口径——先分清「当初欠了什么」和「现在到期什么」
口径统一:把「立项时欠下的论证」和「量产期到期的代价」分成两本账,先记两笔:
- 欠账:硬约束清单 0 页——目标平台、品类实时性、技能结构、发布周期、商业条款 5 项全没落纸;选型会 2 轮定案,验证任务 0 项
- 到期:周产能 5 → 2(掉 60%);招人 3 个月到岗 1 人;追加平台发现底座不支持,客户端面临整体迁移
产能掉的不是引擎性能,是内容管线;招不到的不是工程师,是会引擎 B 的工程师——两笔账都不是「跑分」能解释的。
第二步:分层归因——从产能掉队到选型过程账本
约束账 硬约束清单 0 页、候选对比 0 份,2 轮会凭社区热度定案——软约束说服了硬约束
产能账 美术入库 9 步手工、单场景装配 2 天,周产能 5 → 2 个场景(掉 60%)
人员账 关键岗位开放 3 个月:简历 40 份、能上手 3 份、到岗 1 人
记录账 决策记录 0 份,同一争论半年重开 3 次、场场从零账本收束:60% 的产能是管线账,3 个月 1 人是生态账,半年 3 次重开是记录账——三本账都挂在同一笔约束账上:立项那天,约束清单是 0 页。
第三步:根因——先挑了方案,后补理由
对照本页「先分清硬约束与软约束」:立项时「直接从方案清单里挑顺眼的,而不是先把项目自己的约束写清楚」——「硬约束:目标平台、品类对实时性的要求、团队现有技能结构、发布周期、商业与合规条款」5 项全没落纸;会上「选型会上很多看似技术性的分歧,本质是一方拿着硬约束、另一方拿着软约束在互相说服」,最后「用软约束去说服硬约束,比如为了技术先进性牺牲平台匹配度」原样发生。对照「引擎选型真正在权衡什么」:品类与平台匹配度、团队存量经验、内容生产管线、商业条款、生态与招人、多端规划六个维度无一进入对照论证,事后回看产能、招人、多端三项全出了事——「引擎选型失败的案例,绝大多数不是输在跑分,而是输在内容管线卡产能、关键岗位长期招不到人,或者商业条款中途变化」三条命中前两条,「原型阶段感觉不到这些问题,量产期会集中爆发,而那时候再换的代价已经完全不同」逐字应验。对照「用不可逆性决定论证投入」:引擎属「一旦铺开极难回头,通常值得做原型验证和正式评审」的一档,论证却只有 2 轮会、0 次切片;同一季度团队为一把可逆的状态管理库吵了 3 周——「对不可逆的决策投入的论证时间,反而少于对可逆决策的争论」原样发生;「拿参数表和跑分做决策,忽略内容管线、招人和商业条款这些长期变量」也正是当初的打法,「选型做完不留决策记录,几年后同样的争论再演一遍」则以半年 3 次的频率提前兑现。
第四步:处置与回填——先把约束落纸,再按节奏迁回
修法分两段。应急:T+0 冻结「换不换」的争论,把硬约束 5 项逐项落纸并对引擎 B 打分,平台匹配度与生态招人 2 项亮红;T+1 产能止血——2 人 5 天把 9 步手工入库收敛成 1 键导入脚本,单场景装配从 2 天压到 0.5 天,周产能从 2 个回到 5 个。中期迁移:引擎 B 未停维护,不属「被动更换比主动更换危险得多,因为时间表不在自己手里」的最坏形态,按渐进替换迁回引擎 A——增量模块全部先落 A,B 的存量模块按维护节奏分 2 个版本周期迁回,每步保留可回退位置;不推倒重写,因为「一次性重写最容易被低估的成本,是同时失去了旧系统里所有已经修好的暗坑」。制度三步:第一步约束先行——立项评审表加硬约束清单 5 项必填,缺项不开选型会;第二步会议纪律——「约束清单和候选材料提前发出,会上不带未读材料发言」「每个候选指定一位熟悉者陈述,并且要求讲清它不擅长什么」,分歧落到具体维度,未定当场留验证任务(谁负责、何时回报);第三步决策记录——三段式模板(「当时的硬约束是什么,哪些候选被考虑过」「每个候选为什么被否,放弃了哪些好处」「当初预期会出现什么问题,打算怎么观察」)入仓,引擎、核心语言、核心存储三类不可逆决策强制垂直切片加正式评审。复核:半年后新项目立项,硬约束清单 5/5 齐备才进会,选型会 1 轮定案,会后验证任务 2 项按期回报 2/2,决策记录 1 份入库、新成员 30 分钟读懂「为什么是这一套」,同一争论重开 0 次。
回填清单:
| 落点 | 动作 | 回填处 |
|---|---|---|
| 约束先行 | 立项评审表硬约束 5 项必填,缺项不开选型会 | 先分清硬约束与软约束 |
| 会议纪律 | 材料前置、熟悉者讲短处、分歧落维度、未定留验证任务 | 选型会怎么开才不空转 |
| 决策记录 | 三段式记录入仓,不可逆决策强制垂直切片与正式评审 | 决策记录比结论更长寿 |
| 渐进迁回 | 增量先落目标底座,存量按维护节奏分两期迁回、留可回退位 | 什么时候值得换底座 |
案例的三个教训
- 选型的第一张纸是约束清单,不是候选清单——「用熟悉的引擎稳定做出七十分产品,往往好过用陌生引擎冲击九十分」当时被当成保守笑谈,半年后成了唯一的止损线。
- 不可逆决策欠下的论证,量产期连本带息偿还——2 轮会省下的论证,换成掉 60% 的产能、3 个月 1 个人和 2 个版本周期的迁移。
- 决策记录是写给半年后的自己——0 份记录让同一场争论半年重开 3 次;「过程留得住,选错了还来得及纠正;过程留不住,选对了也说不清为什么对」。
Used By
引擎/语言/框架选型评审(约束清单先行);选型会议组织与决策记录;换底座信号评估(什么时候值得换)。
Related
关系链:约束先行 → 硬软分类 → 权衡展开 → 不可逆性定投入 → 决策记录。上游:client/engines 子树(01 商业面、02 语言面、03 团队面——本页是它们的方法论收束)。下游:retro/02(架构模式对照)、retro/04(失败案例分析)。
Reference
本页为工程经验归纳;页内实战案例为教学示例(数字取整简化)。