DynaMine finds usage patterns that describe how methods should be called, for instance a call to addWidget() should be followed by removeWidget(); besides simple pairs, the approach also discovers state machines. Potential patterns are then validated dynamically and violations of patterns are reported to the user.
HAM identifies and ranks cross-cutting concerns by applying concept analysis on additions of method calls. Since such concerns do not align with the given modularization of a program, they end up scattered across many code locations and cause serious maintenance challenges.
Both approaches have been evaluated with the history of open-source projects and scale up to industrial-sized projects like ECLIPSE.