When I was a young student, I had a fashionable infatuation with martial arts.   One day at the dojo I was busy practicing a particular punch to the side of the neck.  The teacher watched my repeated fumbling for a while, and finally pulled me aside and gave me one of the best lessons I’ve ever received on how to become a better software developer.

Why learning only one thing is hard

“Listen, you won’t learn the punch right by practicing it in isolation.  You’re going through the motions but you don’t know what you’re doing.  You’re going to need some context.”

OK, I thought, that seems like a good idea.  I’m not getting anywhere anyway.

“Let’s make the punch a part of a story,” he said.

So he taught me a kata.  It incorporated the punch into a sequence of moves against an opponent.  Before learning the kata I did basically know how to execute the punch.  But the kata showed me why I was doing it and that made all the difference.

My teacher’s lesson applies to software development as well.  The part you’re working on is part of a bigger story.  You have to know that story.  It is much easier to do the right things if you teach yourself a little bit about the customers, the business, usability, technology, or anything which is not your specialty but is happening around you anyway.

Are you a fake specialist?

When you pick a specialty, strive for technical depth.  As Chad Fowler says in The Passionate Programmer:

Too many of us seem to believe that specializing in something simply means not knowing about other things.

This hits the nail on the head.  If  ”specialist” does not mean technical depth, then all that is left is an excuse to avoid learning anything else.

So, here is my advice. Be both.  Be a generalist so you can understand the whole story.  Be a specialist to do your part better than anyone else could.




{ 22 comments }

Building High Performance Software Teams

Thursday, December 24, 2009

Post image for Building High Performance Software Teams

A matrix organization allows you to build teams with a high degree of specialization and top-notch skills, plan your resourcing easily, and encourages sharing knowledge between product teams. A matrix organization is great. Except that it’s not, not for developing software.

It’s not great when coders don’t do any testing because it’s the QA department’s responsibility. It’s not great when it takes a week to go through the DBA team to have a column added to a database table. It’s not great when developers have never directly talked to an actual end-user.

Please take a number. We will be able to look at your request in three or four days.

This is why startups get things done quickly. They have a small number of people, and most of them can and will do everything. There is no DBA team and no red tape. You can just add that damn column when you feel like it.

If you have separate departments for customer support, QA, development, product management, and so on, you should seriously consider tearing down those silos and replace them with real teams.

Of course, there are limits to what responsibilities teams should have to be successful. You probably shouldn’t have to set up your own network infrastructure, negotiate the rent, or unblock the toilet. If you have someone to do these things for you, that’s great. If you don’t… well, that’s life. I would rather unblock a toilet myself than try to keep it in. You?

{ 10 comments }

The Silver Bullet That Wasn’t

December 8, 2009
Thumbnail image for The Silver Bullet That Wasn’t

I have a confession to make. I occasionally fall prey to a most basic mistake: I think a tool will solve a problem before I even understand the problem.  Here’s what happened this time…
Like any company, we have an intranet. Ours is a motley collection of internal websites and tools: we have a [...]

7 comments Read the full article →

If Your Code Crashes in Production, Does it Make a Sound?

November 18, 2009
Thumbnail image for If Your Code Crashes in Production, Does it Make a Sound?

Meet Frank. Frank works as a product manager at Faxes-R-Us. He’s finishing up a presentation on their latest fax machine model: FRU-1221i with integrated Twitter and Facebook support. This one will sell like hot cakes.
Frank’s presentation is due tomorrow, and he’s now trying to include pictures on some of the slides. [...]

1 comment Read the full article →

The Three Doors of Type Systems

November 11, 2009
Thumbnail image for The Three Doors of Type Systems

Every so often, I get drawn into a discussion about the merits of static typing (Java, C, C#, ML) versus dynamic typing (JavaScript, Python, Ruby, Scheme). Many programmers seem to be firmly in one camp or the other. But somewhere in between, there’s a third door. Let me explain…
I hate dynamic typing.
Dynamic [...]

3 comments Read the full article →

Hashed Bits becomes Hacker Boss

November 9, 2009

I decided to change the name of this blog to something more descriptive and less “meh”. This blog is about developing software and managing development teams. That is, about hacking, and about being a boss. Frequently at the same time.
It is likely that RSS subscribers will see old posts coming up [...]

0 comments Read the full article →

The Essence of Lambda

November 6, 2009
Thumbnail image for The Essence of Lambda

When I was studying Scheme on a programming course at HUT, I remember I was a bit baffled by first-class functions. My previous experiences were with C, Pascal, Basic, and other languges which didn’t have first-class functions. Data is data, code is code. You don’t go mixing those two. Why would [...]

2 comments Read the full article →

A Developer’s Most Important Interface

November 1, 2009
Thumbnail image for A Developer’s Most Important Interface

A long time ago, I was actively playing a MUD. A MUD is like World of Warcraft, only on a much smaller scale, and there are no graphics. It’s all text based. To make your character do anything, you have to type commands at the prompt.
The thing with this MUD was that fights [...]

8 comments Read the full article →

Do You Speak Binary?

October 20, 2009

How well do you know the fundamental unit of information, communication, computation?
When interviewing coders, I often like to ask them to explain how they would implement a function which counts the number of bits set in an integer. This is often called the “population counting” problem. In Beautiful Code: Leading Programmers Explain How [...]

7 comments Read the full article →

5 Favorite Excuses to Avoid Fixing Your Architecture

October 12, 2009
Thumbnail image for 5 Favorite Excuses to Avoid Fixing Your Architecture

Do you remember your last quarrel over whether the current architecture of your software is a good one? Were you defending or attacking?
I’m sure some parts of that discussion weren’t completely rational. Here’s a list of some of my favorite irrational arguments against fixing a broken architecture. Maybe the list helps you [...]

0 comments Read the full article →