为什么以及如何从Ruby切换到Python

为什么以及如何从Ruby切换到Python
本文是 Sqreen的第一位工程师 Benoit 的个人经验 ,该工程师曾在Ruby代理和Python后端工作。

早在2008年,当我还在工科学校时,我的两个朋友就决定成立一家名为Feedbooks的公司。 他们的目标是使人们更容易找到,下载和共享高质量的电子书。 一个数字图书馆,它将公共领域的杰作,自我出版的作品和商业发行的作品归纳在一起。

允许他们实现此目标的网站必须快速,高效且易于维护。 当时,刚刚观看了现在著名的“ 如何在15分钟内创建博客 ” Ruby on Rails演示视频,创始人决定放弃尝试并开始编写代码。 几周后,为了尽快开发产品,他们需要其他帮助,并问我。

像我这一代的许多工程师一样,我以前曾涉足PHP和Mysql网站,甚至为小型开源CMS系统做出了贡献。 我熟悉与Web相关的所有内容,但从未听说过Ruby。 因此,我观看了视频,也迷上了Ruby on Rails的魔咒。 在接下来的十年中,我一直迷上Ruby,而且还在继续。 我们一群志趣相投的朋友伸出援手访问了图书馆网站,并使用该技术开发了许多其他网络应用程序。

但是为什么是Ruby,这有什么好处呢?

Ruby是一种非常富有表现力的语言。 语言的主要设计师Matz在创建Ruby时有一个非常简单的目标:为程序员带来快乐。 对我来说,这显然已经实现。 Ruby是一种面向对象的脚本语言。 Ruby中的每件事都是一个“对象”。 Ruby虚拟机负责将看起来很自然的语法转换为实际指令。 该VM不断改进,并且每个新版本的生成代码都变得更快。 Ruby中的对象通过向自身发送包含方法名称和参数列表的消息来进行协作。 Ruby的自省性也非常好,更改这些消息或创建临时接口很容易。

这些使之成为编写域特定语言(DSL)的一种非常好的语言。 这正是David Heinemeier Hansson(又名DHH)在创建Rails时所做的。 Ruby on Rails的核心是DSL的集合以及可轻松生成模型驱动的Web应用程序的框架。 时至今日,它特别适应并擅长创建应用程序,而业务逻辑和建模将在其中发挥重要作用。

因此,六年后,当我加入Sqreen成为第一位工程师时,合理的选择是使用Ruby。 但是,当我们启动Sqreen后端时,我们没有使用Ruby,而是使用了Python。

您是说您喜欢Ruby,但选择了Python作为后端?

这是为什么?

首先,Sqreen后端实际上是向世界公开(或不公开)的多种服务。 新客户看到的第一部分是我们的公司网站,它实际上是一个静态网站(尽管我们确实使用基于Ruby的网站生成器Jekyll生成了网站)。 然后是我们的仪表板,相反,它是一个非常动态的应用程序,构建为单页应用程序,是在首次涉足Meteor(又是一天的博客文章!)后作为React应用程序编写的。 仪表板与专用API进行通信,我们称之为“后端后端”。 这不是我们唯一的API,我们还有其他一些API,但到目前为止,最重要的是我们专用的“代理后端”。

我们很早就决定,我们不想使用多种语言编写API,因此我们可以轻松地在不同的API之间重用业务逻辑代码和模型。 我们还很早就预见到,至少代理的后端应该能够很容易地扩展到大量并发客户,因为我们的代理经常会向后ping后端。

不幸的是,Rails的运行速度并不是我们真正的首选。 显然,Rails并不是将Ruby用于应用程序和API的唯一方法,Ruby中提供了许多微框架,其中最著名的是Sinatra。 Sinatra很棒,它有一个非常小巧且易于使用的API,我们本来可以做到的。

我们选择Python的原因有两个。 首先,两位联合创始人JB&Pierre对Python更加熟悉,他们在Apple以前的生活中曾将Python用作一些内部工具。 其次,我们始终认为数据分析对于Sqreen至关重要。 不幸的是,Ruby对此并没有太大帮助,而Python科学生态系统只是一流的。 选择很容易,让我们使用Python及其众所周知的微框架解决方案。 烧瓶。

从Python开始

那时,我只涉足Python编写小型脚本,以转换和重塑某些数据或执行计算。 我必须加快使用它来创建API的速度。 幸运的是,如果您更改编程语言,则Web及其基本组件不会更改。 HTTP / HTML / JSON仍然是基于文本的协议/语言; REST仍然相同。 我在职业生涯中所学到的一切仍然有效,只是输出方式有些不同。 在Ruby中,使用称为Rack的通用规范来使应用程序与Web进行较低级别的通信。 这是一个非常简单的规范,主要规定应使用“ Array”表示HTTP请求和响应。 事实证明,Ruby的Rack实际上是受Python早期名为WSGI的倡议启发的。 很好,一个巨大的潜在障碍已消除。

但是语言呢? 如前所述,Ruby是一种面向对象的脚本语言,而python也是一种面向对象的脚本语言。 但是,Python在实现该概念上的方法不够纯净。 它不是作为一种面向对象的语言创建的,它还支持其他范例(主要是功能)。 但是,它们仍然是不同的语言,因此语法也有很大不同。 让我们举几个。 Ruby使用关键字(开始/定义结束)描述块。Python使用空格。 这确实需要一些习惯(而且我个人仍然更喜欢Ruby的方式)。 您可以使用try / except在Python中使用begin / rescue / end捕获Ruby中的异常。 但是对我来说,最大的变化是无法以Ruby允许您传递给许多方法的方式进行任何内联阻止(例如,使用find,map,inject等)。 在现代Python中,人们可以使用内联理解来经常执行等效操作,但是语法会变得非常混乱。 这实际上迫使开发人员更多地考虑正在使用的循环数,并最终导致更高效的代码。 我还发现了一些新的,非常周到的概念。 示例:Python中的上下文管理器使您可以将清理行为应用于资源和实际语法,这再次促使人们编写更有效的代码。

那么,我个人如何快速掌握Python语法? 首先通过练习使用非常好的Python Koans 这个开源项目使人们能够通过修复一组越来越困难的单元测试来学习Python。 他们浏览了该语言的不同功能,并提供了一个实际的,非常深入的教程。 然后,我阅读Python文档。 在Ruby文档可能比较简短甚至有时缺少的地方,Python文档非常完整。 该语言分为多个模块,每个模块都有详细的解释,通常会详细说明模块存在的基本原理,要解决的问题,如何解决的问题以及不使用时的情况! 是的,显然,它还包括示例。 对于任何想使用Python的人来说,这都是必读的。 等待所有这一切是否意味着Sqreen不使用Ruby,并且我不再使用它了? 很高兴您提出要求,实际上没有! 我喜欢Ruby,实际上我们在Sqreen做了很多工作。

首先,我们有一个Ruby代理 ,可帮助保护Ruby应用程序。 在过去的3年中,我断断续续地开发和维护代理,实际上它比以前复杂得多(阅读,有趣!)。 我们的每个代理商都进行动态检测。 换句话说,我们正在编写代码,该代码将基于通过有线发送的描述(经过加密签名)来更改正在运行的软件的控制流。 我们首先在Ruby中进行了实验,但是现在我们使用了五项技术(很快就会有六项!)。 这并非易事,与一群才华横溢且充满激情的人们一起工作是一种荣幸。

其次,当我们创建代理时,在将其发送给我们的第一批测试人员(现在是客户)之前,我们希望在现实生活中对其进行全面测试。 我们需要一个外观逼真的应用程序,我们还可以在该应用程序上评估代理的行为。 秉承我们的工程文化,我们决定自食其力,并创建了一个小巧但非常有用的Rails管理界面。 内部每天都在使用它来监视我们代理商的行为并为我们的客户提供帮助。

来过那里的人的一些建议

您是Ruby开发人员正在考虑从Python开始吗? 你应该做! 它与Ruby足够相似,您很快就会感到有生产力。 但是,它也足够不同,您将学到一些新技巧,这些新技巧可以为您打开新的大门。 无论如何,成为一个小技巧的小马绝不是一个好主意! 一个好的交互式教程和文档是一个很好的起点。 但您也应该尝试在真实的应用程序上工作。 仅执行教程时,就不会出现生态系统的许多特质(例如,程序包管理,测试,配置文件…)。 是否想和已经做出转换的人一起尝试? 加入Sqreen ,很明显,我们正在招聘????

最初于 2019 年1月30日 发布在 blog.sqreen.com 上。

From: https://hackernoon.com/how-i-switched-from-ruby-to-python-ac7038015888