Archive for April, 2009

On Learning…

Wednesday, April 29th, 2009

My friend showed me this the other day (yes we’re both computer scientists and apparently nerds) and this kind of got me thinking about how I’m starting to see applications of computer science concepts all over the place, and especially in my other courses. It’s happened to me too many times to be coincidence, and I know that it’s also happened to some of my friends, and personally I think it’s really cool.

Regarding that specific article, I’m enrolled in an algorithms class where we’re talking about NP-complete problems, and in particular graph coloring. I’m also enrolled in a compilers class where we just started talking about code optimization. My friend and I mentioned this article to our compilers professor and he said that we would discuss this soon (and I think soon means on Thursday). I found this totally awesome! My courses are so aligned that we discuss a problem in one and then see an application in another within two weeks of instruction? Amazing!

Of course you’ll see applications of algorithms all over the place; they are kind of the foundation of computer science. For example, today, I implemented a Disjoint-Sets data structure to do run a Union-Find type algorithm for a project I’m working on. And yup, we talked about this structure in detail when we were talking about Minimum Spanning Tree algorithms. The disjoint sets structure was exactly what I needed to cleanly finish what I was working on, but had I been doing this just 2 months ago, I wouldn’t have known what to do.

I think this is why I like my algorithms class so much. Not only is it fun and intellectually stimulating to think about algorithmic challenges, but it’s arguably one of the most useful “advanced” computer science courses (of course it is more useful if you know how to program and enjoy/need to do so). Without thoroughly understanding the suite of algorithms at your disposal, it’s often difficult to find the right solution to your problem (although if you’re lucky/smart you can re-invent algorithms and data structures, I’ll comment on this in a later post). In that sense, to be a good programmer, you have to either spend a lot of time reading books, or browsing the web to learn the techniques.

I guess this is true of most fields, but when I came to college, I didn’t really think it would be true for computer science. I kind of thought that my degree would more or less validate that I knew how to program, but that I didn’t really need to actually go to school to figure that out, I could just read language tutorials online and whatnot. And I think that a lot of people also have this mindset about programming. Many of my friends are envious about programmers because you can get involved in side projects and research without taking a bunch of advanced courses. And yeah, this is true in some sense, but I don’t think you can do your side projects well if you don’t have “advanced” knowledge. Being a good programmer (and more so a good researcher) takes years of experience and also years of learning, just as it does in any field.

This is especially true for research. There are tons of techniques out there and how are you supposed to even know that they exist without reading hundreds of papers? And sometimes you need to take techniques from other completely unrelated fields. In one study, network security researchers used the mark-and-recapture technique from ecology to figure out estimate the size of a spamming botnet. How are you supposed to even know this technique exists? I think it’s really interesting and quite crazy how people even know about the technique, let alone realize that they should apply it in this new space.

At the same time, it’s really cool when you end up doing this yourself. I really enjoy including tidbits of information from the AI class I took last semester in my algorithms homework. For one assignment, I framed running Kruskal’s algorithm as running an agglomerative clustering with some threshold distance at which you stop clustering. In another, I modeled a problem as a Hidden Markov Model (which we haven’t discussed in the class) and solved the problem by running the Viterbi Algorithm. Applying previously learned knowledge to current problems not only enforces your understanding, but it validates that you didn’t waste your time learning some stuff.

So in one regard, I’m always applying things I learned. To write this post, I’m hinged on the fact that I learned to write in elementary school. Every time I program, I’m applying my knowledge of basic programming skills that I’ve been honing for the last two years. There aren’t many situations when you aren’t using past learned information. I just take a lot of the basics for granted and am not really impressed when I apply them. This is almost unconscious behavior, so it’s not exciting to me. I am impressed when I apply the advanced stuff, because I don’t really expect my brain to dig that information out when I’m thinking about something completely different. I don’t think it’s instinct to think of some specific advanced techniques, but it’s not like I’m delving into textbooks to discover them. I guess when you study some techniques in enough detail it does become instinct to recall them in new contexts.

Ok, I’ve started writing really long posts since I picked up this blog again, so I’m going to wrap it up. Here are my takeaways: Learning is super important; it gives you a full repertoire of techniques that you can use to tackle any problem. Without these techniques, you have no hope of elegant solutions. It’s also important to be able to apply these techniques in new contexts, places that you’d never expect to use them. I didn’t really talk about this much in this post, but I may in a future one. Keep reading about your field, I think you’ll quickly find that you are not wasting your time

Direction

Saturday, April 25th, 2009

If you’ve been reading my old blog posts, the ones from way back, you may have noticed that I have quite a few posts about entrepreneurship. I used to be really excited about starting my own company straight out of college. In my free time I’d read stuff by Paul GrahamMarc Andreessen, and tons of blogs by founders and VCs. I’ve tried to start a couple of serious side projects with some of my friends, and we hoped to turn these into startups when we graduated. And most importantly, one of my dreams was to start my own company. 

Over the last year though, I’ve become really involved in a couple of research projects and my excitement about them has got me thinking about my life direction. Nowadays, when people ask me what I want to do after I graduate (which scarily isn’t that far away), I tell them that I want to go to grad school, get a doctorate degree, and possibly go into academia. If you asked me that question a year ago, I would have said that I wanted to start my own tech company. So why this sudden change?

Well first of all,  I actually don’t think that the two paths are all that different. I’m excited by working on really innovative, leading software/technology, and this property is essential in any research project as well as in any startup (at least to have some core competency). I love the challenge that comes with working on something that’s never been done before, and I definitely want that challenge in any thing I devote myself to. There are tons of other similarities, to name a few: 

  • Both research and entrepreneurship have some component of selling your idea to others. With research, you need to get grant money, you need to present your work in a way that will get you published. With entrepreneurship, you need to pitch your startup to VCs, and VCs have to like what you’re doing.
  • Both have quite close-knit communities. In research, you largely see the same people at conferences in your area; the grad students and professors that I’ve talked to know a lot of other researchers in their field just by attending conferences. You know who the top researchers are. It’s the same way with entrepreneurs, they have events like startup school as ways to meet fellow entrepreneurs. And of course, you know who the successful people are.
  • Both typically involve some small group effort for awhile. With research, you often work in a small group, maybe of 2-4 people. Similarly, when you start a company, you may have 1 or 2 other co-founders and the founders are ultimately responsible for the success of the company. On a similar note, your effort can noticeably impact the success of the company or the research project, largely because there are so few people involved. This is really important to me, it’s one of the things that turns me off to large companies.

So these similarities are all awesome, and the fact that these are also around in the research world made it much easier to change my direction. Of course there are several differences. In a start-up, you have to do a lot more than just build your product; you have to hire employees, interact with VCs and customers, and a lot of the business/managerial stuff. In research (at least as a grad student), you do have to do some of the managerial stuff, writing papers and grant proposals, giving talks about your work (to gain credibility and support in the community), and as a professor the analogue to hiring employees is admitting and advising grad students. So yeah even here there are similarities, but I think this is a fundamental difference between entrepreneurship and research. As a young company, without some of these business skills, it will be very difficult to succeed. In research, your success is much more related to the quality of your work, and doesn’t depend so much on these auxiliary things.

Startups also need to build products, whereas in research, you can often get away with a good prototype. There’s a huge difference here and personally, I hate doing the work to turn a prototype into a product. In research, you just need your project to prove your point effectively, you don’t need your project to be visually appealing and entirely bug free. As an entrepreneur, you do need to spend a lot of time on this, potentially taking away from the core functionality and the level of innovation at your company. I really like this about research; you can focus entirely on the novel aspects of your project, you don’t have to waste time with the stuff you’d need to attract customers.

Now, I think the whole customer thing attracts people to entrepreneurship. They like to measure how successful they are by how many users they have, and yeah it feels great to have people using things that you built (or reading things that you wrote…). But I think there are ways to get this feeling in research too, one way to measure a researchers success is to look at their publications. Even better is to count citations. Citations tell you how many other researchers are looking at and using your work, and it’s pretty much the same measurement of success as the users one.

So research and entrepreneurship have some similarities, but they also have some fundamental differences. I think I transitioned from the latter to the former because I found that I didn’t want to get caught up in all the other stuff that comes with being a founder, I wanted to focus on the new technology. In my research I’m totally able to do that.

Another thing I love about research is that you’re always learning, and you’re always learning really cool things. Honestly, I wish I had the time to read a paper every day. I have a huge list of random papers that I want to read but there’s just too much stuff to do. As a researcher, it’s kind of your job to read random papers to see what other people are doing and to learn about new techniques. I don’t really know if this is around for entrepreneurs. You have to watch your competition but I don’t think you’ll learn much about their core technology. I’m not sure about this (and feedback would be awesome) but my impression is that you won’t experience the same state of perpetually learning in a startup.

Actually, I want to emphasize that last point. The constant learning really keeps me going. I don’t choose my classes because their easy, I choose them because I’ll learn a lot and because they sound interesting. I get really bored by easy classes because I don’t learn anything. I’m taking one of the hardest classes offered at my school this semester, and although it’s a ton of work, I love it because I’m learning so much.

So yeah, over this past year, the classes I’ve taken have pushed me in the direction of research. I’ve become involved in a couple of projects and I’ll be spending my summer exclusively doing research. Not that the dream of success as an entrepreneur has completely faded, but it’s definitely been put on the back-burner while I try to become a successful researcher.

Back in action!

Friday, April 24th, 2009

Yup it’s almost finals time and you know what that means… productivity is going to plummet and I’m going to start blogging again.Maybe a few of you noticed but my blog has been down for quite some time. I was originally hosting on a free 1-year facebook accelerator from joyent, but the problem was, naturally, that I only get it for a year. Anyway, my contract expired, and I’ve been super busy with school and stuff to re-set my blog on my older hosting service. This last week, I’ve somehow had a bunch of free time (or I’ve been really good at not working on important things) so I decided to set things up again. So yup we’re back. I think I will probably be blogging a lot over the summer (as I did last summer), mostly because I hope to have a bit more free time. I should also start posting lots of pictures.I guess I’ll start things off with an interesting article I found a couple of days ago. These researchers at Yale came up with a new way to analyze the running time of algorithms. The technique is called Smoothed Analysis and the article is here. The actual paper is ridiculously long and I don’t have enough statistics background (or patience) to read the whole thing, but the basic idea was really cool. Also, we just learned about the Simplex method in my algorithms class, and we talked about how in the worst case the algorithm is exponential, but in practice it’s quite efficient. Smoothed analysis is the explanation!