I am having a very difficult time because my colleague seems to exhibitPremature/Unnecessary optimization effortsPremature deduplication with questionable abstractionsFor example, we use a modified VIPER architecture. He introduced a base class for the Router component (using generics) as part of implementing the first viper stack without actually knowing what exactly will be duplicated in other routers. Now we are stuck with having to provide a type UseCase that holds use cases, but most of routers do not have multiple use cases, only one.Inventing general purpose solutions for speculative potential future featuresFor example, he wrote a manager for populating static cell table views when we only had two screens like this in the app and he was not aware the design will move away from boring vertical forms to more custom UIs so the manager is useless.Opting for incidental complexityHow do I fight this when he also exhibits having a language barrier with lousy English? 
How to prevent a colleague introducing extreme complexity and abstraction?
architecture