Learning by Doing

Most people believe very strongly that the best way to learn is to learn by doing. Particularly in the field of programming.

I have a different perspective. I see learning as very dependency based. Ie. there are a bunch of concepts you have to know. Think of them as nodes. These nodes have dependencies. As in you have to know A, B and C before you can learn D.

And so I’m always thinking about how to most efficiently traverse this graph of nodes. The efficient way to do it is to learn things in the proper order. For example, if you try to learn D without first understanding, say A and C, you’ll struggle. I think that it’d be more efficient to identify your what your holes are (A and C) and address them first before trying to learn D.

I don’t think that the “dive into a project” approach leads to an efficient traversal of this concept graph. That’s not to say that it doesn’t have its advantages. Here are some:

  1. People tend to find the act of building something fun, and thus motivating (even if it has no* use other than as a means to the end of learning).

  2. It’s often hard to construct a curriculum that is comprehensive enough. Doing real world projects often forces you to do things that are hard to otherwise address.

  3. It’s often hard to construct a curriculum that is ordered properly. Doing real world projects often is a reasonably efficient way of traversing the graph of nodes.

Personally I think that as far as 2) and 3) go, projects sometimes have their place, but they should be combined heavily with some sort of more formal curriculum, and that the projects should be focused projects. My real point is that the tradeoffs should always be taken into account, and that an efficient traversal of the concept graph is largely what you’re after.
I should note that I feel most strongly about projects being overrated in the field of programming. I also feel rather strongly about it for quantitative fields in general. But in my limited experience with non-quantitative fields, I sense that 2) and 3) are too difficult to do formally and that projects are probably the best approximations (in 2015; in the future I anticipate smart tutors being way more effective than any project ever was or can be). For example, I’ve spent some time trying to learn design by reading books and stuff on the internet, but I sense that I’m really missing something that is hard to get without doing projects under the guidance of a good instructor.
What do you guys think about all of this?

Side Notes:

*Some people think, “projects are also good because when you’re done, you’ve produced something cool!”. I don’t buy this argument.
  • Informal response: “C’mon, how many of the projects that you do as you’re learning ever end up being used, let alone produce real utility for people?”.

  • More formal response: I really believe in the idea that productivity of programmers differs by orders of magnitude. Ie. someone who’s 30% more knowledgeable might be 100x more productive (as in faster and able to solve more difficult problems). And so… if you want to be productive, you’d be better off investing in learning until you’re really good, and then start to “cash in” by producing.

1. Another thing I hate: when people say, “you just have to practice”. I’ve asked people, “how can I get good at X?” and they’ve responded, “you just have to practice”. And they say it with that condescending sophisticated cynicism. And even after I prod, they remain firm in their affirmation that you “just have to practice”. It feels to me like they’re saying, “I’m sorry, there’s no way to efficiently traverse the graph. It’s all the same. You just have to keep practicing.” Sorry for the rant-y tone :/​. I think that my System I is suffering from the illusion of transparency. I know that they don’t see learning as traversing a graph like I do, and that they’re probably just trying to give me good advice based on what they know.
2. My thoughts on learning to learn.