12 Nov 2009

Are You a Problem Solver or a Tool?

I’m at a point in my career as a Software Developer where I feel like things are opening up quite a bit for me. I’m not talking about getting a new job or something, I just mean that I think I’m finally understanding Software Development for what it is. I’ve been writing software since the beginning of 2003, so I guess I’m a little late coming to the game in this understanding? Oh well, it’s not the destination, it’s the journey, right? Right.

The Journey

My journey began as a craftsman. I got lucky because I learned how to program from a friend I worked with who was just helping me in his little spare time at work. My knowledge of PHP scripting started out super small, but I took rather well to it and essentially launched into a career when I had no idea I wanted one.

Through the following months and years I gained an incredible amount of knowledge by simply working with really bright people. It just seemed that each new job I got I came in contact with someone who helped me in a different way than before:

  1. From Nathan, I learned the very basics of programming: control flow, variables, functions, mysql, etc.
  2. From Rainer I learned a ton about OO programming and CSS-based designs, as well as semantic markup that validates and conforms to standards. He also taught me to love the complex Join Query, and love it I do.
  3. Ben showed me a new way to use objects I hadn’t really seen before (closer to framework programming), and also got me a job at a great little startup where we were given a great opportunity to run the show. At that company, I gained absolutely invaluable experience managing, developing, and deploying large applications. We even got the chance to write our own web framework, which was a huge learning experience.
  4. Ryan showed me what it takes to really get things done. He’s also a fine purveyor of knives and guns (which, admittedly has nothing to do with this post at all, it’s just cool).
  5. From Eric and Kevin I gained the opportunity to take all my knowledge and apply it with a different toolset. I also learned a lot more about enterprise-level systems.

All of these people and experiences has made me the developer I am today. I believe that whatever the road you take, eventually you come to be a developer who solves problems, which is really what software development is all about.

The Destination

So what is the relationship between solving problems and the programming languages or frameworks we use to do so? It’s quite simple:

Languages are tools, and we use tools to solve problems.

Much the same way a carpenter uses a hammer to put in a nail and a screwdriver to put in a screw, developers should choose their tools based on the problem at hand, not based on programming ideology. Just because you know Java considerably well doesn’t mean that Java should be used in all situations, like website scraping. Ruby or Perl would be much better suited to handle the retrieval and parsing of webpages, due to the better Regular Expression integration.

Scraping websites is just one example of a trillion different scenarios. I’ve run into this quite a bit lately, where a developer choose a language or framework due to ideology, and it’s been driving me crazy. Use the right tool for the job, and move on with it. My career and more importantly my abilities are not defined by the tools I use, but by my ability to solve the problem. Just as a carpenter is not defined in skill by whether he uses Dewalt or Craftsman, but by the experience he’s had building staircases or handcrafting beautiful pieces of furniture.

So, as a rule of thumb, write this down:

Your usefulness is defined by your experiences and ability to solve problems, not necessarily by the tools you use along the way.

This will always make you better when you apply this knowledge. Pick the right tool for the job, and ignore the detractors who say that Java is better than Ruby because it has compile-time checking and IDE support.

What good are tools then?

I’m glad you asked. Tools are simply meant to increase productivity and ease manual labor. Simple machines like the lever and pulley were undoubtedly created to alleviate the difficulties of certain types of manual labor, like raising heavy objects up to a higher plane. In other words, some caveman decided to solve a problem in a more convenient way: push the rock up the hill rather than try to heave it up a cliff.

In a similar vein, programming languages and frameworks are created to solve specific problems, which in turn makes them great tools for getting things done. There are thousands of languages out there to use, each of them created to solve a specific need that the creator couldn’t solve effectively with other tools. They found the need, so they created the tool, and now we all can use the tool to solve the given problem again and again.

So please don’t confuse yourself into thinking that the tools you use are what makes you great. The tools you use today will be outdated in five years or less, guaranteed. Your ability to solve problems with the proper tool is what makes you great.