I’m pretty lucky.  I knew that I wanted to do something in computers since I was in the 5th grade.  My class got an old (new) computer with a green screen, some kind of math/vocabulary rabbit game, and my favorite…BASIC (the programming language).  Yes, “10 Print” and all.  I wrote my first video game on that machine – Magic 8 Ball.  It was pretty simple.  You entered your name and your gender, and then, if you were the girl that I liked in class, it would tell you who you would end up kissing me by the end of the day.  Ahh, memories.  How did I learn how to code that?  I can’t even remember.  Was it learning from class?  Was it trial and error and figuring it out?  What was most important?

As I got older, I took dual enrollment classes in high school, one of which being a programming class where I met a guy from a state government agency that offered me a paid, full/part time internship that I ended up taking all through college.  In undergrad I got four years worth of experience working as a developer on systems that hundreds of people used – it eventually won awards.  At the same time, I also got a CS degree.  I graduated with 4 years of experience under my belt (not lame tedious internship work, actual hardcore enterprise-level .NET development work).  Who does that? I then went on to graduate school at George Mason, getting my MS in Software Engineering over the next two and a half years full of long nights of theory and projects.  In order to pay for grad school, I got a job at Amentra, Inc. in 2007.  At that time, it was a feisty, young software consulting company where almost everyone in the company was in their 20s or at the most, 30s.  I worked there by day and took classes two nights a week.  The projects were long.  I was learning enterprise Java and .NET, JBoss, Biztalk, Sharepoint, ESBs, SOA, Agile, and the list goes on.  Everything was new to me and every client needed me to be an expert yesterday.  Many times, my school suffered because I was working late.  Other times, I would walk into a class being able to rattle off the final exam as soon as I walked through the door.  Eventually, that little company got bought by Red Hat, Inc., which is when I thought I had arrived.  I couldn’t believe it.  Just 7 years into my development career and I had gone from a town a few thousand people where nobody leaves to working for THE Red Hat.  I learned and heard a lot of things during that time – about how software, people, and the world works.

I’ve heard many people say that “Grad school is nice, but you really learn all that stuff at work anyway, so why would you need it when you can just learn it by working?”.

Ok, first off, I worked at Red Hat. I don’t know about you, but working at Red Hat, Microsoft, or Google is not exactly your “typical” software company.  Especially where I am from, which is Northeast Tennessee, not everyone is as bleeding edge as the Juggernauts of software (though the company I currently work for in Southwest Virginia actually is!) ** Here are some reasons **FOR education in software engineering and computer science.

  • The academic environment gives you the resources to study topics and projects that EXCITE YOU.

    • You aren’t getting paid, so you can build whatever you want.
    • Schools have labs and funds to get you the hardware and software you need to build the project of your dreams.  (Like a multiplayer, remote poker game where you can play any combination 8 virtual or physical people…yea, that was super fun building)
  • You get a big piece of paper.

    • Computer scientists and software engineers know that technology changes, but many times the person hiring just sees that you have a big graduate degree tick beside your name, which bumps you above the next candidate.
    • Grad school is often seen as a replacement for work experience.  So, what happens if you work AND go to grad school?  Extra free years?  I’ll take it.
  • You get PRACTICE.  Education without practice gets you nothing.  Software development is a craft.  You perfect your craft through practice.  Eric Raymond, author of The New Hacker’s Dictionary says, “Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter”
  • You learn to work with “contrary” people

    • Lazy people, angry people, confused people, people that are just hoping for a D-, people that are taking the class just because it was easier than BioChemiPhysics – They’re all there.  People this bad will likely be fired in the real world, but at least you’ll learn how to deal with the worst of the worst and still get the job done.  Now that’s experience.

Here are some reasons AGAINST education in software engineering and computer science.

  • It costs money.

    • This, however is usually taken care of by an employer that cares about the people that work for them.  If they don’t offer some kind of repayment plan in exchange for a few years of service to them, then they probably have a high turnover rate and don’t expect you to stay anyway.
  • You could be spending that time making money.

    • The time you would put into classes, you could have a second job as a freelance developer, or work on an open source project to gain experience.
  • You don’t really need a degree to “do” software.

    • I’ve seen people from all walks of life just hop into software.  I’ve seen former teachers, cognitive science majors, chemists, CPAs, lawyers, english majors, artists, musicians – you name it.  Lack of formal education can always be made up by experience and hard work.
    • Formal education can always be substituted by more and more focused hard work, since formal education typically has a very structured goal and plan for achieving that goal, combined with projects that help you practice concepts.  The same can be achieved on your own with you inputting the time to do research of material instead of the professors.  (which, in the long run is only more practice to help you get better.
  • You don’t get large team experience

    • 5 people is not a “large team”.  Try working with 7 developers, a whole testing department (who doesn’t speak your language), the ops guys who don’t want to give you access, the security guy that believes developers know everything and don’t use google to code.  Classroom projects can be more fun and motivate you, but the social dynamic is just different.

So, when you look at someone who has a all of these school credentials, or someone who doesn’t, remember that their skill is not really about that.  It’s about hard work and experience.  Period.  Graduate school is a great opportunity to work hard and learn a lot, and certainly was the right choice for me, but it is was just that – an opportunity.  I had to work hard in order for it to mean anything.  Just like you.

If you want to read more about hard work in Software Engineering, here is a great, timeless article: Teach Yourself Programming in 10 Years by Peter Norvig

May I also suggest: Discipline Outdoes IQ in the Long Run