Personally I don't. I started off with data flow diagrams and similar top down design methodologies which I'd been formally taught, but it's very difficult to keep your software and your diagrams in line and over time the diagrams become more and more spaghetti-like, to the point where they're no longer useful.
The best methodology seems to be the unix-like approach of dividing the problem into small self-contained programs for dedicated tasks which are then strung together as needed. This allows development to proceed in a flexible way, without having to waste a lot of time re-drawing impossibly complicated diagrams. Instead of a hierarchy of programs you can think of this as being an ecosystem of programs.
The best methodology seems to be the unix-like approach of dividing the problem into small self-contained programs for dedicated tasks which are then strung together as needed. This allows development to proceed in a flexible way, without having to waste a lot of time re-drawing impossibly complicated diagrams. Instead of a hierarchy of programs you can think of this as being an ecosystem of programs.