<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jvm on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/jvm/</link><description>Recent content in Jvm on Backend Engineering Strategy Tools</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://backend-engineering-strategy-tools.github.io/site/tags/jvm/index.xml" rel="self" type="application/rss+xml"/><item><title>JVM Languages</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/languages/jvm/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/languages/jvm/</guid><description>&lt;p&gt;JVM-hosted languages beyond Java. Each trades something to gain something, and each found a niche where the trade made sense.&lt;/p&gt;
&lt;p&gt;Java was enough. It still is. The honest reason to know Groovy, Scala, and Kotlin is not that they are better — it is that the ecosystem puts them in front of you whether you choose them or not. Build tools, CI pipelines, and frameworks make that decision for you.&lt;/p&gt;
&lt;p&gt;A practical tell: if the Java code you are reading starts to feel syntactically off — closures where you did not expect them, type inference that seems too aggressive, operators that should not be there — you are probably looking at Groovy, Scala, or Kotlin. Worth knowing enough to recognise each and get things done.&lt;/p&gt;
&lt;p&gt;Also worth noting: Java itself has been catching up fast. Virtual threads, records, sealed classes, pattern matching, a faster release cadence — the gap between &amp;ldquo;Java&amp;rdquo; and &amp;ldquo;a more modern JVM language&amp;rdquo; has narrowed considerably. The case for leaving Java for something else on the JVM is weaker now than it was five years ago.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="groovy"&gt;Groovy
&lt;/h2&gt;&lt;p&gt;Dynamic, optionally typed JVM language with a syntax that is a superset of Java. Groovy code is often valid Java. The dynamic parts — closures, metaprogramming, GStrings — are what made it popular as a scripting and DSL language.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where you find it today:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gradle build scripts&lt;/strong&gt;: the Groovy DSL is the original Gradle scripting language (now being replaced by Kotlin DSL)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jenkins pipelines&lt;/strong&gt;: Groovy is the language of Jenkinsfile declarative and scripted pipelines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spock framework&lt;/strong&gt;: expressive BDD-style testing for JVM projects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Groovy&amp;rsquo;s peak was the early Gradle/Jenkins era. Kotlin has taken over most of the &amp;ldquo;better Java scripting&amp;rdquo; use cases. Still found widely in CI/CD tooling — if you work with Jenkins or older Gradle builds, you will write Groovy.&lt;/p&gt;
&lt;p&gt;Groovy shows up in Gradle builds and Jenkins pipelines. Know enough to read and modify it; not a reason to seek it out.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="scala"&gt;Scala
&lt;/h2&gt;&lt;p&gt;Statically typed functional + OOP hybrid on the JVM. Strong type system, pattern matching, immutable data by default. Compiles to JVM bytecode and interops with Java libraries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where you find it today:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apache Spark&lt;/strong&gt;: the dominant big data / data engineering platform is written in Scala and has a native Scala API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Akka&lt;/strong&gt;: actor model concurrency framework&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Play Framework&lt;/strong&gt;: web framework, less common now&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SBT&lt;/strong&gt;: build tool, build definition is Scala code&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Scala has a reputation for complexity and a steep learning curve. The community split between Scala 2 and Scala 3 (Dotty) added friction. If you are working with Spark, you will encounter Scala. If you are not, the reasons to choose it over Kotlin or Java are narrower than they used to be. Another case where Java catching up makes the trade less obvious.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="kotlin"&gt;Kotlin
&lt;/h2&gt;&lt;p&gt;JetBrains&amp;rsquo; answer to Java&amp;rsquo;s verbosity. Statically typed, concise, null-safe by design. Full Java interop — Kotlin and Java can call each other in the same project. Official Android development language since 2017.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where you find it today:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android development (the default)&lt;/li&gt;
&lt;li&gt;Spring Boot (first-class support since Spring 5)&lt;/li&gt;
&lt;li&gt;Gradle Kotlin DSL (replacing Groovy as the recommended build script language)&lt;/li&gt;
&lt;li&gt;Ktor — Kotlin-native web framework from JetBrains&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kotlin is what you reach for when you want Java but less of it. Coroutines handle async cleanly. The Kotlin DSL in Gradle gives type safety that the Groovy DSL could not.&lt;/p&gt;
&lt;p&gt;Kotlin is the cleanest of the JVM alternatives — but again, Java has been closing the gap. Worth knowing if the project is already Kotlin; not a compelling reason to switch from Java.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="jython"&gt;Jython
&lt;/h2&gt;&lt;p&gt;Python running on the JVM. Jython implements the Python language but executes on the JVM, meaning Python code can import and use Java classes directly.&lt;/p&gt;
&lt;p&gt;Worth knowing it exists. In practice: Jython implements Python 2 (Python 3 support was never completed), which limits its relevance post-2020. Main use case was embedding Python scripting in Java applications. A few enterprise tools and test frameworks still use it.&lt;/p&gt;
&lt;p&gt;If you need Python-JVM interop today, consider alternatives: GraalVM&amp;rsquo;s polyglot API, or just making an HTTP boundary between a Python service and the JVM service.&lt;/p&gt;
&lt;hr&gt;</description></item><item><title>Java</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/languages/java/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/languages/java/</guid><description>&lt;p&gt;Java is my primary language for backend services. Mature ecosystem, strong tooling, and frameworks like Spring Boot and Quarkus make it productive for building production-grade APIs and microservices.&lt;/p&gt;
&lt;h2 id="tooling"&gt;Tooling
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;IDE:&lt;/strong&gt; &lt;a class="link" href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener"
 &gt;IntelliJ IDEA&lt;/a&gt; — the standard for Java development. Excellent refactoring, code analysis, and framework support (Spring, Quarkus, Jakarta EE). The free Community edition covers most needs; Ultimate adds Spring-specific tooling and database tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build:&lt;/strong&gt; &lt;a class="link" href="https://gradle.org/" target="_blank" rel="noopener"
 &gt;Gradle&lt;/a&gt; or &lt;a class="link" href="https://maven.apache.org/" target="_blank" rel="noopener"
 &gt;Maven&lt;/a&gt; — Gradle is the least bad option; keep the build file focused on compile, test, and package only. See &lt;a class="link" href="https://backend-engineering-strategy-tools.github.io/site/public-notes/cicd/build-systems/" &gt;Build Systems&lt;/a&gt; for the full take.&lt;/p&gt;
&lt;h2 id="frameworks"&gt;Frameworks
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://spring.io/projects/spring-boot" target="_blank" rel="noopener"
 &gt;Spring Boot&lt;/a&gt; — the dominant choice for enterprise Java. Convention over configuration, huge ecosystem, production-ready out of the box.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://quarkus.io/" target="_blank" rel="noopener"
 &gt;Quarkus&lt;/a&gt; — optimized for containers and GraalVM native compilation. Noticeably faster startup and lower memory footprint than Spring Boot. Worth considering for microservices running in Kubernetes.&lt;/p&gt;
&lt;h2 id="testing-with-junit"&gt;Testing with JUnit
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://junit.org/junit5/" target="_blank" rel="noopener"
 &gt;JUnit 5&lt;/a&gt; is the standard testing framework. Combine with &lt;a class="link" href="https://site.mockito.org/" target="_blank" rel="noopener"
 &gt;Mockito&lt;/a&gt; for mocking and &lt;a class="link" href="https://assertj.github.io/doc/" target="_blank" rel="noopener"
 &gt;AssertJ&lt;/a&gt; for readable assertions.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;shouldReturnGreeting&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; service &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; GreetingService();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; assertThat(service.&lt;span style="color:#a6e22e"&gt;greet&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Manfred&amp;#34;&lt;/span&gt;)).&lt;span style="color:#a6e22e"&gt;isEqualTo&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Hello, Manfred&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Spring Boot&amp;rsquo;s &lt;code&gt;@SpringBootTest&lt;/code&gt; and &lt;code&gt;@WebMvcTest&lt;/code&gt; slice annotations make integration testing straightforward without spinning up a full application context.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.spring.io/spring-boot/index.html" target="_blank" rel="noopener"
 &gt;docs.spring.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://quarkus.io/guides/" target="_blank" rel="noopener"
 &gt;quarkus.io/guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://junit.org/junit5/docs/current/user-guide/" target="_blank" rel="noopener"
 &gt;JUnit 5 docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>