The issue with the way software patents are enforced currently is that, unlike a physical invention, you can't come up with a completely different approach to implement the idea and not violate it. In the physical domain, clean room reverse engineering is allowed, but software patents have been allowed to be so ambiguous your implementation is probably covered.
I think software patents could be fine as long as they are specific to a SINGLE IMPLEMENTATION of an algorithm or idea. If your patent was implemented in C++, then the same algorithm implemented in Perl or even COBOL SHOULD NOT BE COVERED.
Under this concept, the way to invalidate patent claims is to simply show in court a different implementation. This would take out the teeth out of patents, remove lawsuits based on vague claims that might or might not be covered while still "promoting the arts" since now you can both license your invention and allow others to improve on it.