I just got back from vacation and I was trying to catch up on the Alt.Net mailing list, and ran across a few heated discussions. Inside one of these discussions I ran across a post with the following statement:
Personally I think that university Computer Science programs are a
joke (at least in the U.S., can’t speak for other countries). In my 4
years at the U. of Toledo I think I had 5 classes that taught me
something relevant to real world software development. The words
"unit test" were never uttered in my classrooms <shudder>. College
grads take this education into workplace and have no idea how to
practically use the skills that they have learned.
As far as I know there is nowhere you can go to get a formal education
on advanced software development topics. User groups and conferences
are great, but there are tons of devs that don’t go to those things.
I’m talking about classes that teach you software development
principles like what unit testing is, how to do test-driven
development, what SOLID is, domain driven design, etc., or maybe more
technology specific things like how to use NHibernate, how to optimize
ASP .NET applications, etc.
I have to say that I wholeheartedly agree with this statement. In my 7 years in college I had never heard of Unit Testing, SOLID principles, etc. It wasn’t until I began to use the basic building blocks I was taught in daily software development that I realized, “Hey, there is a better way to do this stuff.” Then I found the Alt.Net community and began further educating myself on these topics. The most important part of what I just discussed is, “I educated myself.” In large part this is the one single thing that separates a great developer from a programmer, initiative. You have to want to continuously improve and hone your skills in order to become a great developer.
Why does this education breakdown exist?
I have my opinions on why this education breakdown exists and I would love to hear yours as well. I think one of the biggest reasons this happens is because Computer Science programs tend grow from within themselves. I mean obviously if you have been in college for 12 years and have a PhD in Computer Science then you are an expert software developer, right? I say WRONG; It becomes the blind leading the blind in a redundant cycle over and over. Most PhD Computer Science professors are what I would call “Research Oriented.” They go through their entire educational career never writing any real business software. They focus on research projects, and exercises that are only important in school. They are not forced into dealing with the pain and struggle that full-time normal developers encounter each and every day. The dynamics of developing software with a team and a boss, and their bosses boss, not to mention timelines and financial constraints. These “Expert” professors hold the students well being (grades) in their hands, and mandate that you do it their way or you fail. Nobody wants to fail so they do it their way, and the cycle continues.
Some professors may actually come from the industry, but many only join academia in retirement. More likely than not, they were not a developer when they retired, they had become “successful” and moved into management. Either way, it has probably been a while since they were in the trenches developing software on a daily basis. Compounding the problem are advances in language, methods, and principles. The software they wrote a long time ago was in different languages than what is taught at colleges and universities today. They are now learning new languages so they can teach them to students. They are so focused on the new languages that they neglect the principles that are language independent like Unit Testing, SOLID principles, ORM’s, TDD, etc.
What can we do to stop the cycle?
I believe we have to take action as individuals inside the community to change the path that our future team members are on as soon as possible. Each year, the cycle perpetuates itself.
One of the ways we can do this within our own teams is to have “The Way”. Inside our development team we have “The Way”, which is the way we develop software. We practice TDD, Unit Testing, DDD, we adhere to SOLID principles, we use NHibernate. That is “The Way” we develop software. Now this puts a burden on the company, and on the seasoned developers to spend time with new team members and teach them how to do these things. This does two things: it helps develop a team working environment and hopefully instills in them personal initiative to continuously improve their software skills.
Another way that I am currently doing is to get involved with your local college, community college, or University and teach some classes. Remember, the professor’s way is the students way. I currently teach classes at our local university and these are the exact things I want to engrain in the minds of these students. Next week I begin teaching an upper level Systems Analysis and Design class. During the semester we will design and begin developing an Open Source Learning Management System,will make the students learn and practice concepts such as pairing, unit testing, SOLID principles and practice using an ORM. They will create this project in C#, as that is my language of choice, but will understand that these tools and concepts are not tied to one language.
You may or may not be able to teach a class at your local university but I would be highly surprised if you could not, at the very least, give a talk at a “Computer Science Club” meeting about these things in an evening.
I know I do not have all the answers, but this is the best way for me to make a difference. I would like to hear opinions and other things we can do to help alleviate this breakdown in education of our future employees and teammates.