Pavel Kleisner

Senior backend engineer · team lead · level 9

Pavel Kleisner

I build and look after the backend systems real businesses run on, and I stay around for what happens after the deploy.

Class
Backend engineer
Level
9 years in production
Home base
Near Prague, remote
Party status
Open to contracts

Quest log

Main quest

TSM / CETIN

2020 – now

Senior backend and integration engineer, team lead

Kotlin and Java services on PostgreSQL for a telco operator's service platform: B2B flows, change management, partner integrations and incident analysis.

  • Lead the 2.2 production rollout
  • Lead the 2.4 production rollout
  • Core developer on version 1.5
Side quest

Nordic web

2024 – now, on demand

Focused changes in a Django codebase when they're needed.

Completed

MNCP

2018 – 2021

Full-stack Kotlin/Spring and Angular: authentication, exports, archives, measurement batches.

Completed

ZIS

2017 – 2018

Enterprise Java and ZK. Where I learned to deliver a feature end to end.

Abilities

Integrations
B2B APIs, message contracts, retries and the failure modes that only show up once a partner system is connected.
Releases
New platform versions into real environments: old data, backward compatibility, rollout order and a way back.
Debugging production
Logs, metrics, the database and domain knowledge together. I look for the cause, not for a patch that makes the symptom go quiet.
Architecture
Small safe changes, clearly named rules and sensible service boundaries. As little ceremony as the problem allows.

Companion AI in the party

  • I use AI agents every day and I've learned to get a lot out of them: exploring an unfamiliar codebase, drafting the boring parts, running tests, preparing migrations and reviewing a diff before I do.
  • It makes me noticeably faster and lets me take on work I wouldn't have had time for.
  • It doesn't take the controller. I read and understand every line that ships under my name, and when production breaks, the analysis and the fix are mine.

Boss fight The UUID that wasn't a UUID

When we rolled out the first platform version, the integration spec said the messageId would be a UUID. One partner started failing straight away: their system had been quietly parsing the ticket ID out of the old ticketId_timestamp format, even though the ticket ID sat right there in the message body.

The clean fix was on their side, but in a corporate setting it would have taken months. So I switched our side back to the old shape and production kept running. Sometimes the right call isn't the pure one. It's the one that doesn't break someone else at 2 a.m.

Skill tree

Main
Kotlin, Java, Spring, PostgreSQL, Kafka
Also unlocked
Kubernetes, Oracle, Angular, Python and Django, TypeScript, Astro

Current save

Playing
Bayonetta 3
Reading
Citadela — Alexej Osadčuk
Watching
One Piece

Looking for a party member?

Long-term or focused contracts on backend systems, integrations and production releases.

contact@pavelkleisner.dev