Would you mind explaining why Ruby makes this harder than other languages do?
The reason that I ask is because I've found the opposite; due to the massive number of easy to use testing frameworks, it's easier for me to end up writing tests and making sure my debt doesn't come back.
Because of open classes and code generation in general, it's very difficult to track down to the exact line of code where a feature is introduced, or changed. Add to this that code tends to be decorated in a very non-traditional way; it is typically just re-opened and modified to fit the developer. Add to this the fact that you may have many gems installed, and each of them may do this re-opening, and it becomes a refactoring nightmare, because you really don't know at any given time where all of your behavior is coming from.
In one specific example, we had a bug in moving an app to 2.3 in which three different gems contributed. It was very tough to nail down.
Aside from all that, pop open your favorite editor or IDE, find a method you're interested in learning more about (let's say, for refactoring), and try to use that tool's built-in functionality to "Go to" the declaration. 6 out of 10 times I bet it fails to get you there. I have tried with RubyMine, NetBeans, Aptana, and Vim, and each of them fail to find anything more complex than simple method declarations. Ruby is just a hard language to navigate.
> Because of open classes and code generation in general,
Gotcha. Makes lots of sense. I've just not been bitten by this yet, I guess.
> use that tool's built-in functionality to "Go to" the declaration.
Ah, I'd never run into this too, because I default to just going to a browser and going to the online docs. But if you're used to another workflow, I can see how that'd be a pain.
The reason that I ask is because I've found the opposite; due to the massive number of easy to use testing frameworks, it's easier for me to end up writing tests and making sure my debt doesn't come back.