That mental space behind the couch

Is where new features go when you forget to scope and prioritize them, relying instead on the deluded fantasy that the new feature you are talking about is just "this small thing" that we'll do "now". It is easy to fall into this delusion because the meeting discussing the new feature was very genial. You can tell a feature has been stashed in that forsaken crawl space when:
  1. It has no story cards or to-dos attached to it -- it's just something you're "taking care of".
  2. Alternately, it has one card -- with few or no details. The title of this one card could translate without too much trouble into "Write Big New Feature". If you were questioned about that card you would grudgingly admit that it could be an umbrella for ten or twenty other cards, including things like: figure out what this feature actually does, CRUD all the resources (once it becomes clear what the resources are), and design UI.
  3. Other cards or to-dos are left open and unfinished while you "take care of this quick thing". Leaving them open supports the delusion that you're only gone for a second -- to the corner store, as it were, and not fleeing to Argentina to start a new life.
Other things you might also find in that crawl space when you start poking around it are:
  1. The fictional project deadline someone in your company insisted on having set in stone (that is conspicuously about half the time it will take to complete the project).
  2. The unfinished tails of "completed" features, e.g., "Yeah, the widget is done! I mean, it doesn't work in Safari yet and the we're gonna change the background image from a gremlin to a frog, but essentially, it's done."
  3. The chocolate bar that had no calories because you ate it standing up.

How awesome is that? (A public service announcement for using gems, plugins, and otherwise tested code)

Ok, so let's say you have some code from some guys you worked with once, some really really smart guys, and the code is... well, no, the code is awesome. It extends Rails in such a way that you can do all sorts of hitherto unheard-of magical transformations that make your life so much easier, and your code so much easier to read. And to write. And to understand.

OK, now, when you say it extends Rails, you don't actually mean like a patch or anything. And, actually, you don't even mean like a plugin or a gem. But it extends Rails in a really really awesome way.

OK, so what if the code is untested, really...dense, difficult to read, impossible to understand (even if you really really wish you understood it), and reliant on many other files? And so what if the other files the code depends on aren't in a plugin or a gem. Well, technically, some of them are. But some of them aren't! Which is fun! Because then it's not all conventional-like. Just super magical. I mean, who cares?

Because this is awesome. It gets even awesomer, because as you're busy using these magical transformations -- you don't even have to learn how to do things the regular way. You can just awesome it up and go home.

Which is fucking great. Until you decide to upgrade your application into the future, where everyone else has been living for a while. You know, Rails 10.11 -- or something really awesome like that.

And then, wait a minute, all the code breaks.

The app doesn't start. The code is no longer compatible. And worse, it's no longer compatible in a really really obscure way. That you really wish you understood. But you don't.

How awesome is that?

Pair Programming Firsts

I had a great time pair programming last weekend. It was the first time I had done this in a formal, our-computers-are-connected-and-we're-typing-at-the-same-time kind of way. I've programmed with people at the same computer, collaborated with people on different computers in a casual throw-ideas-back-and-forth kind of way, and done the passing-the-laptop-around thing, as well. But, a lot of my development time has been alone. For instance, I had a job for six years where I not only worked alone, but I telecommuted. During this time I lived in Brooklyn, Austin, Denver and Chicago (though not all at the same time). This was great and terrible at once: I had wonderful freedoms and benefits (cross-country travel and NY salary with TX income tax rates, to name a few), but I missed having other developers to learn from and play with.

Read the rest of this post »

Solo standups (that you can do sitting down)

I love daily standups, but what happens when you're standing (working) alone? Or it's not in the organizational culture? Even if you're lucky enough to have a standup meeting at work, you still have to find the thread of continuity from your work yesterday to your plans today and be able to communicate it in just a minute or so.

Personally, I find it hard to get a focused start on a workday if I don't know where I am on my road map of things to do and have a list of tangible discrete tasks. It's easier to feel overwhelmed or just kind of vague about what needs to be done. Also, when diversions occur, as they always do -- an unexpected bug or meeting -- it's easy to lose track of where the time went. People can get overwhelmed, let things pile up, veer down a different path without fully acknowledging the trade offs, or buy Getting Things Done and leave it unread on the shelf for a year. :)

Read the rest of this post »

Hold the Candle, Read the Code

Maybe you inherit an application, as I have. With an old test suite: some tests, but not too many. Written in Test::Unit, not overly clear from the wording what they are doing. Reliant of fixtures with evocative yet ambiguous names: @full, and @empty. But they're there. You run them. They pass.
def test_homepage_section
    assert !@empty.on_homepage?
    assert @full.on_homepage?
  end
Then one day, you're exploring some of the code covered by these tests in order to add a new feature to this particular corner of the site. Some code needs to be written, some needs to be refactored, all of it needs to be understood. It's the perfect time to port the tests to RSpec, as you've been doing little by little as time permits. Fixtures are replaced by Factories, underscored test names replaced by strings; and yet, as you get started, it's clear that whatever a particular test is asserting is simply not clear from reading it. Yes, '@full is on homepage', you say to yourself. But what exactly does that mean?

Read the rest of this post »

Design By Caste

Recently, en route to NYC, I was navigating through Chicago’s Midway airport. When I came to the Security Check there was a discouragingly large crowd of people pushing towards the gates. As we moved forward a few steps we came to three signs -- each marking the entrance to a separate line.

Each sign had a label and a graphic. Each traveler had a choice.

The first sign, I forget the label: but the graphic was of multiple people, including children, with multiple bags, crowded rather lumpishly into the frame. The label said something along the lines of Unfamiliar Travelers, High Maintenance Travelers, or People You Never Want To Be Stuck Behind In Line. I was definitely not joining this group.

The second sign had a line drawing of a fit young man in his thirties or forties. He sported a shoulder bag and a trendy hair flip. His sign? Casual Travelers. I hesitated in front of it and noted a feeling of fleeting disturbance that this representation of casualty and ease was male.

And then… sign three. Expert Travelers. It featured a woman in a pencil skirt, obviously traveling like an expert. My disgruntlement vanished. The line it flanked seemed short and swift.

I paused.

Read the rest of this post »

Chasing People through The Google

I love my dad. He's an original. And sometimes stubbornly so. For instance, when his originality is dried up and he's in a creative slump, he starts slinging language around like confetti, minting word-concoctions like wildwildwild, spoink, and metaNow.

What do they mean? Despite the fact that more often than not the new words are presented in some awesomely frightening font, such as showcard gothic, and are at least 70px high, no one actually knows. And more than one person has been burned by a quick defensive reaction when inquiring whether wildwildwild is actually a viable business plan. (Answer: of course!).

He loves PowerPoints and Word Documents, often writes without capital letters, and has a sixth sense for pronouncing words and names exactly... wrong. Syllables go where no syllables have gone before.

Read the rest of this post »

On Hiring Developers

If you want an animal, go to the zoo.

If you want a guru, go to the mountain-top.

If you want a rock star, wait around the stage door at Madison Square Garden and hope you get lucky.

If you're seeking a craftsman, talented developer, smart or brilliant programmer, someone with a particular skill set -- or any other combination of human qualities and technical capabilities, ask for those things.

You may find you get what you need -- minus the mythology, attendant fantasies, and egos (yours and theirs).

If you're not pending, flunk.

I've inherited a Rails project from a big design firm. My job is to stabilize it in its new environment, maintain it, and eventually grow and improve it. Today was a bit traumatic: I deleted 47 files from the project. These were unit tests and functional tests that were either completely empty, like so:

class ModelTest < ActiveSupport::TestCase
# crickets
end

Or functionally empty, a result of leaving scaffolding in place, like so:

class OtherModelTest < ActiveSupport::TestCase
# Replace this with your real tests.
def test_truth
assert true
end
end

Forty Seven Files.

The problem here is not only that much of the app is not tested (nor documented by well-written specs), but the presence of the 47 passing test files gives a false sense of security to anyone eyeballing the project before they realize that the coverage is in name only. Certainly there were many (ok, some) files with active tests in them (I'd say I pulled a little more than half the files from the project) but it left me a bit shell-shocked to realize not only how little was covered, but that this cruft had been passed back to the client.

Read the rest of this post »