<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on Backend Engineering Strategy Tools</title><link>https://backend-engineering-strategy-tools.github.io/site/tags/java/</link><description>Recent content in Java 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/java/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>AWS CDK</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/infra-as-code/cdk/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/infra-as-code/cdk/</guid><description>&lt;p&gt;AWS CDK (Cloud Development Kit) lets you define infrastructure using real programming languages — Java, TypeScript, Python — rather than a DSL. You write code, CDK synthesizes it into a CloudFormation template, and CloudFormation deploys it to AWS.&lt;/p&gt;
&lt;p&gt;The appeal is obvious if your team lives in Java: familiar language, familiar tooling, loops and abstractions, unit tests with JUnit. No HCL to learn.&lt;/p&gt;
&lt;p&gt;In practice it is slower and more cumbersome than it looks, and the CloudFormation layer underneath causes real problems.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Write Java (imperative)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mvn package&lt;/code&gt; — compile and run unit tests&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cdk synth&lt;/code&gt; — generate the CloudFormation template&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cdk diff&lt;/code&gt; — compare deployed stack with current state (optional)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cdk deploy&lt;/code&gt; — deploy stack to AWS via CloudFormation&lt;/li&gt;
&lt;li&gt;CloudFormation makes the API calls to AWS&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The key thing to understand: CDK does not talk to AWS directly. It generates CloudFormation, and CloudFormation does the work. Everything downstream of &lt;code&gt;cdk synth&lt;/code&gt; is CloudFormation behaviour, not CDK behaviour.&lt;/p&gt;
&lt;h2 id="the-cloudformation-problem"&gt;The CloudFormation problem
&lt;/h2&gt;&lt;p&gt;CloudFormation does not track changes made outside of stacks. Someone logs into the console and modifies a security group — CloudFormation does not know, your CDK code does not know, and &lt;code&gt;cdk diff&lt;/code&gt; will not show it. That is drift, and it accumulates silently until a deployment overrides something that was manually changed in production, or a &lt;code&gt;cdk destroy&lt;/code&gt; removes something that was depended on.&lt;/p&gt;
&lt;p&gt;CloudFormation does have a drift detection feature, but it is not part of the normal workflow — you trigger it manually from the console, it shows you the diff, and then expects you to go fix it yourself.&lt;/p&gt;
&lt;p&gt;Compared to &lt;a class="link" href="../terraform/" &gt;Terraform&lt;/a&gt;, which maintains its own state file and surfaces drift explicitly in &lt;code&gt;terraform plan&lt;/code&gt;, this is a meaningful operational weakness.&lt;/p&gt;
&lt;h2 id="cross-stack-dependencies"&gt;Cross-stack dependencies
&lt;/h2&gt;&lt;p&gt;Splitting infrastructure into smaller stacks is the right instinct — smaller blast radius, faster deploys, clearer ownership. The problem is how CloudFormation handles values shared between stacks.&lt;/p&gt;
&lt;p&gt;When Stack A exports a value (a VPC ID, a security group ARN) and Stack B imports it, CloudFormation creates a hard dependency. You cannot modify or delete that export while any other stack is consuming it. CloudFormation will block the update and leave you stuck — Stack A cannot deploy because the export is in use, and Stack B may be in a broken state because it depends on something that no longer exists as expected. Getting out requires carefully coordinating the removal of the import before you can change the export.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix: use SSM Parameter Store instead of CloudFormation exports.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Stack A writes its outputs to SSM:&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;StringParameter.&lt;span style="color:#a6e22e"&gt;Builder&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;create&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;VpcIdParam&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;parameterName&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/infra/vpc/id&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;stringValue&lt;/span&gt;(vpc.&lt;span style="color:#a6e22e"&gt;getVpcId&lt;/span&gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;build&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Stack B reads from SSM at deploy time:&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;String vpcId &lt;span style="color:#f92672"&gt;=&lt;/span&gt; StringParameter.&lt;span style="color:#a6e22e"&gt;valueForStringParameter&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;/infra/vpc/id&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No CloudFormation export, no hard dependency, no blocked deployments. Stacks can be updated and deployed independently. SSM also gives you a clean place to browse shared infrastructure values and reference them from outside CDK (application config, scripts, other tools).&lt;/p&gt;
&lt;h2 id="testing"&gt;Testing
&lt;/h2&gt;&lt;p&gt;Testing in CDK is limited to validating the synthesized CloudFormation template — you are not testing infrastructure behaviour, you are testing that your code generates the JSON you expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unit tests&lt;/strong&gt; — JUnit assertions against the synthesized template (e.g. &amp;ldquo;does this stack contain an S3 bucket with versioning enabled&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration tests&lt;/strong&gt; — deploy to an isolated environment and validate via AWS SDK&lt;/li&gt;
&lt;li&gt;No native plan/apply preview; you must deploy to see what actually happens&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pros"&gt;Pros
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Familiar Java constructs — loops, conditionals, reusable classes&lt;/li&gt;
&lt;li&gt;Full IDE support, refactoring, type safety&lt;/li&gt;
&lt;li&gt;Unit testing with JUnit&lt;/li&gt;
&lt;li&gt;Good for teams already invested in Java who want infrastructure close to application code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cons"&gt;Cons
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Generates CloudFormation — debugging complex stacks means reading generated JSON/YAML&lt;/li&gt;
&lt;li&gt;More boilerplate than HCL for straightforward infrastructure&lt;/li&gt;
&lt;li&gt;Drift detection relies on CloudFormation, which has no visibility into out-of-band changes&lt;/li&gt;
&lt;li&gt;Importing existing infrastructure can be awkward&lt;/li&gt;
&lt;li&gt;Smaller community example base compared to Terraform, especially in Java vs TypeScript/Python&lt;/li&gt;
&lt;li&gt;Deployments are slower than Terraform&amp;rsquo;s direct API approach&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vs-terraform"&gt;vs Terraform
&lt;/h2&gt;&lt;p&gt;For repeatable, standardised infrastructure with a clear plan/apply workflow and reliable drift detection, &lt;a class="link" href="../terraform/" &gt;Terraform&lt;/a&gt; is the stronger choice. CDK makes sense when infrastructure is deeply coupled to application code and the team is committed to a single language across both.&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.aws.amazon.com/cdk/v2/guide/home.html" target="_blank" rel="noopener"
 &gt;AWS CDK documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.aws.amazon.com/cdk/api/v2/" target="_blank" rel="noopener"
 &gt;AWS CDK API reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cdkpatterns.com/" target="_blank" rel="noopener"
 &gt;CDK Patterns&lt;/a&gt; — community example library&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/aws/aws-cdk" target="_blank" rel="noopener"
 &gt;AWS CDK GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Code Quality &amp; Architecture Analysis</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/frameworks-tools/code-quality/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/frameworks-tools/code-quality/</guid><description>&lt;p&gt;Static analysis catches bugs and code smells before they reach production. Architecture analysis catches structural decay before the codebase becomes unmaintainable. SonarQube does the former; Structure101 does the latter.&lt;/p&gt;
&lt;h2 id="sonarqube"&gt;SonarQube
&lt;/h2&gt;&lt;p&gt;A code quality and security platform. SonarQube runs static analysis on your codebase and reports bugs, code smells, security hotspots, and test coverage in a web dashboard. It supports 30+ languages; the Java and Kotlin analysis is particularly deep. Integrates into CI pipelines via the SonarScanner — a quality gate can fail the build if new code introduces issues above a configured threshold.&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Run analysis (from project root, after configuring sonar-project.properties)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sonar-scanner &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Dsonar.projectKey&lt;span style="color:#f92672"&gt;=&lt;/span&gt;my-project &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Dsonar.sources&lt;span style="color:#f92672"&gt;=&lt;/span&gt;src/main &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Dsonar.tests&lt;span style="color:#f92672"&gt;=&lt;/span&gt;src/test &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Dsonar.host.url&lt;span style="color:#f92672"&gt;=&lt;/span&gt;https://sonarqube.example.com &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Dsonar.token&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$SONAR_TOKEN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Quality gates&lt;/strong&gt; define the conditions a project must meet — for example: no new critical bugs, test coverage on new code ≥ 80%, no new security hotspots unreviewed. A gate failure blocks the PR merge or CI pipeline. The built-in &amp;ldquo;Sonar Way&amp;rdquo; gate is a sensible default; most teams customise it over time.&lt;/p&gt;
&lt;p&gt;SonarQube Community Edition is free and covers the core analysis features. Enterprise Edition adds branch analysis, portfolio views, and security reports.&lt;/p&gt;
&lt;h2 id="structure101"&gt;Structure101
&lt;/h2&gt;&lt;p&gt;An architecture analysis tool for Java projects. Structure101 visualises the dependency structure of a codebase as a layered graph and identifies violations — circular dependencies between packages, classes depending on layers they shouldn&amp;rsquo;t reach, packages with too many inbound dependencies. It is particularly useful for large, long-lived Java codebases where architectural boundaries have eroded over time.&lt;/p&gt;
&lt;p&gt;The key report is the &lt;strong&gt;tangle&lt;/strong&gt; metric: a tangle is a group of packages with circular dependencies, and the tangle percentage measures how much of the codebase is affected. A clean architecture has zero tangles. Structure101 shows exactly which dependencies create each tangle, making it possible to systematically break them.&lt;/p&gt;
&lt;p&gt;It integrates with build systems (Maven, Gradle) to enforce architecture rules in CI — build fails if the tangle percentage exceeds a threshold, or if a dependency violates a defined layering rule.&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.sonarsource.com/sonarqube/" target="_blank" rel="noopener"
 &gt;SonarQube documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.sonarsource.com/open-source-editions/sonarqube-community-edition/" target="_blank" rel="noopener"
 &gt;SonarQube Community Edition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://structure101.com/documents/" target="_blank" rel="noopener"
 &gt;Structure101 documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>IntelliJ IDEA</title><link>https://backend-engineering-strategy-tools.github.io/site/public-notes/frameworks-tools/idea/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://backend-engineering-strategy-tools.github.io/site/public-notes/frameworks-tools/idea/</guid><description>&lt;p&gt;IntelliJ IDEA is JetBrains&amp;rsquo; Java and Kotlin IDE. It has the deepest language understanding of any Java IDE — code completion that reasons about types across the entire project, refactoring that updates all call sites, a debugger with expression evaluation, and a profiler integrated into the same window. The free Community Edition covers Java, Kotlin, Groovy, and Scala. The paid Ultimate Edition adds frameworks (Spring, Quarkus, Micronaut), database tools, HTTP client, and built-in support for web technologies.&lt;/p&gt;
&lt;h2 id="key-capabilities"&gt;Key capabilities
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Refactoring&lt;/strong&gt; — rename a class and every reference in every file updates. Extract method, inline variable, move class to a different package, change method signature — all with full project-wide impact analysis before execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navigation&lt;/strong&gt; — &lt;code&gt;Cmd+Click&lt;/code&gt; goes to declaration, &lt;code&gt;Cmd+B&lt;/code&gt; shows all usages, &lt;code&gt;Cmd+E&lt;/code&gt; opens recent files, &lt;code&gt;Cmd+Shift+F&lt;/code&gt; searches across the entire project. In a large codebase, knowing where things are called from matters more than reading the code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inspections&lt;/strong&gt; — real-time static analysis flags potential bugs, code style violations, and anti-patterns as you type, not at build time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Debugger&lt;/strong&gt; — set breakpoints, step through code, evaluate arbitrary expressions in the current scope, watch variables, set conditional breakpoints. Remote debugging attaches to a running JVM with a single click.&lt;/p&gt;
&lt;h2 id="plugins"&gt;Plugins
&lt;/h2&gt;&lt;p&gt;The plugin ecosystem extends IDEA significantly. Notable ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IdeaVim&lt;/strong&gt; — vim key bindings throughout the editor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; — YAML editing with schema validation and cluster connectivity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database tools&lt;/strong&gt; (Ultimate) — query databases from within the IDE&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="remote-development"&gt;Remote development
&lt;/h2&gt;&lt;p&gt;IDEA supports JetBrains Gateway for remote development — the IDE UI runs locally but the indexing and execution happen on a remote machine or container. Useful for developing against large codebases on powerful remote hardware.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jetbrains.com/help/idea/" target="_blank" rel="noopener"
 &gt;IntelliJ IDEA documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jetbrains.com/help/idea/keyboard-shortcuts-and-mouse-reference.html" target="_blank" rel="noopener"
 &gt;JetBrains IDE key bindings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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>