Hacker News new | ask | show | jobs
Teaching other teachers how to teach CS better (cacm.acm.org)
156 points by robfig 1805 days ago
15 comments

As a university lecturer in a non-STEM subject who is currently self-learning both 'hard CS' and the more practical side of development, I have often thought about what an effective CS curriculum would be, and the thing I keep coming back to is something along the lines of guided self-learning. Nothing is as effective as curiosity, but having someone with broad knowledge and experience in the field can help guide students to not get caught up in dead ends.

In my own academic studies the teachers that were the most valuable to me were ones who nudged me in the right direction, and then mostly stayed out of the way and let my hunger for knowledge and results do its thing. But now I perceive a fundamental shift in higher education, one towards spoon-feeding in order to satisfy a strict curriculum, and I worry strongly that this sort of model is very dishonest and doesn't produce good graduates.

The biggest problem that I see in present-day academia is the bureaucratic desire to quantify and measure things, which might be reasonable if you see universities as trade schools, but is in my opinion doing irreparable damage. I'm sure there are some bad teachers out there, but the bigger problem I see is institutions that prevent good teachers from doing their thing, until only the bad ones remain.

> the thing I keep coming back to is something along the lines of guided self-learning.

As a university lecturer in CS, I agree this would be a great thing for a lot of students. The thing about CS though is a lot of students hear that programming is a path to a high paying job, and they are really not motivated to learn the subject in the way that people who frequent HN might be. They don't want to self-learn, they want to be told what they need to learn to achieve an end-goal of earning a high salary when they graduate in 4 years. If you sit them down and ask them about their curiosity, interests, or ambitions related to CS, they give you a blank stare. They just want to get paid.

This perception also means that our program is the biggest at my institution. Students from every college want to take our classes. Our department is not so big (in terms of faculty, fewer than 20), so our class sizes are huge. My PL class last year was 200 students. My systems course last semester was 160. What this means is that I can't offer the kind of guidance for self-learning. Maybe if my class sizes were 30-40 students, but not for classes of 100+ students.

And then there's the issue of what students imagine a self-guided education looks like. They want to do things like mobile app development and AI. Most students don't self-guide themselves into fields like compilers and operating systems in my experience. They just aren't interested. Hell, I wasn't interested in these topics, until I was forced to take these classes as part of the standard curriculum. Now compilers are pretty much the only thing I'm interested in! I guess that's where the "guided" part comes in, but the point is that if students are left to their own devices, I worry we'll end up with a generation of programmers who are experts at making predictive AI models and iPhone apps, but have no idea how an OS or compiler works. Then who is going to teach the next generation how to make an OS? Already we have problems hiring people in these fields. 90% of the tenure track applications from our last round of hiring were from AI/ML type researchers, with only a few systems people (2-3 if we're lucky). I even have trouble getting TAs for my PL class, because all of our available grad students only know Python and C++ for their ML research. I see this only getting worse in the future.

Ooft …’trendiness’/hype to blame…(for want of a better way of describing it - nothing against trendiness per se… :) …short-sighted also as technology moves so fast and what garnered the highest salaries in this generation could easily change in the next… (esp. if over-subscribed)… I teach guitar/bass/music production (though trying to slowly educate myself about CS as much as I can), but I get what you’re saying about learning basics - you can go blue in the face trying to explain to someone that if they learnt eg. basic harmony or acoustics or how MIDI works etc etc that they would understand eg. how to make any style of music they happen to like potentially more quickly/effectively, or that instead of learning eg. only specific interfaces/ individual siloed DAWs/platforms, they would see that they all work on basically the same underlying principles and be able to pick up and use any they wish from then on/make their own… (…counter to a lot of ‘magic’ marketing speak/youtube vids etc…). Perhaps as CS ideas become more widely used/diffused/familiar to teachers/practitioners of all other subjects, and indeed programming etc. potentially becomes ‘higher level’/more abstracted/built on specialised API’s/libraries/AI/autocomplete/visual paradigms etc. those subjects will incorporate the teaching of CS/programming/AI and eg. biology will inevitably integrate teaching of what might at the moment be called ‘computational biology’, or literature will incorporate analysis of texts using AI as a standard component of the course etc. etc.? …that might then free your dept. to focus on core concepts/constructing the underlying platforms that all these other subjects use as a base? all the best! (good article btw.)
> Perhaps as CS becomes more used/diffused/familiar to practitioners of all other subjects

I think you're spot on here. You don't see people flocking to the English department because they had heard the ability to read and write is essential to landing a high paying job.

The same will be true for programming in the future; programming will be to the CS curriculum as reading and writing is to the English curriculum. No one is teaching English majors how to read and write English at my university. But we have 4 semesters devoted to reading and writing programs, because we can't assume any student knows these things like the English department can.

Isn't that a problem on which path gets taken to reach university actually?

Many countries have specific exams in place for each university degree, and it is expected that the basis are already in place from the highschool.

> something along the lines of guided self-learning.

I don't know about the solution of this problem, but giving programming challenges to students (in groups of two) is extremely effective. Ideally, forcing the students to use a different language each time. The evaluation is automatic and both the correctness and the speed of the solution over large inputs need to be evaluated. I've seen groups of otherwise passive and uninterested students spent weekends working really hard on a problem to try to beat the challenge.

> in groups of two

I wouldn't doubt there's good research showing pair programming is a great way to learn, but anecdotally/observationally I really have trouble believing it's effective. In my experience, in at least half of pairs there will be one more skilled programmer and one less skilled programmer and the better one does the lion's share (if not all) of the work -- this is doubly true if the partnerships are randomly assigned. Even if the worse one is trying their best to stay engaged and follow along, it's just hard to do if the other person is faster than you, and you might even feel like you're being a bit of a useless nuisance by asking questions when the other person is clearly capable of working on their own. (I've been on both sides of this in different contexts, BTW.)

But I imagine my intuition must be wrong since this is such a popular teaching method -- interested to read any research/counterpoints on the subject.

I only have anecdotal evidence. But in my lab we have tried all combinations (working in groups of n, for n=1 to 4, randomly assigned or not). All setups may fail, for different reasons, but the setup that is consistently less likely to fail is two students that get along well with each other. The case when one of them is more skilled is actually very good, because then they teach the other one. There's often other work to do, like presenting the solution, or writing a short report, and they can share that work as they see fit.

As a student, many years ago, I have been in both situations: the more skilled of the group who taught the other, or the less skilled that was taught (and worked really hard because I was ashamed to be a "useless nuisance"). Both experiences have been very positive in my case.

I was swayed by the argument against working in pairs, then swayed back by your argument in favour of working in pairs. I think the key part that changed my mind was "two students that get along well with each other". I wonder if you emphasise this in your instructions to students? And if so, how?
We just let them group themselves. If there's an odd number of students, a group of three is allowed. Every couple of years there's a "bad experience", in which one of the students does all the work, or some kind of conflict. But so far it seems to be a good choice overall (after the deal, the students generally say that it was a happy experience).
> The case when one of them is more skilled is actually very good, because then they teach the other one.

Right, I get that that's the theory, it's just that I've never personally seen it work out so well in practice.

I can imagine how it's extremely useful and rewarding for both partners if you have two very motivated people, and the better one is keen to teach and even genuinely open to suggestions from the "worse" one, and the "worse" one is keen to learn. That's the model for a good partnership that most people probably have in mind when they propose doing a project like this. I've just never actually seen a partnership work out like that -- it feels like it requires both members of the parternship have top ~quartile motivation/empathy/communication skills (which as you could imagine might end up being pretty rare among randomly selected CS students...).

In any case thanks for sharing your experience -- good to know that it actually can/does happen!

To me the key part is really this:

> There's often other work to do

IMO there needs to be somewhat of a give and take situation (which can also work on other angles with pairs that already like each other for whatever reasons).

When finding a balance is just hard, straight rewarding the more knowledgeable/faster half of the pair could work too, provided there is a reliable way to identify them and how much they helped their counterpart.

I don't know about C.S., but anecdotally, I studied with another student as an undergrad and taught him Zoology. It was good for me (I was forced to explain all the concepts thoroughly) and good for him (he did fairly well in the course). Win-win.
Out of interest, do you actually force them to follow pair programming best practice (e.g. periodic switching)? Or just put them in groups of two and let them at it?
Im not the person youre responding to but I have a similar experience and I usually let the pairs make their own decisions about how they work. I've found that to be many times more effective than "switch every x minutes" or interfering in any other way. Let them work it out. I only step in if there's a problem (students not showing up, refusing to work, etc -- which is very, very rare).
I always felt cheated when teachers do this. Either I’m the better one in the pair, and I’m forced to waste my time doing the teacher’s job teaching simple concepts instead of learning anything new myself, or I’m the less knowledgeable in the pair, and instead of listening to a professional I’m stuck being tutored by an amateur who doesn’t know how to explain anything.
This was my feeling too, and so I always found a way to weasel out of groups. In the decades since though, I have come to think that it was a mistake.

In the ways you describe, academic group work is pretty similar to being a professional developer, unless you're in a solo project. The experience of dealing with people would have been more instructive (for me) than whatever ostensible subject material we were covering at the time.

My first-year CS student self would have agreed with you; I had several experiences where I (a minority student in CS) had to work with overconfident white male students who always felt the need to explain things to me that I already knew. Looking back though, these experiences have made me a more resilient person when dealing with difficult colleagues and peers I'm forced to work with.

I've always loved teaching peers because it reinforces my knowledge of the concepts being taught and gives me a sense of satisfaction. On the flip side, I feel small and maybe a bit ashamed if I'm less skilled than my partner, but if my partner's nice enough to explain things to me, then I come out with a better understanding of the concepts and a good relationship with my peer. Either way, it's a win-win situation, even if it doesn't feel that way in the moment.

> Either I’m the better one in the pair, and I’m forced to waste my time doing the teacher’s job teaching simple concepts instead of learning anything new myself,

Nothing will expose the gaps in your own understanding faster than trying to teach another person. Just being forced to verbalise your own understanding helps you remember things better, even if you already had a good grasp of the material.

> or I’m the less knowledgeable in the pair, and instead of listening to a professional I’m stuck being tutored by an amateur who doesn’t know how to explain anything.

If they understand what they're talking about you can ask questions until you understand as well as they do.

> I’m forced to waste my time doing the teacher’s job teaching simple concepts instead of learning anything new myself

IMO you can't say you really understand a thing until you've taught it to someone else. Your teachers gave you the opportunity to hone your own teaching skill, something you will use your entire CS career. Just wait until you are a senior dev holding the hand of someone more junior than you. If you think there is a skill gap between you and your peer in the same class, imagine the experience gap between you and someone 20 years younger than you.

> Your teachers gave you the opportunity to hone your own teaching skill

If I wanted a lesson in teaching, I would take a class in it. Teachers should teach the subject as advertised.

http://www.machall.com/view.php?date=2005-01-26

Teaching the course content through lectures is overrated, in my opinion. I rarely went to lectures, but the ones I did go to I was there not because I felt a need to learn the course material but because I could in some way engage with the lecturer. One lecturer would talk about how things looked in "real papers", and how new algorithms would get published even though they lacked certain key invariants, and how stupid that was. Another one revealed key insights about the material which he had gained himself. This kind of knowledge exchange is far more important than the course material. You've got the chance to hear what and how some really smart people think about difficult subjects, that's amazing!

Learning is easy, you just sit down and you engage with the material in earnest. Whether that's course material or research papers doesn't matter too much. Figuring out other people's perspective without them explicitly telling you is way more difficult.

How did you know to go to those lectures? Reputation or trying the first few lectures? Just the start of the course feels like it might not give a good enough sample.
Typically just trying the first few, then going to another in the middle of the course or so to see if things have changed.
>> Learning is easy for me, I just sit down and engage with the material in earnest.

Fixed it for you. What is true for you is not true for all.

Thank you! Learning is easy in the way that weight loss is easy (for all). The actual work to be done is easily defined and simply needs to be done, but that process can be much harder to go through for some than for others. Or perhaps you disagree even more?
I still feel that it's an oversimplification. If easy is defined by a work that can be easily defined and then needs to be done many things can be overly simplified. But I understand what you are trying to say.
Hey, life's complex. I'll never get it right, especially not here on HN :). Thanks for being understanding!
I also found courses that had discussions at lectures and prerequisite reading material to be the best, for more or less the same reason.
I'm amazed at how teaching isn't a core competency of universities.
It's crazy that the people doing some of the most complex and demanding research on the planet are the ones who teach under graduates too, trying to get tons of papers published, etc, etc. Obviously the educational quality suffers when davulty have to do so many complex and different things at the same.
Some of that research is also unreproducable BS, but that's another rant. I agree, though. Combining teaching and research into one job makes no sense, especially for how much the students pay.
Overall good article but I was expecting an in depth assessment of how to actually teach CS. I was particularly interested in hearing how teaching CS might be different from teaching other subjects, particularly math, engineering, etc.

Instead the article was more about why student reviews are not a good way to evaluate the teacher. It’s like letting your toddler decide what’s for dinner… “ice cream and candy, again?!?!”

IMO the big difference between CS and other subjects like math, engineering etc. is big tech. No one goes into a math degree at 18 thinking they're going to be earning $200k in 4 years time. But in CS, this is the general expectation of students. They are obsessed with learning everything they need to know to pass Google's and Facebook's white board exams. Students demand prep sessions to help them pass, where we just give them interview questions to solve. They are not so interested in learning CS for the sake of learning CS.

Students and parents view our CS department like a trade school. They are very focused on us teaching "practical" skills that students will use when they enter the work force. I think that's something we should do, but that's not all we should do. But any time we try to teach more theoretical CS concepts, there's always a lot of push back like "How will I use this thing when I'm at FAANG, and if I won't then why am I even learning this?"

Then there are employers, who have in the past come to us trying to get us to teach their tech stack so they don't have to. They wanted us to convert our entire curriculum to .Net, because that's what they use. Would that ever happen in the math department? I don't think so.

> "How will I use this thing when I'm at FAANG, and if I won't then why am I even learning this?"

Maybe college has changed since I went there, but a similar question was asked and the professor responded with "you are free to drop the class." It was a required class for a CS degree and when the student pointed this out, the professor said that it's still freshman year, feel free to switch majors and that they should shut up because they were interfering with everybody else who (unlike them) were actually trying to learn something.

If you follow through the links, you'll find this: https://www.lifescied.org/doi/10.1187/cbe.14-02-0023

It's actually got a table of teaching practices, which they presumably want to see. I went through them and it looks like good stuff to me. I do a lot of it, though some wouldn't fit my (non-CS) discipline well.

I was hoping for something more CS specific as that list seems to all be fairly generic pedagogy; it's been known for a long time e.g. that quizzes help memory formation and that more immediate feedback aids learning.

One thing they mention that I think is a problem with CS is:

> connect with student prior knowledge and beliefs

I do not know how do do this in a group larger than about 6-8 (I'd say 2 pizza rule, but you need more than 2 pizzas to feed 8 college students :)

In particular since much computer related learning prior to joining a college level CS class is some combination of: informal, self-taught, and/or poorly taught. This leads to a very wide variety of prior knowledge and beliefs, most of which are subtly wrong in important ways.

In a small group it's trivial to address these as they come up, but I can't imagine trying to anticipate them for a larger group.

I switched to CS from Physics and immediately noticed this difference. At first I just thought it was because physics classes were smaller, but I had no classes with less than 10 people. Then I realized that there just wasn't that much variety in the misbeliefs my physics peers held; partly because we had fairly similar backgrounds (most had taken AP Physics in High School, and had read a selecton from a fairly small pool of pop-science physics books).

I'd actually be interested in seeing a taxonomy of specific misbeliefs in CS (or really any field). Such a summary would probably aid teachers as well; most good teachers will have an intuition for the categories, but organizing and naming things can help one think in a more structured way about them.

Not, computer science, but Laurent Bossavit's "The Leprechauns of Software Engineering" covers exactly that: folklore that has mutated into fact. 10x programmers, the cost of change curve and more. Terrific read.

https://leanpub.com/leprechauns

I noticed that the pedagogical ideas were fairly generic too. That's why they work for me when I'm in a completely different discipline.

I think that taxonomy is a great idea. Maybe it's something that could be developed inside a department with a wiki?

In my university every new faculty member needs to go through 200 hours pedagogical training and further 50 hours of training every 5 years. But it is unfortunate that these training programs are same for all disciplines and designed by pedagogical theory people with no CS or even science background. It was a waste of time who focus mostly on theory of pedagogy which is hardly applicable for CS.
It's been nearly 20 years since I took a course taught by Mark Guzdial. What I remember most from it wasn't anything about his teaching style but that the correct answer to nearly any exam question that starts "what is the best programming language to use for X" was going to be "Squeak," and there definitely would be such a question on the exam.
It's incredibly easy to learn how to hack, and not how to abstract good design in a problem.

Anyone who opened a 1980s PC mag could be shown how to implement basic FOR or WHILE or if/then/else expression logic in BASIC and achieve huge outcomes: playable games, interesting solutions.

Learning how to craft code so its "better" is really hard. Abstraction is a distinct skill.

The mathematical underpinnings of code lie in things like logic, and group theory, higher order functions, recursion, you name it. These are not things to acquire by asking your kid next door to show you how his mod-scene ASM works.

I studied CS over 40 years ago. I think I'm still deficient, at the end of my career. CS is hard.

Understanding the implications of code on memory, performance, critical paths, safety, provability, type-safe all come with rules of thumb (engineering) which can often be acquired by the kid-next-door path, and fundamentals in their theory which really cannot.

FP is at the extreme end of hard-to-acquire, especially if your entry was imperative hacking.

> I studied CS over 40 years ago. I think I'm still deficient, at the end of my career. CS is hard.

Name one system you worked on in your career that was “abstracted well” and built to the quality uncle bob thinks is good. I bet you can’t. Because they don’t exist. Not in the framework that this industry now measures “abstract well” in.

It’s a square peg in a round hole. Writing software is more like composing music than it is an engineering or maths discipline no matter how much people really want it to be. (Hardware is a different story)

Come at me bro :)

I don't think Bob's standards are preferable. Or, in the likeness of Yegge's Execution in the Kingdom of Nouns, I present:

void get_coffee() { /* ... */ }

void move_away_from_obstacles(auto what_to_move_away) { /* .... */ }

void place(auto object_to_place, auto to_be_placed_on) { move_away_from_obstacles(where_to_place); put_object_on(to_place, to_be_placed_on); }

void sit() { place(butt, seat); }

void prepare_mind() { get_coffee(); sit(); }

void get_opinion(int on_whom) { /* .... */ if (on_whom == UNCLE_BOB) { return create_opinion("too many short functions"); } }

void get_opinion_of_uncle_bob() { prepare_mind(); opinion my_opinion = get_opinion(UNCLE_BOB); return my_opinion; }

Haha, this is really good, never seen it. But one piece of the uncle bob's advice says you should order your functions from higher level abstraction to lower level, then it reads like a book and you can stop at any time you get the understanding of the code. So your example reordered:

void get_opinion_of_uncle_bob() { prepare_mind(); opinion my_opinion = get_opinion(UNCLE_BOB); return my_opinion; }

void prepare_mind() { get_coffee(); sit(); }

void get_opinion(int on_whom) { /* .... / if (on_whom == UNCLE_BOB) { return create_opinion("too many short functions"); } }

void get_coffee() { / ... / }

void sit() { place(butt, seat); }

void place(auto object_to_place, auto to_be_placed_on) { move_away_from_obstacles(where_to_place); put_object_on(to_place, to_be_placed_on); }

void move_away_from_obstacles(auto what_to_move_away) { / .... */ }

I've always found this advice confusing and contradicting. Higher level to lower level doesn't read like a book. To make it read like a book (or an essay), you have to "flatten the tree", do something like:

void get_opinion_of_uncle_bob() { prepare_mind(); opinion my_opinion = get_opinion(UNCLE_BOB); return my_opinion; }

void prepare_mind() { get_coffee(); sit(); }

void get_coffee() { / ... / }

void sit() { place(butt, seat); }

void place(auto object_to_place, auto to_be_placed_on) { move_away_from_obstacles(where_to_place); put_object_on(to_place, to_be_placed_on); }

void move_away_from_obstacles(auto what_to_move_away) { / .... / }

void get_opinion(int on_whom) { / .... / if (on_whom == UNCLE_BOB) { return create_opinion("too many short functions"); } }

No system I worked on in my career still exists and is abstracted well.

Music is a sub-arc of Maths. You know that, right?

Any recommendations for getting more of the fundamental knowledge and not being the next store neighbor?

I feel like I'd be a much better programmer had I studied CS, but it's difficult to also self study when working so I'm trying to find some balance to learning. Like, easy reads that will show immediate improvement to keep me interested, instead of picking random dry textbooks.

This is particularly interesting to me as I've been building a CS education platform this year (https://qvault.io). My favorite bit was right at the end:

> In computer science, we often have a model of teaching that is heavily focused on content matter knowledge—if you know your CS, you'll likely be a good teacher. But all our evidence about quality teaching says that that's wrong. There's a lot of knowledge involved in teaching computer science well, and perhaps the most important is pedagogical content knowledge.

Basically, its not enough to understand your CS, you have to understand how to teach the CS.

The same applies to any field. The primary skill of a good teacher is...teaching. Domain expertise is important but still secondary.
Working in IT but having a commercial pilot license, it's bizarre how continuing education in IT is non-existent, yet mandatory in the aviation world - and IT people don't even know it.

To teach in aviation in the US, you need a Chief Flight Instructor (CFI) rating, where you demonstrate to an examiner how to teach the various maneuvers.

IT could learn a lot from regulated industries like aviation.

https://en.wikipedia.org/wiki/Flight_instructor

Education in IT is so continuous that people don't recognize that it's happening. Every use of google counts.

You can either have a dynamic field or a mandatory curriculum. Once the curriculum is fixed, the field advances at the speed changes can be pushed into the curriculum, which is at best annually.

lmfao, pedagogical education is its own discipline and becoming a competent teacher takes proper education and training. Googling how to teach ain't going to do shit for you.
There's no evidence that education degrees make teachers more effective. If an entire degree in pedagogy has no detectable effect on student outcomes how can it help become a competent teacher?

> It's easier to pick a good teacher than to train one: Familiar and new results on the correlates of teacher effectiveness

> Neither holding a college major in education nor acquiring a master's degree is correlated with elementary and middle school teaching effectiveness, regardless of the university at which the degree was earned. Teachers generally do become more effective with a few years of teaching experience, but we also find evidence that teachers may become less effective with experience, particularly later in their careers. These and other findings with respect to the correlates of teacher effectiveness are obtained from estimations using value-added models that control for student characteristics as well as school and (where appropriate teacher) fixed effects in order to measure teacher effectiveness in reading and math for Florida students in fourth through eighth grades for eight school years, 2001-2002 through 2008-2009.

https://www.researchgate.net/publication/227414368_It's_easi...

http://www.hks.harvard.edu/pepg/MeritPayPapers/Chingos_Peter...

Every time the "how did you get into programming" discussion comes up, a large chunk of people on HN report being autodidacts. It's far more widespread in programming than any other kind of profession or speciality. I feel this hasn't been seriously investigated or taken into account.

Not googling how to teach, but skipping the entire "teaching" process altogether.

The post is about teaching CS, not learning it. They are related but different disciplines.
The analogy doesn’t really stack up, flying a plane is nothing like designing software or even managing software systems. Imagine if aviation had a few million kinds of planes to worry about where pilots were expected to modify their planes in flight, in might begin to resemble IT.
That's the reason why CS degrees teach core principles, not a collection of every possible platform and technology.
Yes, and teaching such very abstract things is very different from teaching flight.
For 99% of work out there, flying a plane is higher stakes.
Anyone working in IT who doesn't continue to learn will likely be out of a job soon enough, but it's much less likely that anyone would be injured as a result.
Maybe not "IT" because IT includes printer toner replacing and stuff

but software engineers? definitely.

"Definitely" what?

The parent comment called it IT, so I called it IT, but if use the more specific term "software engineer" I'm still going to say that most software engineering projects aren't likely to injure people when they fail.

Software engineering just doesn't seem to fall in the category of jobs where you'd want to mandate ongoing training... jobs like pilots or psychologists.

Definitely SE is kind of job where people are constantly learning

a lot of them even in their free time.

Teachers please use testing suites, include basic tests that can show student that they are making progress in the assignment. Have your own tests for grading (if you want).

For intermediate classes force students to use some type of version control, as in they need to submit assignments to a branch, and the branch will be graded.

When I was in college --names are elided to protect the guilty-- the school of education was a hot mess. There was a verbal meme around the campus that went something like this:

    those who can do
    those who cannot do teach
    those who cannot teach teach teachers.
The ultimate source of this is Aristotle... the original is (from memory), something like this:

  Those who can, do; those who understand, teach.
"What I cannot create, I do not understand" -Feynman

Thus teachers must be creators first. Out of 100 teachers I had, that applies to... 3?

Some years ago in the UK when teachers were leaving the profession in droves (stress, paperwork, and result of little actual teaching hours), one of the newspapers (The Guardian, I think) had a front page headline:

"Those who can, leave"

I thought this was true until I learnt bjarne did some teaching.
I thought this was true until I tried to teach. Then I realized you have to really know what you're talking about if you want to explain it to someone else.
Brian Kernighan also teaches.
My brother had him at A&M. Heard he was great.
Bjarne is an exception.
In my experience, those who teach teachers have been uniformly excellent, impressive people (teaching is hard!). Those who teach are quite varied depending on whether they actually wanted to teach or are just doing it as a fallback.
I thought it was

    those who cannot teach teach gym
The simple solution to learning CS is to just start building something.

The process of getting stuck and figuring out how to get un-stuck is where the learning actually happens.

CS and software development are different subjects, aren't they? Plenty of devs know little CS and CS academics often do no dev work. CS existed as a field before general purpose computers existed, when algorithms operated on room of women called computers.
Why do they use bit.ly?

I can't visit bit.ly links.

ERR_CONNECTION_CLOSED

"Teaching other teachers how to teach teaching to teachers" would have been a better title.
https://code.org/teach

git and HTML and Linked Data (and Reproducible Containers) should be requisite: https://learngitbranching.js.org/

Pedagogy#Modern_pedagogy: https://en.wikipedia.org/wiki/Pedagogy#Modern_pedagogy

Evidence-based_education: https://en.wikipedia.org/wiki/Evidence-based_education

Computational_thinking#Characteristics: https://en.wikipedia.org/wiki/Computational_thinking#Charact... (Abstraction, Automation, Analysis)

Learning: https://en.wikipedia.org/wiki/Learning

Autodidacticism: https://en.wikipedia.org/wiki/Autodidacticism

Design of Experiments; Hypotheses, troubleshooting, debugging, automated testing, Formal Methods, actual Root Cause Analysis: https://en.wikipedia.org/wiki/Design_of_experiments

Critical Thinking; definitions, Logic and Rationality, Logical Reasoning: Deduction, Abduction and Induction: https://en.wikipedia.org/wiki/Critical_thinking#Logic_and_ra...

Doesn't this all derive from [Quantum] Information Theory? It's actually fascinating to start at Information Theory; who knows what that curriculum would look like without reinforcement and [3D] videos: https://en.wikipedia.org/wiki/Information_theory

Stone, James V. "Information theory: a tutorial introduction." (2015). https://scholar.google.com/scholar?q=%22Information+Theory:+...

It used to be that we had to start engines with a turn of a crank: that initial energy to overcome inertia was enough for the system to feed-forward without additional reinforcement. Effective CS instruction may motivate the unmotivated to care about learning the way folks who are receiving reinforcement do: intrinsically.

From the title, I expected deepities. It failed to even meet that bar. It's a CS prof. Was the article generated?
Did you really read the article? It's packed with references, so you can go as deep as you like...
This was printed in the articles section of CACM yet it has more citations than some peer-reviewed pieces. What article did you read?