(Yes, I know this node is old. Oh well.)
I've found that one of the best ways to learn something is to talk to people who know it, or listen in on them. I wanted to get into Perl internals, so I subscribed to perl5-porters. At first I didn't really understand what people were talking about, but over time I picked up bits and pieces. Although I still haven't touched the code, I have a better idea than most of my peers how Perl works on the inside, and I feel confident that I could probably do some work on it.
Last week, I posted a message on perl6-internals suggesting an alternative way to store my() variables. (In Perl 5 they store them as an array of arrays, one nested array for each level of recursion; I thought that we should use a symbol table like we do with globals, local()ing things when we recurse.) Once people understood what I was really suggesting (some people had trouble decoupling the storage of globals from the semantics of globals) they came up with reasonable arguments against it. (Basically that it would take up more space, overuse the savestack (the data structure that holds the old values of local()ed variables), require more startup time if we were reading in bytecode from a file, and might be slower. The advantage was that we wouldn't have to write or debug as much code in the core and that certain lookups which must happen at runtime would be quicker.) When I pointed out an optimization they could do, they nodded in agreement (so to speak) and pointed out that it would still be bigger in memory; however, Dan Sugalski (the guy in charge of internals for Perl 6) conceded that there could be significant advantages to my approach and said that they might benchmark the two approaches and compare them.
I know that, had I not been keeping an eye on perl5-porters, I would have had no idea about any of that. I also know that, if someone else had posted that message, I wouldn't have understood it. But by paying attention to other programmers I learned a lot about a subject I cared about.
On a separate note, you mentioned about taking days to come up with the plans for things. That's not a problem at all! My father is a programmer (he learned on a PDP-11 at UCI). He's been doing this stuff for almost thirty years, and he still takes days just writing down how he thinks a new program should work. His programs are generally well thought out and fairly quick and understandable--even to me, someone who doesn't even know that language.
Some of the best coders take time to think up how to do something. Don't sweat it--if you really are good, you'll come up with the right technique eventually.
Update: Lo and behold, I've been made Perl 6's first Configure pumpking. See, listening works!