Optimizing side projects for learning

Adam Zerner
11 min readDec 16, 2018

--

Back in 2014, I was a student at Fullstack Academy, a coding bootcamp. The way these bootcamps usually work is, the first six week you have lectures and do exercises, and the last six weeks you apply what you’ve learned in personal and group projects. When it was time for us to do our group projects, we all got together in front of a white board and brainstormed ideas. There was a point in this brainstorming session where I spoke up and basically said “I think we’re going about this all wrong”.

People were trying to think of ideas that were cool. Y’know, the kind of thing that would make the front page of Hacker News. The kind of thing that you’d want to brag to your friends about. The kind of thing that people might actually want to use!

That sounds pretty reasonable, right? How can I say that they’re going about things all wrong? How else could you possibly go about picking a project idea?

You could try to pick an idea that will be as educational as possible. You can optimize for learning.

As a student

I think that many people should be optimizing for learning in their side projects, but I think that it is particularly unwise for bootcamp students to optimize for coolness instead of learning. When you’re at a coding bootcamp, you have a unique opportunity to educate yourself. You have instructors, teaching assistants, and fellow students around to bounce ideas off of and answer questions. That’s why you’re paying $1,000+/week to be there, instead of sitting in your room working on projects by yourself (well, it’s one of the reasons). So why not take advantage of it?

Suppose that you are interested in web sockets, but you get tripped up a lot when you try to use them, and you aren’t sure what the best practices are in using them. If you try to use them after the bootcamp is over and you’re at home, you’ll probably get tripped up a lot and things won’t go very smoothly. But when you are at a bootcamp, you have people around you who’s purpose is to help you when things aren’t running smoothly.

You can think of it as if the price of learning about web sockets has been reduced, as if a store were having some sort of a sale. When a loaf of bread is on sale, you don’t have to spend as much money as you otherwise would to get the bread. When learning about web sockets is on sale, you don’t have to spend as much time as you otherwise would to accumulate the knowledge.

I think that the same point can be applied to students who are in college, but less strongly, because you don’t have quite the same access to help in college as you do in a coding bootcamp. In a coding bootcamp, you spend maybe 10 hours a day sitting around a bunch of other people who are there to help you. When you’re programming, it’s really awesome to be able to receive help at a moments notice. ESPECIALLY when you are just getting started. When you get started programming, you could end up stuck on something for hours, days, even weeks, that could be solved in minutes if you just had someone there to help you. That makes the presence of such help extremely useful.

In coding bootcamps, it isn’t really true that you can get that help at a moments notice. You usually have to submit some sort of help ticket and wait for an instructor to head over to you, which could be 30–45 minutes sometimes. But other students are at least usually willing to help at a moments notice. And waiting 30–45 minutes is much better than you’d get in college.

In college, one resource available to you are office hours. You get to have a professor review your code and talk through your questions with you. A professor. A fucking, professor! Professors are really, really smart. I can’t tell you how awesome it’d be to get a code review from a professor for my app. You also have TAs, but they’re also pretty damn smart for the most part.

Another resource you have available to you are things like the computer help center, or whatever they’re called. It’s a room that has some tutors walking around helping people.

Anyway, the point is that when you’re some sort of a student, the price of learning is cheaper. You’re going to have to learn about eg. web sockets at some point, so why not save the “cool” projects for later and “purchase” the web socket knowledge while it’s still “on sale”?

Stepping stones and 10x developers

In the world of programmers, we talk about the idea of a 10x developer. A developer who is so good that they are ten times as productive as someone else.

It isn’t a myth.

It really, really isn’t.

Some excerpts:

In years since the original study, the general finding that “There are order-of-magnitude differences among programmers” has been confirmed by many other studies of professional programmers (Curtis 1981, Mills 1983, DeMarco and Lister 1985, Curtis et al. 1986, Card 1987, Boehm and Papaccio 1988, Valett and McGarry 1989, Boehm et al 2000)…

and

…As I reviewed these citations once again in writing this article, I concluded again that they support the general finding that there are 10x productivity differences among programmers. The studies have collectively involved hundreds of professional programmers across a spectrum of programming activities.

and

…the body of research that supports the 10x claim is as solid as any research that’s been done in software engineering.

and

This degree of variation isn’t unique to software. A study by Norm Augustine found that in a variety of professions — writing, football, invention, police work, and other occupations — the top 20 percent of the people produced about 50 percent of the output, whether the output is touchdowns, patents, solved cases, or software (Augustine 1979).

So what are the implications of this? I think the implication is that, if you could become an order of magnitude more productive by increasing your skill, well, investing in education is pretty damn fruitful!

Imagine two developers: a 10x developer, and a 1x developer. The 10x developer is able to bang out 10 side projects over the course of a year, whereas the 1x developer slowly stumbles through just one. Who has a better chance of reaching the front page of Hacker News?

If your goal is to actually do cool things, I think that you should lay down some stepping stones instead of trying to jump across the whole pond. Take some time to invest in your education now, and it’ll pay off in the long run.

Motivation

Some people say that they just can’t bring themselves to work on a side project if it’s not cool. I have three main responses to that:

  1. I suspect that it stems from not really understanding the 10x developer thing and how useful it is to build skills. Not internalizing it. In which case, my advice is to spend some time really pondering it, and reading a few books like Deep Work and Peak. It’s one thing to be told something is true, and it’s another to spend 50 hours studying it yourself and understanding it. If you do the latter, I think that you’ll find yourself a lot more motivated. And I think that taking the time to develop that motivation is very worthwhile.
  2. My second response is to call BS. “Really? You really can’t bring yourself to work on that stupid web sockets project? You have to build another todo list app?” Sometimes you have to push yourself a little bit in life. Sometimes “I can’t” is an excuse for “I don’t want to make the effort, and I’m going to rationalize it by saying that I’m not actually capable of motivating myself.”
  3. Motivation can be hacked. Eg. with habits. Maybe you can figure out how to motivate yourself to do the educational project instead of the “cool” one?

Still, I recognize that we are humans, and that we can only do so much. So if you are more motivated by a cooler project, I definitely think that is something to consider. But it’s not the only thing to consider! It’s just one of the many factors to consider in choosing your side project. Is the downside of it being harder to motivate yourself really outweighed by all of the upsides of a more educational project?

Fun

Some people will say something along the lines of “side projects are supposed to be for fun”. My response to this may be somewhat opinionated, but this article itself is opinionated, so why stop now!

I think that sometimes it is worth taking the long view on fun. Don’t just ask how much fun the cool project will be for the months you work on it. Ask how much fun it will lead you to have, in aggregate, over the long run. And ask that same question of the educational project too.

Being great at what you do is really fun. Actually reaching the front page of Hacker News is fun. Building an app that people actually use and are grateful to you for is fun. Autonomy, mastery and purpose are some things that really make us happy. In order to get any of this, you really need to take the time to invest in your education.

Cal Newport expands on this perspective in So Good They Can’t Ignore You.

“But anything you do will be educational”

I think that this perspective is very, very wrong. Imagine the following statements:

  • “Any food you eat will be nutritious.”
  • “Any exercise you do will be good for you.”
  • “Any money you save will help you retire.”

Sure. Of course all of these statements are true. And of course it is true that any side project you work on will be educational.

But there are degrees!

  • Spinach is way more nutritious than candy.
  • High intensity interval training is a lot better for you than walking on the treadmill as you watch TV.
  • Saving 20% of your paycheck will allow you to retire much sooner than saving 5%.

And working on some projects will be much more educational than working on others.

If this isn’t self-evident, think back to your experiences in school. I assume that you learned more from some teachers than from others. More from some assignments than from others. More from some books than from others. Doesn’t it follow that you might learn more from doing one side project than you would from doing a different one? Also, check out some of the research in educational psychology.

Cashing in

Saving money is good, but not if you never spend it. As the saying goes, you can’t take it with you.

I don’t think that education works quite the same way. Even if you never “cash in” the knowledge you’ve gained from your educational projects an apply it to a cool project, there is still some inherent joy in acquiring, and possessing the knowledge. Knowledge for knowledge’s sake is definitely a thing. But that doesn’t mean you should never cash in.

In high school I had this teacher for an intro to law class, and every time I’d ask her a question she’d say “it’s a case by case basis”. I hate cop outs like that, but I have a hard time addressing the question of when it makes sense to cash in. It does seem like it’s a case by case thing. You have to weigh the costs and the benefits.

I will say that if you would describe yourself as a junior developer, it is probably too soon to cash in. And that if you consider yourself a senior developer, it could definitely be a good idea. This doesn’t mean that junior developers should never cash in, or that senior develop should never optimize for learning, just that it might be a good rule of thumb.

First principles, terminal goals, and cached thoughts

So far I’ve only provided logical arguments for why I think it’s often a good idea to optimize for learning in your side projects. But as I look to wrap up this post, I worry that I haven’t been addressing the right topic.

I don’t think the issue is that people logically go through a cost-benefit analysis, look at all of the trade offs, and decide on a cool project over an educational one. I think the more common issue is that people decide to look for a cool project automatically, without considering other possibilities. What about a philanthropic project? How about contributing to an existing open source project instead? Or maybe, if you’re going to spend the time on a project, maybe you may as well try to make it a business and make money from it?

People don’t usually consider so many possibilities. Instead, people make a lot of automatic decisions. They have a lot of cached thoughts.

Usually, this makes sense. Usually, it is perfectly rational. If you paused to think about everything so thoroughly, you’d never make it out the front door. But sometimes it makes sense to really ask yourself what you want to accomplish, and what the best way is to get there.

As a developer, you’ll probably spend many months of your life working on side projects, so this seems like a good candidate to approach from first principles, as opposed to something with a narrower scope, like what you’re going to eat for dinner.

Sacred values and taboo tradeoffs

I’m not sure that cached/automatic thoughts are the real problem here either. When I stood up during that brainstorming session at my coding bootcamp and explained that I think we should be optimizing for learning instead of coolness… people just kinda looked at me with blank faces. I felt like there was a subtext to those looks that said, “stop ruining our fun, party pooper!”

Of course, I’m not trying to ruin fun. Fun is my goal too! I believe in optimizing for learning because I believe it is what will produce the most fun. In the long run.

But optimizing for learning comes at a cost. And when that cost involves a sacred value, making the trade off becomes taboo.

What truly distinguishes sacred values from secular ones is how people behave when asked to compromise them. When people are asked to trade their sacred values for values considered to be secular — what psychologist Philip Tetlock refers to as a “taboo tradeoff” — they exhibit moral outrage, express anger and disgust, become increasingly inflexible in negotiations, and display an insensitivity to a strict cost-benefit analysis of the exchange.

https://www.scientificamerican.com/article/psychology-of-taboo-tradeoff/

Being able to build whatever cool shit you want with your side projects seems like something that some programmers treat as a sacred value, and telling them that they should do something more educational instead seems like it’d be viewed as taboo.

But being inflexible and dogmatic like that in life just doesn’t work. And with the case of side projects, it’s particularly childish.

Building cool shit is one of the big reasons why we program. I get it. I understand that being told not to build cool shit will have a certain shock value to it.

But you can’t just jump across the pond from the get go. If you try to, you’ll probably land flat on your face and fail. I don’t think there’s anything cool about that. But if you lay down some stepping stones and work your way across the lake, I think you’ll feel pretty cool when you look back at everyone else on the other side.

--

--

Adam Zerner

Rationality, effective altruism, startups, learning, writing, basketball, Curb Your Enthusiasm