There are three approaches, and you will probably want to do some of each --
Designing Top Down (trying to think about the big picture, and what functions and classes you might need, and then what helper functions you might need, to break it into smaller pieces/steps, etc). This is where some pseudocode can help.
Implementing Bottom Up. Can you write one of the small helper functions, and test it? Does it doe what it is supposed to? Can you write another small helper function, and test it? Can you write a custom class with some instance variables, and test it by itself?
Incremental development. Start by writing a program that displays a blank/empty window. Then, add one feature/thing, to get it one step closer to your eventual project. Test it. Change one more thing, or add one more feature. Test it. After each small change, make sure to test.
IF you try to write all of the code for your project at once, before testing any of it, then your code will have so many syntax errors and bugs, that it will take forever to track them all down and fix them, and the bugs will interact with each other to make it hard to tell what's wrong, when you can't even run it to test it!
Thus, it is crucial to take smaller steps, and test smaller pieces at a time!