Ask HN: How do I re-educate myself?

28 points by gboy ↗ HN
I have a PG degree in CS (systems), and a fairly good knowledge of most of the basic concepts in systems and distributed systems.

I am highly interested in systems and distributed systems but I find my education is lacking. I have identified this to be mostly a problem of ignorance - I do not know of many of the interesting systems projects in the research area, of the problems faced and how they were solved. Consequently, I am unable to contrast and compare different methods of solving problems, etc.

I'm not only missing the more basic advanced knowledge (e.g. the more advanced data structures) but the deeper "domain" knowledge that comes with systems.

However, I have tried plugging this gap by reading books, papers,etc but I don't find myself getting a lot out of them - sure I can understand them, etc but there is no creativity that follows (e.g. new ideas or application of ideas to the problems I have). Soon I forget about the papers, ideas etc. Considering the time and effort it takes to properly understand an academic work (for me at least), the whole effort becomes very heavy, draining and often pointless.

I find I have this problem even with stuff that I'm really familiar with. For example, I know the average time complexity of quicksort but I'll be damned if I can implement it without looking it up. I know an algorithm called "heap sort" exists but that's about it - I can look it up in wikipedia NOW but I'll forget it in 6 months.

I want to educate myself to have a really sound and broad baseknowledge that I can build on and use to become better at what I do. I want to do this in the evenings and weekends, and in what I'm looking for is a way to "classically" educate myself from the ground up so that I don't have little bits and pieces of unrelated "facts" in my head that are of no practical use to me and that I continually refresh but rather a good foundation of ideas, base abstractions, properties etc that I can build on. I have often been struck by the fact that if I properly retained and understood 20% of everything I read, I would be a much better computer scientist.

I know that knowledge acquisition is a personal thing so I'm asking more about the techniques that one can use to acquire this knowledge without getting bogged down.

19 comments

[ 3.4 ms ] story [ 54.0 ms ] thread
From what you write it would seem to me that you are trying to approach the problem from a purely theoretical point of view. That's fine, but you can read papers and books until the cows come home, at the end of the day the only way to really educate yourself is to apply your knowledge.

In short, go do something, stop reading! Before long, because you are trying to actually get something done you'll find that you are reading again, but this time you are reading with a clear purpose, some problem that you need to solve. And you'll be reading about technologies that are relevant to you, not just about whatever somehow made it on your reading list.

Those are the lessons that stay learned, and then, after doing that for a while you may find that learning by doing is far more rewarding and far faster than learning for its own sake.

And you have more fun in the process.
I believe that this should be applied to almost anything you want to learn in your life. In my opinion it is almost always a waste of time to read and study something if you are not immediately applying the knowledge. I think this is just how people learn.
Agreed and beautifully put, but perhaps I can expand a little.

Gaining applied knowledge is not a spectator sport. I can say this both from personal experience (at least in math and CS) and from being told it by people far wiser than I am.

In math, I always try to figure out a valid proof before reading it, and it helps me understand it much better than just reading. In programming, I will read the example first, but then I try to implement it and modify it. No matter how well I think I understand it on first reading, I learn a great deal in trying to implement and play with it.

Have you ever learned something truly? That you didn't forget? If the answer is yes, try to think about the environment that helped you do it and emulate it. Unless it requires socializing with people or something that is uneasy to do on your own, it should be doable.

E.g. if you found that a particular type of class in college helped you a lot, say, a laboratory where you had to hand in code weekly, then you could "assign" yourself a task that you'd like to do, just in a laboratory fashion.

Sometimes you might think this is hard for a newbie to do, since you don't know what you don't know, etc. For some things you can look up a relevant course at a "good" university/program and see what its curriculum is, what the reading material is, what kind of tasks get assigned etc.

(comment deleted)
This is how the great management guru Dr. Ram Charan used to develop mastery:

"In the lulls between customers, Charan studied. Using a system of his own devising, he condensed onto a single unlined page the essence of what he had learned that day in each subject. (Today he provides similar one-page summaries for his CEO clients.) "Am I going to get good grades?" he would ask himself, knowing there was only one right answer. "Am I the master of this subject?" He knew from Sanskrit teachings that "fear, anger, laziness - these are the downfalls of human beings"; that peace of mind alone is worth striving for; that dedication and mastery are their own rewards.

More at: http://money.cnn.com/magazines/fortune/fortune_archive/2007/...

That was a wonderful article. Thank you for sharing.
>there is no creativity that follows

You are likely lacking in enthusiasm or other deep interest in any area. I find even casual reading outside the field tends to spark ideas in areas that I am interested in. Try to find some problem that you find deeply interesting and think about it while reading or, as jaquesm says, choose and actually work on a specific problem.

Take a long holiday.
To remember something you have to constantly use that information. The basic information from your youth stays with you because you were tested on it daily and practiced it for years. Also the young brain soaked up information better before than it does now.

To learn new information you'll have to do recite it often OR put it into practice often. So make sure it's subjects that you enjoy or can force yourself to use/memorize.

I can still recite the first few lines of Ulysses by Alfred Lord Tennyson since I memorized it for recitation years and years ago. I practiced for hours and hours.

Getting my masters in mathematics was a task as practical as a carpenter's job. I would actually use everything I learned in some way, for example trying to generalize it. Perhaps that approach could help you remember, too.
Find person(s) who need help w/ distributed systems. Figure out the problems they need to solve. Discover what interests you. Work towards learning how to solve those intersting problems. Stay in touch with the people you meet and get known as the guy who they need.
Sometime back I found myself in a slightly similar situation. I felt like I had forgotten many things I had learned in my masters (CS), and I also felt that many new technologies have come about and I do not know enough about them.

I organized my learning goals as another masters in CS, and have started doing the first course (web technologies). For each course I plan to identify open courseware and other resources and blog as I learn stuff. I am hoping my blog will help me establish a learning trail, which might be an alternate for the credentials of a paper certificate.

Check it out - http://opencs.wikidot.com

If you are interested in practical application of your knowledge, I would suggest you to build a mid scale real life distributed system on AWS. You would need to spend around 100$ per month though.

Currently I am trying to analyze a huge public data set using AWS, it is cheap at same time powerful enough to do practical work.

Echo what everyone else is saying here -- you won't truly grasp anything until you apply it as a solution to a problem you care about. That's how self-teaching always works best for me. It's the difference between driving around aimlessly and driving to a specific point on the map.

Imagine something like API documentation. What's going to make you an expert in that API? Reading through the API docs end to end or acually building some projects?

More importantly, which is more fun? Solving your problems activates feelings of reward, which is important positive reinforcement when you're learning something new. There's very little learned without fun.