First understand the problem, its environment, and any constraints.
Second, determine what a system has to do to solve the problem in the environment and within the constraints.
Third, design a system to do what is needed in the environment and within the constraints.
Now that sounds like a waterfall, but it doesn't have to be. Nobody says you have to solve the entire problem at once - but if you don't, don't forget to allow for the parts of the problem you have decided to defer else you will be hit with technical debt.