I've spent the last 15 months working on a project that was particularly complex. One of the techniques I used in recent times to try to understand and manage that complexity was to use yFiles to draw dagrams that visually represent the system.
The first diagram I created was one that described the dependencies between modules in our system. We've been using Ivy to manage our module dependencies, so I wrote a script to parse the Ivy files and generate a graphml file that Ivy knows how to parse. Here's the result:
This diagram shows over 100 inter-dependant components that developers work with every day. The Ant build file controls every one of them in a single build. Its definitely complex. I won't go into why it should or shouldn't be this way right now. The important things to nore is that it is that way, and its extremely hard to understand the impacts of a change to any single component. Visualizing the dependencies just helps a bit.
The second diagram I created was one that I drew by hand. It shows all of the runtime components in the system and how they depend on each other whilst they are running. This diagram shows about 30 portlets, 60 EJBs, 15 JMS queues and a few 3rd party legacy systems.
This again was something that was very hard for most of the development team to visualise in their heads without some help. The nice thing about drawing it in yFiles is that it will lay out the diagram so that all of the components are clearly visible.
Update: I was contacted by someone from yWorks to ask if they could use these graphsas examples on their site. I've created some sanitised versions of the graphs for them. So you can download dependencies.graphml or architecture.graphml if you want to see more detail.