The first step is to decide what you want your program to do. Make a detailed list of the functionality you wish your program to have. And once you've decided, avoid adding anything new halfway through implementation. If you design your code correctly, you should be able to add new features with relative ease afterwards.
Decide who is using your program, and how they'll interact with it. Is it a specific client you're designing it for? In that case you can afford to specialize the program design to your clients preferences. Are you designing it for a massive audience? In that case you'll want it to be more customizable, yet simplistic. You'll also want to put more thought into appearance. will the users be interacting with a server? If so you'll want to design your program to be scalable.
Decide on how you intend to design the program. Will your program be event driven? If so will you be using an event polling system, or will you have event handlers? If your program needs to be scalable, does your design allow for runtime improvements without massive downtime? will you be able to easily improve the runtime performance without massive rewrites? Think deeply about design choice because if you don't it can result in having to restart from scratch.
After all of that is out of the way, start thinking about how you will structure your code. This is an entire process all its own, so I won't go in depth, I'll just point out a few things to avoid.
1) Do not use interfaces/abstract classes if you do not need to. They are not magical features that should be used at every opportunity, contrary to what people say. They can lead to massive reimplementation problems, and poor design.
2) don't overuse inheritance either. For the same reason stated above.
3) don't over design your code. You don't need everything being as fast as possible if all you're doing is sorting a small container with 30 elements. You don't need to make everything as abstract as possible either. If the benefits can't be observed either through performance, or code readability/maintainability, it isn't worth the effort.
4) make sure to make your code modular when possible. It'll make adding or removing features in the future much easier.
That's some basic tips I can offer you.