Legacy code is almost never the actual problem. The problem is that nobody knows what it currently does. I work backwards from the running system: characterize behavior with tests, then change it deliberately, in small steps you can roll back.
Refactoring and modernizing older codebases. Framework upgrades, careful test-driven changes, and migrations from end-of-life platforms.
Legacy code is rarely the original problem. The work is in understanding what behavior the current system actually has, then changing it without breaking the parts no one documented.
Characterization tests, contract tests, gradual TypeScript adoption, monorepo migrations, dependency upgrades, Delphi and Pascal modernization.
Yes. Modernization paths range from incremental refactoring within Delphi to full migrations to a modern web stack. The right path depends on how much business logic lives in the UI layer.
Yes. Changes go in small, reversible steps with characterization tests added first, so the running system keeps its current behavior while pieces are replaced behind it.
That's the common case. The first phase usually adds enough characterization tests around the parts we're about to change to make further work safe. Full test coverage is rarely the goal; safe-to-change is.
Tell me what you're trying to do. I'll let you know honestly whether I'm a good fit.
Get in touch