The Evolution of Software Engineering: From Monoliths to Micro-Frontends