Teaching how to code is broken
Typically:
- Chapter 1: Types
- Chapter 2: Variables
- Chapter 3: Operators/Math
- Chapter 4: Control structures
- Chapter 5: Arrays
- Chapter 6: Functions
- Chapter 7: Structs
- Chapter 8: Classes and Objects
- Chapter 9: Methods
- Chapter 10: Inheritance and Polymorphism
- Chapter 11: Some advanced thing X
- Chapter 12: Some esoteric thing Y
- Chapter 13: No one reaches the end so let's introduce concurrency here
This is fine for a reference book for an experienced professional. It is a terrible format for tutorials or any guidance material that intends to teach people how to code, specifically beginners.
Why? Because none of these chapters answer the most important question a reader has, the entire time, WHY!? Why is all this important and what problems does it solve? When should I use this thing that I learned? Imagine if aliens landed on earth and we teach them everything about the shape of a fork, its material, how its made, typical ways of holding it, various shapes of forks, its history, and etymology, but never tell them that a fork is used to pick up food and stick it in the mouth.
Teaching how to code should be about problem-solving and effectively using the tools of a programming language to solve it. Say for example modeling a card game. Even better if the example is a continuous improvement starting from the very basics, hard coding stuff, and then increasing the scope as follows:
- Chapter 1: Cards (Constants, literals - hard code all cards)
- Chapter 2: Suits (String concatenation, Int vs literal string)
- Chapter 3: Ordered Ranks (Arrays, Variables to store each suit)
- Chapter 4: Deck (Multidimensional arrays)
- Chapter 5: Shuffling (Loops, Control flow, Member access, Assignment)
- Chapter 6: Reusability of Shuffling algorithm (Functions, Pass by Value/Reference)
- Chapter 7: Modeling a card game (I/O, Cards as Objects, Classes/Structs)
- Chapter 8: Modeling a complex card game (Abstraction, Inheritance, Polymorphic behavior, Overriding methods, etc.)
- Chapter 9: Multiplayer card game (Sockets and Networking, Server-Client communication, Concurrency)
There are very few resources out there that truly embrace this type of teaching – e.g. the absolutely brilliant Nature of Code for beginners. Another one for experienced software engineers is Architecture Patterns with Python (models an e-commerce business from scratch).
I've found that modeling or simulating something real like a card game is very effective. It teaches students about how to translate a real-world situation/problem/thing/phenomenon into code. Teaches them about assumptions and limitations of the model they've built. Also, it teaches them about how to interrogate requirements imposed by the real world through simplification/abstraction or simply rejecting some aspects of it as "Too complex, costly and impractical to model with no real benefit or a clear use case" :-).
Image credit: https://commons.wikimedia.org/wiki/File:Croneberg_and_Stokoe.png Deafhistory101, CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0, via Wikimedia Commons