20140905

The Failure of Colleges and Computer Programming...

I've taught at several colleges, released a book on programming, assisted other teachers, assisted other students, attended classes and interviewed a lot of candidates for senior and mid level IT Roles with great contrasts between those focused on college education and those without.  This may be a rant, but it's intention is to help potential students pick classes and learn, and to help colleges improve their curriculum.

Naturally, I'm open to  debate about any of this.  I want to help out, and I'm not going to help improve things by being close minded.


1) Math is not that important in programming, so why do so many colleges have such hefty pre-reqs?


"Any high school freshman has enough math skills to become a great computer programmer."

I've known brilliant people, with IQ's over 160, who didn't want to go to college, because they weren't that good at the math.  However, they were excellent at taking large complicated business plans and wrapping software and sites around them, exactly what they were and would be doing in the real world anyway.  I'm not arguing against basic algebra and even some minor calculus, but in general, any high school freshmen in the US has enough math skills to become a great computer programmer.

So why do the colleges do this?  I believe this comes from history.  When computer's were first coming to use, they were typically 2 things.  1) was a specialist piece of hardware focused on a particular task, and 2) was a GIANT programmable calculator.  While the study of electricity and circuits already existed, the ability to program these machines would have fallen into the realm of a mathematician.  And since then, colleges have never been able to let go of a strong math background as part of it.

I'd love to hear some feed back on why math is so important here.  Because after 80,000 hours of tech work, I don't see it as a norm.

*Update: From conversations with many other readers, Science in general is very mathematical.  Most people sign up for Computer Science courses, and therefore having a math background is important.  Many college do have more practice oriented degrees available.


What should happen instead?  I believe that most colleges should drop the strong requirements in math when it comes to computers, unless the major somehow focuses on math over all.  The most important thing to most businesses is the ability to apply business logic in applications.  Even in game development, it is common to have a programmer use existing math functions, or stub out the code and let a more math focused individual figure out the most effective way to resolve a math problem.

TO STUDENTSUnless you know your goals will require a lot of math, like 3D Physics Engines, I recommend finding a school that focuses more on patterns than on math.



2) Why are outdated patterns running rampant in professional college courses?


"a good instructor will typically have real world projects and commitments"

Spaghetti code, Hungarian Notation and other terrible naming conventions are still demonstrated in modern courses, and those are just a couple obvious ones.  The real problem stems from instructors who are unaware or unwilling to find out about the changes happening in the world.

Items in a resume are typically obsolete past 4 years in the tech industry, yet many college instructors haven't worked outside the classroom for far longer.  I mean no offense to current instructors.  I've worked with some and helped them improve their classes.  The ones I've worked with have all been very receptive to new coding technology and patterns.  But by the nature of not having deadlines for projects, and not having to work with new technologies every semester, it is harder for many instructors to improve or even see what needs improvement.

I would say that a good instructor will typically have real world projects and commitments relating to the technology they teach.  They will probably have blogs themselves, but will be able to recommend others that they pay attention to about new techs and patterns.  The hardest part of it is that many Instructors don't know when their material is becoming outdated, and most colleges rely primarily on the instructors what is the right material to teach.  In my opinion, a good instructor will probably be split between working on paid contracts or projects for other clients and teaching their classes.  Often getting students involved in the actual work.

TO STUDENTS:  This is a tough one, but find a mentor working with as modern stuff as you can find; heck find a couple.  Ask them to review the required materials, and occasionally sample code and lessons from the instructors and see what they think.  Also make sure your professors are actually still in the modern world or programming.  If they haven't released TEAM projects in a while, don't trust that their training is modern.




3) Why is flash still being taught?

"I was a strong VB6 supporter, but I would never make it a requirement."

Flash will not work on Mac/Tablets/Phones, and in general is no longer accepted as a relevant consumer technology.  Despite that I still see plenty of colleges teaching it, some even presenting it as a highlight of advanced website development, this year.  While this relates to outdated patterns, the point is that colleges are often presenting classes, just because that is what they taught last year, and many students coming in won't know any better.  And these outdated classes are often required in order to pass.

I for one was a strong VB6 supporter, and did not like the fact that .NET required 15 times the resources in memory just to run it.  VB6 is still used by a huge number of companies, despite it being more than a decade old.  VB6 is an effective language, and I know there are plenty of jobs out there for people with good VB6 skills.  But I would never make that a required class for programming in college.  I could see offering it, especially if a considerable amount of local businesses were using it, but that's it.

TO STUDENTS:  Check dice.com for a lot of their required course topics, and see if you can find many jobs in the area you want to live.  Is it used much at all?  If you're not finding many of the required topics, even in the school's home town, it's probably a bad sign

*Update: After speaking with many of the readers, it was pointed out, that many colleges are trying to teach patterns and practices that can be applied to near any language.  Making the student more universally knowledgeable.  Despite that, the major languages of today have been out there for a while.  I still believe that a person can AND SHOULD be taught those principals via industry standards.  


4) College is often harder than it should be.


"It was one of the toughest reads I've ever experienced"


I remember the first book I read on Binary back in the 80's (though I don't recall the name or author).  It was somewhere around 200 pages, clearly written by someone with a strong mathematical background.  It was one of the toughest reads I've ever experienced.  Later in my own teachings, I was able to effectively teach all the same concepts and materials to 7th graders in less than an hour, and have them using it in code as part of a game class.

I also remember taking a course on some development practices that I was very familiar with, but wanted to make sure I had it down well.  The first 6 weeks were easy, all well below my skill level, but on the 7th week we were still doing things well within my skill level but presented in complex ways that made little sense.  I had to decompile the libraries to see the internal structure of the code to understand what on earth was required.  After reflecting on it for a while, I realized the project was simple, and relatively straight forward, it was just the instruction and training leading up to it was poorly communicated and complex to follow.  The students having trouble weren't at fault, the teacher was.  To their credit most of the course was good, but I see that happen all the time; papers and course materials written by people who are clearly brilliant in their professions, but poor communicators.

TO INSTRUCTORS:  You might argue that the real world is complicated and project are not usually straight forward.  The problem is that doesn't help you learn.  It would be far better to present the topics as simply as possible and then provide extra homework that focuses on breaking down more complicated business logic and code.

Tutors and any professionals assisting should be able to help correct and improve these issues in the actual course material.  But it is typically not their place to help.  College curriculum management is often a hidden practice derived primarily from a single mind (The professor) and geared to be unchanged by others unless there is an obvious mistake, and not for improvements otherwise.

TO STUDENTS:  Understand that materials are often taught from one mental perspective.  The fact that you don't get it, doesn't make you stupid, it more often means the instructor didn't present it well. Keep in mind that you might just need a different perspective.  When pieces of it start to click, try to figure out why it didn't in the first place.  Maybe it was a hard topic with no better way to learn it, maybe it was taught poorly, maybe you were missing some small but pivotal piece of knowledge that should have been picked up in an earlier course.  Understanding the difficulty will often help you with improving your learning with that particular teacher or course material.

*Update: from a college instructor at an ivy league university, I've been told that often colleges often like to include a few near impossible, yet required courses at the beginning as kind of a filtering out process.  I.e. if you don't have the determination/experience to figure you way through the course, then you *probably* won't do as well in general, but I disagree with this practice.  I should also include that I have no idea which colleges or how often practices like this are used.



5) So what's holding them back?


"what does it mean for students when the topics covered last year have changed"


Unlike most college majors, computers are changing at an incredible rate.  Medicine, physics and other sciences are seeing significant improvements as well, but they are usually improvements, not so much completely shifting paradigms.  Computers on the other hand, are evolving left and right, and not just in improvements, but significant changes that cause us to adapt different solutions and patterns in every language, not to mention the invention and need for new languages.

Many colleges and professors may approach course restructuring facing great difficulty.  It can be expensive; catalogs, books, accreditation and curriculum's need to be updated.  It can be confusing; what does it mean for students when the topics covered last year have changed?   It can be hard to track student growth; how do you track if minor changes helped when the entire class material keeps changing?  Professors and instructors need to know all these new materials inside and out; to teach it, you better know it.

There are hundreds of difficulties in altering the directions and requirements in courses, majors and colleges.  But this is what colleges and universities are supposed to be doing.  Below are some proactive suggestions.

TO STUDENTS:  Be expressive at your schools.  If you feel the technology is out dated or practices are not relevant, bring this up to your professor, mentors and school directors/councillors.  Schools often have the uniquely difficult task of staying ahead of the curve in technology, and at the same time keeping it stable and valuable.  Its tough, especially if no one is helping them.



6) Here are a few things I think can help colleges and universities.


6.1) Interview the instructors every year.

For real jobs.  There are many companies who would be willing to help out, if you put the requests out.  Let your instructors go out for some significant positions in their fields.  (not to actually find other employment of course)  Don't expect them to always succeed.  The point of the exercise is to start identifying when you are off base with what the real world wants.  The instructors should be taking a strong look at any part they came up weak, and also strongly considering if the courses are preparing the students for positions like these.

*Update, this also helps the teacher focus on preparing students for similar situations.

TO STUDENTS:  Ask your mentors to interview you for mock positions.  Not to get a job, but to get a review of how well you did, weaknesses you can improve and technologies that should have been more common.


6.2) Start Dicing up your required course topics.

Make a list of all the technologies listed in required courses (granted that is not so obvious when it comes to patterns and some other class types), do job searches (like Dice.com) in your area and compare them to other more popular technologies.  If you teach a technology that only has 5 jobs in your state and those are more just footnotes, its a good sign to at least drop it from required courses.


6.3) Have the students make the classes.

Offer extra credit for students to rewrite the training material.  If the students walk into a topic understanding that there is room for improvement, they'll be less apt to put themselves down for being too stupid to get it, and be more apt to figure out why it is difficult to learn, and once understood, be more comfortable sharing their difficulties with others.

TO STUDENTS: If you can, find mentors who are advanced in your class, or have completed it prior, and ask them if they can simplify topics when the teacher or teaching material is confusing.  People will help out more often than not, because it makes them feel more valuable.


6.4) KISS.

Keep It Simple Stupid. Math is not as prominent in computer science as many colleges make it out to be, but adds a high level of complexity that wards off the interests of many young programmers.  I implore colleges to put together groups to determine what is really important to jobs or not.  Around 50% of any interview I do is based on cultural fit.  But seldom are there courses that teach good cultural etiquette in the modern business world, especially in computer science.

The word Job might be too specific here.  Programmers are changing, often telecommuting teams of people who have never met.  And many of the biggest web companies started from kids in their garage (or basement or web team or whatever)  What is really needed?

TO STUDENTS: School Course Counselors can be a great value, but seldom will you find one who has "been there/done that" in your selected field.  I strongly recommend you find mentors willing to review the required classes with you and see it if is valuable or not, especially when selecting a school in the first place.


This isn't that tough, we can do it.

7 comments:

Unknown said...

1) Mathematics is important. One semester of calculus and a course in probability and statistics is highly desirable in any programmer. (Disclosure, I am a mathematics major)

2) The problem is not the technology (the given language). The problem is the lack of flexibility in adapting to NEW technologies (languages, APIs, etc.) Computer Science major would do well to be flexible.

3) The greatest failing after flexibility that I see is a lack of discipline. It is not enough to throw code at the screen and get it to work, it needs to work well and needs to be verified to work well. It is not enough code--coders are a dime a dozen. If you've got long term skills, you'll design a solution that is reliable, performs, and can be maintained by somebody other than you. There are very few such individuals being produced today. Coders are a dime a dozen--and just as expendable.

Unknown said...
This comment has been removed by the author.
griff said...

Colleges should not be creating "Good Programmers" any high school graduate has the appropriate foundation to write code. Colleges should be and I submit are focused on creating better Software Engineers/Architects/Developers ( who just happen to know how to write code). The distinction I make Is that the latter disciplines require a broader scope of knowledge to bring to bare at a problem beyond language syntax specifics. To that end Mathematics as well as history and even psychology become significantly more important to a solutioner. Soft skills like public speaking are as the keys to the kingdom of success as well.
The hay days of the coding cowboy who ruled by knowing the most about the intricacies of the language de jour are sadly gone, any one with a kindle or access to google can look-up how to code jugs about anything in less than 30 sec,
But knowing how to properly design and communicate a scalable extensible solution , with reusable components to both a client and a programmer without a 6-week cycle to build and test a prototype, and be able to reasonably calculate performance metrics, well now, those wiith the skills to perform at level will never find their work being outsourced.

That's just my 2cents, since you added ;)

Wondering Richard said...

I agree with the two comments above. While I agree that schools can do a much better job teaching skills, you have colleges and universities confused with trade schools.

In your scenario, what happens two years after they graduate and we find out that they have obsolete technology?

The ability to think abstractly, synthesize information and understand patterns (which requires you to know older technology) becomes relevant.

Unknown said...

We all know that math is present in all major CS topics like computer vision, AI, machine learning, bioinformatics, game dev and so on. Maybe in a few years the universities will have more fragmented courses that focus on bussiness modeling and web dev , and the more technical/scientific courses, so the students will have a choice to choose a specific sphere. I think there that the path will go in a way of a modular course selection, like Coursera where you can focus on a segment you like or the one which is currently hyped. The fact is that computer science isn't just web dev and bussiness modeling and if you want to solve some major problems you have to have math background, that is why colleges are somehow forcing us to study it, because there is a lot of hidden talent among us, many of them are just afraid of maths. Look at the current hot topic cryptography, there is a big need for cryptographers in these days and you should know a math or two when crypting :). By the way i'm finishing my masters degree in computer science and i'm also not a big fan of maths, but sometimes it is cruicial for some big problems that we have in modern world.

DadMan said...

Hi, it's pretty stunning to read someone who is clearly fairly literate and has some good ideas I think, and to disagree with him on every single idea at the ground level.

I don't want to attack each approach individually. That would take all night. I would just say that you seem to be stuck on the difference between a technician and an engineer. I am going to get screwed up here in definitions, so please forgive me, but look at this way and I hope it makes sense.

I am going to start with a simple definition. I don't know if you will agree with it, let me see.

Programming is math. At it's core. Programming is math. I can show this easily enough with the first lines I learned in basic back in 1976 when I learned my first lines in computer programming which were something like:
10 let a = 10

See simple math. I have assigned a value to a number. This is basic algebra.

From there I could:

10 Let total = 0
20 for cntrl = 1 to 100
30 total = total + cntrl
40 next cntrl

Which turns out to be the numerical summation from 1 to 100.

Fundamentally, software is the language of computers. Which, basically speak in 1's and 0's. Put it another way, they speak in long strings of 1's and 0's. Even the pumped up super quad engines of multi-quad engines still speak in long almost infinite strings of 1's and 0's. You would know that if you took a lot mat math in school. You should know that if you are an expert in Computers.

Any yahoo can learn to write programs on computers. That's not a problem. A Universities job is to teach a person to be a well rounded individual, to function in society, to design computer systems, write software, solve software problems, and learn to speak French. If you are lucky they will make you take women studies.

Dan Violet Sagmiller said...

First off, I want to thank everyone who commented. Your messages where insightful and well written.

I would also like to include that when I wrote this rather harsh article on the current state of education (as I see it), but I don't mean to imply every school, course or teacher is teaching poorly. I have met some great teachers, seen some great courses and in general have faith in a few of the colleges out there. That being said, more often than not, I find myself reviewing course material or helping someone else through classes only to find confusingly difficult sections that only seem to serve to damage the foundations of knowledge the student already has.

Regarding Colleges vs Trade Schools. I know they are different, but I still see them as the same thing, particularly to a student. In either case you have someone attending for a couple years (or more) who wants to make money in a profession they like.

Both forms of schools would do well to have well rounded students, but also to have students who can hit the ground running. If you consider that in either case, Colleges have students spending years and small fortunes to learn these skills, and when they get out find out they have been taught things that are considered bad practice in the industry, and don't yet have enough skills to hit the ground running. I would be pretty mad at the school They could have replaced outdated courses with ones that had more current and practical application.

Regarding "Programming is Math" find me an equations for this:
- List all purchases where userId = X

Granted there are similarities between math and programming, but most business purposes, especially the giant web market, is about organizing data and displaying it. With that in mind, they might as well be studying Biology so they can learn to classify things better, since biology has a great deal of classifications and structural organization.

But the problem is that neither the math (beyond a typical high schooler) nore the biology, are required to teach those same concepts in the programming itself. I've taught kids who haven't done a = b + c in school yet, basic algebra, as the concepts were very easy in programming.

Granted, I was not teaching these kids non-euclidean geometry, but for programming in general, math is not a major factor. There are plenty of positions and tasks which include it, but I strongly believe that highly effective programmers can come from very little math experience.

Now that being said, I will concede this: I don't think it is for me to say, or even reasonable that all colleges should drop math as a focus for computer science, I'm just saying that in general, I don't believe computer science *requires* a great deal of math. The biggest issue I have is people feeling overwhelmed in courses that they are *Required* to take, that do little for their intended goals and interests, just so they can get the degree from their college, especially when many current techs might be completely ignored.