I find UML is excellent for this task. However, to reverse engineer, you need to understand the forward engineering path.
Business requirements can be captured at three levels:
[ol][li]Global requiremnets go into 'Non-Funtional Requirments Document'. A silly name, but it contains all the Business rules that affect everything that happens on the system. The are mostly used for security and availablility requirements, but also make an excellent repository for things like 'Ergonomic Requirements'.[/li]
[li]Operational Requirements, that correspond to 'Business Processes' and achieve one objective at one time on the computer session, map into Use Cases. There are lots of fancy definitions for these, but the 'one thing, one time at one place' is a good start. Then as people above had commented, these should only say 'What' people want to do and NEVER 'How'. [/li]
[li]Business Rules. All the remaining Business rules should map onto classes or their associations. This assumes you use classes. Often they are written in Business English, just as a list, but this is just a presentational approach. [/li][/ol]
There you are, UML Analysis in a nutshell ;-)
In design, this data is used in different ways.
[ol][li]Use Cases tend to get used to identify one or more screens each. Sometimes, one screen may be used by several use cases.[/li]
[li]The use Cases provide an excellent skeletal set of User Acceptance Tests. They identify all paths, all intents and what to look for when the use case terminates.[/li]
[li]The key business classes should map fairly directly into the any relational database schema.[/li]
[li]Finally there is the code :-( [/li][/ol]
To reverse engineer, you need to make use of these concepts:
[ol][li] Start with the screens and draw the menu structure. Most menu Items are indicative of a use case. Also look at the actions from the mouse keys, as they are NOT always reflected in the top level menus.[/li]
[li] Look at the screens and try to imagine just what a user can do when working on that screen. Also note which other screens they have to use to do that thing. Maybe, you see a very complex set and the user could be working their way through a number of secondary use cases linked by <<includes>> and <<extends>>. Remember the 'One Thing' aspect of a use case. If they do a couple of things, look for a couple of use cases. Beware that 'a thing' in this context is NOT and action, but something that achieves an objective for the user; they could possible go get a cup of coffee after they have done it.[/li]
[li] Look at the database schemas. These probably reflect the classes involved. The relationships then reflect fairly directly, some business rules like 'No more than three items at a time'. Data constraints are sometimes reflected here, like 'Must be over 16'. [/li]
[li] You may be lucky and find an old copy of the 'Non-functional Requirments Document' as these have been used for centuries (Well nearly). [/li]
[li] The code: [ul circle]
[li] If you are lucky it is OO code, and you can find classes[/li]
[li] Components are sometimes Object based just by nature of the desire to encapsulate. Look for these.[/li]
[li] If it is designed with Yourdon, then the functional units tend to deal with only a couple of data structures, each of which reflects a few classes. [/li]
[li] Then you are into the code. Hopefully, you have got most of the structure before you reach this level. [/li][/ul circle][/li][/ol]
Good luck
Gil