写点什么

用 Clojure 改善 Java 项目是种什么样的体验?

  • 2019-03-06
  • 本文字数:1927 字

    阅读完需:约 6 分钟

用 Clojure 改善 Java 项目是种什么样的体验?

关于软件开发,特别是服务端软件开发的技术栈的探索,几乎贯穿了我整个职业生涯。几年前我就想写这样一个专题,但是开了个头就又很快搁笔。反复思考,感觉自己仍然太过浅薄。近几年随着技术领域的整体进步,和自己的学习积累,感觉现在是个比较合适的时机,建立一个围绕 Java 体系的工程技术栈,将它整理成文字,与大家分享。


一方面,Java8 之后,语言的进步,使它在生产力上与旧版本已有很大提高。虽然 Java 与新时代的编程语言相比,仍显得比较笨拙,但是做为一个技术体系的基础,已经足够可用。另一方面,基于 JVM 环境的编程语言的发展,使得 JVM 可以成为一个通用的运行时环境,在其上利用若干互补的编程语言构建工程。


JVM 平台上最著名的新贵莫过于 Scala,特别是 Spark 的兴起为 Scala 争取了很多爱好者。但是就我亲身体验而言,Scala 也有一些问题:


  • 首先是 Scala 本身是一门复杂语言,要用好这门语言,需要大量的领域知识。当然将其作为一个“更好的 Java ”来用,未尝不是一件好事,这也是我向普通用户推荐的用法。要发挥 Scala 的全部优势,需要一个优秀的团队,成员有对代码风格和质量的追求和共识,愿意为驾驭工具,提高生产力,付出精力;

  • 其次 Scala 的构建工具 sbt 实在不能说令人满意;

  • 另外就是,Scala 实在跟 Java “太像”了,它是一个自成一体的复杂体系,如果用 Scala,很难划清一个边界,找到其它语言的切入点。这倒不能说是 Scala 的缺点,更准确的说,其它技术需要 Scala 的多,Scala 需要其它技术的少。


我尝试了 Java+Clojure 的体系,发现是一个非常好的组合。Java 是静态编译型语言,Clojure 是动态类型,虽然它本质上仍然是编译型的,但是可以在 Repl 中方便的交互,也可以以脚本形式运行。两者可以在工程上建立非常清晰的功能边界,各司其职。


Clojure 的构建工具 Leiningen 是 Maven 的高级封装,可以充分利用 Clojure 的语法和 Maven 的资源。Clojure 的语言风格和内置库,都强调了与 Java 的互通,而 S 表达式内在的数据抽象能力,以及大量依赖 Clojure 语法的功能支持,可以将 Java 项目变得更敏捷和干净。在 Java 项目中引入 Clojure ,可以有效地提高生产力。


或许 Java 语言层面的笨拙,本身也促进了其工具库和框架的蓬勃发展,现代 Java 生态中,负责组建项目架构的 Spring / Guice,提供并行 / 并发抽象的 Java Concurrent 和 Akka、Clojure.core.async 、提供数据库访问的 Hibernate 等,都是很好的作品。在具体的项目中,找到一个互补的工具集很有意义。


一个复杂工程,往往不是单一架构和技术栈能够覆盖的,技术组合能够互补就很重要了。例如异步框架中 Vert.x 曾经是我期待很高的一环,它为多种语言提供了 SDK ,包括 Java、Scala、Node.js 等。但是实践中这个东西完全无法让人满意,在高性能压力下,出现大量无法管理的错误。更重要的是它非常的排外,一旦在项目中使用 Vert.x,就要整个在编程风格上遵循它的需要,大量的回调并没有节省开发人员的思考时间,相反还要削足适履,不断思考自己的代码逻辑是否会阻塞框架。而它的异步安全,依赖全局的单一 Vertical 对象,在原生支持多核并行的 JVM 环境下,强制开发人员依赖 GIL,是一个非常愚蠢的退步。


相反,我在尝试 Akka 的过程中,体验非常好,Akka 不会强制用户在一个单一的 Materializer 下运行逻辑,跨节点扩展非常容易,而进程内的 Actor 运行负担也非常小,接入 Akka 的过程很友善,并不会污染 Actor 之外的代码风格,在 Spring MVC 中使用 Akka 也不会有任何问题,我还尝试在 Google Cloud 的 App Engine 实例(war 环境)中用 Akka 管理爬虫逻辑,整个过程没有任何问题。这也印证了前面所说的“其它 JVM 技术需要 Scala ”的场景。感谢 Akka 提供了完整的 Java DSL,虽然它只能用在 JVM 项目中,但是对于服务端开发并不是很大问题。我编写了很多在 Clojure / Java 中使用 Akka 的代码,组合使用了各种各样的框架和库,都没有遇到风格上的冲突。更多干货,我将在今年举办的 QCon 全球软件开发大会广州站上,为大家详述。


作者简介:


刘鑫,从事软件开发工作近 20 年。曾在火币网的钱包组和撮合引擎组担任技术专家。是 Python 中文社区的早期成员,维护了 2.x 时代的 Python Tutorial 中文版翻译。近年的关注点在 Java + Clojure 的技术组合,以及研发团队的工程化管理等方面。


5 月 25-28 日,QCon 全球软件开发大会广州站将邀请刘鑫老师作为「编程语言」专题的讲师,现场分享实战经验。还有来自 BAT、京东、滴滴、网易等实践专家,围绕微服务、大前端、人工智能、高可用高性能架构、DevOps…带来 TOP 70+最佳实战案例分享。最后附上 8 折报名福利,立减 1360 元,咨询可致电鱼丸:13269078023(微信同号)。更多详情可戳:http://t.cn/EIl5B0h


2019-03-06 14:056245

评论

发布
暂无评论
发现更多内容

降本增效的利器——组件化开发

力软低代码开发平台

云原生数据库前世今生

亚马逊云科技 (Amazon Web Services)

数据库 云原生

多版本并发控制 MVCC

月明风清

直播预告 | 在 CurveBS 上部署跨机 PolarDB for PostgreSQL 集群

阿里云数据库开源

数据库 postgresql 阿里云 开源 polarDB

一文读懂,硬核 Apache DolphinScheduler3.0 源码解析

白鲸开源

源码阅读 Apache DolphinScheduler 工作流编排 大数据 开源 大数据调度

学习WEB前端去哪里?

小谷哥

Java 设置 Word 中的段落缩进方式

Geek_249eec

Java word 段落缩进

C站专家圈分享-低代码构建WebAPI的原理与体验

葡萄城技术团队

架构 低代码 开发 WebApi 前后端

云原生数据库 Amazon DynamoDB 十年创新回顾

亚马逊云科技 (Amazon Web Services)

数据库 云原生

MediaTek MT7915 Module 2T2R DR7915/Wallys Wi-Fi 6 Wave 1+ chipset

wallys-wifi6

MT7975 MT7915

如何写成高性能的代码(一):巧用Canvas绘制电子表格

葡萄城技术团队

html 前端 canvas html2canvas 纯前端表格技术

TiDB Hackathon 2022丨总奖金池超 35 万!邀你唤醒代码世界的更多可能性!

TiDB 社区干货传送门

黑客马拉松

数字孪生智慧校园三维可视化管理系统解决方案

数据可视化平台

智慧校园 智慧学校 智慧校园解决方案 智慧校园管理系统 校园三维可视化

尚硅谷ShardingSphere新版视频教程发布

小谷哥

什么样的人适合参加前端培训呢?

小谷哥

【SSM】Spring系列——Spring概述、第一个Spring程序、容器接口和实现类

胖虎不秃头

spring ssm 9月月更

主流开源APM:Zipkin/Pinpoint/SkyWalking全面对比

穿过生命散发芬芳

APM 9月月更

官宣 | 极狐(GitLab) 公司成立一年完成 4 轮融资,夯实中国开源市场信心

极狐GitLab

开源 DevOps 融资 自主可控 极狐GitLab

select多路选择

飞翔

Go

OpenHarmony编译报错解决

坚果

OpenHarmony 9月月更

前端培训与自学的区别

小谷哥

在上海想学WEB前端课程如何选择

小谷哥

【SSM】Mybatis系列——分页、使用注解开发、mybatis执行流程

胖虎不秃头

mybatis SSM框架 9月月更

【SSM】Mybatis系列——多对一和一对多的处理、动态SQL

胖虎不秃头

mybatis SSM框架 9月月更

资深专家亮相华为云快成长直播间CDN专场,助力企业体验升级!

神奇视野

2022 DEMO CHINA创新中国峰会收官,5大专场创业者PK,投资人脱口秀别开生面

创业邦

阿里云云原生实时数仓升级发布,助力企业快速构建一站式实时数仓

阿里云大数据AI技术

大数据 数仓

MySQL数据库之索引

Java快了!

:MySQL 数据库

如何防范钓鱼网站诈骗?

郑州埃文科技

钓鱼网站 钓鱼诈骗 网络诈骗防范

深度学习+大规模计算+大数据,谁才是未来的算力之王

Finovy Cloud

人工智能 云渲染

用 Clojure 改善 Java 项目是种什么样的体验?_编程语言_刘鑫_InfoQ精选文章