Programming is difficult. Everyone who ever tried it knows it. But there is a number of things that are especially difficult to learn or teach. You could think of them as of bumps on the road.
- Declarations – the idea that you can assign symbols to values.
- Interpreting – the instructions are getting executed one by one.
- Internal state – the idea that those assignments can change over time.
- Flow control – how the conditional statements work.
- Looping – some instructions can get executed many times.
- Macros – we can create our own functions and procedures.
- Namespaces – those procedures can have their own symbols.
- Data structures – we can define our own types with their methods.
- Object analysis – we can solve problems by defining our own types.
- Recursion – the functions can call themselves to do things repeatedly.
- Callbacks – we can pass functions as values.
- Closures – we can create functions programmatically.
- Asynchronicity – we don't have to know when something gets called.
- Locking – how to stop threads from stepping on each other's toes.
- Transactions – how to do it without locking.