Speaker Notes

Is Your Team Ready for AI-Driven Modernization? | Birgitta Böckeler

Successful AI-driven legacy modernization requires a hybrid approach combining deterministic tools, dynamic MCP servers, and rigorous spec-driven validation to safely refactor old architectures.

AI Native Dev · 56:09 · YouTube ↗

Podcast · 1 host and 1 guest  Advanced · concepts and strategy

Highlights

6 clips · 9 min of 56 min
    • Avoid single-step translation from complex legacy code to modern code
    • Capture runtime behavior using database triggers or change data capture
    • Combine AI web browsing with audit log analysis to map application behavior
    • Use coding assistants combined with custom Model Context Protocol servers
    • Build lightweight MCP servers dynamically for task-specific data access
    • Use Playwright MCP servers for DOM-aware browser interaction during analysis
    • Create comprehensive functional specifications as the first phase of migration
    • Review generated descriptions with domain experts to uncover hidden dependencies
    • Enrich functional specs with modern compliance and UI requirements before code generation
    • LLMs can make browser tests more flexible by locating elements without rigid selectors.
    • End-to-end AI tests can theoretically compare old and new application parity.
    • Flakiness and non-determinism remain major hurdles for AI-driven browser testing.
    • Deterministic tools like OpenRewrite handle the heavy lifting for routine upgrades.
    • LLMs fill in the gaps where deterministic software patterns fall short.
    • Marketing claims about AI-only savings often mask the underlying use of code mod frameworks.
    • AI's extreme confidence can anchor developers and bypass critical thinking.
    • Developers often waste hours fixing broken AI code due to a sunk cost fallacy.
    • Reverting and trying again is often much faster than trying to patch flawed AI output.

Questions this video answers

6 · every answer cites the moment it was said
01 How should I approach AI-driven legacy code migration? 2 sources · 15:28

Instead of feeding legacy code to a large language model in one step, break the migration down into structured steps. First create a comprehensive description of the application via reverse engineering, then use that description for forward engineering.

02 How do agentic tools change day-to-day developer workflows? 2 sources · 9:09

Modern coding assistants now have autonomous access to multiple files and the terminal to execute tests and commands. This expands task sizes significantly, shifting developers into a managerial role where they oversee and guide these automated processes.

03 How can I perform forensics on legacy apps with missing source code? 2 sources · 20:13

You can combine existing coding assistants with custom Model Context Protocol servers and web scraping tools to monitor application behavior. For instance, putting triggers on database tables logs changes into audit tables that an AI agent can query dynamically.

04 How can we create safety nets when legacy applications lack test suites? 2 sources · 25:36

Since legacy systems rarely have end-to-end tests, teams must perform constant risk assessments and evaluate the probability of AI errors. You can also explore AI-driven browser testing frameworks for parity checks, though non-determinism remains a challenge.

05 Can large language models effectively help reason about decompiled assembly code? 2 sources · 30:35

Developers can feed verbose assembly code into an LLM in smaller pieces to generate readable pseudo code. This helps teams form hypotheses about functionality, though it requires manual preparation and validation.

06 How can LLMs be combined with deterministic code mod tools for upgrades? 2 sources · 34:03

Deterministic tools handle heavy lifting by executing precise code modifications, while LLMs can be paired with them to fill gaps where rigid recipes are insufficient. Combining software determinism with AI creativity allows teams to safely tackle framework upgrades.

Section-by-section summary

12 parts

Reverse engineering precedes forward engineering

Legacy migration requires breaking down the journey into manageable steps rather than a single direct rewrite. By first creating comprehensive descriptions of current application behavior, teams establish a solid foundation for forward engineering.

Generative AI dominates the technology radar

ThoughtWorks publishing cycles show massive shifts toward generative AI tools and techniques. While foundational techniques like RAG reach adoption maturity, specific tooling remains in the assessment phase.

Agentic tools shift developers into managers

Modern coding assistants with terminal access and multi-file editing have expanded task scopes significantly. Developers now act increasingly as managers overseeing asynchronous agentic workflows and parallelized processes.

Forensic data capture for legacy codebases

Migrating legacy systems often involves missing source code and outdated dependencies. Teams use forensic techniques like database audit logs and browser exploration to reconstruct application functionality.

Custom MCP servers enable flexible legacy analysis

Legacy architectures vary widely, requiring adaptable tooling rather than rigid platforms. Developers can build lightweight, disposable Model Context Protocol servers on the fly to query audit tables and inspect DOM structures.

Verifying AI specifications against legacy risks

AI-generated specifications allow teams to sanity-check behavior with domain experts before modernization. Mitigating risks involves combining these specs with rigorous rollout strategies and continuous behavior verification.

Overcoming the lack of tests in legacy systems

Legacy applications rarely come with reliable test suites, requiring teams to explore AI-assisted end-to-end browser testing. However, non-determinism adds flakiness, making traditional risk assessment and staggered rollouts essential for safe migrations.

Reasoning about decompiled assembly code with AI

Feeding assembly code and binaries to large language models helps teams translate complex logic into human-readable pseudocode. Running prompts multiple times ensures consistency and builds confidence when uncovering hidden mainframe dependencies.

Combining LLMs with deterministic code mods

Major technical upgrades succeed best when combining the creativity of LLMs with deterministic tools like OpenRewrite and abstract syntax trees. While marketing attributes massive savings purely to AI, the magic truly happens when deterministic automation handles the heavy lifting.

Evolving developer skills for AI workflows

As AI accelerates code generation, developers must shift from reviewing text diffs to evaluating decisions and test suites. Critical thinking and overcoming psychological biases, such as sunk cost fallacy with broken AI code, become essential daily skills.

Maintaining team control amidst accelerated delivery

AI indiscriminately amplifies existing engineering practices, meaning flaky pipelines and poor foundations lead to chaotic throughput. Delivery managers must ensure strong automation and safety nets to prevent losing control over fast-moving changes.

Preserving foundational debugging and safety skills

Experienced developers rely on deep mechanical sympathy and risk assessment to navigate complex legacy systems safely. While juniors may hit pain points faster with AI, fostering environments that teach critical thinking through mistakes remains vital.

0:00 / 56:09
k play/pause · f fullscreen · m mute
n next · p previous clip · t highlights/full
< > slower/faster · / search what was said
  • MCP servers3× · first 10:11

    Extension tools that give coding assistants access to external environments like databases and browsers.

  • Technology Radar2× · first 3:03

    A biannual snapshot publication by ThoughtWorks mapping the maturity and adoption of software tools and techniques.

  • OpenRewrite3× · first 34:03

    A code mod framework used for writing recipes to automate large-scale language and framework upgrades.

  • Abstract syntax tree2× · first 35:41

    A tree representation of source code structure used by tools to understand deterministic flows.