I am having a very difficult time because my colleague seems to exhibit

1. Premature/Unnecessary optimization efforts
2. Premature deduplication with questionable abstractions  
  For 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.
3. Inventing general purpose solutions for speculative potential future features  
  For 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.
4. Opting for incidental complexity

How do I fight this when he also exhibits having a language barrier with lousy English?