Some important tips:
-Definitely learn code by sound. Don't learn it by writing down dots and dashes - this will build in a translation step in your head and you'll never get fast that way. I made this mistake when I was starting out and got stuck at 5 WPM.
-Learn at high speed. Train your brain to recognize characters sent at 20 or 25 WPM, spaced out (Farnsworth). This way you don't have to retrain at every speed increase.
-I relearned code and went from 0 to 13 and eventually 20 WPM with a special training tape I made. Using an audio mixer, I sent random characters from a CPO, and after each character, using a microphone I spoke the letter onto the tape. So I would hear 'dit dah A; dah dididit B' etc. I listened to this tape 24 hours/day for 3 days (yes, even while asleep). After the 3 days I could copy the code fine. I would hear the 'ditdah' from a test, and then hear 'A' in my head. It was a programmed response.
-Tony, K1KP