本文最初发表于 Towards Data Science 博客,经原作者 Rhea Moutafis 授权,InfoQ 中文站翻译并分享。
Python 是我的谋生工具,我很喜欢它。尽管我对这门语言有一些批评的地方,但我还是强烈推荐给任何开始从事数据科学的人。反正在这个领域中,比较有经验的人往往都是 Python 的布道师。
然而,这并不意味着你不能时不时地挑战你所在领域的极限,例如探索不同的编程范式或新的编程语言。
Python 的竞争对手名单很长:Rust、Go、Scala、Haskell、Julia、Swift、C++、Java 和 R 都可以在其中找到条目。在如此拥挤的领域里,JavaScript 和 TypeScript 没有得到那么多的认可,这是可以理解的。
但这并不意味着 TypeScript 不是通用编程领域的主流。然而,在数据科学家群体中,它似乎从来就没有特别受欢迎过。
你可能会得出这样的结论,TypeScript 可能不是数据科学的理想选择。但不要急着下结论。尽管它可能不适合数据科学的每一部分,但在某些领域上,它比 Python 有明显的优势。
如果你碰巧在这些领域之一工作的话,那么值得给 TypeScript 一个机会。如果你不这么做的话,谁知道你的下一步会在哪里呢?这个领域发展得如此之快。如果你能将眼光放远一些,你就有了竞争优势。
大约十年前,Microsoft 的软件工程师注意到,JavaScript 已经不能满足他们所有的需求了。一方面,该语言发展迅速,并增加了非常有趣的新特性。另一方面,管道中的任何功能都不能解决一个根本性的问题:JavaScript 对于小型程序来说非常棒,但用它来编写整个应用程序却一团糟。
解决这一问题有几种可能性:例如,可以使用不同的编程语言,或者使用更好的语法重新设计 JavaScript。Microsoft 的开发团队采取了一种不同的方法:他们通过扩展 JavaScript 创建了 TypeScript。通过这种方式,他们能够利用 JavaScript 的所有新特性,同时摆脱了那些不适合大型项目的东西。
与 Python 类似,JavaScript 是在运行时编译的,这意味着你需要运行代码来调试它。另一方面,TypeScript 是编译的。这提供了额外的安全层,因为程序员在执行时间之前就可以获得关于可能存在的 Bug 信息。对于 Python 或 JavaScript 这样的非编译语言,一旦意识到代码的行为与预期不符,定位 Bug 可能会非常耗时。
然而,JavaScript 和 TypeScript 之间的关键区别在于类型检查器。在编译时,每个 TypeScript 程序都会检查数据类型是否彼此一致。
手动做这些事可能听起来微不足道。但是,当你在项目中使用数千行代码时,你就会感谢上帝赐予你这一切。
还有一些其他不同之处,例如,TypeScript 有匿名函数和异步函数。匿名函数是函数式编程的一个关键特性,它可以使程序在大数据负载下更加高效。
当你需要并行执行多个操作时,或者在处理不应中断后台进程的 I/O 操作时,异步编程非常有用。异步编程在 Python 和 JavaScript 中是可能实现的,但在 TypeScript 中,异步编程是内置在内核中的。
TypeScript 是 JavaScript 的超集
如果你讨厌 JavaScript 中不断发生的不合逻辑但又滑稽可笑的、令人抓狂的时刻,那么,我有一个坏消息告诉你:你在 TypeScript 中也会看到所有这些东西。
但是,这些语法上的小问题,并不是程序员如此热爱 TypeScript 的原因。更确切地说,这可以归结为这样一个想法:你需要一个很棒的产品(JavaScript),并添加更棒的东西(静态类型)。
当然,我并不是说 JavaScript 总是很棒,或者静态类型总是最好的处理方式。但是,对于构建大型 Microsoft 风格的应用程序来说,这似乎非常好用。
话虽如此,TypeScript 仍然只拥有 JavaScript 的一小部分人气。这可以归结为发行时间的原因:TypeScript 发行有八年了,而 JavaScript 的发行时间是它的三倍!Python 在这一领域中,也是一款有着三十年发行历史的老古董。
尽管它很年轻,但在某些领域中,TypeScript 是不可避免的。这就增加了它的受欢迎程度。例如,当 Google 在 2016 年宣布 Angular.js 将与 TypeScript 一起使用时,TypeScript 在 StackOverflow 上的标签数量呈爆炸式激增。
与 Python 和 JavaScript 的吸引力相比,TypeScript 只占一小部分。不过,在某些领域,TypeScript 是不可避免的。
JavaScript 之所以在当时很受欢迎,是因为它可以在任何地方运行。你可以在服务器、浏览器或你喜欢的任何地方来运行它。你只需编译一次,它就可以在任何地方工作。当它第一次出现时,简直就像是魔法一样。
由于它是基于 JavaScript 构建的,所以 TypeScript 也继承了这种魔法。Python 也是如此!当然,Python 的实现方式略有不同,因为它使用的是解释器而不是虚拟机。但这并不能改变这样一个事实:就一次编写到处运行这方面,TypeScript 和 Python 是可以相提并论的。
像泛型和静态类型这样的特性使得在 TypeScript 中进行函数式编程比在 Python 中更容易。这可能是一个优势。因为由于数据科学、并行编程、异步编程等领域的发展,对函数式代码的需求正在增长。
另一方面,Python 也在添加越来越多的函数式编程特性。当涉及到数据科学、机器学习等方面,Python 处于前沿地位。
这就剩下并行编程和异步编程了。尽管这两种编程语言都可以完成这两种工作,但是有一个很大的不同:在 Python 中,你需要使用特定的库来完成任务。而在 TypeScript 中,所有的库都是与内核异步的。由于后者在默认情况下功能更多,因此进行并行编程更容易一些。
换句话说,如果你是从事异步进程和并行计算的 Python 开发人员,那么你可能会想尝试一下 TypeScript。
许多数据科学家都在处理异步和并行进程。你可能已经在考虑使用 TypeScript 而不是 Python 来编写下一个项目。不过,这究竟是不是一个好主意,还要取决于许多其他因素。
首先,TypeScript 并没有一种简单明了的方式进行列表推导。例如,当处理大型数据时,这可能会令人感到沮丧。
其次,TypeScript 中并没有原生矩阵运算。Python 中有 NumPy,以及许多其他工具,这些工具使 Python 变得更容易。因此,如果你的项目有大量的线性代数,你可能不会想用 TypeScript。
再次,如果你对 JavaScript 不是很熟悉的话,你几乎肯定会有一些困惑。因为 TypeScript 就是基于 JavaScript 构建的,前者继承了后者的所有特性——所有好的、坏的和令人抓狂的特性。不过,说实话,遇到这些现象也会很有趣……
最后,你还需要考虑到编程并不是一种单独的职业。在数据科学领域中,有一个庞大的 Python 社区,它能为你提供支持和建议。但在目前,TypeScript 在数据科学家中并没有那么流行。因此,你可能无法在 StackOverflow 和其他地方找到对你的问题有帮助的答案。
也就是说,如果你要开始一个没有太多大数据和矩阵运算的小项目,那么无论如何你都可以尝试一下 TypeScript。特别是当它涉及到并行或异步编程时。
并不是每项任务都有一种语言。当然,有些语言比其他语言更为有趣,或更为直观。当然,热爱你的工具是很重要的,因为这会让你在困难的时候继续前进。因此,从一种很受欢迎的编程语言(如 TypeScript 或 Python)开始,并不是一个坏主意。
但归根结底,你不应该像信奉宗教信仰一样只信奉一种编程语言。编程语言只不过是一种工具。至于哪种工具最适合你,主要取决于你想用它做什么。
目前,对数据科学领域来说,Python 是巨大的存在。但是,在一个快速发展的领域,你需要把眼光放远一些。随着任务的改变,你的工具也会随之改变。
另一方面,TypeScript 有一个围绕前端 Web、后端节点和移动开发的活跃社区。有趣的是,这些领域与数据科学的交叉比人们想象的要高。特别是,Node 在数据科学家中越来越受到关注。
当然,这并不意味着你应该一次涉足十几种编程语言。真正精通一门编程语言有着巨大的价值。但从长远来看,对其他语言和技术的好奇心将有助于你保持领先地位。
所以,当你想尝试新事物的时候,不要犹豫!那为什么还不去尝试 TypeScript 呢?
Rhea Moutafis,正在攻读暗物质物理学博士学位。热爱艺术、音乐及美好事物。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货