My Professor is an idiot

I've had the dubious distinction of running freenode's ##java IRC channel almost 10 years now.  (Yes, i'm "that jerk" to some people. :D )  As such, I've seen a lot of beginners come and go.  One common complaint we tend to see in the channel is university (usually) students coming in and complaining about their "stupid" homework and their "stupid" teachers.  It's a depressingly common refrain that I've tried to address in channel when it comes up but I'd like to expand on it here.

Let me start by acknowledging that there are some professors teaching that probably shouldn't be.  It can happen.  Hiring mistakes are made all the time.  Call it blind optimism, hopeless naiveté, whatever, but I have to believe that this is a far rarer occurrence than these indignant students would like to believe.  As a new student, as a beginner in anything, we're functionally too ignorant to gauge our instructor's competence with any meaningful value.

Many students focus on how dumb an assignment is based only on face value without stopping to consider any deeper or longer term questions.  When I was in high school, my computer science teacher gave us a problem.  It was a little something like this:

You have an army on two different hills separated by a valley controlled by the enemy.  One side can not directly communicate with the other but has to send a runner from one side to the other.  Devise a protocol for sending messages which can guarantee delivery with no message loss.

That's not exactly it but that's the basic gist of it.  As we hammered away on all our brilliant solutions, our teacher kept pointing out flaws.  "They can't signal each other."  "That requires a direct communication with each other."  etc.  As time wore on we were increasingly frustrated by the impossibility of it.  We would have felt justified considering this assignment stupid.  But the point of the exercise wasn't to design a communications protocol.  It was to realize the inherent hostility of networks and the difficulty of building robust networks.

Teachers often assign such tasks to drive home points other than the obvious.  Another example is when teachers give assignments with restrictions that a professional would consider not only absurd but outright destructive.  Oftentimes, these assignments aren't about learning that particular approach but learning how truly stupid it is.  By forcefully highlighting such shortcomings, the "correct" solutions then become much clearer.  

More commonly,  students are forbidden to use existing libraries and are forced to implement things like linked lists from scratch.  Professionally, no intelligent boss will require this of anyone.  But as a student, it's the only way to really learn how such structures work.  It may be "dumb."  It's certainly tedious.  But it's fundamental.

Another example:  when I went through CS in university, the degree program was pretty new.  By the time I got around to taking discrete math, they had moved it from a senior level course to a freshman level course.  So I was in the course with a fellow senior and dozens of self-important freshmen who were utterly convinced that they would "never need to know" topics such as algorithmic complexity analysis.  Having already been through the bulk of the courses they had yet to take, we laughed at their ignorant bleating.  We tried to tell them otherwise but they wouldn't be convinced.  They knew better, you see.

My advice to beginners, then, is this:  always keep in mind that those who have been selected to teach you might actually know more than you.  Pay attention.  Withhold judgment until you have the full story.  Learning takes many forms but almost all of them start with you acknowledging that you don't know everything you think you do.