Categories
Articles

Why Math is Important for Software Engineering (Even if You Never Use it Again)

Math is important.  No, really!  I’m not just talking about that 2+2=4 stuff.  I’m talking about the big stuff.  The Cal III type stuff.  The problems that keep you up all night long.  The problems where the professor gives you 5 problems on Monday to do in a week and you say “Oh, shoot, 5 problems?  That’s it?  Pfft.  I’ll start next Sunday night at 9PM because Halo 3 just came out!”  Then you pull an

math in software

all nighter on Sunday and barely get four of the problems done.  Yea, I may or may not know about that first hand.  But really, I ask, why are you learning all this?  Are you really going to need all these crazy formulas for programming and software development?  Can’t just pull them out of a math book later?  It’s just a formula, right?  To be honest, there’s probably a 2% chance you will ever need this kind of math as a software developer.  Unless you go into graphics programming or something like that, you’ll likely never need it, and even then you’ll have references in the real world.  So why do I still think (really) hard math as absolutely essential to being a great developer?  Allow me to explain…

From a broad and practical point of view, math IS software development.  Math problems are solved exactly like you have to solve software problems in the real world, and there are direct parallels between math and programming.  Let’s go over them:

Categories
Articles

Software Development: Academic VS Real World Education

Should you learn software development by going to school? Or go straight to the real world? That largely depends on what you want and where you are in life.

I am lucky. I knew that I wanted to do something in computers since I was in the 5th grade. 

My class got an old (new) machine with a green screen, a math/vocabulary game starring a rabbit, and my favorite – BASIC (the programming language). Yes, “10 Print” and all. I wrote my first video game on that machine’s 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 the 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. I got four years’ worth of experience working as a developer on systems that hundreds of people used, and the apps eventually won awards. At the same time, I also got a CS degree. I graduated with four 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. To pay for grad school, I got a job at Amentra, Inc. in 2007. At that time, it was an aggressive, 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 learned enterprise Java and .NET, JBoss, Biztalk, Sharepoint, ESBs, SOA, Agile, and more. 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 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. In just seven years into my development career, I had gone from a town of a few thousand people where nobody leaves to working for THE Red Hat. I learned and heard many 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 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, Northeast Tennessee, not everyone is as bleeding edge as the Juggernauts of software. Here are the PROs of 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.
  • You get a big piece of paper.
    • Computer scientists and software engineers know that technology changes. Still, the person hiring sees that you have a big graduate degree tick beside your name, which bumps you above the next candidate.
    • Hiring managers often see graduate school 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 and understanding brings you nothing. Software development is a craft. You perfect your work through practice. Eric Raymond, the 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.
    • Many of the most challenging problems you will encounter as a developer are people problems. 

Here are the CONs of education in software engineering and computer science.

  • It costs money.
    • Grad school costs tens of thousands of dollars. On a positive note, many employers will allow you to expense your tuition in exchange for a certain number of years’ commitment. Generally, more advanced leadership positions in more traditional companies require an advanced degree to match.
  • You could be spending that time making money.
    • With 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 need a degree to write high-quality code.
    • I’ve seen people from all walks of life transition into software development. I’ve seen former teachers, cognitive science majors, chemists, CPAs, lawyers, English majors, artists, musicians, you name it. Lack of formal education can always with experience and hard work.
    • Formal education can always be substituted by 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. These outcomes manifest when you do the work yourself, with the only difference being the grades and degree recognition.
  • You don’t get experience working with a large team.
    • Five people is not a “large team.” Large teams can include dozens of developers, a whole testing department, an operations team, a security team, and more. Classroom projects can be more fun and motivate you, but the social dynamic is just different.

When you look at someone who has advanced school credentials, remember that the value is still about hard work and experience over time. Graduate school is an excellent opportunity to work hard and learn a lot and, indeed, was the right choice for me. Always remember that additional schooling is just that – an opportunity. I had to work hard for the degree to mean anything other than a piece of paper, just like you will.

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.