I can tell you what I do; I understand that other people might be doing it differently, or not at all. I'd like to hear their opinion as well, I might learn something.
I write a lot of comments, everywhere. Most of my "logic" is in packages within the database. All procedures and functions are well documented. All my tables have comments as well (on a table and most of their columns).
Apex just calls procedures/functions, I don't write a lot of code there. Certainly, you can't avoid writing select
statements for e.g. interactive reports etc. If necessary, I write comments (it is the last property, in the bottom-right corner of Apex screen).
If someone knows how Apex works, it is fairly simple - on fairly simple pages - to follow its execution. Running the page in debug mode also helps, as it leads you through the process.
After application enters production, I also have a MS Word document which contains information about what's being changed on a certain page, when and why.
We've been discussing recently that it would be nice if someone investigates possibility of using Git. We haven't done it yet (too few people, too much daily jobs to do. Classic).