Friday, September 5, 2014

Software, Challenges and Why I write software and build hardware

Someone in our office asked me an odd question a while back. How do we chose what software to write. At first the obvious answers came up but then it dawned on me that I was missing the real reason.

The standard answer to that question given by any engineer would be, “It solves some problem”. Well duh! Of course. Do we ever write software or build something that doesn't solve a problem? Well yeah, we do. I once had a contest with a friend to see who could write a general solution to solve a Rubik's cube in the smallest number of lines of code. That's harder then it sounds. Is solving a Rubik's cube a problem? Kind of, but not really. Solving a problem is what all engineering whether software, hardware, or any other type of engineering is all about. That is what makes us engineers breath!

Software's entire purpose in life is to solve some problem. Somewhere inside software is a little hamster running around trying to fix something, make something easier, or just plain do something. That hamster's whole goal in life is to make the user of that software's life easier, more productive and just plain better. Throughout history mankind has slowly moved the tedious jobs, the mundane from himself onto others, then machines, the computers, and today our robots. We create those hamsters to solve problems. So that's why we write software.

How about a business need? Do we write software because some business process or mechanism is screaming and yelling for a solution. Oh yeah. Just look at how many thousands of little one off Access database or Excel spreadsheets show up throughout most businesses. People all over a business, not just software developers go around solving problems the best way they know how. So, yes, I write software because a business need is saying, “Fix me! Fix me!”.

How about when something is bugging me. It happens all the time. Some mindless task has finally reached my threshold of 'enough'. I'll spend the next few hours writing a quick piece of software to never have to do that task ever again.

Because it'll make money? Unfortunately, I still need food and shelter. Maybe someday somebody will solve that problem but it's going to take a while. I'd love to say we don't write software for this reason. But it wouldn't be true. Until software engineers all have patrons, like Leonardo DaVinci did, then we have to make money. Perhaps, someday I'll retire, not likely, and go write software for some not for profit entity. Oh, wait quite of number of my friends, colleagues and I do that already. Hmm, yes, we write software because it will make money, but once again, that's not the real reason.

Because I want to learn something? Oh yeah! Absolutely, 1000%! I am a learning magnet. Instead of watching TV (sorry watching Big Brother is a bit predictable), I tend to read a book, watch a class room video, a vblog, listen to some podcast, go read the proceedings of some conference. All those things and several thousand other things tend inevitably to lead to writing some piece of software or creating some hardware just to learn something new. Not because I need it, but just because I can. Every single, GOOD developer I know writes software at home to learn stuff. Without exception. But that's not the real reason. We are however getting closer to the real answer.

Ok, fine there's many reasons why I write software. Perhaps, it will be easier to write about why I don't write software.

There's times I or my team write software that I just hate. It's usually something that already exists. It's been done before. There's eighteen thousand versions already out there. There's nothing new about it. But we have to do it because someone is forcing us. Generally when that happens, I am bored. It's a struggle to get up and go to work everyday. You can see and hear it in the faces of the team too. They are not enthused. Just plain bored. Want to kill a team? Rinse and Repeat and your team will be bald in a few months.

There's an old story about a Cherokee Elder that sold a necklace to a New Yorker for a dollar (ok, ok, it's an old story). The New Yorker came back a few months later and asked if the Elder would make and sell him one hundred of the necklaces. The New Yorker's plan was to sell them in the city with a huge mark up. He thought he was going to be rich! Due to the large quantity of necklaces he was buying the New Yorker thought the Elder would charge him much less then one dollar. “I'll sell you them for $100 a piece.”, said the Elder. “What!”, exclaimed the New Yorker. Calmly the Elder replied that making one necklace was fun and required great craftsmanship, but making one hundred just became tedious and required much more effort to keep the craftsmanship to acceptable levels.

The exact same concepts apply in developing software and hardware. Making one can be a proverbial blast, making ten of the same exact piece of software. Not so much fun! Good teams and good developers want to be stretched.

Ok, maybe I can't answer Why I don't write software either.

But wait, isn't there a clue in those last two ideas. And I don't believe I'm alone in this. The real reason I write software or build hardware: It's almost euphoric.

Creativity, stretching oneself, stretching the team, watching the look in a team member's eye when they just came up with the solution to some problem. It's just plain fun!

Sometimes it's debugging. Finding that elusive little bug that's kept you and your team at bay for a week is what I tell my wife about when I go home. Ok, she has no idea what I'm talking about but she listens faithfully for a few minutes.

Sometimes it's in the design. Trying to find a way to build this huge cathedral out of these 100,000 bricks is a challenge. Especially, if the bricks are the wrong size.

Other times, it's watching the silly little robot stumble as it goes down a ramp. Ok, why did we not think about this thing walking down a ramp? Stairs are easy. Ramps. Hmmm.

Sometimes it's working with a great team. A great team is perhaps the most incredible thing you can experience after sex and religion. And on a good day of writing software I might question one of those. You guess which one.

When a good team is in tune, no egos, all focused on solving a difficult problem the world just vanishes! You actually forget what time it is. You realize you are hungry when your wife says, “Are you going to eat, supper is cold”? Once you've lived in that environment you will spend the rest of your days trying to get it back. It reminds me of an interview I once saw with Buzz Aldrin. After you've walked on the moon, there's no other place you want to be.

Sometimes, it's watching two computers spin up and start doing the work that use to take fifty computers.

Sometimes, it's watching ten people do the work that should have taken 100. You stand back looking at them celebrating and think “We actually did it! That should have been impossible. Yet it's done!”.

Sometimes it's when no one calls you to report a trouble. The team is done with the project and is standing around saying, “Ok, when are the trouble reports going to start coming in. Did we flip the switch? Let's check.” Other times, it's telling your client that you're done. And they say, “What? I thought we were weeks away.”

Once, in a while, it's scratching your head with two other developers saying, “Ok, now how in the world did she do that?”.

Sometimes, it's setting in a room with twelve other developers and you suddenly realize that no one has said a word for the last two hours. Yet somehow you've been communicating ideas all along.

Other times, it's knock down drag out fights at a white board. Red scribbles everywhere. Flying erasers. Coffee shop napkins are laid out all over the floor as the blueprints of the next industrial revolution.

That's why I write software. That's how I choose what software to write, and what software my teams will write. It's time to go do something cool! See you in the trenches. Let's go have fun.

So, if you have a problem that everyone is telling you it can't be solved or it's really tough. Give me a call. Those are the fun ones!