A generalization of “seeing something on the screen” is getting feedback of what you have done. The sooner you get feedback, the better. The best method that I know for getting feedback of code, is writing tests using TDD. When you write new test code and production code in cycles of less than one minute, and running all the tests takes a couple of seconds, you get immediate feedback of whether your code works or not, which in turn makes programming more fun.
TDD also gives feedback of how well the code is organized and abstracted. With TDD you are changing the code all the time, and if changing the code or writing tests for some behaviour is hard, the design has a problem and needs to be improved. It helps in writing the “simplest thing that could possibly work” - just enough abstractions to keep the code flexible, but not too much to make it overly complex. Because TDD forces the code to be testable/decoupled, you end up doing more object-oriented design, which is also fun.
And because TDD gives you a regression test suite (TDD is a design technique, but regression tests are a nice side benefit), you can change the code without fear of breaking something. You can improve the design step by step, so if the architecture is not good, you can fearlessly make it better without breaking things - refactor and rewrite some parts until you have a better architecture. When the code is well decoupled, you don’t need to rewrite everything, even when doing big architectural changes.
I use UML very rarely. In the beginning of my programming career it was useful in putting my thoughts together, but nowadays I don’t need it for designing. I might use it for communicating my ideas to others. I can easily keep the design in my head and I know that the simple things will be solved on-the-fly when driving the design with TDD. For complex things, such as message passing in a distributed environment, I may draw some diagrams on paper. The design that I do without writing code (mostly in my head, sometimes on paper) is at the level of subcomponents (each maybe 1-20 classes in size). For class and method level design I don’t use any diagrams - those parts I can design better when writing tests and when refactoring.
One thing that I always design on paper, is user interface design - finding out what are the users’ goals, defining the functional requirements of the system and testing that the users can reach their goals with the system effectively. For a medium-sized project, that will take one or two weeks, as a result of which we have specified and tested, using a paper prototype, that what is the problem that needs to be solved, what kind of system will solve the problem and how exactly the system should work.