Because software is so intangible it tends to take on a mysterious air. Uh oh! nothing to see. Scary. Must be difficult. Only a very knowledgeable person should have anything to do with it. Software developers are not like the rest of us.
Don’t let anyone fool you. From a design perspective, software is just a machine. Maybe a complex machine. But, at its elemental level it accomplished a task that adresses a problem.
It has inputs and outputs. And all of its fellow code machines (modules) have to work together to solve the larger problem: Why the heck are we spending money developing this product in the first place. What do we need it to do. Sounds like a list to me!
The easiest way to design software is start with the end in mind…Steven Covey…thank you. What does the machine need to do. Come up with a list. Then keep breaking it down until you are at the level where you can see the whole process from start to finish with no surprises.
The way I do this is to create a series of horizontal boxes across a white board and label them with the high level problems you need to solve. If you don’t know where to start, for machines start with any of all of these: Process Mode, Eternal Interface, Data Management, Logging, Error Handling, UI, Instrument Control, Maintenance. From there create individual requirements trees to support how you are going to accomplish those tasks.
The goal is to get to the level of granularity that you feel you can, with your experience and creativity, make that requirement happen. And if you have several requirement block delineated enough so that they can be sent to the design level, you can now parse out each one of those blocks to the Systems Engineers and software designers to complete the functional specifications.