Last year, I had the opportunity to lead the migration of a legacy Angular application to React 19 + Vite. Like most migrations, the biggest challenge wasn't writing new code — it was understanding years of existing business logic without breaking customer workflows.
Instead of treating AI as a code generator, we used it as an engineering partner. It helped us understand unfamiliar code, compare Angular and React patterns, generate initial implementations, and even create test cases. Every change was still reviewed and validated by engineers, but the time spent understanding and translating code reduced significantly.
The result was a migration completed in about one-third of the estimated timeline, along with a much smaller bundle size and noticeably faster application performance.
For me, the biggest takeaway was that AI doesn't replace engineering judgment — it amplifies it. When combined with a solid architecture and good review practices, it becomes a powerful productivity tool.
Micro Frontends sound great on paper — independent deployments, team autonomy, and modular applications. But in enterprise products, they're only valuable if they reduce complexity instead of creating it.
One thing that worked well for us was keeping shared responsibilities centralized while allowing individual teams to own their business modules. Clear ownership, consistent design patterns, and reusable shared libraries prevented the application from feeling like multiple disconnected products.
The biggest lesson wasn't about the technology itself. It was about defining boundaries carefully. Good architecture isn't about splitting everything into smaller pieces — it's about deciding what should stay together.
Micro Frontends solved organizational challenges as much as technical ones.
Testing used to feel like something we planned to do later. As the application grew, that approach became harder to sustain.
We introduced a layered testing strategy:
- Vitest for fast unit tests
- React Testing Library for component behavior
- Playwright for end-to-end user journeys
Each tool had a different purpose. We didn't try to test everything with a single framework.
The biggest improvement wasn't just better coverage — it was confidence. Engineers could refactor features, release faster, and catch regressions before they reached production.
The lesson was simple: a practical testing strategy isn't about maximizing the number of tests. It's about choosing the right type of test for the right problem.