Xah Lee has an excellent post on learning how to program in Emacs Lisp1. His idea is to start with your favorite programming mode, disable it, and program your own. Begin with just doing syntax coloring and then slowly add features as you need them. Over the course of, say, a year you will build a robust mode for your language and learn a ton of Elisp.
I find that the best general method for learning a piece of technology is to use it to solve a problem. If you have some editing problem that needs solving, then try to do it with Elisp (Lee’s Elisp Tutorial can be a huge help here). If you don’t have some problem you need to solve but just want to learn Elisp so that you can make better use of Emacs then Lee’s suggestion of implementing a major mode for your favorite programming language is a good one. It may take some time but you don’t have any problem—urgent or otherwise—to solve so time shouldn’t be an issue. Either way, you’ll end up learning a lot of Elisp and be able to use it to make more effective use of Emacs.
Update: Lee notes in the comments that he has made this post into a separate page that you can find here.