One tensions that I’m not sure every goes away for programmers is that of “Am I learning enough?” If it does, I’d like to know when so I can prepare myself :).

Here’s the thing: Technology, and programming specifically, move really fast and there’s a lot not only to keep up with, but to be aware of on a week-to-week basis. Notice that I did not say that there’s a lot of to learn on a week-to-week basis.

Very, very early in my career I used to feel as if I needed to keep up with every single new programming language and/or related technology in the software world as it releases.

Talk about a fools errand.

Even as I began working with what is now known as Pressware, I was focusing both on Ruby on Rails and WordPress at the same time. Then something changed: I dropped Ruby on Rails (not because I dislike it – critiques aside, I actually am a big fan of Ruby and what the Rails framework offers), but because I began to think:

“If I dedicated my time to one area rather than splitting it into two areas, could I be a better asset to those whom I’m tying to serve?”

But this question can be generalized even further because our culture releases tons of new stuff every single day, and there’s an implied level of “you should learn this” that comes along with it.

And if there’s not, then either I’m misunderstanding the plethora of comments, blog posts, and other pressures induced by the Internet.

Becoming a Word Class Programmer

A couple of months ago, I shared a video (that received some mixed responses) about a perspective on working that really resonated with me.

The quote was:

Be great at one thing. The world will reward your knowledge of a very narrow field … Be world-class at that one thing. Forget your weaknesses because someone is going to eat your lunch at the stuff you’re not good at.

To be clear, I am not advocating only learning one thing and sticking with those tools until your job security is as is such because you’re the only person in a 100 mile radius who can write that type of code, but I am advocating going deep rather than wide as it relates to learning to write software.

If we don't keep up, this is us.

If we don’t keep up, this is us.

At some point, most programmers realize this: Programming isn’t about the language that you use. It’s about how to efficiently and effectively solve problems using programs.

Languages are easy to pick up, and the more language that you learn, the easier it becomes, but knowing n-number of languages is only going to get you so far. Knowing how to use a language or a set of languages to creatively solve a problem for someone else is something completely different – and that’s what I believe programmers should be after.

Point, Counter-Point (And Counter Counter-Point)

Here are a few of challenges as I see them (not just in WordPress, but in software in general):

  • Our culture promotes constant learning, but constant learning is defined as always learning something in addition to the toolset that you already have.
  • Our culture promotes learning every new thing, but learning every knew thing will make you a jack of trades, master of none.
  • Our culture promotes a deep knowledge of a number of technologies, but how do we develop a deep knowledge when we’re thrashing about technology that are being released?

Obviously, for each of the points above, there’s a counter-pointer. I know, I know: there are likely counters to the counter-points, but the point that I’m trying to make is that, as programmers, we all feel a tension and it’s not one that we can easily deal with because it’s something that we’re faced with on a day-to-day basis.

For me, the questions always comes back to this:

“What do you want to be world class at doing?”

And at this point in my career, I have no shame in admitting that I want to be world class at solving problems using WordPress as a foundation for problem solving. Everything article I read, every technology that I explore, every book that I read all comes back to seeing what I can bring back to the table with WordPress.

Anyway, all of this gets even more complicated when you look at the tools that we have available to help us simply get our work done. Some examples of this include:

  • Should I use CodeKit, or Grunt and Bower?
  • Do I need to know server-side JavaScript?
  • Is the best language to learn PHP, Ruby, C#, …, or what?
  • … and so on, forever.

And the answer of all of these questions is dependent upon where you are, where you want to go, and if you’re able to successfully and effectively solve problems for those for whom you work.

For example, right now, Grunt and Bower are extremely popular among those who are constantly needing to “watch” their project, minify their scripts and styles, lint their work and so on. And don’t get me wrong, they are fantastic tools.

CodeKit offers the same functionality though I’d say it’s probably a bit less flexible. For most of my work, this is what I’ve opted to use. I’ve been happy with it (and I still use Grunt and Bower when other projects require it).

Does this make one set of tools better than the rest? It all depends on the environment in which you’re working. If you need a wide array of packages, more complicated-than-not dependency management, and need to work more with a large team on a large code base, then perhaps Grunt is a better option.

But I’m getting off topic: This isn’t a comparison/contrast post. This is a “are you doing what needs to be done to become a better programmer” post.

Striking a Balance

The thing is, we should be using tools that not only help us achieve our end goal, but that can also help us pick up a few new tricks a long the way.

And that’s how I think you strike a balance: You work on the things that you love with the toolsets that help you be most productive, but you work new tools, methodologies, and approaches into your workflow such that you’re still getting work done while also learning something new.

The thing about programming is that there are tips, tools, and tricks that can be generalized to what we’re doing – like patterns – and then there are platform-specific tools. I’m not saying never branch out of the things that you primarily work with – after all, learning how another platform does something helps you bring something back to your day-to-day – but I am saying that keep things in perspective.

Work hard to become world-class at your primary vocation, fight the tension that induces fear that you’re not good enough, not smart enough, or not capable enough to be a good programmer, and work on mastering those things with which you’re currently working.

I have a very, very long way to go but at least my work is cut out for me.

By now, I think I’m probably talking to myself more and than anyone else at this point, but maybe this will resonate with some of you.

It’s hard to keep up with everything that’s out there, but if I let that make me feel guilty, then I’ll lose focus of what I set out to achieve not only years ago, but just this morning.

I’d rather have a deep knowledge of a handful of things, than a surface level knowledge of a few things, and that’s what I remind myself whenever I feel that tension start to creep.