java developer jobs
Findev has 6 open java positions at the moment
java engineering at findev
Java development at Findev is not generic Java development. It has its own specifics, and that shapes the way we hire. Below, we explain what we think matters in our work.
Very often candidates ask us: “Why do you care about multithreading knowledge? Do you really use it?” Yes, in most modern Java stacks, developers rarely create a thread or deal with thread pools directly. Frameworks manage the lifecycle; reactive pipelines handle async chains; connection pools handle concurrency. The application code looks sequential. But in reality it's not.
The microservices model makes this worse, not better. Splitting logic across services removes shared mutable state. That eliminates one class of concurrency problem and introduces distributed race conditions and deadlocks that are far harder to detect. A deadlock inside a single JVM produces a thread dump with a visible cycle. A distributed deadlock shows up as a timeout, a latency spike, or a silent queue backup. There is nothing in the stack trace that says "deadlock." Understanding what the runtime is doing underneath (memory model, happens-before guarantees, thread scheduling) is not optional in asynchronous distributed systems. It is the difference between diagnosing the problem and rebooting the service and hoping it clears.
Engineers who don't know VM internals treat a lot of things as a mystery; engineers who do, can recognize patterns analytically and can solve burning prod incidents in time.
Every system we build is distributed. That means every message can be delivered more than once, and every consumer must be designed with that in mind. At-least-once delivery is the Kafka default; in most applications, that is an acceptable tradeoff. In an order management or reconciliation system, the difference between once and twice is an incorrect position or a duplicate trade. The Saga pattern is a part of our professional life. It does not eliminate the delivery problem; it makes the failure modes explicit. The decision about delivery guarantees and idempotency must be clarified at the very beginning and then tested each time the system evolves.
Extreme market events such as the Flash Crash (2010), the SNB's removal of the EUR/CHF peg (2015), Brexit (2016), and the COVID-19 (2020) market turmoil have repeatedly driven trading activity to record levels. While exchange-wide trading volumes typically increase by several times, downstream event-processing systems can experience one to two orders of magnitude (10x-100x) higher workloads due to fan-out effects and cascading recalculations.
While the triggering event may resemble what Taleb describes as a Black Swan, the engineering question is narrower: can the system absorb a 100x spike without falling over and return to normal operating cost afterward? Permanent over-provisioning is not the answer. Elastic capacity design is (partially), and it has to be built in from the start, not added when the system is already under pressure. But it's not the end of the story. Growing hardware performance gave us the luxury of not worrying about algorithmic efficiency. Who cares about O(N²) while N is small enough. But what if it’s not? That is where algorithms, data structures knowledge, and JVM internals come back into the picture.
"My app is on the cloud, I'm safe in case of most infra failures" - no, you are not.
"DevOps and infra team thought about resilience, that's not my business" - no, it is.
Cloud providers offer availability guarantees. Those guarantees describe how their platforms behave under certain conditions. They do not describe how your application will behave when only part of the system fails.
As developers, we are responsible for making sure our systems continue serving the business when something goes wrong: earthquakes, forest fires, blackouts, or a rogue bulldozer cutting through a cable. Redis, Kafka, database clusters, k8s: all the building blocks are there, but we still need to think through failure scenarios in advance.
RTO and RPO are defined before the first design decision, not discovered during the post-mortem. Whether the answer is synchronous cross-DC replication, active-active topology, or a 60-second automated failover depends entirely on those two numbers.
what findev builds in java
Java is still our main backend language in fintech, but Python and Node.js are also gaining ground.
And what do we build with Java? Primarily, systems around the trade lifecycle: Order Management Systems, Execution Management Systems, market data capture and distribution services, post-trade processing platforms, and so on.
Here are a few examples from our past work.
A local equities platform scaled from 10,000 to 100,000 orders per day across EU and APAC, with a 5x increase in system load, maintained as a single global platform.
How we built a HOT-HOT DR for a DMA environment: connectivity loss, single server failure, and full data center outage handled, with failover within one minute and zero data loss verified through automated drop-copy reconciliation.
Real-time balance calculation with automated end-of-day reconciliation across regions and time zones, replacing fragmented systems and manual processes.