Some of my approach:
-- I strive primarily to form a clear and simple mental model of the system that the software will represent.
-- Simplicity is everything in software design and should be priority one. Conversely, you must actively avoid complexity, and when part of a system is starting to feel complex, take a step back and rethink the approach. Sometimes systems must include complexity, try to contain this all into a tightly constrained area of the system.
-- Loose coupling of system components is next most important - priority two - when designing large interconnected systems - you'll succeed in designing something big if you can instead make a number of smaller systems that know as little as possible(ideally nothing) about the other parts of the system.
-- Software is like painting - you can't plan every brush stroke in advance - instead you get the broad brush strokes in place and then paint ever finer levels of detail.
-- I strive for consistency, but not slavishly. Try to use the same approaches/technologies everywhere if possible. When not possible, choose the most suitable technology/approach and use that.
-- I'm extremely hesitant to allow special cases or exceptions, but I will happily do so when it is clearly necessary.
-- I grant myself time to think about possible solutions even when there is pressure (typically from myself) to be actually implementing/coding a solution.
-- I do my best to "design out" or get rid of software - the fastest, easiest to write and most reliable code is no code.
-- I try to lean heavily on the capabilities of existing systems like database and web servers. If you really understand what existing systems are capable of at a deep level then often you can avoid reinventing the wheel and hook in to what those existing systems do.
-- I'm not a fan of complex systems such as containers and kubernetes. I have been able to build all my software architectures without them.
-- The project build should primarily aim to put together a working ended to end system that does the absolute minimum to enable the integrated whole to work - i.e. you need to build just enough of each thing to put a pig in one end and get sausages out of the other..... without much attention to anything like user interface or error handling or really much of anything else at all. This is because it is much easier to complete a system that is working, even if only minimally.
-- I'm happy to throw away previous decisions and system components if they have proven to be wrong.
About 1,000 other things I don't have time to think out right now.