I am confused with what's the different between clarify and gather. I know using interview, observe or questionnaire can to elicit the requirement we want, but how to clarify the functional requirement?
Gathering requirements means just that: collecting them.
Clarifying requirements means making sure that those requirements are clear and unambiguous. You need clear and unambiguous requirements so that there is no dispute with the customer over whether or not something that was asked for has been provided.
One way to clarify requirements is to write acceptance tests. Acceptance tests are tests that, if they pass, indicate that the requirement has been fulfilled.
// Acceptance Test
public void GetRandomNumber_ShouldReturn4()
var result = GetRandomNumber();
public int GetRandomNumber()
return 4; // Chosen by fair dice roll. Guaranteed to be random.
If you're having difficulty with things like scope creep, inaccurate time estimates and disputes over completion of requirements, one way to refine those things is to write a Software Design Specification, including the classes and interfaces it would take to fulfill the requirements. This can be combined with the Ubiquitous Language of DDD to get a clear understanding of the scope of a project (from both the developers' and customer's perspective), and what it takes to declare success on each requirement.