Like many of you, no doubt, I am a constant tinkerer with programs I'm working on. I'm nearly always refactoring and, in my head, I'm constantly refining designs as I go along. While I try to limit these tendencies so that I can actually get something done, I find the process of constant appraisal and revision to be useful. It deepens my understanding of what I'm doing and often turns up small changes in design that can streamline an operation or facilitate a downstream action.
Many times, I want to capture the design I have in mind without recourse to UML. While UML is a reasonably good format (and due to its universal adoption, the right one to use for many use cases), it's not an easy format to get right, once you move out of the core two or three diagrams known to most developers (class, sequence, use case, etc.) What I'm trying to capture is frequently none of those. I simply want a way to write down a series of actions, decisions, or implementation details that hang off some part of the existing software.
Text is an easy way to do this, and I've previously discussed the value of capturing coding-time decisions in a spreadsheet-like document. However, text quickly becomes problematic for anything but the most trivial of notes. Design artifacts should be easy to shuffle around, change, adapt, and otherwise modify. And so for that, I use a mind mapping tool. Mind maps are a weird name for a diagrammatic representation of loosely connected ideas. They are a central tool in brainstorming sessions. Mind map tools help capture ideas and then mush them around until you have the structure you want. While mind maps take many forms, the canonical representations look like a central idea with branches sticking out:
This is a preliminary mind map for HTML5 capabilities of a project I contribute to. It is read by going to the center point and starting with the top-most right branch ("At Startup"), then proceeding clockwise through all the branches (to "Verification"). Actually, this is the uncluttered, so-called "collapsed" version of the map. When given its full expansion, the mind map looks like this:
As you can see, lots more notes have been filled in off the various branches. I've also added icons on items where decisions still need to be made. By the time I'm done laying out the HTML 5 support in this project, the map will be even bushier. Because I can selectively open and close branches, I can focus on just what I need to. Later, if I want to move items from one branch to another, add images, icons, and the rest, I am able to tweak and modify to my heart's content until I'm satisfied I've captured what I need.
This might not look like a design diagram, but in fact, by the time I'm done, it will contain a huge amount of design data. Beyond its ability to let me initially capture fragments of ideas and then slowly build them out, the mind map has one other salient benefit: I can send it to anyone, including users, and they can read and understand it. Try doing that with a UML diagram!
When the design is more or less to my satisfaction, I can extend the arms of the map to include notes on the code implementation. I might, for example, include references to existing code, comments on the choice of a possible collection needed for a specific feature, as well as other notes about potential coding issues. This is not a full spec, of course, and can't substitute for one, but if it was assembled in conversations with the team, it generally provides enough information so that they can progress without stumbling into crevasses.
Mind maps are beneficial in other contexts: They function equally well as tools for writing documentation. User documentation often consists of discussions of many features that frequently have to be resequenced as new functionality is added. The mind map enables this shifting around and encourages quickly capturing a key point to be made in one of the subsections in a chapter all of which is neatly encapsulated in the hierarchical, spidery format of the mind map.
There are several free mind map products available in the open-source bazaar. The one I've used most and know best is FreeMind. I know users of other packages who prefer theirs, but the OSS packages all do more or less the same thing. Among commercial packages, XMind gets great reviews. If you prefer drawing up maps and diagrams in the cloud, then MapMeister is a choice that many developers seem to like. Whatever your choice, if simplicity is the watchword of good software, then mind maps certainly deliver.