Hacker News new | ask | show | jobs
by burnt-resistor 300 days ago
Zeroth, teaching "everyone" programming is a pointless and futile gesture... it would be more effective to teach EE/CS capable students who aren't just passing through to collect a paycheck.

In terms of course planning, it's the perpetual dilemma of teaching top-down vs. bottom-up.

More concretely, teach the hardware side as such:

1. The basics of CMOS logic operation

2. Combinational digital logic

3. Sequential digital logic

4. Construction of a 4-bit adder

5. Construction of a basic ALU

6. Construction of a single cycle MCU (simpler than MICMAC)

7. Construction of a processor like MICMAC first, as a single cycle with microcoding

8. ... as a pipelined processor

9. ... add branch prediction

10. ... an L1 code and an L1 data cache

11. ... superscalar

12. ... L2 and L3 caches

13. ... specialized compute units

14. ... NUMA

Concurrently, and in parallel teach:

1. Math becoming functional/concrete mathematics

2. SICP

3. Introduction to Algorithms

4. C for concrete implementation and analysis of algorithms

5. Multiple language paradigms: Python, Prolog, OCaml, Bash, and Awk

6. Compiler construction

Gradually, also teach:

1. Engineering ethics and professional responsibilities

2. Profiling and debugging tools and techniques

3. Software and systems configuration management

4. OWASP and defensive programming practices

5. Testing, lightweight agile, and formal process methodology

6. Effective documentation

7. Project lifecycle management

8. Working effectively in a team

9. Maintaining large, long-life codebases

Engineers of the future need to do the intellectual labor to grasp and master the topics rather than being spoon-fed the minimal, easiest possible path with little explanation of the underlying technologies.