Generally speaking, the professional activity of an engineer like me consists of two significantly different scenarios: developing new software from scratch or supporting existing software which in most cases is developed by somebody else. In both scenarios I use diagrams, though in different fashions.
In the case of a new development it is usually a top-to-bottom approach. I draw the architecture of the future software as a set of abstract blocks or actors and then I move to more detailed levels eventually reaching the level of the chosen programming language. Certainly, I do not draw everything. I draw only the parts which are of interest to me. Tools like MS Visio help me only when I work on a high level. I wish there was a tool which would help me with the lower level, and preferably in two complementary ways: generating a diagram from code and vice verse. I have never found such a tool.
In the case of maintaining existing code it is the usual – and sad – situation that there is no documentation and I have to reverse engineer the ideas behind the code. So I proceed in a bottom-to-top way. I read the code and when I understand what a chunk of it does I draw – physically on a piece of paper or mentally – a block with an appropriate label on it. Thus I get a single block (or a chunk) with a label instead of a group of statements. Eventually I get a flowchart which corresponds to the code. Again, I wish there was a tool which supports this process conveniently but I have not found it yet.