Keep a running list of the actions taken by the user. If the
interface is driven from a command line, then you have it easy
-- just record everything typed there. See the example above.
If you can, keep track of the history across sessions, so the
user can see what was done even a week ago or longer.
If it's a graphic interface, or a combination of graphic and
command-line interfaces, then things get a little more
complicated. Find a way to express each action in one
consistent, concise way, usually with words (though there's
no reason why it can't be done visually). Make sure you
define these with the right granularity -- if one action is
done en masse to seventeen objects, record it as one action,
What commands should you record, and which ones shouldn't
you? See the
Multi-Level Undo pattern for a thorough discussion of
what commands should "count." If a command is undoable, it
should be recorded in the history.
Finally, display the history to the user. That display
should be optional in most software, since it will almost
certainly play a supporting role in the user's work, not a
starring role. Lists of commands -- oldest to newest --
tend to work well. If you'd like, you could timestamp the
history display somehow. MATLAB, shown in the example above,
puts a date and time into the history whenever the program