从Rails到Clojure再到Java,最后回到Rails

18-03-22 banq
              

在过去的6年中,我开发Web应用程序先后使用了Rails、Clojure和Java,最好又回到了Rails,上。以下是我总结过去几年使用这些不同的技术栈的好处和缺点。

Rails 2.3

做过一个Rails 2.3的大项目。它是典型的混合大单体,已经失控。它拥有+ 1K的端点并使用了大量的gems。由于依赖关系,升级实际上是不可能的。在某种程度上,它的可维护性和性能问题正是我们期望快速推向市场导致。

但是后来团队开始专注于重构。开始遵循清洁架构的指导方针。使用了表现层,交互层和存储层。在某些时候,我相信代码库的一部分实际上是令人愉快的,并且是正确构建的。错误和性能问题的数量大幅下降,我们为此感到自豪。但是我们只修改了40%的应用程序。

此时我开始寻找其他工具。我去寻找更适合我想要的东西:生产力、代码质量和性能。

Clojure

我有机会启动一款新产品,并有幸使用Clojure中做了这个产品。这是一个巨大的转变,转向一种新的编程范式,而且使用的是一种外来语法。毫无疑问,Clojure是我最喜欢的编程语言。我学到了很多东西,即使在今天,我也会关注这个社区,因为这里有大量的创新。

我们实现了一个带有几个有界上下文服务的web api。我们使用异步HTTP和数据库的异步通信,使服务器完全异步端到端。一切都很快,我们非常有成效,并不断学习。

并非一切都很好。招聘人员是有个问题。我们发现了解Clojure或者甚至愿意学习的人是比较难的。从其他编程语言中吸引人们却有一定难度。

但是我对这个产品的主要问题是,业务不具备规模扩展性。虽然我们有了我们认为是一个很好的架构和良好的实施,但没有通过测试。

所以我开始环顾四周。这次我想要一个大型项目,能够处理大量数据,无论使用哪种语言。

Java

我发现一家拥有庞大规模项目的公司,他们使用Java。那时我并不在意,我假设我将使用Java entreprise-ish工具,并且这将是来自两种动态语言的巨大冲击。但我愿意学习,公司相信我能做到。

幸运的是,Java项目不是entreprise-ish。他们非常精简,在架构上与我以前的工作非常相似。他们有一层仅用于HTTP处理“控制器”和JSON序列化器。他们有一个专门用于业务逻辑的层,等等。使用Java 8实际上很好,因为我可以使用从Clojure学到的一些构造。

事实上,一切都更加严格。不得不为所有概念定义POJO是很麻烦的。但实际上,我并没有在Rails和Clojure社区听到过抱怨Java的生产力缓慢。实际上,我的速度很快,而且工作效率很高,而且我喜欢用Java 8进行编程。它的确更加冗长,但一个好的IDE在这方面有很多帮助。

有时候我认为Rails社区实际上可以从Java社区学到很多东西。反之亦然。例如,在Java中,您花时间定义模型并记录它们。Java开发人员会为此感到自豪,并对我说:“你在动态语言中没有这样的东西,你怎么做重构并知道一切都好?”。

这是真的。我做了几个产品范围的重构。IDE帮助了很多东西,当编译完所有东西时(事情并不总是很容易完成),事实上我确信一切都很好。

但有趣的是:使用动态语言进行重构的工作量没有Java这么大。而动态语言也可以实现更多关于所用数据和模型的定义,但事实是,当您在动态语言环境中编程时,您会构建更易于更改的代码。

Rails 4.2

最后,我又一次在Rails项目上,这次使用Rails 4.2。我感觉有一件事:在Rails 4.2中进行编程与在Rails 2.3中进行编程相同。我并不是说没有改进。我说的是,从我的角度来看,从一个不太记得Rails 2.3的人那里,在Rails 4.2中编写一个rest API实际上感觉是一样的。

这让我想知道:如果我没有看到巨大的变化,为什么升级很难?为什么会有这么多重大改变?这是与Java和Clojure生态系统冲突的地方,他们非常关注向后兼容性。

我想到另一件事是,新的孩子不会喜欢Rails,而且招聘雇用更困难。现在很酷的孩子们喜欢Go或者Elixir,并且会对Rails皱眉。老实说,我并不期待这一点。

无论如何,我确实认为拥有一支优秀的团队和一个需要解决的问题是优秀编程的主要条件。而且我非常希望Rails能够进行测试,并尽量充分利用它。

那么,我从使用这么多语言中获得了什么?

参与过几个生态系统真的让我睁大眼睛,让我想到了几种做事的方式。这完全取决于权衡,作为工程经理,我必须从能够从任意堆栈中检查代码中获益。我可能不是最好的低水平评论者,但从我了解到的情况来看,我确实有很多建议。

从Ruby开始:着重于轻松更换软件,适用于小型函数和小型类。让你的代码易于阅读和理解。关注强大的面向对象编程。让我们尝试制作默认情况下易于更改的代码。

Clojure:考虑容易和简单的区别。在数据和改变数据的逻辑之间有清晰的区别。能够区分纯函数和副作用功能,尝试将它们分开。让我们尝试默认制作简单的代码。

Java:性能,并发性和严格性。不要忘记你的日志记录和异常处理。让我们尝试默认快速编码。

对于工程经理的职位,我相信是必须的,而且我觉得我有更多的见解,因为我有过不同的经历。

缺点?

掌握多种语言的知识确实使我更具多面性。但也使我对某种特定语言的熟练程度和熟练度不够。担任高级工程师的工作对我来说更为复杂。几个月前我曾申请过高级职位,当我为自己的挑战感到自豪时,公司没有选择我。但经过考虑后,我意识到我在公司的“这人是否是一个高级开发人员”测试中落选了。

招聘公司希望招聘到一位经验丰富的开发人员,使用某种特定的语言具备某种特质,技能和知识。例如:

Java:日志记录和异常处理非常重要,不要使用原始字符串作为常量,编写好的文档。熟悉Java中的并发性,Java内存模型以及GC的工作原理。

Ruby / Rails:了解内部Rails细节,了解干净的架构,编写易于更改的代码。编写快速测试。

Clojure:高级函数式编程,Clojure中的高级并发编程:channels,transducers等...

游戏编程:矩阵乘法可能比一个if更快。使用高速缓存经验。

想成为专家需要花费很多时间来做同样的事情。没有捷径。

概要

虽然 学习语言很困难,但还有很多事情我们需要知道。

知道使用的语言

了解使用的构建工具(maven,npm,lein,bundle,...)

了解使用的数据存储(postgres,mongo,elastic,cassandra,...)

了解如何将项目投入生产,以及什么是最佳配置

了解项目的结构,在哪里以及如何实施

了解应用程序的业务逻辑

所以,语言只是一小部分。我实际上相信工具和整体生态系统需要更多的时间学习。

From Rails to Clojure, then to Java, then back to

              

2