Full disclosure, I'm not a father, though I have thought a lot about introductory CS education.

1. Let the student drive the learning.

We all have our own views of what fields are interesting, exciting, and worth studying. They've been shaped by our own past experiences and views of what's important or useful at large.

Students, especially young students, are still forming their worldviews. It's possible to condition them to think one way, but these views will always feel "forced" or "alien" compared to views they arrive at themselves.[^1]

Thus, it's important that the students drives the learning. This is largely done by perpetually asking questions. Knowing the answer without being intimately aware of the question is nearly useless. Curious students will ask better questions, internalize the knowledge better, and drive their own learning.

As it turns out, this applies to all learning, not your specific question related to programming/computing. Let's explore that question next:

2. Prioritize computational thinking.

Specific choice of languages in industry come and go. You identify this trend yourself: in recent years languages like Go and Elixer appear to be gaining popularity, perhaps even at the expense of languages like Ruby or Java. Whatever the general trend maybe, language choices always vary. However, there are two tenets which remain relatively constant.

a. "Computational Thinking" provides a framework for problem solving

Computational Thinking, as popularized by Jeanette Wing[^2], basically just means thinking about solving problems in a way that formulating the solution resembles the process by which you could encode the solution on a computer. Regardless of the choice of language, programmers and computer scientists still approach problems algorithmically and formulaically. This skill set is more important than knowledge of any particular language.

b. Language paradigms change infrequently

Across all the industrial trends in language choice, languages in popular use can largely be categorized by the extent to which they utilize two paradigms: the imperative paradigm, where programs are built of a series of state mutations, and the functional paradigm, where programs are built from mathematical functions with a focus on composition.

Familiarity with both of these paradigms is important, and indeed they complement each other.[^3][^4] Most languages are not purely functional nor purely imperative. However, being able to recognize and identify these features will facilitate learning new languages as they arise.

3. Embrace child-like wonder.

As we get older, there's increasing pressure to not be "surprised." People say things like, "Wait, you didn't know that? Everyone knows that." As a result, we are conditioned to contain our excitement when learning new things.

As it turns out, people are learning and getting excited about things all the time. Excitement is infectious; if you are always excited and passionate about the things you're learning (or teaching!), that excitement will spread to those around you.

> Never lose sight of that child-like wonder. It's just too important. It's what drives us.

> -- Randy Pausch, The Last Lecture

—————

[^1]: Cf. Inception

[^2]: Computational Thinking, Jeanette Wing. https://www.cs.cmu.edu/~15110-s13/Wing06-ct.pdf

[^3]: When Carnegie Mellon restructured their entire introductory course sequence in 2010, it was driven by these ideas. Freshman take two courses: Principles of Imperative Computation, in C, and Principles of Functional Computation, in Standard ML.

[^4]: Introductory Computer Science Education, A Dean's Perspective, Randal Bryant et al. http://reports-archive.adm.cs.cmu.edu/anon/2010/CMU-CS-10-14...