Welcome to further reading and notes from the Your Own Personal Bootcamp talk. It was great seeing you all at PyOhio this year and I can’t wait to come back again. I hope that, if you were able to see the talk, you were able to pull something away from the talk and had as much fun watching it as I did giving it.

To find out more about the Dreyfus Model of Skill Acquisition, you can check out the [Wikipedia page] on it and read this excellent article on applying it to your situation: Use the Dreyfus Model to Learn New Skills.

Read up on more information about Tech Elevator where I work as a Curriculum Developer. Check out our events schedule too and come visit us for an Open House or just come to one of our many hosted meet ups.

I also have a couple of articles on this site that you might find interesting:

And finally, I have added in my original notes below. This isn’t exactly how the talk went and they’re pretty rough, but it was the original inspiration and brainstorming I did for the talk. Hopefully, it’s helpful for you.

And here’s the video, if you’d rather watch that!

I’m Joseph Erickson. I’m a curriculum developer at Tech Elevator, a 14 week bootcamp with 5 locations in the rust belt and growing. One of which is in Columbus.

Our grads learn a variety of skills while in the program including either Java or C#, MVC architecture, modern CSS, the Vue JavaScript framework, building and connecting to APIs and a bunch of stuff in between. All in 14 weeks of full-time, intense training. No one comes out of this an expert, but they do come out with a good head start for a junior dev role, or so our hiring partners tell us. companies hire the students we train and keep them. And are very happy with them.

We take them from complete novices at times to competent developers. We do carefully screen candidates to make sure that they could compete in a fast paced program like ours. We also have designed the curriculum, and constantly refine it, to gear it towards the best learning experience that we can get. Part of my role there is to study how learning happens and look at what best practices there are out there around teaching, knowledge retention, and efficient learning techniques. This talk will focus on that. But enough about me. Let’s talk about you.

As people in technology, learning is something that you all will never stop doing. New things come out and you need to pick them up for your jobs, your personal interest, and your career advancement. And you want to learn efficiently. This talk is all about that. How to learn without the floundering.

One think I’ve learned is that this is mostly mental. And I don’t mean just learning wise, I mean morale wise. One thing we work hard on at Tech Elevator is having students win the mental game of “I’m not good enough”. That’s a hard lesson to learn whether you are in a bootcamp or have been in the industry for 20 years. But it’s vital to effective learning. Knowing you can. Proving to yourself that you can make progress. Being able to celebrate small wins.

“Of all the things that can boost emotions, motivation, and perceptions during a workday, the single most important is making progress in meaningful work.”

It has been shown time and time again that small wins really matter, seeing progress matters way more than making progress. This must be kept in mind when learning. And brings us to two very important needs as we move forward, we need to make progress in the learning in the most efficient way possible and we must see that progress along the way or we will give up even if we are almost complete.

Rule #1: You must be aware of your progress

How do we go from knowing nothing to being able to actually do something? Many people have studied this over the years, but there’s one model that speaks to me and made a lot of sense in how I’ve found myself learning over the years and how I’ve seen bootcamp student pick up the skills they will need to know on the job.

The Dreyfus model of skill acquisition is an attempt to explain and guide how an adult learning actually picks up a skill enough to perform tasks in it. It lays out a series of stages that you’ll pass through and gives some guidance in how best to learn at each of the stages.

The first stage is the novice. This is someone who knows nothing about the subject.

Next is beginner. The beginner has some knowledge of the subject, but that knowledge is very situation specific. They know how to do this thing, but thinking laterally and applying their new skills to other problems they haven’t seen will be hard.

Then, competent. The student can now begin to explore the wider world of the technology. Begin to learn what else is out there.

Proficient is next. After looking at a couple of options, the right course is generally pretty clear. This is where intuition starts to kick in.

Finally, expert. Things are now obvious. You couldn’t say exactly why a certain course of action is right, it just is. You can usually justify yourself after the fact, but it usually boils down to, “That just doesn’t work and this does.”

Rule #2: Know where you are in the learning process

Now, let’s look at these stages and what is the best approach to learning at each one. First, I’ll start with being a complete novice, because that’s where most of us will start.


At this level, you are unconsciously incompetent.

That just means that you don’t know what you don’t know. You know nothing about the subject except maybe an introductory level of understanding about what it is. You may have heard chess is a game and seen someone play and you like games so maybe you’ll try it.

At this stage, you just need to learn the basics. In fact…

Learning the concepts. Before you can hope to understand anything, you need to have some mental model or mental picture of what’s going on. You need a structure in which to hang any future lessons. Get some code under your belt because experience is the only way to build that model.

Learn the what and the how. The why will come later, you just need to type code and make things happen. To do that you will…

You just need to run through some tutorials and example projects where someone is leading you through step-by-step. Find a couple of different ones so that you can see parts of this from different angles, but stay on the trails! Just do some tutorials first. The practice really matters. Whatever you do…

Don’t dive deep into the documentation! I’ll just confuse you and try to show you alternate ways of doing something that you have no understanding of. You need to start off with one way of doing something. Follow the recipes, don’t read a triste on cooking beef through the ages. That’s how you learn how to cook.

Learn from those who are just a little ahead of you or know how to teach a novice. Many online lessons have no idea how to teach someone just starting out, because many of those people intuitively know things that novice have no idea about. We go through a lot of instructor candidates that have 20 years of experience but no idea how to explain an array to someone who has no mental model of what an array even is. You need someone who can get to your level.

Finally, focus on the technology you’re trying to learn, not on all the things. Sadly, many JavaScript frameworks need knowledge of ten different things before being able to make anything in them. Try to use CLIs or other things in the tutorial without trying to understand them. You can come back to them later and understand what they’re doing. Try to focus on doing things in the technology you are trying to learn. Many bad tutorial try to teach you Vue, TypeScript, SASS, Vuetify, Vuex and everything else all at once. You’ll never pick anything up trying to do all that. Take those one at a time if you don’t want to hate life.


Novice is a stage that is fairly quick. Once you have some of the tutorials under your belt, it’s time to start branching out.

Now you’ll start learning the Where. Where do I use this piece, where can I utilize this technique? You’re going to start experimenting outside of the nice, safe lines of a tutorial.

And you’ll do this by screwing up. A lot hopefully. The more you push yourself out of your comfort zone, the more solid your understanding of the concepts will be. You are exploring in the dark but your brain is mapping it all out as you go. You might hit dead-ends, but that’s good because the landscape is becoming clearer. Do this by…

Changing the tutorials to make them your own. Do the hero tutorial for Angular? Make it into a book review site. Made a simple note app in flask? Add more features and make it something useful for you. Don’t worry if there are already 100 different versions of your app already out there. The point isn’t the app right now, the point it going beyond the tutorial.

Take an idea and make a project out of it. Start with a todo list. Already made a todo list? Make another one. Do something simple. Once problem students have sometimes is thinking that their first project is going to be an application that reads all the scores from the MLB site, calculates all the stats for them and tells them which draft pick to take for their fantasy league. No. That’s a bad beginner project. How about an application that takes the data and shows it as a table in HTML? Yes, that’s a good project. Later add the bells and whistles. The key to this and helping to win the mental game is small wins. Try for something small. First, it will take you way longer to do than you think and second, it will give you that burst of confidence you need to keep going. That’s way more important than having something that no one else has.

This is the stage where you will move into conscious incompetence. You will know how much you don’t know. This is often called the Dip and it’s where most people fail. This is also the stage, if you are in a bootcamp, where you will hang out for about 14 weeks straight. It’s not fun or rewarding to be constantly reminded of how bad you are at something. People will do one of three things here:

  • Many people just give up. If it’s not fun anymore, why do it? I think a lot of people that take a bootcamp fall into this category. They want the structure, the outside accountability, and frankly the money on the line to help them not give up. But the emotional pain and frustration still push people to throw in the towel. But does giving up bring you closer to your goal? Try to think of the frustration as a required part of the learning process. Much like sore muscles. That means it’s working. Feeling frustrated means that you know enough now to know that there’s got to be a way and finding that way isn’t fun, but it is rewarding once you succeed, and you will succeed. Others have. A way is obviously there for you, you just need to cut down the weeds to find it.
  • There are others who will just keep doing the tutorials and spinning their wheels doing the same thing over and over. It’s comfortable there. You already know it. But dear lord it’s boring. You can’t advance unless you get uncomfortable. Unless you’re willing to get frustrated. You need to advance at some point and go off of that well worn trail.
  • The third option is to push through. Keep going. Put in the time, even when it’s not fun or it’s super frustrating. You will succeed if you keep at it. Practice is the only thing that will get you there.

That makes it super important that you track your progress. Be sure to take stock any time you think you’re not getting it. Make a list of the concepts you understand and those you still want to get. and then mark them off as you figure them out. Progress is very hard to intuit in programming, so make it visual and make it obvious. that will go a long way in improving your morale as you learn.


Finally, the hollowed lands of competence. Competence is born out of practice and application, as is every stage. Books will only get you more to learn. This is the stage of the junior developer, you might not be able to create a full project from scratch, but you can do independent work on a real project.

Now is the time for some simple paid work or real on the job training. A personal project that is more complex is also good. Why these? Because paid work will tell you things to do that you haven’t even thought of, and that will stretch your skills even further. These aren’t things that you’ll do in a tutorial or that you’ll even find in the documentation. They are new ideas that you’ll have to fit into your mental model of the concepts and see how the concepts can be used in different ways. There should be lots of questions and unknowns at this stage and lots of answer finding by google searching and experimentation.

This is when you will enter the world of conscious competence. You’re not perfect at everything, but you can see how your hard work it paying off in progress and competence. Having someone pay you for that or acknowledge your achievements is exactly what you need right now.

Now that you can perform in this skill, it’s important to start digging into the Why of what you’re doing. Why does the documentation tell you to do something this way and not that way? Why does the data seem to magically update itself? These might have been questions you have asked yourself all along, but trying to figure out why before you’re ready might lead to confusion and misunderstandings. But now that you have some competence under your belt, it’s a good time to dig deeper to really solidify the mental model of how things are working.

Either on the job or off, find someone who you can ask deeper questions to and review your code. Earlier, it was way more important that you get things to work and feel good about that. Now, a code review can point out not just better alternatives to your solutions but also where your solutions might not always work. Detailed and helpful developers will be able to help you accelerate your learning even more. Be careful of unhelpful experts. There are some that feel good telling others that their ideas aren’t good enough when they’re really just not exactly like theirs. Some developers really get off on making others feel bad. They are petty, lonely people and should be avoided at all costs.

You are at a prefect nexus point to start teaching others. You still have a fairly good feel for what it’s like to be a Novice and Beginner, so teach them what you know. It will solidify the skills for you because you have to express them in English, one of the hardest programming languages to learn. It will also force you to think about things in different ways and from different angles and help you dive a little deeper into things that “you already know”. So give talks, write posts and reenforce your knowledge.

Proficient and Expert

This is where everything comes together and certain decisions about the technology are just obvious.

This is the world of unconscious competence. You don’t even know all that you know anymore. That makes it very hard to teach novices. How do they not know what a ternary is? And how the hell do you explain it? Getting here is, of course, the goal.

Rule #3: Learn at the level you are at

Of course there are some caveats to this. Does everyone really start out as a Novice? Often in our work, the answer is no. If I already know Java, picking up Python won’t be 100% foreign. A lot of the concepts will already be there, Objects, if statements, stuff like that. That means that this Novice stage will go pretty fast. Probably with one or two extensive tutorials to see what is different.

Are these stages set in stone? No, of course not. You’ll be on a sliding scale within these, maybe competent at one aspect of the technology, but a near novice in another. There are a lot of beginning programs that work on if statements and logic all day long and have no experience with good OO design. That’s okay, just remember to branch out a little more to strengthen those areas.

The Game Plan

So, what’s the game plan? How should you approach learning that next big thing?

First, mentally prepare to fail and flounder. It’s the only way to actually learn. You will do it. It won’t feel good. But you need to move forward and you know you want this. So pay that price and be okay with it. You can struggle and complain and throw things and yell and scream and hate every minute of it. Or you can struggle.

Start with the simplest, most step by step thing. Your first goal is not to know how to do something right off the bat, your goal is to just do it. The understanding comes from repetition and from building the concept first. Skip this step, wander from the path, and you’re liable to get lost.

Remember that frustration is the sore muscle of learning programming. It’s okay to be frustrated, it means that your mental model is conforming more to reality. It’s also okay to take a break! You’re going to learn more through your subconscious than through your conscious mind. Take a walk, play ping pong, take a nap. Sleep is important. It’s how your brain gets things into long term memory so use that to your advantage.

Find a supportive site or group and use them to ask questions to. Formulating your struggle into a good question can be a great way to assimilate an idea. If you run into a site or forum where people are acting like you are an idiot for asking basic questions (Reddit), leave that forum and find a better one. You’re allowed to learn and to start at the beginning. I do recommend trying to answer your own questions and searching, but really, find a forum or people that are helpful and use them. I think that’s one of the reasons Python has generally done better than other languages, because of the helpful community.

Find ways to win. Work on small projects. The add a small feature to it. Don’t worry about the finished product. Worry about now. If you keep worrying about now, the finished project will take care of itself. Celebrate figuring out a difficult piece. All of these will keep you going, keep you learning and keep you winning.

Again, focus. Want to learn Vue? Then go through the tutorial that’s already there. I saw a tutorial that showed Vue, Vuetify, Firebase, Vuex and I don’t know what else. That’s not your first tutorial. You need to know all of those technologies before even attempting to go through that with any hope of getting anything out of it. Make simple things, then add another technology.

At Tech Elevator, we start off teaching variables. Just variables. A whole day of variable and data types. At the end, students are making front-end Vue applications that connect to a full back-end written in Java and connecting to a Postgres database with user authentication and authorization, external API integration, and not too bad CSS. We start incredibly small, but we add on every day and make sure there is constant progress.

I didn’t know half of this stuff before joining Tech Elevator. I didn’t know a lot of this stuff before starting this talk, but the act of making the talk made me solidify my concepts and put them in a format that ordered them better in my head. This is going to make me better at teaching and at building material for Tech Elevator to use to teach. Write a blog, write on dev.to, make a video, answer a question on Stack Overflow.

Writing a blog is one of the best things you can do while learning for yourself. And before you think that no one will want to read it, understand that you are in a much better position to teach beginners than many of the people post online.