3 ms·
One thing I would add to the excellent suggestions above is that it can be surprisingly useful to go one level below what is usually considered “software engine
by michael-lehn 2mo ago
One thing I would add to the excellent suggestions above is that it can be surprisingly useful to go one level below what is usually considered “software engineering fundamentals.”
I teach mathematics students, and over the years I've become increasingly convinced that understanding some of the machine underneath makes many higher-level concepts much easier to understand later: memory and addresses, a simple CPU, assembly, calling conventions, and eventually how a compiler translates a programming language into something the machine can execute.
There is a pedagogical principle I like: don't learn the solution before you know the problem.
For example, pointers become much less mysterious once memory and addresses are concrete. Many programming-language features also make more sense once you have encountered the problems they are designed to solve.
This is one reason I like the Computation Structures recommendation above.
I've been experimenting with a similar bottom-up approach in an undergraduate course at Ulm University. We eventually go as far as writing a small compiler, and then rewriting a smaller version of it in its own language so that it becomes self-hosting.
I've started putting the material in English here:
https://github.com/michael-lehn/not-abc https://github.com/michael-lehn/not-abc