Before you develop a detailed design of a system, define the goals clearly. Begin by making a list of requirements. Some requirements are specific, such as the types of I/O, sampling rates, or the need for real-time analysis. Do some research at this early stage to be sure you can meet the specifications. Other requirements depend on user preferences, such as file formats or graph styles.
Try to distinguish between absolute requirements and desires. While you can try to satisfy all requests, it is best to have an idea about which features you can sacrifice if you run out of time.
Be careful that the requirements are not so detailed that they constrain the design. For example, when you design an I/O system, the customer probably has certain sampling rate and precision requirements. However, cost is also a constraint. Include all these issues in the requirements. If you can avoid specifying the hardware, you can adjust the design after you begin prototyping and benchmarking various components. As long as the costs are within the specified budget and the timing and precision issues are met, the customer might not care whether the system uses a particular type of plug-in card or other hardware.
Another example of overly constraining a design is to be too specific about the format for display used in various screens with which the customer interacts. A picture of a display can be helpful in explaining requirements, but be clear about whether the picture is a requirement or a guideline. Some designers go through significant difficulties trying to produce a system that behaves in a specific way because a certain behavior was a requirement. In this case, there probably is a simpler solution that produces the same results at a lower cost in a shorter time period.