

Java in College: "You might as well be teaching Chinese to a monkey." - bprater
http://pshaw.wordpress.com/2008/10/18/i-have-no-idea-how-difficult-my-class-is/

======
mdasen
I don't believe that programming is something you need to just get. I've seen
a lot of people struggle on assignments like these as a TA. Usually, it's that
they're missing certain concepts, but they don't know which ones and they
can't debug themselves. If you know 70% of basic Java, you won't be able to
create a working solution. You'll get tripped up on a type mismatch error that
just makes you bonkers until you give up because you don't know what the error
message means or you tried to make a templated array rather than an Object
array and casting it to a templated array or whatnot.

There are lots of little pitfalls in programming that are just terrible. In C,
you can just walk off the end of an array (or the beginning). In Java, you can
store an object in an array and then modify that object in both the array copy
and the one you have in a regular variable because Java works by reference,
not by copy. A lot of the time, you just need someone who is a lot more
learned in programming to notice that. It's not that you don't get a concept
like object references, it's that if it's not in your mind, you don't notice
when your code does it and it takes a long time for these things to really get
into your mind to the point that you catch them fast.

And most people give up. You get hit enough times with silly things like these
and you just want out unless you're truly dedicated. I know when I was
learning, I hit all the trap doors. It's why I noticed them when other
students made them. Heck, back in the old days of Java, you could easily screw
up things like int vs. Integer and not notice it - especially since a lot of
professors might not make a distinction because for veteran programmers, we
know that pitfall, but also because its place is at the start where students
get inundated with syntax and such a distinction might go unnoticed (or
abbreviated as int in notes).

I would think schools should hire more TAs to help students through those
pitfalls except that most students like to do assignments at the last minute
where these errors become the source of the mind-breaking stress.

~~~
Xichekolas
I have to wonder if a language with _less syntax_ would be easier to pick up.

Start people that are totally new to programming with something like Scheme or
Ruby (surely there are even better ones than these) that requires less arcane
punctuation to do things like hello world, then once they get the hang of
things, slowly introduce them to more structured languages.

~~~
tdavis
I think the problem with those languages is they're _too_ different for a
starting course. Scheme is obviously very powerful, but its syntax is wildly
different than most popular programming languages used today. As for Ruby,
don't even get me started. There's practically no syntax at all; merely
reading it agitates me.

I think, in the beginning, people are most likely to understand concepts like
Objects (Circle, Square, etc.) and how they relate to other stuff since it's
so based off how we normally think. Also, since Java is statically typed, I
think it makes things appear to contain less "voodoo". Then again, I could be
completely wrong; I had been programming in other languages for years before
taking my first Java course in college and only attended the class when there
was a test.

~~~
Xichekolas
Ruby has quite a bit of syntax (parens, methods on objects, blocks, etc),
whereas scheme has almost none (parens, special forms like lambda, #t, '()).

Of course both have less obtrusive syntax than Java, which requires the famous

    
    
      public static void main...
    

just to get started. That is the kind of stuff that I think confuses true
beginners. They look at that stuff and think "holy crap memorize these voodoo
incantations" and never really leave that mindset once they get there. Even if
they eventually learn what static means, they will always treat it as such.

I think once they get the hang of programming in something, it's easy to build
up from there. I just think it causes people to focus on the wrong thing
(syntax rather than semantics) when they are first starting out.

~~~
talboito
One of the things that complicates Scheme for many beginners is the prefix
notation for arithmetic and such.

It's just not a concept most Freshmen are acquainted with.

~~~
khafra
I dunno--I started community college with an HP-48 instead of a TI calculator,
and reverse polish notation wasn't a problem at all once the friend who'd
convinced me to get one explained how the stack was like the way you do
arithmetic on paper.

------
tlrobinson
This really has nothing to do with Java, except it happens to be the language
he's teaching. A more accurate title would be 'Programming in College: "You
might as well be teaching Chinese to a monkey."' as it would be equally
applicable to any programming language.

~~~
stcredzero
I taught Comp Sci 101/102 as a TA at a state university in the US. Yes, there
are students who just don't get it. There was one student of mine who seemed
to think as if the machine contained some weird little fussy creature, and if
you somehow made nice to it in its unusual language, it would decide to like
you and do you a favor and run your program correctly.

Seriously. He couldn't comprehend:

    
    
        X = X + 1
    

To be fair, that might seem paradoxical, but I would break it down for him,
going step by step with cards and boxes labeled by the variable names. He just
couldn't comprehend. He had a hard time with variables. Heck, I think he had a
hard time with anything but social interaction. What was disturbing to me, was
the amount of energy he devoted to sucking up to me and trying to scam me by
mimicking the "Ah-HA!" moment.

Other disturbing observations: many of my fellow grad students didn't get it
either. To them, the C compiler was just magic. No understanding of how things
were marshaled on the stack or how operations were implemented in machine
language. Surprisingly, they were often about as bad as the local community-
college students who got employed by a local corporate body-shop.

At one point, one fellow grad student got exasperated at me in a study session
and said, "I don't care about the principles, just give me the answer so I can
get an A on the test!" She later told me she was just planning to go into
management anyhow. (In a way, that was really disappointing. She was one of
the few women in the program, and pretty cute.)

~~~
tlrobinson
I can see how "X = X + 1" could be confusing to someone who has never been
exposed to programming before. All your life you're taught in math classes
that "=" means the things on both sides are "equal" at all times.

Maybe replacing the "=" with an array while teaching would be helpful. Then
once he understands the concept, try to introduce the "=" syntax.

~~~
mattmcknight
This is why a certain language used := as the assignment operator and = as the
boolean equality operator. It really doesn't make sense as written when
compared to all of the maths people have learned up to the point they are
introduced to programming. It's where learning about addressable memory and
pointers compared to the values stored at those addresses actually made more
sense to me than the optimized syntax (at least when I was 12 or so). It also
operates backwards in most languages, where the stuff on the right of the
equals happens before the stuff on the left. It really should be something
that reads as "take the value in box with address x, add one to it, and store
the value back in the box with address x" (basically show the student what the
assembly language looks like).

I really don't have a problem with people not getting x=x+1, I think it shows
someone is actually trying to deeply understand what is going on.

~~~
marius
This is one of the advantages of using Scheme as an introductory language:
(define x 1) (set! x 2) (let ((x 3)) (1+ x)

------
andreyf
Diagnosable mental defects aside, I refuse to believe that there exist
students who genuinely want to learn Java with a private tutor who understands
the student's mental model of the world.

Students range from couldn't-care-less to passionate, not from stupid to
smart.

~~~
silentbicycle
I suspect students could be plotted on _both_ axes, and probably several
others (amount of background knowledge, for example) as well.

It seems clear that smart/passionate will generally do well and stupid/CCL
will generally fail, but that leaves smart/couldn't-care-less (know-it-alls
who won't listen to anything in class) and stupid/passionate (who will
probably need to put in extra time, but have a good chance).

Everyone will fall somewhere in between, of course - those are just quadrants.

~~~
andreyf
_stupid/passionate (who will probably need to put in extra time)_

I think this view ignored the correlation between "put in lots of time" and
"smart". All of the smart people I know have usually put in an extraordinary
amount of time studying whatever they are good at.

------
kragen
Several people in the blog comments have cited the “camel has two humps”
paper, which still hasn’t made it through peer review. There have been some
failures to replicate the study. Perhaps their results were an artifact of the
authors’ teaching style, i.e. they were just terrible at teaching, so the
students who entered the class without knowing the material failed?

I’m very skeptical of results that claim that some large fraction of the
population is incapable of some mental feat like programming. 500 years ago
the same was thought of reading, writing, and arithmetic.

(also posted to the blog comments)

~~~
cconstantine
"I’m very skeptical of results that claim that some large fraction of the
population is incapable of some mental feat like programming. 500 years ago
the same was thought of reading, writing, and arithmetic."

Exactly. At birth we are basically no different from someone born 100, 500,
1000 years ago. People in the past we not stupid. In fact, the giants who's
shoulders we stand on now are from the past.

This isn't to say the camel doesn't have two humps. I tried pretty hard in
college to learn German, but by then it was too late. Kids can learn languages
without even trying because they're wired to learn languages. Waiting till
college to learn German effectively doomed me to failure.

A similar thing might be happening with programming. Some people don't start
thinking about programming until pretty late, sometimes as late as college or
beyond. Perhaps some of the people who "just can't get it" could have had a
chance if they started sooner.

This would imply that there is no fix at the college level; the solution is to
start introducing programming/logic earlier.

~~~
kragen
There are people who attain native-level proficiency in foreign languages as
adults. It is true that children more often do it, but it also seems to take
them longer.

How many hours a week did you study German in college? I think children
growing up in Germany typically study it about 70 to 90 hours a week if their
parents are foreigners, or 110 hours a week otherwise, and it takes them about
six or seven years to reach a high level of proficiency.

By contrast, an acquaintance of mine studied Mandarin Chinese only 40 hours a
week as an adult (22-year-old I think) for six months, and then spent the next
several years transcribing and analyzing intercepted Chinese telephone
conversations 40 hours a week for the next couple of years, thereby achieving
a native level of proficiency.

So my alternative hypothesis is that kids learn languages well because they
try really hard for tens of thousands of hours, while adults rarely do.

~~~
cconstantine
I knew someone would say this ;)

It is true some adults can learn language almost as easily as children, but
that's the exception. The main point is that as you get older (for the vast
majority of people), learning a new language becomes more difficult. A similar
effect may be happening with programming.

~~~
kragen
I don't think that needing _thirty thousand hours_ of practice to learn
something qualifies as learning it "easily", and that's how long children
normally take to learn their first language. Adults can often learn new
languages to an expert or native level of competency in only ten or twenty
thousand hours of practice. What's exceptional is the adult who takes that
amount of time to learn a language, challenging themselves and trying to
improve the whole time.

(Exceptional adults may be able to do it in less time, and far less time to
achieve a lower level of competency. Sidis supposedly could "learn" a new
language in a day.)

~~~
cconstantine
Hmm, to avoid this being a back-and-forth between us, I attempted to find a
reference for my point (which I was taught from multiple professors in
college, and backed up by personal experience)... and I couldn't find any.

I could find reference to "the myth that children learn languages easier than
adults". I'm shocked that my child psychology and cognitive psychology
professors (who both taught a section on language development) would get that
wrong, but it's entirely possible.

------
jorgeortiz85
About a third of his class needs to switch to a more challenging course.

Every university should have a way to "place out" of introductory programming
classes, just like you can place out of introductory (natural) language
classes if you have previous coursework or are a native speaker. This should
be done by demonstrating proficiency in the skills that will be taught in the
programming course.

~~~
Eliezer
Well, sure, if universities were there to _teach things_ , they'd invent ways
to teach you using fewer classes. If universities are there to make you take
classes until you get a piece of paper, why would they care?

~~~
neilc
Except that this is a pretty common practice: at most reputable schools, if
you can demonstrate you don't need to take an introductory programming class,
you can switch to a more advanced class.

~~~
llimllib
what schools? (I ask because I hope that my school was "reputable" but that
was certainly not the case)

~~~
lincolnq
At Brown (where I went for undergrad), you are normally tracked into an intro
course, but if you can convince a professor of a higher-level course to
override the prereq, then you can take whatever course you want.

I have the sense that most universities will do this given enough prodding;
you are, of course, paying them tens of thousands of dollars a semester.
Sometimes there won't be an official documented procedure, but I would be
surprised if you were qualified for a particular course but couldn't talk your
way into it.

~~~
sofal
I've found that students who breeze by in these introductory classes have no
desire to skip over them. Easy semesters are hard to come by. College students
generally don't have the attitude of "I'm paying so much for this so I'd
better get something worthwhile out of it". They are there for the paper, and
they don't feel like rocking the boat. They know this and the system knows
this. They are normally so inundated with work from other classes that they're
forced to take as many shortcuts as possible.

------
kwamenum86
Some people start coding at a young age and some people graduate high school
and decide it is time to give programming a try. Of the latter group, a subset
seriously understand what it involves.

I think cs concepts can be taught to anyone but they can't be taught BY
anyone. If you start from the very beginning and take baby steps I doubt there
is anyone who can't pick up coding.

------
elviejo
"A change of context is worth 60 IQ points" (Alan kay)

So, I think that the first step towards requing the last third of the group
will be to teach them LOGO… yes LOGO once people “get” for loops drawing
squares and stars and circles etc. etc. making the shift to other programming
languages is easy.

If the curse requires OOP then start with Smalltalk and Etoys. They are
intended for kids… but you are trying to build fundamental concepts here.

best of luck..

------
spc476
I can sympathize with the author. I "got" programming and generally found it
rather easy (in college, I would look at some random student's code and just
point out each bug; used to drive the random student crazy when I did that).

But there was one class I took, Unix Systems Programming (all in C). It was a
higher level course with prerequisites of data structures (by that time in
college, taught in C) and compiler writing (undergrad version). We were
sitting there as the professor was going over the memory layout of a running
Unix process ("the text segment is where the code is stored, the data segment
were all pre-initialized code goes, yada yada"). One student raises her hand.
The professor stops and asks if she has a question.

"Yes, where do the comments go?"

I think it took a full thirty seconds for the professor to reboot.

I do have to wonder how that student got through compiler writing.

~~~
kragen
You know, most ELF executables do have a .comment section, and IIRC Java
includes comment text in its *.class files, and comments are included in the
HTML and XML DOMs. So it's not a completely insane question.

------
tolmasky
What I think is somewhat particular about the challenge of teaching
programming is that there quickly develops two distinct levels or types of
thinking it's "difficult". I don't see "programming" as difficult in the same
way that I don't see "writing papers" as difficult: it's a piece of cake to
get words on the screen that make sense. Of course, writing a paper can be
quite hard depending on the ideas you are trying to express. Similarly, I
think everyone believes programming to be difficult depending on the
underlying problem you are trying to solve (for example, no one thinks its
easy to solve NP-Complete problems in NP time or to write fast games on slow
devices).

However, what trips teachers up is that with some students the problem is that
they can't even get past the first hump: getting meaningful things on the
screen in the first place. It would be as frustrating as having a student in a
college level writing course that always puts the words in his sentences in
random order, and expects the reader to "know" what order to read them. Such a
teacher would on the one hand be teaching tone and proper structure to one set
of students, and basic rules of semantics to another. I recall many students
in my CS classes just rearranging the syntax in their programs hoping the
compiler would finally accept it. Clearly these students are having much
different problems than the ones who simply get a little confused when they
have a hard bug in their programs or find the idea of pointers unintuitive.

------
mattmaroon
Wait, what does he mean about the shift key? I pushed shift, then pushed a,
and the a is still lower case.

~~~
qqq
you didn't even write it in all lowercase.

~~~
byrneseyeview
I used to use caps-lock for that.

But then I learned enough Chinese to tell my pet monkey to type my comments up
for me while waiting for Eclipse to launch.

------
brandnewlow
I snuck into the roster for an intro to Object Oriented Class when I started
grad school, which was taught in Java.

I took physics with the engineers in college and this was about as hard
conceptually for me.

But it was one of those things where it was hard until I stepped away for a
while and then came back to it. Then it wasn't so hard anymore. Just too much
info to take in at once I found.

Loops were the hard part. Oh man. Loops. that took forever to "get."

~~~
amrithk
Recursion for me. I still grapple with it sometimes.

~~~
trevelyan
Recursion is really fun until you have to use it to solve something under
pressure.

~~~
sadfsa
Recursion is easy if you're used to it. A recursive procedure just looks like
a loop to me.

------
misuba
Why on earth are those three types of student all in the same class?

~~~
tokenadult
a) Some students have no idea what they are getting into when they register
for a class. (This explains some of the clueless students who can't do any of
the assignments.)

b) Some students who register for a first course in their probable major
subject register conservatively, especially if they can't prove completion of
equivalent courses. (This explains some of the students who easily do more
than what is assigned.)

c) Some students have some good preparation (e.g., math) but not all the best
possible preparation (e.g., previous programming experience). (This explains
some of the students who seem to find the course just right for them.)

Further along in a computer science major sequence, students who neither get
it nor like it will move on to some other major. Then the ability spread in
any one class may diminish somewhat.

------
sofal
I just finished helping to teach an introductory programming class as well
(HTML and JavaScript -- one step below the Java class). I also observed a
surprising range in the ability of the students to grasp programming. Hardest
class ever all the way to easiest class ever.

Another funny thing I noticed is that many students had the idea that they
could get credit for non-functional code. They would treat it like a math
class and hope that we would pop open the hood and look to see that they had
the right general idea.

I guess I can't blame them too much though. I've been a programmer for so long
that I've acquired the unforgiving attitude of the machine. I certainly wish
my computer would do what I mean and not what I say.

~~~
tokipin
i remember another student complaining to the teacher, "so you're not giving
me credit because i'm missing a for loop?"

i wish i was the teacher. i would have explained that "missing a for loop"
isn't something like, say, having an injured arm. it's more like having an arm
that was recently sawed off and is spraying and pouring copious amounts of
blood all over the place

you have to be strict in those cases I think. programming requires precision,
and if a person can't muster it then they shouldn't be fooled into thinking
it's something they can major in, because then their time will just be wasted

------
mattmcknight
A couple of suggestions…

Start with a visual programming language for the noobs- maybe something for
kids like Scratch and then something where you can make real apps quickly like
VB6. My 5 yr old can do programs in Scratch. She hasn’t learned recursion yet,
but loops and events are clear to her. She did learn about the shift key in
preschool computer class this year though, so she’s probably ahead of some of
your students.

Grade people based on how far they get, don’t make them go forward with the
rest of the class if they don’t grasp week one. Let them keep iterating on
those concepts until they get it. The tragedy of group education is that you
are forced to move and it is very hard to ever catch up. I would computerize
the whole class and make it self-paced if there is that much variability.

For the non noobs, the Java 2D stuff is useless. It’s completely useless to
learn that API. Make them write programs they can use in their life. Do a
simple data model for their budget and use Ruby on Rails to turn it into a web
app.

PASCAL, Ada, and Modula-2 suck. I hated programming when I was using those and
thought it was useless BS. When I was a student, I liked learning c and asm
because you learned about how computers work and I liked learning high level
languages with easy graphics libs because you could make useful things
quickly. I liked Matlab too, because I could use it to check my math problem
sets.

------
rbanffy
I used to start my courses with the following:

"This course has as much chances of turning any of any given person into a
programmer as a swimming class can turn you into a fish. Some of you have it,
some of you don't. Some of you will find it easy, and some will find it
utterly incomprehensible. The fact you are here holds, at least, some, but not
much, promise. Live with it."

------
Eliezer
I've noticed this with higher-level concepts too. There are people who simply
can't grasp the concept of a mind that doesn't work like a human mind. There
are people who simply can't grasp various levels of meta-thinking - like the
distinction between metaethics and object-level moral decisions.

You can keep trying to point in the direction of the meta-level but they just
can't look in that direction, like they're in Flatland and you're trying to
point "up".

And at least according to them, some of these people are programmers.

It seems there are multiple "gears" that you can have or not have, not just
the "programmer's gear". I suspect I'm missing a social gear or two, because
there are things I can't see, even after the fact, no matter how often they're
pointed out to me.

~~~
SapphireSun
I'm not so sure about that gear theory. I think you can have new gears
installed. When I took some higher level courses that required new kinds of
thinking, I didn't get it. I looked and felt retarded for a while, because no
matter how it was explained I didn't get it.

Then by continuing to study, and thinking about things, eventually I was able
to see it, and it started to integrate itself into my thinking. It's almost
like I can feel my brain being rewired.

I think that what's required is enough exposure and determination to reset
some neural connections and eventually the idea will integrate itself into
you.

~~~
brandnewlow
Yeah, for me it's always been struggling through. Stepping away and then
coming back to it. Then I get it.

Same with piano lessons as a kid. I had chopsticks down pat after a few weeks.
Then it was time to play a triad (a 3 note chord) and I just couldn't do it,
pushing three keys at once with one hand.

Spent a whole lesson with my teacher literally just pushing my hand down on
the piano while I looked on in horror at how badly I was at it. That sucked.

Then my family went on vacation for a week. At my next lesson I could play
them just fine. Something clicked.

But it wouldn't have clicked had my teacher not spent an hour pushing my hand
down onto the piano over and over again.

~~~
pavelludiq
Thats how i learned driving. I couldn't get it, my instructor tried to teach
me, but i couldn't do anything right. My instructor was pretty good and knew
that it was normal and the next day after a good nights sleep i was starting
to get good at driving. After a while of driving with mixed success i stopped
for a week, and when i got in the car again i was really good. I got my
license, but didn't drive for a month and today i got in a car and after a few
minutes of remembering, i was good at it, it was all easy, you couldn't tell
that it was my 30-th hour in a car, and i haven't driven THIS car ever before,
so i had to 'learn it', and get used to it. The mind is an amazing thing,
learning is one of the strangest things we are capable of.

------
tokipin
i think it's a matter of perspective. people's perspectives can be _very_
different. it didn't hit me until i got really smashed one night and my vision
became many times more detailed. the world looked _beautiful_. no doubt there
are people that can see that clearly all the time, people who live _in_ the
world, as opposed to outside of it which is how it feels i am. those people
are probably the ones who can "get" drawing, and who might wonder why it is
that others don't get it

when it comes to programming however, i bet these people can confuse the
letters on the screen for the program itself, or it might not be clear to them
that the semantics of the language are rich and are more important for
understanding it than its syntax is, and other fundamental misconceptions like
that

i can see better if i put a lot of focus on it, but it would take practice to
make it something i could readily call forth or sustain, and even then i don't
know if i could see as clearly as when i'm drunk, or as clearly as someone for
whom it is natural. going the other way, how do you show people what to look
at when programming? i can give myself visual tasks like "try to perceive all
of the individual blades of grass on the lawn at the same time," but what is
an equivalent exercise for someone who finds programming difficult?

~~~
kragen
Maybe this is missing the point, but have you gotten your vision tested? Maybe
you're farsighted or nearsighted. I think the world looks a lot more beautiful
when it's in sharp focus.

~~~
tokipin
i'm very nearsighted, and use glasses. however the kind of detail i see when
i'm very drunk is on a different level, regardless of whether i'm wearing
glasses or not (like looking at things up close.) it might seem strange that
you can see better than 20/20 (or whatever 'perfect' vision is,) but this is
something that is independent of the apparatus of the eye. it's deeper, like
the cognitive management of attention/focus

i'm sure part of it is that i don't actually use my eyes much from day to
day... which might be the reason i'm nearsighted to begin with. but even that
much wasn't apparent to me before. though the same could be said of those who
have trouble programming. maybe there is something they don't use a lot, and
it atrophies over time?

let me be clear. when i say i don't use my eyes much from day to day, i mean i
spend most of my energy in my head and i don't really focus on my sight at
all. it doesn't take much ocular prowess or precision to parse some text on a
screen

but who knows, maybe i'm loony. koo koo

~~~
kragen
Aha, cool. Thanks!

------
zaidf
A lot of it is about motivation.

I took AP Comp. Science. A in freshman year of high school. I got a 5 on the
exam. An A in the class. I'd be so excited each day as I went to class. This
was the peak of my new found love with programming.

Then in senior year I took AP Comp. Science AB. I did just-okay in the class.
And bombed the AP exam.

More telling was how little I cared about the poor grades.

------
nradov
It's not surprising at all to see a huge variation in student ability for an
introductory class. The variation is just as big in other areas. My wife has
been attending a large public university and from helping her edit group
project papers I've seen samples of numerous other students' writing. Some of
them do pretty well, but others are borderline illiterate (seriously).

------
rthomas6
This reminds me of a class in C I took last spring. Some people fell so
hopelessly behind that they probably "borrowed" a good bit of code from other
people for projects. On the other hand, some people turned in an almost
commercial-quality video game for their final project. I got an A, but fell
somewhere between those two extremes.

------
axod
Learning programming in classes like this just seems a terrible idea to me.

