With Pith

Ethan Petuchowski

On Learning

I like to learn things, but I often feel like time I spend learning things is wasted.

It’s hard to tell what info is going to be useful and what is fluff

Classes in school (at all levels) lead to lots of wasted effort, because a lot of the stuff you’re supposed to learn is simply not useful knowledge. For example, for one college exam, I had to name about 30 different rocks and minerals by sight, and the names are very complicated. People say: “well just going through the process is teaching you how to think.” I don’t disagree, but I think that’s a fallacy; learing to think and useful knowledge are not mutually exclusive. Useless knowledge includes specific dates, long names, irrelevant historical events, and other things we might in everyday life dismiss as “trivia”.

In my experience, all academic disciplines have room to reduce the “trivia” overhead in their curricula.

In college computer science classes, there is not a whole lot of trivia. However, their is a “jump into abstraction” that often left me confused. I quite often didn’t understand why what I was learning was important. Edsger Dijkstra said we should teach the abstractions before rotting the students’ brains with modern programming realities and deficiencies. That’s a laudable mission, but problems still need to be better motivated.

Difficult material with no motivation is not rewarding

E.g. during my first Operating Systems course. Everything seemed way more complicated than anything I should ever be expected to know in real life. So I figured I would never end up needing to understand virtual memory, processes and threads, scheduling, networking, etc. In reality, I just had no idea what I was talking about, and that’s why it should have been motivated. For example, I have since learned that the Linux kernel has a very interesting open source development ecosystem. They are making upgrades to the thing all the time that affect everyone developing most kinds of modern software. In addition, a whole lot of the different features of computers are motivated by internal business tool usecases, rather than home consumer usecases. Being a college student without a computer nerd background, I had no idea about any of that. Being taught to appreciate how important this stuff would end up being for me would have made me learn drastically more during the course of the class.

What I wanted at that time was for the material to be motivated with an example, like, “let’s build a program for running a medical radiation machine.”Now we’re talking; we’re going to need to get all the different low-level components right and make them fit together so that we can save lives!

What actually happened was similar in content, but not in objective. We were expected to read a very long and dry paper on the Therac-25, a radiation machine with concurrency issues that killed a few people in the 1980s. I spent a few hours trying to read the paper. One could say I was spending that time “learning to think”, but I think I spent that time “getting nowhere”. The whole time I was reading the paper, I was thinking: it would take me so long to get to the point of this paper, and I’m not even going to get a whole lot out of it. No good. In the end I learned about the Therac-25 from Wikipedia, a source of information whose expected readership has a level of background knowledge more commensurate with my own. Then, a few years later, I had to read that paper again for a graduate operating systems class, and at that point I had sufficient background knowledge to simply read the paper and feel like I understood its content and learned important lessons about software engineering.

This example demonstrates the fundamental principle that the same content can lead to completely different learning outcomes for different people, and even for the same person at different points of time and (as we shall return to later) in different emotional moods.

Some keys to not wasting effort

  • Have something in mind that you want to accomplish with your newly-obtained knowledge
    • E.g. “I want to build the software for a medical radiation device”
  • Have someone (colleague) or some place (e.g. stack overflow) where you can ask questions when you get confused
    • Sometimes having another person just explain the whole thing in one shot face to face can lead you to simply just get it
  • Learn the relevant vocabulary for the field on wikipedia
    • For example take at least half an hour digging through linked topics until you have a general grasp of the various concerns and their names, and ideally how they relate to one another
  • Skim liberally but don’t expect to understand what you skim

Qualities of time

During college, I learned from an Aaron Swartz article about how one can’t just spend all day reading tough material because it’s too mentally strenuous. Instead, you have to choose the right activity for the mood you’re in, and there’s not a whole lot you can do if you’re just not in the mood to learn anything. Mr. Swartz says we should have a todo list that is aware of the fact that different tasks require different levels of mental effort. Maybe after reading my compilers textbook for an hour I’m mentally tired and physcally peppy, so I go for a jog. Then I’m relaxed and ready to work on writing code for a program. Then I’ll get overwhelmed so I step back and plan out some next steps for the program. By now I’m sick of the program so I meet some friends. Then I’m tired and take a nap. And so on. The point is each activity follows from the next according to my current mental and physical state. So many people don’t start the project until the night before, and have to do one strenuous activity all night, fighting exhaustion, and not really getting much out of it because it’s all slapped together. Granted, plenty of people are really proficient at getting that strategy to work out.

Find the right source of information for you right now

Some places to learn things include youtube, conversations, podcasts, wikipedia, books, tutorials, projects, and blogposts. In terms of enabling lots of deep and useful knowledge to be gained per minute, the most effective might be reading a great book, and doing a great project.

Try out a few different compiler books

Finding a great book can be pretty challenging, because you may spend some time reading the wrong books. But it is worth it, because the right book can make a big impact. After looking for some time, I have finally found a compilers book from which I am learning what I wanted to know. (It’s cover happens to be quite ugly compared to the other compiler books.) Before that I tried reading a hundred pages of each of a few more theoretical compiler books, but over time I decided that for now I’m more interested in learning to write the code, over understanding the theory. So the book I found is a tutorial for building a Pascal compiler from scratch in Java, with real executable code accompanying the text. The point is I found a book that is teaching me what I want to know more efficiently than several other popular books on the subject. And I know that from having tried out the other books. I think this is a useful strategy in general.

Try out a few different algorithms books

I went through a similar process for learning the fundamentals of algorithms. First I took the class in school and got an A. I can’t say that did me much good, as evidenced by failing many easy job interview questions. I didn’t like to go to class so someone else would hand in my homework. I studied for the exams directly from the book called “Algorithm Design”.

After failing at interviews, I started rotating through different algorithms books. I finally sat and (over a few months) read the whole explanatory section of “The Algorithm Design Manual,” but didn’t feel like was walking away with a good grasp of the material it covered.

So I tried to read the classic “CLRS”. After reading about two chapters then skimming around, I decided I wanted to focus on implementing algorithms instead of proving correctness and complexity bounds.

So I started “Algorithms” by Sedgewick and Wayne. It started off pretty slow, so I found that by skimming, I was able to read a few hundred pages in the first few hours, which wasn’t productive but motivated me to get into some more challenging material. So I skimmed up to a lot of material that I didn’t already know (I think chapter 2 or 3).

In addition to incredible explanations, the book has clean code, amazing diagrams, easy, medium, and hard code and theoretical exercises, a full sequence of lecture videos by Dr. Sedgewick himself, etc. With this mix, I was finally able to achieve a satisfying learning per minute score. In general, I was able to just “follow along” with the book and understand things as they came.

The whole time I was reading this book, whenever I found a concept hard to grasp, based on my bad experiences with other books and classes and tutorials, I could rest assured that it would be unlikely that I could find a better explanation elsewhere. This attitude strengthened my resolve, and I ended up reading and understanding almost everything in the book.

Maybe it’s just the tone

I have always been deeply affected by the tone in which information is presented to me in turms of being able to remember it. So have you, just ask your parents. I’ve had professors I couldn’t stand teach me subjects I love and walked away with nothing from that class. And vice versa. Everyone knows that. It’s the same with textbooks. I think the key is inspring the student about the potential of what they can do with the knowledge, and to actually convey the excitement of it!, instead of simply boring you to tears with facts.

One thing the Khan Academy (among others) has brought to teaching is excitement for the actual content. The end result is that people (e.g. me) can actually bear to spend hours watching and re-watching Mr. Khan explain differential equations. He’s doing a taylor series expansion, and he’s like “just check out how cool this is!” and I’m like “yeah, expand that shit!” Whereas otherwise I’d be sitting at class at 8:30 in the morning like, “FML I can’t believe I’m not sleeping right now”. Junior year of college, without Khan Academy’s help (and Paul’s Online Notes, a free math textbook), there’s no way I would have done so well in diff-eq, which gave me the confidence to transfer into a computer science degree later on.

When to skim

Most of the time, skimming material does not lead to understanding the material. Instead, it only leads to some kind of awareness of the material; that feeling later of “yeah I think I’ve seen this stuff before”. That said, skimming is often crucial, especially for reading blogposts.

Blogposts may be written with any of an assortment of aims.

For example, the author may be trying to assert her expertise in an area by providing a good explanation, in order to further her career. Those vary widely in quality, and can occassionally be read deeply for understanding. Data science has a huge number of those.

Or the author may be trying to clear up his own thoughts on some subject. That’s what I’m trying to do here. In that case, skim to find the parts that are relevant or entertaining, and read those.

Or it may be written for the author to remember something, like “how to get HDFS running locally on Mac”. Thank heavens for such blogposts.

Or it may be some sort of war story: “this is what we did, and this is how it worked out”. If you’re trying to build a complex system, you probably want to read some of those.

Lectures are generally only worth skimming. It takes me less effort to understand a lecturer than to understand a book. But even when it’s clearly stated, the lecturer is generally not divulging much information, and when they start to say something actually complicated, it becomes easy to zone out, get lost, and lose interest. They may also get lost on side-tracks or try to pull things in that they think are cool. A great lecturer can be a very entertaining way of learning, but it’s generally not time spent learning nearly as much substance as can be read from a page. Please note, hour long lectures are quite different from a super-helpful and targeted 5 minute youtube video.

One useful question to ask before reading something is “Can I just skim it?” The answer to this is yes if you don’t want to be able to actively use that knowledge in the future. Often, skimming is useful for verifying that you understand something that you learned about elsewhere. For example, if I were to skim a tutorial on parsing theory, I would be able to roughly guage how much of that stuff I actually understand based on how much I’m recognizing concepts and “agreeing with the author” as I skim.

A frustrating situation is to read something deeply when you could have just skimmed it because there was nothing really there. Maybe this can be avoided by skimming first to see whether it’s even worth really reading. But I never do that.

Another time skimming is useful is when you’re stuck. When I got stuck reading about computer architecture, I would go back to the table of contents. “How did I get to where I am?” “Where are we going with this stuff?” “What do I find interesting about this?” Then I would skip to some figures. Look at the figure. Is it cool looking? Wouldn’t it be fun to understand what it means? Let’s look at some of the keywords in the text near the figure. Oh there’s some words I’ve seen before but didn’t understand, I guess they were important. Now I can go back to their definitions and see if I can place them properly in the figure. And so on.

Is learning important

By getting better at seeking out the best sources of information, we build an improved ability to affix knowledge into the brain accessibly, without expecting the best educators to just to fall in our lap when we need them. Here, I have tried to explore and share some lessons about building the conditions for learning efficiently.