6 Jan
2009

Education Breakdown?

Category:General PostTag: :

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.

-Ryan

7 thoughts on “Education Breakdown?

  1. I’ll play devils’ advocate and throw two ideas into the mix:
    Computer Science != Software Engineering
    College != Vocational School

    While I don’t totally agree with those assertions (I have two engineering degrees because I considered it a practical education), I can see the logic of those on the other side of this education breakdown. Many believe that college teaches you to think and generically solve problems, not to master specific technologies or even methodologies.

    That said, modern design and testing methods are part of the software world and do deserve attention, either in class, through on the job training, or via self-study.

    I think Ryan’s efforts to expose students and professors to real-world software practices is a great way to get people started. From my own experience, I’d also encourage students and companies to take advantage of co-op or internship opportunities where students can begin to meld their theoretical knowledge with hands-on experience.

  2. Matthew,

    I do not disagree with the statements you make either. I too believe that the number one outcome of a college education should be that you know how to learn and how to go about solving problems. College is not a vocational school and cannot be in large part due to how hard it is to make curriculum changes, especially at an accredited school.

    I think you have some great ideas with the co-op or internship opportunities as well, I forgot about those. We have done that in the past and it has typically been a win-win for everyone.

  3. Going into school I had actually planned to make a go at game development so I already accepted that what I learned in school wasn’t going to be much more than a toe-hold on the mountain of skills I’d need to learn to be a good developer. Still I was presented with a 4 year course at Uni for $8000/year plus books, or a 2 year computer engineering course at an accredited technical college for $4000/year including most books. Uni would mean it’d be an extra 2 years before I actually started anything meaninful, and would mean a loan. With college, I had enough money put away plus a bit I promised to reward myself with a new car if I graduated with honors and found work.

    At college I learned about electronics, PLCs, CAD, and software development with Assember, Pascal, & C/C . Handy, because as it turned out I decided game development probably wasn’t going to be more frustrating than I first imagined. (Based on the degrading quality of games I played through college:)

    Still the best thing about college is that as far as learning technical skills it was almost entirely hands-on. It wasn’t “read this approved material, listen to me lecture, and then write a thesis.” We were building hardware, writing software, and truly using our brains and asking realistic questions. Some of the instructors were pretty ordinary, but a few really stood out. My favorite was in C/C . This was before TDD/Agile became the buzz but whenever we did an assignment and he was reviewing it, the first question he ask was “how do you know it works?” You had to have test cases/scenarios before he graded it.

    Oh yeah, and I did earn that car. 😉

  4. Ryan:

    I applaud you for taking the time to teach others. I have taught a few university courses and know the work and time commitment involved. However, it is very rewarding. Thanks for making a difference.

    I have thought about this as well. At a small level we can teach good coding and design practices during a C# class, a compilers class or SAD. However, if you take time to teach some of the larger concepts you are discussing, something else has to come out of the curriculum. Maybe its time to re-define what a Software Engineer really needs to be successful in the real world and how to get them the education.

    Scott

  5. Ryan, I applaud next to Scott. Very cool that you’re doing this. It has come across my mind many times. If I were to do it, I’d be teaching next to former teachers as I’m not that far out of the system. I don’t know if that would be a good or bad thing.

    I’ve had the discussion with others many times on this very topic. My feelings is to start small. When I was in school we didn’t practice or (not to my memory) even talk about source control. Starting small could be as simple as introducing source control to the students (other institutions likely do, a few years back mine did not). This can be easily accomplished all completely free. If the IT department didn’t want to set up an SVN server, there’s always Assembla, which would probably be even better. Students could work from wherever they wish and commit their code. Instructors/teachers/professors could then grab the version as of the “due date/time” and have their projects turned in.

    I realize that hindsight is 20/20 but I really feel this is one way that could be a valuable mechanism for both teaching students how to use source control and allow the teachers to see how the students built up the codebase to the version it was at the time of submittal. They could either see a work in progress, or one single commit. If it were me, one could easily garner a higher grade than the other. To me this beats handing in projects on a floppy/CD/DVD/ZipFile hands down.

    I hope you continue blogging about this experience, I for one would be looking forward to it!

  6. I think the most useful stuff I learned I learned in University, we also don’t had any mention of Unit Testing or Solid principle or ORM. But I learned about Boolean logic, algorithms data structures and complexity, underlying theory of operating systems and databases. I know about fundamentals of computing what possible and what not, I learned 3-4 very different languages and principals behind them. I also grasped a basic understanding of mathematics and can read and understand research papers describing advantage solutions to complex problems we all face.

Comments are closed.