As I start writing graduate school applications and figuring 0ut what I want to do with the next few years of my life, I decided to stop and take a look at just how much of computer technology I really know about. The answer is: not as much as I would like. Though I know a fair amount about programming languages and the related tools, my knowledge outside that area is fairly limited. I have some knowledge about operating systems, a significant amount about computer hardware (including new multicore CPUs and GPUs) and I have a good understanding of the core theoretical concepts behind computer science.
However, I know very little about things like databases, security or computer networks. And this makes me uncomfortable because we live in an increasingly networked world. A growing amount of user facing software is becoming networked, collaborative and social. Both computation and storage are embracing the cloud and it’s becoming more common to have our data in large or small-scale databases rather than in multiple discrete files. Since I plan on staying in the computer field for a good period of time to come, I think it would be a good idea to read up on the networked side of things.
I have a good idea of the hardware layer of networks and the basic socket system (learned all that in the operating systems class) but I have little idea of the protocols and systems built on top of them. I suppose there are enough books out there that would give me a good idea of our networked world, but I don’t just want to know about it, I want to be able to build it (at least parts of it). Luckily there’s tons of great oepn-source networking code out there.
In particular the Ruby on Rails framework and the Mongrel2 webserver are not just completely open source, they also have excellent documentation and manuals. It may not be an entirely good idea for me to start learning about networking by reading server code and documentation, but I like following a “throw myself in the deep end’ policy when I’m self-educating. My plan is to start reading up on how some good networking code works, trying to figure things out and when I can’t figure something out, go look up other resources on it. I did something similar with programming languages when I got interested in them (though not looking at implementation code) and I’ve learned a lot.
In addition to that, there are two computer networking courses being offered next semester (one from an ECE perspective and one from a CS perspective) and I plan on taking one of them. I’m hoping that I’ll have self-taught myself enough that I can use the class to clear any doubts or misconceptions I might have and gain a really solid understanding of the area.
Of course, the best way to learn is by doing and I want to write code that implements the stuff I learn about. I’ve already started this by refactoring my old operating systems project. It started out as an a simple client-server combo that sent data over a network and was a multithreaded program. I’ve slimmed it down and thrown out all the client stuff. At this point it’s a small C library that handles multithreading and establishing TCP connections that could be used for building servers. I have a simple echo server and at some point I’ll sit down and write an HTTP server for it. It’s called Litepipe and you can get it from Github.
I’m really looking forward to exploring and learning about a new area of computer technology, but with all the stuff I have on my plate, it’s probably going to be rather slow going. But that’s ok, I’m not in a rush. I’d love to hear any advice you guys might have on how to get started learning about networking.