# Strategies for independent learners to identify gaps in their knowledge

One common concern many independent learners of computer science and tech have is figuring out what they "don't know". More specifically, the concern is that since they've never been formally educated in CS, their knowledge might have "blind spots", which can cripple them when they start working on more complex projects or try and get a job. (For example, somebody who didn't know that data structures and algorithms were a thing will very likely struggle on most standard tech interviews).

I interact with/help self-learners on a fairly regular basis, and am never quite sure what to tell them when this question comes up.

One strategy, of course, is to simply give them a list of things they ought to know -- there are many articles that give a good overview of topics covered by a standard CS degree, for example (example 1, example 2). However, this strategy doesn't generalize well: once you move on to trying to learn about something not on some list, you're back at square one.

The other strategy I try suggesting is to just read random highly-upvoted posts on StackOverflow and news aggregate sites like Hacker News -- I've personally found you tend to pick up a good awareness of different CS and tech topics almost by osmosis if you do this. However, this strategy is also flawed: it's a random and slow process, and isn't guaranteed to be comprehensive. (If a topic isn't trendy, it's likely you'll never stumble across it.)

This brings me to my core question: what are some effective meta-strategies suitable for self-learners that help them identify gaps in their knowledge?

I'm hoping for strategies that are either more generalizable or more systematic then the two I listed up above.

• You may need to define "gaps". He doesn't know about the latest technologies ? Same for me and I don't care. If you're thinking "gaps" in term of "basic programming knowledge" then what is that basic programming knowledge ? Define it and you know what to test people against to. – Walfrat Aug 24 '17 at 10:03
• @Walfrat -- ok, I'll define a "gap" as "a lack of awareness of some specific topic relevant to what the student is interested in". The topic could be big or small. For example, not being aware of the existence of data structures like lists or hashmaps is a gap. If the student is doing some data analysis in Python, not knowing about libraries like pandas or numpy is a gap. If the student is making a web page with complex layout, not being aware of the box model (and things like flexbox) is a gap. If the student is writing JS, not knowing how the 'this' keyword is scoped is a gap. – Michael0x2a Aug 24 '17 at 15:04

First off, it's worth mentioning that everybody has these "blind spots" or gaps in their knowledge. Nobody can know everything, and some of the smartest people I've met are very open about that fact. I think a big part of being a good programmer is being comfortable with the unknown. What makes a good programmer isn't that they can write code, it's that they can learn how to write code.

In that regard, a self-learner already has a lot going for them. Because it's not really about memorizing stuff: it's more about the ability to do research, consult documentation, try stuff out, and see what happens. So the best thing somebody can learn is the ability to learn, if that makes sense.

I'll also say that for me, the thing that really took my knowledge to the next level was when I started answering questions. So I'd say your recommendation of checking out posts on Stack Overflow is on the right track, but I'd encourage novice and intermediate programmers to go a step further and try to answer questions as well. If Stack Overflow seems overwhelming (it was for me at first), then maybe join a forum and start answering questions there.

If you're only familiar with if statements, then start answering questions about if statements. Eventually you'll see a question that also involves a for loop, so to answer that question you do some research on for loops. Then you start answering for loop questions, and eventually come across a question about functions... That's a contrived example, but the general flow is pretty much exactly what I experienced. Even after a formal education, it really opened my eyes up to how much I didn't know!

Find a community, share your work, talk about programming. This is one way the gaps get filled in with a formal education, so it stands to reason that this would help with a self-learner as well.

First, I will note that and are both on-topic right here on CSEducators, so this very site can be a great resource for the self-learner in computer science!

There is a saying about the self-taught student, "great student, but they had a terrible teacher!" When designing a curriculum for yourself, there is no single, easy way to make sure that your education is comprehensive within unfamiliar topic. You are dependent, then, on organizations of the material provided by other people.

When I am self-teaching, my first job therefore becomes to find a textbook. Sometimes the textbook itself is rather too difficult to use as a single source, but this is okay! The introduction and the Table of Contents are actually the most important two items in the book for my purposes. The introduction typically lays out the central thinking behind a topic and a coherent philosophy about how to best learn it, and the Table of Contents lists all of the important topics. If the contents of the book are also useful, then I simply count my lucky stars at having found such a wonderful book!

For secondary resources, students can seek out tutorials (either written or video), documentation (if they are capable of learning from APIs), or online coursework. They can then use the textbook TOC as ther guiding star, and work their way through the topics that they need. Using the TOC as a basic guide about what is contained in this topic means that students can make informed choices about what they need to study as they work their way through the program they've designed for themselves.

I faced this issue, a few years ago, when I started taking on .NET development projects. For instance, I would run into a piece of code that I never really heard of, but I see that there would be a lot of chatter about it online forums/stack overflow and so on. The more I continue to work on the project, the more I realised that I simply did not know so many things aka gaps on what I have self-taught.

At that point, I decided to go to the official docs of .NET (MSDN), read through the whole thing. Simultaneously, purchased the official Microsoft recommended books on dot net C sharp, and went through the entire book. When I was done with MSDN and the book, I had an entire list of things I had never even heard. One by one, I self-learned them as well, filling in the gaps.

I had to do this many times (for windows phone, windows 10, web and so on) and each time, this method has worked to my benefit.

This answer is based on the following comment from the OP :

I'll define a "gap" as "a lack of awareness of some specific topic relevant to what the student is interested in". The topic could be big or small. For example, not being aware of the existence of data structures like lists or hashmaps is a gap. If the student is doing some data analysis in Python, not knowing about libraries like pandas or numpy is a gap. If the student is making a web page with complex layout, not being aware of the box model (and things like flexbox) is a gap. If the student is writing JS, not knowing how the 'this' keyword is scoped is a gap

To me those gaps are, except the first one, not important. They're easily filled once your student understand that they should always search first how some things are usually done instead ofdoing it from the only basic component of the language you know (components = keyword and basic libraries). The same can be applied when searching for a data structure than do the job for you, not for doing your own data structure and their algorithm however.

The learning "this in JS" thing is more about having read some others code and when seeing something unknown, asking or googling it. Unless you require students to eat a book for everything they miss, they won't always get what they're missing, since it's missing.

A good way for me to fill those kinds of gaps good enough to start practice is to read some article like this one https://www.infoworld.com/article/3196070/node-js/10-javascript-concepts-nodejs-programmers-must-master.html. Then I practice and each time I can, I try to get deeper in what I do (more advanced usage of the language, framework, library).

It contains basic concepts specific about the language so when you read the doc of a library you use, you understand the structure of the samples codes given. The rest will come by practicing. However this way require you to have already experience in others languages and having the basics (type, list, loop, if, basic algorithm, encoding if necessary, ...).

However when it comes to larger gaps like concurreny/asynchronous, data structure with their algorithm it's another matter. This is something you need to understand as a whole (concurrency : thread, process, schduler, context switch, callback) in order to use it properly. And for that I will go back to the standard CS list you have given in your post.

TL;DR :

• Gap as a localized concept/technical element missing can be learned alone once you have your basics and some practice.
• Basics and general concepts need to be learned and understand as a whole, this require either teaching, or a (good) book. A good way to convince someone that he need to understand a concept before using it is to crash them against concurrency/encoding and others things you just can't get right if you only try to "make it work", specially if you try to make them work in a real world not a simple exercice with 3 sample data.