Crazy Bob coined a term that I really like and that summarizes very neatly the pros and cons of using dynamically typed languages:

Brian, Java in general has a much higher learning curve than Ruby, especially when you consider generics and learning to get the most out of your tools. Java’s type system pays off in long term maintainability and usability. You can take a shortcut and skip this step with Ruby, and you’ll hit the ground running a little faster, but you’ll also pay a continuous tax.

This “continuous tax” is defined by the fact that when you need to maintain or use an API that was written in a language such as Ruby or Python, you have very little information available to you, and even if you eventually figure it out by looking at the sources of the tests (does anyone ever do that?), this knowledge you gain is ephemereal, and you will have to go through that same exercise if you need to modify this same portion of code a year later.

Another facet of the continuous tax is that by choosing a language that’s dynamically typed, you forego a set of tools (IDE’s) and practices (automatic refactorings) that have proven immensely beneficial to software maintenance and evolution. And beware anyone who tells you that not being able to use an IDE is a good thing, because you are most likely talking to a language zealot who will not carefully consider all alternatives before giving you their opinion.

Interestingly, Ruby and Ruby on Rails bigots seem to be quite oblivious to the art of maintaining software, probably because most of them are consultants and because software that’s hard to maintain means charging more consulting fees. Or maybe they just don’t need to see beyond a few months in the future of the code base they help develop.

At any rate, the term “continuous tax” to describe dynamically typed languages is dead-on accurate because it captures very precisely the trade-off you are making when you choose to use a language that is not statically typed.