
Many Java applications need technical renewal while operations and feature delivery continue. Major version upgrades, outdated components, and limited test coverage increase the risk of unintended changes.
I modernize these systems incrementally, from technical assessment through implementation. Relevant workflows and results are captured before changes begin and checked after each migration step. This helps identify regressions early and narrow down their causes.
Depending on the objective, modernization can evolve the existing system or introduce broader architectural changes, including service extraction or cloud migration. The technical approach depends on business requirements, operational constraints, and the intended target architecture.
Depending on the engagement, deliverables can include a technical assessment and staged plan, baseline tests and verification criteria, the migration changes, documented comparison results, and recommendations for further work.
Comparison criteria are defined before the migration and aligned with the application’s critical workflows. For persistence changes, the generated SQL is also examined for correct filters and joins, unexpected N+1 queries, query counts, and suspicious execution plans. Performance and database comparisons use repeatable data and a suitable test environment.
More than 20 years of experience with Java systems, databases, interfaces, and production-critical applications provide the technical foundation.
I use AI regularly in day-to-day engineering—to explore existing codebases, prepare test scenarios and scaffolding, support implementation and refactoring, and assist with documentation and reviews. In client projects, it is used exclusively within approved tools and policies.
I use OpenRewrite for repeatable, rules-based source-code changes. The resulting changes remain reviewable and are assessed using the same engineering standards as manually written code.
Modernization also includes replacing unmaintained libraries, addressing known vulnerabilities through suitable upgrades, and continuously checking code quality with static analysis.
System assessment, risk analysis, test baselines, migration, and comparison of results follow a repeatable structure adapted to the technology, codebase, and project scope. It draws on my experience with Java systems, persistence migrations, and evolving existing applications.
This approach is gradually being extended with reusable checklists, automation, prompts, and small utilities.
Defined modernization engagement: Depending on scope, I take responsibility for the complete modernization of an application or a clearly bounded part of it. This includes planning, technical implementation, coordination, and agreed handover.
Working within an existing team: Hands-on support for Java/Kotlin backend engineering and modernization, including long-term engagements within established delivery processes.
Assessment or independent verification: A technical assessment with risks and a staged plan can provide a starting point. A migration already in progress or completed can also be reviewed separately.
You work directly with me, in German or English. Remote-first across Germany and Europe with CET overlap; on-site kick-offs and workshops when useful.
Yes. Your approved tools and data-handling policies determine the setup. Options include internally hosted models, approved external services, or delivery without AI. Client code is not sent to external services without agreement.
The first step is to protect the most important workflows with a small number of trusted characterization and integration tests. AI can assist in identifying further scenarios and creating test scaffolding; the tests still need to be reviewed for functional validity.
No. Manageable changes within the existing system are usually the better approach. Larger restructuring or service extraction should solve a specific technical or business problem.
Which application needs modernization, which upgrades are approaching, and which workflows must remain stable? A short description is enough to start the conversation.