Preamble (Skip if you don't like to read)
I've been learning C/C++ in school for a year now and all the assignments in the book, after reading through the chapters, were not too difficult to implement. Some examples of programs I've written are abstract data types like binary trees, queues, stacks, lists, and other types of programs were palindrome searching, encrypting and decrypting files, and other similar first-year type programs. As stated, after reading the chapters, I was easily able to implement and understand the algorithms used to solve many of the problems. So I feel comfortable with the syntax and logic of these small manageable problems.
Background (You can skip this part)
In preparation for my transfer to UCSD in the fall, I installed Linux on my machine and switched to using Vi -- definitely a change from Visual Studio. To keep my mind sharp and venture into real-world programs, I decided to download the source for a famous Linux console utility called Wget (http://www.gnu.org/software/wget/), with the intentions of re-writing the program as a C++ object-oriented version. The challenge I am facing is the program, while being a simple single-purpose utility, is still quite enormous when staring at the code.
...The Question (You CAN'T skip this part)
How does one begin to look at a program they didn't write and study it in order to try to re-write it, change it, etc? I guess I'm looking for advice/guidance on a divide and conquer type approach to studying a program written by other people in order to try to re-write it. I understand massive programs like OpenOffice, the Linux kernel, Gnome, etc. don't fall into this "I'm going to re-write them" sort of thinking. But small utilities I would imagine do.