in reply to
How do I become a good programmer?
Is it possible to be a good programmer without being able to instantly devise the most efficient algorithms on the spot?
The nice thing about software is that, unlike traditional hardware, you can correct a mistake in seconds. (The same goes for interpreted versus compiled languages.)
When you're facing a problem, break it into tasks. Tackle the most important one first. Then do the second. As you're putting them together, look for how you can improve things. Get rid of duplicate code. Move things into functions. Share what you can. Slough off the rough edges that stick out.
Cultivate those habits, get some practical experience of how you can improve things, and continue to read up on your theory. That's a great way to improve.