Due to circumstances beyond my control I have been home since January and since that time I have been writing a lot of Perl and really digging deeper into Unix and the whole LAMP thing.
Lately I have been tearing down sheetrock and spackling because we're selling our house (because we want to) and I have gotten to thinking about the two not so dissimilar processes.
I frustrate easily with Perl because I am under the odd idea that I should get it right the first time. I basically write this sort of boring, obvious, cautious code in the hopes that in doing so I will have perfect code on the first shot.
While spackling my walls I realized quickly that:

There's more than one way to do it
You cannot possibly do it all on the first shot
It will never be perfect, but that's OK because that's what paint is for!

Some Analogies

Hanging sheet rock == use warnings; use strict;
Taping == choices like to sub or not to sub. The choises you make here will absolutely have an impact on what happens next
Debugging == Sponging or Sanding:
Sponging is cleaner and can let you "fix" things but requires more elbow grease and you have to wait to see the finished product.

Sanding is messy but really fast. You can use certain tools to make it cleaner but in the end there will be a mess to clean up but you'll be ready to paint WAY faster.

So what I take away from spackling is a more layered approach to coding. making sure that my foundation (or first run) is good enough so that I don't have to break out the sander just to get it good enough for the second coat. That good debugging makes good code. Finally, that making something flawless isn't the most important thing, making something work is (or having straight walls with no weird bumps or waves on it).
There's more than one way to do it, but only some of them actually work.