The way I see it, in Emacs it's less an "extension" and more of "I have this problem, how do I solve it now using elisp?".
So basically, your develop the solution bottom up. You can pretty much write an elisp function anywhere in emacs (in the very file you are editing, in the already open scratch buffer, in an elisp popup shell) and test the function incrementally. Also, the extensive in-built help system lets you very quickly lookup functions that you need.
Once you have something that solves your current problem, you can save it, if you want. Over time your custom collection of functions improves and then you decide if something there needs to be generalized or made into a package.
Obviously this needs some basic elisp knowledge and then just practice over time.