为什么我的后端语言从 Python 转向 TypeScript

1,990 阅读4分钟

太长不看版:

  • Static typing 减少了我写 bug 的概率
  • 前后端语言统一

Python

我曾经做过数据分析师,所以 R 和 python 是我的主要工作语言。

我的第一个 web 项目(一个日语学习产品)自然就用 python 作为后端语言了,当时选择的 web 框架是 flask。这个项目在线上稳定运行了一年。

一年之后,我开始做一次比较大的迭代,但开发过程里会出现莫名其妙的 bug。Debug 的过程占用了我很多时间。这些 bug 在程序运行时才能发现,而且大多数都非常低级,如果稍微认真一点,是可以避免的。

在构思好西瓜haoxigua.top这个项目时,我需要做的第一个决定是:我还要用 python 作为后端语言吗?

答案似乎很自然:

  • 好西瓜会是一个像 Reddit 一样的产品,而 Reddit,是用 python 写的,github 上甚至有 Reddit 的源码
  • 项目最大的不确定性是运营,并不是开发,我不应该把时间花费在学习新的技术上

但这个决定影响太大了,我决定给自己两天时间,试一下 static typing 的 TypeScript 和流行的 ExpressJS 框架(内心深处,我还很想满足下自己的好奇心)。

这一试,不得了,我感觉自己得救了。

TypeScript

我的编程是自学的,我没有参加过真正的团队项目开发,我的代码也没有高手 review 过。这导致我有非常多糟糕的代码习惯。

我会写很多低级的 bug,这耽误了我的开发速度。

体验 TypeScript 之后,我发现 TypeScript 就像一个 review 我代码的“高手”,不断提示我在哪里可能存在潜在的bug,于是我可以当场修改,让自己的代码更加稳健。

另外,TypeScript 引导我更多的思考程序运行过程里的 interface,而不是 implementation。

在写 python 应用时,我不自觉地总是先去写 implementation,这是个很糟糕的习惯。我常在写完函数的 implementation 后,才发现 interface 需要修改。

在写 TypeScript 时,我开始更多思考 interface,因为 interface 没有定义好的话,TypeScript 总会有报错提示。心理学把这种现象叫 nudge,用一些外部的约束,让自己更倾向于地去做正确的事情。

我的结论:

TS 会提高我的代码质量,减少修改代码时的错误概率

但这个结论还不够支持我转向 TypeScript,毕竟,我还需要支付学习 TypeScript 的时间成本,而 python 也开始支持 typing 了。我为什么不干脆开始使用 python 的 typing 呢?

前后端语言统一

改变平衡的那个砝码,是前端:我还要同时做前端的工作。

在我的上一个项目里,前端和后端工作并不会完全切割。更新功能的时候,我经常先开发后端 api,然后立刻切换到前端做页面。在 debug 的时候,我经常在前后端之间来回切换。

当时的我,需要在 python 和 JavaScript 间切换。每次切换后,我打错语句的情况都会增加。

比如写了一个小时 JS 后,我会在 python 的 if 语句里使用括号和大括号。

写了一个小时 python 后,我会忘记在定义变量时使用 const 或 let 。

除了错误增加外,我还很容易在切换语言后感觉到疲劳。

心理学研究表明,大脑在切换工作内容时,需要一些时间才能适应,我所经历的切换语言时的“错误”和疲劳,是context switching 的成本。

如果前后端都是用 TypeScript,我可以减少切换语言时的困扰。

考虑到这点后,我决定转向 TypeScript。

代码只是写给人看的吗?

有一个开发理念:代码是写给人看的。

我曾经很认同这个理念。

Python 减少了“无意义”的关键字,非常适合阅读。这是 python 的优势。

使用 TypeScript 之后,我开始怀疑“代码是写给人看的”这个理念。相比于 python 和原生的 JavaScript,TypeScript 大大减少了代码的可读性。但同时,代码的稳定性得到了提高。项目越复杂,TypeScript 在稳定性上的优势会越大。

代码是写个人看的,这点没错,但可读性并不是优先级最高的价值。

写 python 的感觉仍然是最好的

为了避免误解,需要强调一下,我并不认为 python 不好,或不适合做大项目。只是对于开发能力平庸且需要前后端都开发的我,TypeScript 是个成功率更高的选择。

在给自己的项目做数据分析或者写简单的工作脚本时,我仍然使用 python。

看到 python 简洁的代码,我经常感觉到莫名的舒适感,就像看到一个优美的作品。