I approach designing software in a divide and conquer method. I seperate my workload into smaller related groups then i work on getting every part of it to work independently of other groups. This does not need to be perfect, as a perfect piece of software will never see the light of day.
For my project I decided to modularize all my code, seperated everything into classes, used inheritance and polymorphism.
The tactics that I used are very popular for good reason. They work.
Same way I design. Divide and conquer, with an added step, test everything.
Computer Science is my passion, and it was dying for a while. Computer Graphics rekindled my passion. It is a very interesting and fun topic because it requires a lot of brainstorming and thinking. It needs to be done efficiently otherwise you will not be able to make a decent graphics engine.