Expanding my boundaries

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.


The value of the network

According to Metcalfe’s Law the value of any network is proportional to the square of the number of connected users. As the Web becomes an increasingly important part of our lives, it’s important to keep that in mind. It’s especially important to remember if you’re planning on running a business based on the Web or if you plan on using some web-based technology as a core part of workflow.

I’ve had a Google Wave account for a few weeks and I practically never use it. This is despite the fact that I communicate a  lot online. Even with Facebook, Twitter and this blog, the fact remains that the one tool I use more than anything else is email. It’s not because Email is the most efficient or powerful medium (it’s better than Facebook’s messages, but less powerful than Wave) but rather because it’s the network that has the most number of connected users and the square of that number is huge. Everyone has email. Everyone checks their email. The main reason I can see for Wave not catching on outside of internal corporate/team networks is that the email network is massively more valuable and powerful.

This is true even outside the Internet. Lately I’ve started looking for people who can be creative partners – people with who I can work with on innovative and fun projects. I’ve been looking outside my friend circle (though some of my friends are my creative partners too) because I want to create a larger, well connected network with a specific purpose. Looking back, I can see trace the start of this network back to about a year or so ago. Of course, I had no idea that I was creating such a network, but now that I can see that happening, I can see the value of the network growing as I add more people to the network. As this network grows, we all benefit by having access to more opportunities and coming up with better ideas than what we would have with fewer members. We’re using technology and the Web to sustain the network, but it’s power is independent of the medium.

I only really started thinking about networks when I read this post by Anil Dash where he talks about how he loves New York and it’s startup scene:

New York City startups are as likely to be focused on the arts and crafts as on the bits and bytes, to be influenced by our unparalleled culture as by the latest browser features, and informed by the dynamic interaction of different social groups and classes that’s unavoidable in our city, but uncommon in Silicon Valley. Best of all, the support for these efforts can come from investors and supporters that are outside of the groupthink that many West Coast VC firms suffer from. When I lived in San Francisco, it was easy to spend days at a time only interacting with other web geeks; In New York, fortunately, that’s impossible.

The reason that New York is becoming such a hotbed of new social technology startups is because of the networks it fosters. Similarly the reason that it’s startups are so different from Silicon Valley’s is that the composition of the network is different. Both networks have lots of nodes, lots of connections and hence are of great value, but the different compositions make them and the creations they engender very different.

Even when it comes to pure technology the network is powerful. The lone hacker in the basement may be the stuff of legend, but the most famous hackers are also the best networkers. Linus Torvalds put Linux out on the Internet and leveraged the power of that network. Jamie Zawinski helped build Netscape which in turn was instrumental in the creation of the modern Internet. He was also responsible for XEmacs – a text editor with a large and powerful network.

The moral of this article is this: don’t neglect the network. It might seem heroic and even fun at times to just lock yourself in your room and crank out code (or other works of art), but your work will only become powerful if there are lots of people using and appreciating it. And the fact this, that no matter what kind of introverted and antisocial tendencies you might have, networking is fun, if you find the right people to network with. At the same networking for networking’s sake is a mistake and can be very frustrating. Start out with a purpose – making a great free operating system for example – and then go find people who are into the same kind of thing. Happy networking.