Good Software Design
For any programming problem, there will be many potential code designs. Your job is to find one. The best one. Or at least a sufficiently good one. It's not an easy task. . . .
How do you know that your design will work? After completing a bulletproof plan of attack, you confidently begin implementing it. Later, an unexpected problem will show its ugly head. Back to the drawing board.
How do you know when your design is finished? You can't know until you've actually implemented it and found that it works. Many issues can't be fore-guessed; you have to step out, implement the design, and see whether or not it's complete. It's only by attempting a solution that you even begin to understand the original problem. Armed with this ...