Java
Production Java for enterprise APIs, batch processing, and backend services.
Java is my JVM language of choice for enterprise work. I have used Java 11/17 in production for REST APIs, scheduled batch processing, integration services, and migration tooling — primarily inside the Spring Boot ecosystem but also in plain-Java jobs and CLI utilities.
How I work with Java
I learned Java during my engineering coursework and started using it professionally at GTCSYS for backend services on the Spring Boot stack. I quickly grew comfortable with the modern language — streams, optional, var, records — and the operational realities of running JVM workloads.
Beyond Spring Boot, I have written standalone Java for migration scripts, ETL between PostgreSQL and MongoDB, and small CLI utilities. I treat Java as a serious production language: I write tests with JUnit, profile with VisualVM, and care about GC characteristics when it matters.
I am most productive in Java 17 with Spring Boot, Maven, and Lombok, but I have read and maintained older codebases (Java 8) and migrated them forward.
Java across business domains
Wrote the core API layer in Java + Spring Boot, including search, listing CRUD, and lead-management endpoints.
Implemented audit, reporting, and scheduled-task logic in Java, with batch jobs running nightly to compile compliance reports.
Delivered Java-based integration services that bridged legacy industrial systems with the modern web platform.
Real issues I resolved using Java
Rewrote a slow stream pipeline to cut report generation by 70%
A nightly compliance report job was taking 90+ minutes because of a chain of `Stream.collect` operations that materialized intermediate lists in memory.
Refactored to lazy operations (peek, reduce, downstream collectors) and pushed grouping into PostgreSQL with a single aggregating query, returning a thinner result set to Java for formatting.
Report job runtime dropped to ~25 minutes, JVM heap usage during the run halved, and the on-call rotation stopped getting paged for OOM kills.
Replaced reflection-heavy mapping with explicit converters
A service was using a reflection-based bean mapper between entities and DTOs, which was slow and silently dropping fields on rename.
Generated explicit MapStruct mappers checked at compile time, so mapping mistakes became build errors instead of runtime bugs.
Eliminated a class of silent data-loss bugs, improved mapping throughput measurably on hot paths, and made refactors safe.
Hardened a third-party integration with retries and timeouts
An external Java integration was occasionally hanging because it relied on default HTTP client timeouts (effectively infinite) and had no retry policy.
Switched to a properly-configured RestTemplate with connect/read timeouts and added a retry policy via Spring Retry with exponential backoff on transient errors.
Background workers stopped getting wedged, downstream alerts cleared, and transient blips became invisible to users.
Often used together
Have a Java project in mind?
I am open to full-time and contract work where Javais core to the stack. Let's talk about what you are building.