在过去的6年中,我一直在Rails,Clojure, Java和Back to Rails的Web应用程序上工作。 这是对过去几年的概述,使用这种不同技术堆栈的好处以及它的缺点。
我从事的语言和项目概述
这是Rails 2.3中的一个大项目。 是典型的Rails整体控制已失控。 它具有+ 1K端点,并使用了大量宝石。 由于依赖关系,实际上是不可能升级的。 在某些时候,它存在一些可维护性和性能问题,正如我们从快速进入市场的方法中所期望的那样。
但是团队专注于扭转战舰。 我们开始遵循清洁架构的准则。 我们使用了演示者,交互者和存储库。 在某些时候,我相信部分代码库实际上是令人愉快的,并且构建正确。 错误和性能问题的数量大大减少,我们为此感到自豪。 但是我们只涉及了40%的应用程序。
至此,我开始寻找其他工具。 我一直在寻找更适合我想要的东西:生产力,代码质量和性能。
Clojure
我有机会引导新产品,很幸运在Clojure做到了。 这是一种巨大的转变,它采用了一种具有异类语法的语言,转向了新的编程范例。 毫无疑问,Clojure是我最喜欢的编程语言。 我学到了很多东西,即使到了今天,由于来自社区的大量创新,我也关注社区。
我们实现了带有多个有限上下文服务的Web API。 我们使用了异步HTTP和与数据库的异步通信,从而使服务器端到端完全异步。 一切都很快,我们工作效率很高,并且不断学习。
并非一切都很好。 招聘有问题。 要找到认识Clojure甚至愿意学习的人,这很复杂。 从其他地方带走人员总是有很大的增长。
但是我对产品的主要问题是业务没有扩展。 在那里,我们拥有了一个良好的体系结构和良好的实现,但是并未经过测试。
所以我开始环顾四周。 这次我想要一个大型项目。 无论使用哪种语言,都可以处理大数据。
爪哇
我发现一家拥有大规模项目的公司,他们使用Java。 当时我并不在意,我以为我会使用Java企业级工具,而这两种动态语言会给我带来巨大的冲击。 但是我愿意学习,公司赌我。
幸运的是,Java项目不是企业级的。 它们非常精简,实际上在架构上与我以前研究过的非常相似。 他们有一层仅用于使用“控制器”和JSON序列化器进行HTTP处理。 他们有一个仅用于业务逻辑等的层。使用Java 8实际上很好,因为我可以使用从Clojure学习到的几种构造。
实际上,一切都更加严格。 必须为所有概念定义POJO很麻烦。 但是实际上,我并没有像我在Rails和Clojure社区上听到过这么多次的生产率下降那样。 我实际上很快速而且有生产力,我喜欢用Java 8编程。这确实很冗长,但是在这个问题上,一个好的IDE可以带来很多帮助。
在某些时候,我认为Rails社区实际上可以从Java社区中学到很多东西。 反之亦然。 例如,在Java中,您花时间定义模型并记录它们。 Java开发人员会为此感到自豪,并对我说: “您在动态语言中没有这个功能,您怎么能进行重构并知道一切正常?” 。
这是真的。 我做了两次产品范围的重构。 IDE起到了很大的作用,当所有内容都编译时(有时并不容易完成),我实际上确信一切都很好。
但有趣的是:这是非常罕见的我需要在动态语言执行这些种巨大的重构。 虽然动态语言可以在使用的数据和模型上有更多的定义是正确的,但事实是,当您在该环境上编程时,构建的代码更容易更改 。
Rails 4.2
在这里,我再次在Rails项目中,这次使用Rails 4.2。 在经过几周的恢复之后,我感到一件事:在Rails 4.2中进行编程与在Rails 2.3中进行编程相同。 我并不是说没有改进。 我的意思是,从我的角度来看,对于一个不太记得Rails 2.3过去的人来说,在Rails 4.2中编写一个剩余的API实际上是一样的。
这让我感到奇怪:如果我看不到巨大的变化,为什么升级如此困难? 为什么会有这么多重大变化? 这与Java和Clojure生态系统发生了冲突,在Java生态系统中,Clojure生态系统非常注重向后兼容性。
我得到的另一件事是,新来的孩子不会喜欢护栏,而且很难雇用。 现在,很酷的孩子们喜欢Go或Elixir,然后对Rails皱眉。 老实说,我没想到。
无论如何,我确实相信拥有一支优秀的团队和一个要解决的好问题是进行出色编程的主要条件。 而且我很想对Rails进行测试,并尝试从中获得最大收益。
那么,我从使用这么多种语言中学到了什么?
在多个生态系统上工作确实使我大开眼界,并让我考虑了几种处理方法。 这都是权衡的问题,作为一名工程经理,我必须能够从任意堆栈中查看代码,从而从中受益。 我可能不是最好的低级审阅者,但据我了解,我确实有很多建议可以提供。
- 来自Ruby:专注于易于更改的软件,适用于小型函数和小型类。 使您的代码易于阅读和理解。 专注于强大的面向对象编程。 让我们尝试制作易于更改的默认代码。
- Clojure:考虑简单和简单之间的区别。 清除数据与更改该数据的逻辑之间的明显区别。 区分纯函数和具有副作用的函数,请尝试将它们分开。 让我们尝试在默认情况下制作简单的代码。
- Java:性能,并发性和严格性。 不要忘记您的日志记录和异常处理。 让我们尝试在默认情况下制作快速代码。
对于工程经理一职,我认为这是必须的,而且我觉得我有更多的见解,因为我拥有所有这些不同的经验。
还有弊端?
拥有多种语言的知识的确使我变得更灵活。 但这也使我不太熟练和精通某种特定语言。 对于我来说,找到高级工程师的工作更加复杂。 几个月前,我确实申请了高级职位,虽然我为自己的挑战感到自豪,但该公司选择不对我**。 但是经过考虑之后,我意识到我在“这是一名高级开发人员”测试中失败了。
公司希望使用特定语言的经验丰富的开发人员具有某些特质,技能和知识。 例如:
- Java :日志记录和异常处理非常重要,请勿将原始字符串用作常量,请编写良好的文档。 熟悉Java中的并发,Java内存模型以及GC的工作方式。
- Ruby / Rails :了解内轨细节,了解干净的体系结构,编写易于更改的代码。 编写快速测试。
- Clojure:高级功能编程,Clojure中的高级并发编程:通道,传感器等…
- 游戏编程 :矩阵乘法可能比
if更快。 处理由于高速缓存,线性代数而彼此接近的内存块。
而且,如果一家公司不想押注那些经验丰富但会有所增加的人,这是可以理解的。 因此,如果您想切换区域或堆栈,我的建议是选择一名中级开发人员角色。 从后面开始,快速起步。
我记得我曾经是游戏程序员的时候。 我已经是一位经验丰富的开发人员,但是我是一名初级游戏程序员。 我的代码中存在与对象旋转有关的错误。 一位队友刚刚向我指出并提供了解决方案。 但是我只是没有“大脑记忆”来快速处理这些信息。
做专家需要很多时间来做同样的事情。 没有捷径。
我们需要在项目上进行多层次的知识研究。 虽然学习语言很困难 ,但还有许多我们需要知道的事情。
- 知道使用的语言
- 了解所使用的构建工具(maven,npm,lein,bundle等)
- 了解使用的数据存储(postgres,mongo,elastic,cassandra等)
- 了解如何将项目投入生产以及最适合的配置是什么
- 了解项目的结构,实施地点和方式
- 了解应用程序的业务逻辑
因此,语言只是一小部分。 我实际上认为工具和整个生态系统需要更多时间来学习。
最初于 2018年3月18日 发布在 engineering-management.space 。
From: https://hackernoon.com/from-rails-to-clojure-then-to-java-then-back-to-rails-bd4b418f3cfb