I never recommended teaching programming straight out, unless you want to get someone with a concrete/inflexible way of doing things that will not accept change. So I recommend the following still... (To Get a well rounded idea and also the ideas on how things work in the background)
1. Basic Logic teaching first
2. Teaching Basic OS & hardware building next.
3. Don't Start Programming Languages until they have learned Algebra 2 & Geometry
4. Teach Basic Algorithms next (Agnostic to the programming language or non-programming related, electronic, robotics, and hardware kits are great here and something kids like, project with Arduino can further OS and Hardware design knowledge while having fun. They also show samples of programming and how it works)
5. At this point let them learn about the various style and languages out there, and them pick a style they like (OOP, Functional or Procedural), Have them pick there own Major language that can accommodate there favorite style, and two minor one, one of which focuses on the style the most hate. Have them pick an esoteric language (like brainfuck) and learn how to "Print" there name (Not hello world) with it. Or If they want to learn assemble for like there hardware stuff above, that can take place of esoteric learning, but make sure the write something that instruct some hardware to perform at least there first moderate algorithm.
6. There picked major language if capable of all style, they should write a full program that access a database, program should be able to create update, read and delete in each style. This should provide an example of the strengths and weakness of style to a small degree.
7. Have them program 7 random things in there minor language, but more capable then print or echo statements (CRUD stuff at least), this should give some respect to mature major languages.
8. Have them write program for atleast 5 other languages (Including a Java & Smartphone app, if they have avoid those up till now).
burnt-resistor•3h 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.
flamesofphx•6h ago
1. Basic Logic teaching first
2. Teaching Basic OS & hardware building next.
3. Don't Start Programming Languages until they have learned Algebra 2 & Geometry
4. Teach Basic Algorithms next (Agnostic to the programming language or non-programming related, electronic, robotics, and hardware kits are great here and something kids like, project with Arduino can further OS and Hardware design knowledge while having fun. They also show samples of programming and how it works)
5. At this point let them learn about the various style and languages out there, and them pick a style they like (OOP, Functional or Procedural), Have them pick there own Major language that can accommodate there favorite style, and two minor one, one of which focuses on the style the most hate. Have them pick an esoteric language (like brainfuck) and learn how to "Print" there name (Not hello world) with it. Or If they want to learn assemble for like there hardware stuff above, that can take place of esoteric learning, but make sure the write something that instruct some hardware to perform at least there first moderate algorithm.
6. There picked major language if capable of all style, they should write a full program that access a database, program should be able to create update, read and delete in each style. This should provide an example of the strengths and weakness of style to a small degree.
7. Have them program 7 random things in there minor language, but more capable then print or echo statements (CRUD stuff at least), this should give some respect to mature major languages.
8. Have them write program for atleast 5 other languages (Including a Java & Smartphone app, if they have avoid those up till now).
burnt-resistor•3h ago
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.