I feel like I often name files in such a way that my computer constantly beeps while I program because the tab completion is ambiguous. Before doing a lot of Unix programming, I tended to name related files with the same prefix to indicate their relation. Now I must re-think my approach to folder and file structures and names to program more effectively.

What heuristics or rules do you apply when programming to simplify tab completion? Do you use any tools to make tab completion smoother (e.g., [emacs icicles](http://www.emacswiki.org/emacs/Icicles))? 

**EDIT: Wow, thanks for the fantastic insights. I think every possible weakspot of mine was accounted for in the answers. I accepted the one that seems like the best productivity improvement, although they're all worth reading.**