Note

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