I first use paper and pencil, but then I transcribe and keep it up to date electronically.
http://lucidchart.com has been my favorite service as it is free for simpler projects and can be upgraded if you need more complexity. I've watched the project grow from an idea, to recruiting developers in my CS classes, to a full blown project which has exceeded my expectations. It's exciting to watch!
My process is a bit rudimentary. I just have a folder with notebook paper in it. When I need to create a new system or subsytem I will draw it on paper just as it would look in any of these diagraming tools. Once ready I'll use lucidchart to replicate the drawing (schema or flowchart). Once it's implemented in code and committed in Git I will go back to the electronic copy, mark in red or other colors anything that will change in the next refactor or implementation. As I refactor I change the red makrings to black indicating it is now part of the system. The paper becomes an artifact of the first revision.
Sometimes I'll break out a new paper and do the initial drawings to test my knowledge of the system and see if I have complicated the design. This system works well for me.
http://lucidchart.com has been my favorite service as it is free for simpler projects and can be upgraded if you need more complexity. I've watched the project grow from an idea, to recruiting developers in my CS classes, to a full blown project which has exceeded my expectations. It's exciting to watch!