| 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. |