Java Developer

Anyone can pass the interview.
Fewer can read the GC log.

Java earns its keep on the day the traffic triples. We hire and place engineers who have been on that bridge — Spring Boot, Kafka, Kubernetes, and the runtime underneath all three. Full-time in your team, on our payroll.

$30–54
hourly band
7–12 days
to first standup
1 month
minimum term
4+ hrs
time-zone overlap
Incident report · redacted

Forty-six minutes, one bounded cache

A real incident from a client engagement, with the names removed. We publish it because it is a better description of what a senior Java engineer does than any list of frameworks could be.

Detected
16:02
Resolved
16:48
Root cause
Unbounded cache
Deploys involved
None
16:02Checkout p99 crosses 2 s. No deploy in the last six hours.
16:04Thread pool for the payments client is saturated. Queue depth climbing.
16:07First user-visible timeouts. Support sees them before the dashboard does.
16:11GC logs show 900 ms pauses, every 40 seconds, on the old generation.
16:19Heap dump taken from one instance and pulled off the box.
16:26Cause found: an unbounded in-memory cache of promotion rules, keyed by cart id.
16:31Cache capped and given a TTL. Rolling restart begins.
16:48p99 back under 400 ms. Incident closed; the interesting work starts.

What actually mattered: the three changes afterwards

Every cache gets a bound

A code-review rule and a static check. An unbounded Map used as a cache is now a build failure, not a discussion.

GC pause is a first-class metric

Exposed, dashboarded and alerted on — because the pause was visible in the logs for eleven days before anyone looked.

Support noticed before monitoring did

That is a monitoring defect. Client-side error rate now alerts alongside the server-side one.

Day to day

What they do when nothing is on fire

Which is most of the time, and is the part that determines whether there is a fire next quarter.

Spring Boot services

REST and gRPC, with validation at the boundary, problem-detail error responses, and configuration that differs by environment rather than by branch.

Data access that scales

JPA where it fits and plain SQL where it does not, with the N+1 caught in a test rather than in production.

Messaging

Kafka and RabbitMQ, with idempotent consumers, a dead-letter strategy and a documented replay procedure.

JVM tuning that is evidence-based

Heap sizing, GC selection and thread pool limits set from a load test, not from a blog post.

Modernisation

Java 8 to 21, monolith to modules, and the migration of an EJB or Struts application that still runs your business.

Kubernetes reality

Resource requests that match the JVM's actual footprint, readiness probes that mean something, and graceful shutdown.

Seniority

Buy the runtime knowledge, not the framework

Spring Boot can be learned in a month. Knowing why the p99 moved without a deploy takes years, and it is the only reason to pay a senior rate.

Mid-level

3–5 yrs$30–36/hr

Ships features in a Spring Boot service with review. Solid on the framework, still learning the runtime.

Senior

5–8 yrs$36–46/hr

Owns a service and its SLOs. Reads a heap dump and a GC log without needing to be talked through it.

Lead / Architect

8+ yrs$46–64/hr

Sets service boundaries and the data model, runs the migration, and is trusted on the incident bridge.

Tell us what the service carries

Throughput, latency target, what happens when it is down. We will send engineers who have carried that weight before.