I highly recommend the book “Domain-Driven Development: Fighting Complexity at the Heart of Software,” by Eric Evans. This is a great book that talks about how to communicate with your customers so that you are better able to model your needs.
The book is based on the concept of Ubiquitous Language ... a language that you, as a software architect, create in conversations with your customers using a tool called modeling.
As an architect, there is a fundamental rule that you must accept, as it will greatly help you to convey business value to your customers for your purposes: the client’s task is not quite that, and it’s neatly packed in a beautiful box that you can simply unfold and to build. As an average person between the client and the developer, it is important for you to understand that your job is to extract requirements from your customers.
Why am I saying this? The role of your customers is business, not software development. They are worried about making money so that they can pay their employees, their advertisers, their other bills ... and maybe make some profit in the process. They don't care about the details of how the software ... the tools they use to do the job ... work. They just make sure that the tool does what they need.
If you learn that as an architect, one of your roles is the requirements extractor, you will become more successful. With such success, your customers should be happier, which should lead to the fact that you will be happier and more satisfied with your work and the software that you and your developers create. His difficult task is a completely different approach. It requires a greater presence of mind and foresight, which gives you an idea of ​​the needs of your customers ... letting you know what they need before they do it. If you develop and use the ubiquitous language as your project continues, each meeting with your customers will improve as you both learn how to communicate in common terms that have clearly defined meanings.
Given all this, here are a few examples that could help you improve your requirements earlier:
Cust: So we need an input screen
into which we can enter
product orders.
Arch: Well, that’s doable. Can you give me more details about this
order entry screen ?
Cust: Hm, ok ... I'm not sure ...
Arch: If possible, here are some thoughts I have about business rules:
Arch: Are there any restrictions on what can be ordered?
Cust: Oh! Yes, we do not want our customers to order any Class A products , unless its Tuesday.
Arch: Great, this is helpful. Do you offer any combination of deals, so if a customer orders product X, can they get product Y at a discount?
Cust: Hmm, not really. We have promotions , if a client is included in a specific advertising code , they can conclude a deal with one or more products.
Arch: Okay, so there are class restrictions and promotions . Anything else that might affect the behavior of the order screen?
Cust: Hm, now that you mention it ...
This is a common scenario when doing DDD. (Note that this is also very flexible because DDD and Agile work hand in hand.) In the dialog above, I highlighted in bold and italicized terms that should be part of you and your Ubiquitous Language client. The items in bold are the conditions that your client uses to describe some things about their business. These terms become part of your "software domain", which is the programming model of your customer business (at least the parts that you write software to). I use italics in terms that architects and developers use, such as business rules. If you read Evan's book, he explains in more detail how to develop the ubiquitous language and how to use special visual modeling to develop his software using terms from this ubiquitous language.
Hope this helps. And hopefully, DDD: Complexity at the Heart of Software will help even more. The ultimate goal, once you have the proper connection with your client, there will be (or very few) misunderstandings.