It’s midnight. You’re huddled in the restricted section of the library, eyes glued to powerful tomes—Creating Killer Websites! Resilient Web Design! The Pragmatic Programmer! You get a missive from your co-conspirators in the Late Night Code Club… another night of adventurous learning is about to begin.
Wait, why am I getting this email?! Welcome to the Late Night Code Club, a newsletter about learning programming together. You likely signed up for this newsletter after reading one of my posts on Dev.to or elsewhere. I haven't written here often, so please allow me to reintroduce myself. I’m Kevin McGillivray, the writer of this newsletter and your jaunty host. I’ve been a web developer and software engineer for over ten years, and I’ve helped dozens of people as they deepened their knowledge and skills in programming.
In this newsletter I hope we can share the ✨forbidden knowledge ✨ necessary to learn how to write code—the arcane secrets that are hidden between the tutorials and Twitter threads, and helpful perspectives for the moments we feel stuck, frustrated, or discouraged. Thanks for being here, and if you’re new to the club, you can subscribe here to be notified of new missives.
I’m busy writing new posts for this newsletter, but today I’d like to take a chance to share a classic from the past: The Four Layers of Programming Skills.
The Four Layers of Programming Skills

When learning how to code for the first time, a lot of learning is focused on practicing the syntax of a programming language. That is, learning how the special symbols, keywords, and characters must be written in the right order for the language to run without errors.
However, focusing only on knowledge of syntax is a bit like practicing to write a novel by only studying grammar and spelling. Grammar and spelling are needed, but there are many other layers of skills also needed in order to write a novel.
Similarly, to write code we need other layers of skills in addition to syntax. Often someone learning to code will feel comfortable with one layer of skills, but feel completely stuck in another. They feel frustrated and confused, unsure why they’re stuck simply because they’re not aware the other layers exist. The first step to getting unstuck is to identify what these layers are so you can notice where the biggest challenges are coming up! Here is one way that I organize these skills into what I call the four layers of programming skills:
Syntax skills
This is the layer that is most often focused on in the early learning phase. Syntax skills essentially means how to read and write a programming language using the rules for how different characters must be used for the code to actually work.
Programmatic thinking and concepts
Programmatic thinking means how to think like a computer and translate a process into a specific set of instructions that a computer can understand. It also means understanding programming concepts like data, variables, functions, objects, etc at a more abstract level than how to write them in syntax. This isn't about writing the correct symbols in the right order, it's about how to communicate a specific series of steps to the computer that it's capable of completing.
Humans are capable of both intuitive/visual thinking and logical/verbal thinking. If you were asked to identify the tallest person in a room, and it was a small room with just a few people, you could scan the room visually and quickly pick out who is the tallest. Most computers can't do that, and computers that are capable of visual and language processing don’t do it the way the human brain would. So, for most computers to do the same thing using a programming language, we'd need to come up with a more specific and logical process for identifying the tallest person.
Let's imagine a room with a thousand people instead of a few people. Some people would be too far away to accurately assess their height, and there would be too many comparisons to make at once to be certain that you've found the tallest person. In this case, you'd need a logical process just like the computer would, and there are many ways to approach it. You could ask everyone to write down their name and height, and then you could sort through the thousand slips of paper to put them in order. You could ask everyone to line up, and then compare the height of the first and second person in line. Take whoever is taller from that comparison and compare their height to the third person in line. Whoever is taller in that comparison, compare their height to the fourth person in line, and so on until the end.
To write code, you need to be able to define this type of logical process (an algorithm), and then understand how that translates into the way a computer processes information. The syntax is then simply the standard used to communicate the process to the computer. While sorting by height is an example of a basic script, this is a very deep layer of skills that also includes more and more complex and abstract processes and systems all the way up to the architecture and design of large scale applications.
Creative skills
Here’s a secret: if you know the syntax for a language, and you have a clear understanding of programmatic thinking and concepts, you still might not be able to write code. When you're faced with a programming problem, you still need to answer the question, "how exactly do we get from point A to point B?" Even with a mastery of syntax and concepts, you'll still be faced with a blank page when you sit down to write code, and need to figure out a good way to get started from many potential paths.
Just like with the tallest person problem, there is typically more than one way to do something, and the more complex the problem is, the more ways there are to solve it. Syntax has one right answer—it either works or it doesn't. Programmatic thinking has many possible answers. There often isn't an answer you can simply copy and drop into your code, and even the problems that do have common solutions with examples you find online may have even better solutions that haven't been created yet.
At some point in the process, in order to write original and unique code, you're going to need creative skills. There's a myth that creativity is something you're born with and that it can't be taught, practiced, or learned. The truth is that creativity is a skill just like any other skill, and it can be practiced and improved. Creative skills include things like:
Experimenting
Rough drafting/sketching code
Brainstorming
Editing
Outlining
Taking breaks
Researching
These creative skills are necessary to figure out an answer when it's not obvious what it should be—to navigate going from a rough draft to a final draft with all the bumps and detours in between.
The best thing about these skills is that they don't just apply to programming—they can apply to anything you're doing from cooking to writing to playing a sport, and if you have other areas where you practice creativity, that can help you apply more creative skills to programming.
Interdisciplinary skills
Writing code is never just about writing code—writing code is always connected to something else. Maybe you're making a website about tea, or a fitness app, or a website for a local car maintenance shop—code always exists in a way that's connected to other topics, not in a vacuum by itself. Having skills and knowledge in lots of other areas besides programming not only helps you make projects related to those areas in a more thoughtful way, skills borrowed from other fields can influence the way you write code and help you come up with solutions you wouldn't have considered otherwise. Balancing programming with curiosity and exploration of other topics makes programming even better!
Different students find different layers easier or more challenging than others. Many people who have no problem remembering syntax struggle with programmatic thinking. Many people who have no problem with programmatic thinking have a very difficult time remembering syntax. All layers take time to practice and gain fluency. As learners, recognizing this makes it easier to get unstuck when things are difficult because we can identify the area that is most challenging at the moment. As teachers, when we recognize the whole spectrum of skills that need to be developed, we can make sure we create exercises that cover the entire range.
Thank you for stopping by the Late Night Code Club! If you enjoyed this post, I hope you’ll subscribe to be notified of new posts in the future. Thoughts, questions, suggestions? Let me know in the comments below!