It is difficult to "engineer" good abstractions up front at an isolated desk. Generally, one has to test, learn, and change to get good abstractions. Rarely is a good abstractor the most knowledgeable about a domain. It takes a combination of domain knowledge, experience/skill in abstraction, and time-testing. Stakeholders must be willing to experiment, and this includes the costs of failures on the road. (Note that this is talking about making good abstractions, not merely a successful project. Abstraction allows the next level of automation beyond merely having a working product.)