I usually use a bunch of dired buffers. Dired is actually really nice--it's basically my main file manager these days. You can actually open several nested directories in a single dired buffer using i and you can open directories/files in a different window (in the Emacs sense) using o.
Another really useful trick is M-x find-dired and M-x find-grep-dired, which let you get a dired listing of the result of a find command. This is usually good enough for browsing through even relatively large code bases.
You can also use etags to get "jump to definition" commands for your various functions. Just put the TAGS file in the root of your directory.
Also, ido-mode really helps with handling a bunch of different buffers or files. And, since I have a large external monitor at work, I can have one or two small dired windows (again in the Emacs sense) open most of the time.
Another really useful trick is M-x find-dired and M-x find-grep-dired, which let you get a dired listing of the result of a find command. This is usually good enough for browsing through even relatively large code bases.
You can also use etags to get "jump to definition" commands for your various functions. Just put the TAGS file in the root of your directory.
Also, ido-mode really helps with handling a bunch of different buffers or files. And, since I have a large external monitor at work, I can have one or two small dired windows (again in the Emacs sense) open most of the time.