Not to dampen your enthusiasm, but most programmers and aspiring programmers have a host of "great ideas" for programs they would like to write. I have a decent sized list of new programs I want to write and features I want to add to ones I have already written. I can dream up reasonably detailed plans for complex programs, but implementing them takes much more time and effort. The reason I have a "to do" list is because I don't have enough free time to implement them all. It is definitely a good sign that you have ideas for awesome programs. The best way to understand a programming language is to choose a project, and start implementing it in your language of choice. Start small and work your way up. You will become capable of implementing ever more complex programs as you mature as a programmer. Similarly, new languages will become much easier to learn after you have a solid grasp on the first.
Incidentally, one of the best ways to learn good practice, gain practical experience, and receive mentoring is to join an established open-source project. Pick a project you are interested in, and ask how you can help. Project members are often willing to volunteer some of their time to help you understand how their project works, and help you work through issues you encounter as a programmer. Try to work through problems on your own first, and ask for help only when necessary. Not only will you learn more when you figure out something problematic on your own, but you will likely retain that knowledge longer. Working with an established code base also has the benefit of teaching you neat tricks you might not have thought of on your own.