今天早上刷 Hacker News,看到 Shopify 的工程博客发了篇文章。
标题很直接:我们为什么从 React Native 回归 Swift 和 Kotlin。
1132 分,826 条评论。
评论区炸了。
有人拍手叫好,说早就该这样了。
有人痛心疾首,说 React Native 被误解了。
我看了下文章,又翻了翻评论,点了根烟。
想起了一些事。
2018 年的那个决定
那是 2018 年,我在一家创业公司做技术负责人。
产品要做移动端,团队就 8 个人。
iOS 一个,Android 一个,前端三个,后端两个,产品一个。
CEO 问:我们用什么技术栈?
iOS 说:Swift,原生体验好。
Android 说:Kotlin,Google 亲儿子。
前端说:React Native 啊,一套代码两个平台,省人省钱。
我当时倾向 RN。
不是因为技术多好,是因为现实。
8 个人的团队,你让我养两套客户端?
招不到,也养不起。
跨平台的诱惑
说实话,跨平台这个概念,真的很诱人。
一套代码,多端运行。
听起来就是降本增效的终极方案。
那时候 React Native 正火。
Facebook 自己在用,Instagram 在用,Bloomberg 在用。
文档写得漂亮,社区活跃,第三方库一堆。
我们当时想,这不就是银弹吗?
于是拍板:用 RN。
现在回头看,那个决定,对了一半,错了一半。
甜蜜期
前六个月,真的很甜。
前端团队上手快,React 那套东西直接搬过来。
一套代码,iOS 和 Android 都能跑。
发版的时候,两边同步更新。
CEO 很高兴,说这个技术选型对了。
我也很高兴,觉得省了至少两个人力。
那时候我们没意识到,甜蜜期之所以叫甜蜜期,是因为它总会过去。
裂缝
问题是从第七个月开始出现的。
先是动画。
我们在 iOS 上做了一个列表滑动动画,60fps 丝滑流畅。
同样的代码,Android 上只有 30fps。
卡顿。
用户投诉。
然后是新功能。
我们要接一个原生的支付 SDK。
iOS 这边,Swift 直接调,半小时搞定。
Android 那边,RN 的桥接层出了问题。
找了个第三方库,半年没维护了。
自己写桥接,折腾了三天。
再然后是升级。
RN 0.59 升 0.60,breaking changes 一堆。
改了一个星期,两边平台还要分别调试。
那时候我才意识到,跨平台不是免费的。
它有成本。
只是这个成本,不在开发的时候付,在维护的时候付。
技术债的利息
我们团队当时有个口头禅。
“先上线再说,技术债以后还。”
问题是,技术债是有利息的。
而且利息是复利。
你欠的越多,还的越慢。
到最后,你发现利息比本金还高。
我们那个项目,做了两年。
第一年,RN 帮我们省了人。
第二年,我们花了双倍的时间填坑。
动画性能问题,改。
原生功能桥接,写。
版本升级,折腾。
最后算下来,省的那两个人力,全搭进去了。
还搭进去了团队的士气。
Shopify 的账本
Shopify 的文章里,有一组数据。
他们说,RN 的维护成本,比原生高了 40%。
这个 40%,不是开发成本。
是调试成本、升级成本、性能优化成本、招聘成本。
他们算了一笔账。
用 RN,看起来省了一套代码。
但实际上,你要养一批既懂 React 又懂原生的人。
这种人,市场上很少。
工资比纯前端高,比纯原生也高。
而且难招。
他们面试了 50 个人,最后只招到 3 个合格的。
这 3 个人的工资,够养 5 个纯原生开发。
你说这账怎么算?
围城
我看到评论区有人说了一句话。
“React Native 就像一座围城,外面的人想进去,里面的人想出来。”
太对了。
没用过的人,觉得跨平台真香。
用过的人,知道里面的苦。
但最讽刺的是什么?
是那些从 RN 出去的人,过几年可能又会回来。
因为技术是会进化的。
RN 0.60 的问题,在 0.70 可能解决了。
新架构、新渲染引擎、新桥接方式。
你又心动了。
然后又进去了。
然后又想出来了。
这就是技术轮回。
18 年的轮回
我做了 18 年开发,见过太多这样的轮回。
jQuery 火的时候,大家都说原生 JS 太啰嗦。
后来 React 出来了,说 jQuery 操作 DOM 太 low。
然后 Vue 出来了,说 React 太复杂。
再然后 Svelte 出来了,说 React 和 Vue 都太重。
现在呢?
很多人又开始用原生 JS 了。
数据库也是。
MongoDB 火的时候,大家都说关系型数据库过时了。
后来发现,没有事务、没有 JOIN,写复杂查询简直是灾难。
于是又回到 PostgreSQL。
然后 MongoDB 说自己也能做事务了。
但大家已经被伤过一次了,信任这东西,丢了就难捡回来。
没有银弹
我后来想明白一件事。
技术选型,本质上是在借债。
你选了一个框架,就是借了它的优势,同时也背了它的限制。
优势是本金,限制是利息。
刚开始你觉得赚到了,因为本金到手了。
但时间一长,利息越滚越多。
到最后,你发现还不起利息了。
要么重构,要么换栈。
Shopify 就是还不起利息了。
RN 的利息是什么?
是性能瓶颈,是原生功能缺失,是升级维护成本,是招聘时找不到既会 React 又会原生的人。
这些利息,三年下来,比本金还高。
技术选型的本质
我见过太多团队,迷信"银弹"。
觉得找到一个框架,就能解决所有问题。
觉得选对技术栈,就能一劳永逸。
但 18 年下来,我悟出一个道理。
没有银弹。
只有权衡。
你选原生,就要接受开发成本高、周期长。
你选跨平台,就要接受性能损失、体验妥协。
你选微服务,就要接受运维复杂度。
你选单体,就要接受扩展性限制。
每个选择都有代价。
关键不是哪个选择更好,而是你能承受哪个代价。
Shopify 的决定
Shopify 的决定,我觉得是对的。
不是因为原生一定比跨平台好。
而是因为,到了他们这个阶段,性能的优先级高于开发效率。
他们的用户量够大,每一毫秒的卡顿都是钱。
他们的团队够大,养得起 iOS 和 Android 两套人马。
他们的产品够成熟,不需要快速迭代试错。
在这种场景下,回归原生是理性的选择。
但这不意味着 React Native 就失败了。
对于小团队、对于 MVP、对于快速验证的产品,RN 依然是好选择。
技术没有好坏,只有适不适合。
我的建议
如果你现在在纠结技术选型,我给你几个建议。
第一,别听框架的营销。
每个框架都会说自己多好,别人的多差。
但框架不会告诉你,它的坑在哪里。
第二,看团队能力。
你团队最熟什么,就用什么。
强行上一个新技术,学习成本比你想的高。
第三,看产品阶段。
MVP 阶段,快比好重要。
成熟阶段,好比快重要。
第四,看用户场景。
如果用户对性能敏感,别赌。
如果用户对体验挑剔,别赌。
第五,做好还债的准备。
选什么都会欠债,关键是你能不能还得起。
最后
Shopify 回归原生,不是 React Native 的失败。
是技术选型回归理性的开始。
我们这行,太容易迷信新东西了。
总觉得新的就是好的。
但 18 年下来,我发现,真正好的东西,往往是那些被时间验证过的。
原生开发存在了 20 多年。
关系型数据库存在了 50 多年。
它们还在,不是因为没人挑战。
是因为挑战者还没能彻底取代它们。
技术轮回,不是因为技术在进步。
是因为我们在遗忘。
忘了上次为什么选它,忘了上次为什么放弃它。
然后重新来一遍。
Shopify 的故事,过几年还会发生。
只不过主角会换。
可能是 Flutter,可能是 Kotlin Multiplatform。
但剧本不会变。
这就是技术圈。
永远在轮回,永远在后悔,永远在重新开始。
