I've been a programmer for years now and I feel very comfortable in a handful of languages, especially C.
What I find baffling is that while I have no problem reading code from textbooks and example sites, no matter what the code is doing, I find that when I check out an open source project and look at the code, it almost looks like a foreign language to me.
I get flustered quickly. I have no idea what data structures are important, or even where the main() function is for a lot of these projects (or ones that I'd expect to have one). It's almost embarrassing that I can't figure out anything that's going on in popular open source projects. I've looked at the code from projects such as Bash, Wget, Linux Kernel (this proved futile quickly), and Python, just to figure out the flow of the code, to no avail.
My question to you (more experienced) programmers is:
How do you learn other people's code? What practices are good in understanding what's going on in a large project? Are there specific conventions that most projects follow?