Do you see the "Bimodal Distribution" too?
Ah, the famous bimodal distribution in computer science!

When I took my first CS class in college, I frequently helped out a fellow student in my section who struggled mightily, spending unreasonably long amounts of time on seemingly simple labs. We made very little headway together. In spite of a semester-long effort bordering on the heroic, the student just couldn't seem to get programming.  

I asked my professor about it late in the semester, and he said that there were a certain number of these students every semester, and that he didn't really know how to help them.  He said that, if they didn't withdraw and kept working, he would let them go with grades of C instead of the Fs they actually earned on their exams.

I saw it again years later, as I started teaching my first computer science courses.  In every class, there were some number of kids who just didn't get it.  

And I was not alone!  Others were seeing it, too, and there was even an unpublished research paper that started to make the rounds on the internet called The Camel has Two Humps, which asserted both the bimodal nature of the field and that they had created a test that could predict who would be able to "get" it.  That paper was hardly the beginning of the story.  In fact, professors have been investigating this bimodality for years.

Lately, however, the story has been changing.  The author of the original unpublished study issued a partial retraction, and researchers began looking at far larger datasets of introductory CS grades.  It turns out that that bimodal distrubution is not really bimodal after all.

So what is going on?

When we teach programming, we want our kids to be able to program.  So we test them on programming, and we want to heavily weight our grades on, well, whether or not they can obtain the proper output.

To illustrate this, let's take a hypothetical problem prompt, and some sample answers.  The question, which will be in an introductory Java class, will read, "Create a function called makeN that, given a number n, fills and returns an array with $n$ sequential values".

Answer 1:

public int makeN(){
    array[n] = 0;
    array++; // until its done
    makeN = array;
    return makeN;
}


Answer 2:

public int[] makeN(int n){
    int[] array;
    for(n &lt; array.length; n++)
        array[n] = n;
}


Answer 3:

public int[] makeN(int n){
    int[] array = new array(n);
    for(int x = 0; x &lt; n.length; x++){
        array[x] = x;
    }
    return array;
}


Answer 4:

public int[] makeN(int n){
    int[] array = new int[n];
    for(int x = 0; x &lt; array.length; x++){
        array[x] = x;
    }
}


There's a clear progression among these answers, and they represent vastly different levels of understanding.  Unfortunately, our topic requires students to be able to pull together many different concepts in order to do almost anything.  If we were to grade by whether the answer fulfills the prompt, they would all receive the same grade.

I actually have come to believe that, in a good rubric for a coding example, "actually produces the proper final output" should either not be present at all, or should be worth a miniscule amount of credit.  A good rubric will capture attempts at portions of the algorithm, and successfully achieving steps of the algorithm.

This example above may have been extreme, and I doubt if most teachers would award exactly the same grade to answer 4 as they would to answer 1, I this cognitive bias certainly exists (I possess it myself), and it seems perfectly plausible to me that examples 1 and 2 might receive almost identical grades.

The trick to get out of bimodal thinking, then, is to break down the skills into smaller subskills, and break those down into further and further tiny understandings.  This has two benefits: first, you see the clearer progression among your students, and two, head-scratchers like answer #1 become actionable, and you can see how to help the student to improve.

Student #1 may never quite get to a complete picture during your class - he or she clearly has a lot to learn! - but it is unreasonable to the student (and to you) to demand basically 100% comprehension in order to avoid failure.  And taking a partial understanding as a partial success shouldn't just apply to the student. It's the teacher's success, too.