I take it as the Prime Directive that I must teach every student in every class session. You may disagree, but I'm not asking to debate that question, but to look for how it might be accomplished, assuming it is, at least, a goal.

This isn't about lecture, per se. I'm not sure I believe it is possible to teach everyone with just lecture, since we all learn differently. So this isn't about what "level" at which to pitch the course. Suppose you wanted to give something to everyone in every class period. How would you proceed?

Let's assume that your class contains people of different background, preparation, and ability. Let's not assume that everyone needs to get the same thing out of each class, but something that will advance their own learning. Let's also assume that helping those with little motivation is not the main issue. I'm also not looking for a way that guarantees the result, but for techniques that make it highly likely to be achieved.

I have some ideas about this, of course. Active Learning is my big hammer. Teamwork also. Paired learning (not just pair programming) maybe, though I'd love to hear from anyone who has experimented with that (either successfully or unsuccessfully). I've done Paired Teaching with a co-instructor in which each of us does different things and takes control at different times, with different students likely preferring one of us over the other.

I once had two students who had failed a compiler course, never having had a positive educational experience land at the very top of the class in the following term. The other students there, one of my highest performing groups ever (on technical issues anyway), were very angry, accusing me of putting "ringers" in the class to make them look bad.

Note for the record that I have over 40 years of teaching experience and still can only begin to approach this, though I do believe that it is the prime directive.

Nothing in the Academia list seems similar to this, and I'm interested in CS specific ideas. I think it would be different in, say, teaching Russian Language, or Poetry.

I'm not looking for a definitive answer, but for ideas for how to structure the whole teaching process so that you reach everyone. But I'm also not looking for debate, but for practical suggestions.

  • 1
    $\begingroup$ Stack Exchange is for Q&A, not discussion. Normally discussion questions are too broad for our scope and belong in a different venue. $\endgroup$
    – thesecretmaster
    Jun 28 '17 at 14:39
  • 1
    $\begingroup$ This is really too broad. You may want to consider asking a new question about differentiation within (for instance) labs, or lecture, or code-alongs. I could write a book about differentiation within the CS classroom overall. (And I'm actually considering doing so!) $\endgroup$
    – Ben I.
    Jun 28 '17 at 16:27
  • 1
    $\begingroup$ Actually @Ellen Spertus, I'm trying to avoid differentiation, not promote it. Tracking would never be my solution, though I would look at answers that suggest it. How can help everyone learn, everyone contribute? $\endgroup$
    – Buffy
    Jun 28 '17 at 16:45
  • 2
    $\begingroup$ @Buffy Based on the DVs and CVs, I am going to close this question. What you are asking is an important issue to address, but as worded this is too broad (and to be fair, the tag confusion did not help; this is absolutely a question about differentiation). I get the sense that the community also feels this way. I do encourage you to re-ask this with a more narrow scope and shorter background, so the focus is more on the question itself. $\endgroup$
    – Peter
    Jun 28 '17 at 18:22
  • 2
    $\begingroup$ @Buffy Be short, sweet, and to the point. "What are techniques for differentiation in a CS classroom with a wide range of student abilities?" or "How do I actively engage all students in the learning process when there are great discrepancies in student ability?" Also, try to narrow it to a particular aspect - maybe lecture or first instruction or labs. Pick one aspect to focus on. $\endgroup$
    – Peter
    Jun 28 '17 at 18:54

I am not sure if your post is a statement or a question. However it is my opinion (after more than 25 years in the software industry) that some topics are just not for everyone, and computer science and programming is one of them.

I think it is an admirable goal to strive to teach every student in every class, but a more realistic goal might be to improve each student's understanding in some way in every class.

Due to the focus on STEM in schools and the prevalence of software/IT related jobs, I think an idea has emerged that anyone can be a software developer if they are simply taught well and if they apply themselves. I unfortunately don't believe that this is the case. To me it is somewhat like singing or running. Some people can naturally sing in tune and others can comfortably run a few miles at a good pace. You can hold singing or running classes and you can definitely improve anyone's ability to do either. But you aren't going to teach every single person to have perfect pitch or to run a 5 minute mile.

Computer science / software engineering is a hard science and in my opinion requires a certain type of thinking, problem solving, patience, and fascination with things that exist only in your mind. It also tends to require long hours of concentrated effort usually working alone. While I believe most people can learn enough about the topic to at least have an appreciation for it, this kind of activity is simply not something that everyone can do successfully.

I know many people that I readily admit are far more intelligent than me and have skills that I will never have who are successful in fields such as law, medicine, business, education, and music. Some of them have tried programming or engineering and did not like it which is why they pursued other fields.

  • $\begingroup$ A question, definitely. How to do it if it is a goal, not whether to attempt it. $\endgroup$
    – Buffy
    Jun 28 '17 at 14:36
  • $\begingroup$ I think nearly anyone can learn at least a bit of programming. This question isn't asking how to turn every student into someone who could be a career programmer. I agree that's clearly impossible. You have to like the logic of thinking like a computer to do it successfully and for the long term. I agree it's a mistake to think that everyone could be a coder, or even some any IT position. $\endgroup$ Mar 27 '18 at 3:45
  • $\begingroup$ I think almost everyone could eventually learn something about the most simple of programming, even if it didn't really sink in or fit with how they think. The question for me is whether that's compatible with teaching other students who "get it" an interesting amount of material in the same class. Maybe yes if you set your "learned something" threshold low enough for the students who don't get it quickly or easily. $\endgroup$ Mar 27 '18 at 3:48

Since I'm looking for techniques to advance a goal, not debate about the goal, let me give an example. It isn't definitive, but there isn't a definitive answer to the question "How do YOU do x?"

One way to involve students at any level in a programming course is to use pair programming. However, for it to work you need to set parameters. If the students always get to choose their own partners they will usually choose people similar to themselves, including ability level. So, at least some of the time I need to either assign pairs or randomize (and track) pairs. I need to assure that each student takes and fulfills their current role (driver or navigator) faithfully and that they switch roles often.

The goal in the class room is learning, not maximizing locs/hour. So slowing down the process for a bit is an acceptable cost (to me).

Why do I think this works?

The advantages for the two students, when mismatched, are different, but symmetric. The weaker student gets to watch the superstar up close and maybe contribute a bit. Even saying "I don't understand why you did that" is a contribution, making the stronger student evaluate and explain his/her choices. The stronger student benefits from these small challenges both technically and socially. They will eventually, in whatever career they choose, need to interact intelligently with others.

I also have evidence that students working in pairs (on programming or other work) tend to be much more creative than when working separately. And the "weaker" student may have things to contribute that you haven't considered and are unlikely to until you put them in a situation where they can glow a bit.

The challenge here.

One challenge is having an extremely arrogant student who refuses to work with anyone who is "beneath" them. That person has a lot to learn, though not in a technical sense, perhaps.

  • $\begingroup$ I don't disagree with the value of pair programming or your take on it, but I'm still unsure as to the question to which this is an appropriate answer. Is it merely how to get every student involved in every class meeting? I also don't see how this is not differentiation... $\endgroup$
    – Peter
    Jun 28 '17 at 17:41
  • $\begingroup$ Perhaps I'm interpreting the tag too narrowly, in which case I apologize. I based it on the description on the Tags page only. $\endgroup$
    – Buffy
    Jun 28 '17 at 17:47
  • $\begingroup$ Fair enough. That tag description is inaccurate. You are asking about differentiation. I will improve the tag. $\endgroup$
    – Peter
    Jun 28 '17 at 18:01

Not the answer you're looking for? Browse other questions tagged or ask your own question.