A compelling argument regarding interface engineering: solving interface problems that have largely already been solved leads to underdeveloped solutions, because we tying to improve on decades of UX development in the space of few underfunded agile sprints.
To pick a specific example: the problem with an over-engineered form is that the amount of code required to replace no engineering (i.e. native form controls with basic styling) is enormous and almost always only partially successful (i.e. under-engineered).
They are under-engineered because they are over-engineered — tried to replace native controls.
That said, I don’t think it’s true that the UX pattern implementations we developers know and love are well-matched for the ever-evolving device landscape.