Let me explain. Sorry, this might take a while...
Back
in November 2002 I posted an early working version of BugTracker.NET on
Sourceforge. Just for fun, something to do, to see how Sourceforge
worked and what the open source experience would be like. To my
surprise, by December '02 I started getting feedback from actual humans
actually using my app. Cool! The feedback usually took the form of
"It's very nice. Now, if only you could also make it do X, that would
be great". I loved the attention in a shamelessly infantile way, so
to get more of it, I gladly cloistered myself away and coded.
In September of 2003, I got this bit of feedback:
See the "Joel on Software" guy's "fogbugz" application for how nice email integration can be.
Joel Spolsky and FogBugz
The
"Joel on Software" guy is Joel Spolsky, of FogCreek Software. I knew
about Joel. I had been a fan of his writing way back since his classic
"Fire and Motion" essay. I had even downloaded and played around with
his "City Desk", a web content management system from the Neolithic era
of the internet. FogBugz is his flagship product, a web-based bug
tracker. I guess at some level I must have been at least aware that
there was such a thing as FogBugz, but I hadn't ever bothered to check
out how it worked. I can't explain the
disconnect, how it happened that on the one hand, I had enjoyed Joel's
writing and thinking, while on the other I had not bothered to take a look at his app compared to mine.
Well, that day I looked at FogBugz and this is what I saw (image courtesy of the WayBack Machine at www.archive.org).
There are two things I'd like you to notice in the screen shot.
#1
Both the incoming and outgoing emails related to this bug (or "case" in
FogBugz parlance) are tracked with the bug. It's typical that the
real discussion of a bug occurs in email. If you don't integrate both
the incoming and the outgoing emails with the bug itself, then that
email back-and-forth occurs in a separate system, like Exchange, and
the info in the thread gets misplaced. With the bug system that we use
at my current employer, for example, to get the emails with the bug entry, we have to save an email thread from Exchange as a file, and then
attach the file to the bug. Too cumbersome. Few bother.
#2 The different kinds of posts - like comments, file
attachments, screenshots, emails - are not segregated into their own
tabs, stuffed away into separate drawers like archeological debris. With my employer's bug system, even if somebody does attach the email thread, it's
hard to notice it because it's tucked away in its own minor tab. With
FogBugz, everything is all in the open, in one holistic chronological
narrative.
I like simple and open. I hate deep trees of file
directories when I'm searching for a file, where I have to click,
click, click to drill-down depth first into the terminal nodes of the
tree only to find out that I was barking down the wrong
tree. I prefer my hierarchies to be flat and shallow. For files, just a list. If the list is long, so what. With a click I
can sort it in alphabetical order, or file-type, or last-modified-date
and then scroll to where I know the file should be. With a deeply
nested tree of folders, I feel like I'm a rat, probing for morsels in
this dim nook, in that shadowy cranny. With a flat, open file
structure, I feel like a hawk, soaring above the grasslands, surveying
the panorama, ready to swoop to the earth and grab a scurrying field
mouse..
Hey, I'm just making an analogy. It's not like I make raptor-like sound effects as I scrolling down the file list...
If
that imagery was too overblown for you, how about this one from my married-with-children quotidian routine: When I empty the silverware tray from the
dishwasher, I just dump it unsorted into the drawer. My thinking is
this: Why should I bother spending time parsing the forks in the fork slot, the
knives in the knife slot, the big spoons in the big spoon slot, and the
little spoons in the little spoon slot. (I guess the technical terms
would be "tablespoon" and "teaspoon"). Even if the silverware is in
a chaotic jumble in the drawer, my eyes can instantly locate out the
specific utensil that I want, send the signal up the optic nerve into
my brain, which then issues a command to my hand.
Funny, but somehow my wife of 20
years hasn't bought into my approach yet. Pity, she's still stuck in the paradigm of wanting
each utensil segregated into its own slot in the plastic tray.
For
those software developers who have been living off pizza and carry-out
Thai food for a long time and who don't even have a girlfriend, not to
mention a wife and dishwasher, and so may have trouble understanding my domestic illustration, let me try to translate it for you: My random access
read operation has a seek time of so few milliseconds that there's no
benefit in trying to speed it up by maintaining indexes to the data
pages during the write operation. Clear?
Back to FogBugz. I
liked what I saw and decided to follow its lead. Since that time, I've
kept a close watch on Joel and FogBugz because they both continue to be
a source of good ideas and inspiration for me.
Jeff Atwood and Coding Horror
I'm
not exactly sure when I first encountered my would-be assassin, Jeff
Atwood. Maybe it was when I was researching CAPTCHAs, in 2006 maybe,
and discovered his blog "Coding Horror". In June of 2007 I was drawn
back to him through the act of me googling for people mentioning
BugTracker.NET. Jeff had announced a $10,000 award for a deserving
open source project based on Microsoft technologies, and a couple
people, strangers to me, nominated BugTracker.NET. Cool again! After that, I would read Jeff's blog now and then. He writes clearly and
informatively. In his writing, he comes off as intelligent, open-minded,
down-to-earth.
Stackoverflow
This year Joel and
Jeff partnered up to start a new venture, a programming
question-and-answer website, Stackoverflow.com. As part of building
interest in its launch, Jeff and Joel started posting weekly hour-long
podcasts of them just talkin', one-on-one, for an hour or so at a time,
about whatever tech topics were on their mind. I can't believe what a nerd I am; I enjoy listening to them bicker about the pros and cons of
inline versus code-behind more than I would enjoy listening to, say, Amy Goodman interviewing some random Nobel Peace Prize winner. Their chatter has been
my companion this summer - thanks to my little off-brand, cheapo,
non-iPod mp3 player - as I tortured myself on the Stairmaster at the
health club getting myself in shape for a hiking/biking adventure in
Alaska.
I guess I hadn't spent all THAT much time on the
Stairmaster, because by September, I had fallen behind the pace in
listening to their weekly podcasts. In September, I was still catching up with podcasts they had recorded back in July.
So, when I found myself having to drive to Detroit (from
Chicago), I figured I could catch up by loading up my mp3 player with the backlog of
episodes and listening to them in the car.
The trip from Chicago to Detroit was without
homicidal incident. The only harbinger of what was to come was that I
could sense a growing irritation in myself towards Jeff Atwood. Why?
Because Jeff just couldn't keep up with the pace of Joel's
conversational tennis. Joel would hit the ball to him and Jeff would
be day dreaming or something and would respond back with something
banal, or not even related to what Joel had just said. Jeff wouldn't get the ball back over the net.
Now, Joel would probably be happy to know that Jeff irritates me. Here's an exchange from their podcast #12:
Atwood: I do wish you could tell me like why I suck, like what am I doing wrong? Like...
Spolsky: Yeah, you know I think that it's just that you're just generally an idiot...
Atwood:
Yeah. No, no. And it's a valid opinion but I-- Well, what
specifically?...
Spolsky: Well listen, if you're really
searching, then search on my name and you'll find all these people
complaining about how I interrupt you, and I never listen to what
you're saying, and I'm the idiot, and you're the wise one on the
show. And that's fine, because what's cool is, the more-- that's just
going to make people listen to the podcast more. That's the way it is
with podcasts. There is nothing more fun than listening to two people, one of whom you hate, one of them you like.
Atwood: That's true.
Spolsky:
It doesn't matter which is which. It's just so much more fun than if
you like them both, or if you're-- there has to be like one guy there
that you just want to punch. Or you can't get emotional.
Once
again, Joel is right! Some of my best male-bonding experiences
were based on the shared experience of shouting out loud at the TV
whenever Bill Walton would make some idiotic editorial proclamation to
Marv Albert, like "Tony Parker just made the worst pass in the history
of Western civilization!"
Jewish/Goyish
I
think there's another dynamic going on. Joel is Jewish; Jeff is
Goyish. I don't mean this in the literal sense. Ignore the fact that,
coincidentally, Joel *IS* Jewish and Jeff, I feel safe to suppose, is not jewish. That has nothing to do with the point I'm making
here. I'm talking about Jewish/Goyish in the same sense that one can talk about warm and cool colors. I'm talking about Jewish/Goyish in the cultural
sense the way Lenny Bruce did here,
and updated here, elaborated here.
Some examples:
PCs are Jewish, Macs are Goyish.
Batman is Jewish, Robin is Goyish.
Pot is Jewish, Bongs are Goyish.
Letterman is Jewish, Leno is Goyish.
ESPN is Jewish, ESPN2 is Goyish.
College basketball is Jewish, College football is Goyish.
.com is Jewish, .net is Goyish.
We could add:
Python is Jewish, Ruby is Goyish.
Postgres is Jewish, mySQL is Goyish.
++i is Jewish, i++ is Goyish.
In the sense of these atmospheric
Jewish/Goyish distinctions, Joel is Jewish and Jeff is Goyish, and I've
always been drawn to things Jewish, although, I
dated mostly Catholics, but like I said, I'm not talking about actual
religious identities here. I dated Catholics because, of course:
Catholics are Jewish, Protestants are Goyish.
Are we clear?
The murder attempt
So, I'm driving back from Detroit, tired because I didn't get much
sleep the night before. Got in a traffic jam, which left me more
tired and agitated. That's when Jeff prepared me for the kill. In
podcast #15, Joel was contrasting the business model of software
consulting with the business model of writing software for sale.
Spolsky:
Now I do want to follow this to its logical extreme and so let’s say
that you’re working as an individual consultant and then you bring on a
couple other people and pretty soon you’ve got a team of your 20 guys.
Guys and girls. Your 20 professional, technical, developer type people
and you’ve got some sales people and you’ve got a whole bunch of
clients lined up and you’re doing all these gigs for these clients and
then all of a sudden what you’re going to start to notice is that
you’re charging by the hour and you're paying people by the hour and
therefore the total maximum amount of profit that you can make in this
business is just a function of how many people you can hire, in other
words with 20 employees then you can imagine making two million dollars
a year in profit (although that’s kind of pushing it, but that’s like
based on sort of New York rates) and in order to have four million
dollars you have to get up to forty employees and now all of a sudden
it’s just a game to see how many employees you can get and at some
point you start kind of reducing the quality of the employees a little
bit and it just becomes this gigantic recruiting exercise where whoever
can recruit the best makes the most profit and in fact I hate to say
this but Fog Creek actually started out with this as our initial goal.
As the first thing we were going to do as a part of boot-strapping was
to create this consulting firm and one of the reasons that we have such
great conditions for programmers is that we thought that would allow us
to win that recruiting war and be able to recruit the most people and
treat them the best have them stay with us the longest and therefore be
the most profitable in that kind of "body-shop" business or that
consulting business where you’re basically just providing people with
some where you’re providing your customers with a human being with
brains for a fixed number of hours.
But compare that
momentarily now, to the software business. Because in the software
business, as soon as you've written some code, you can license it or
sell it again and again and again and again and again, without writing
it again and again and again. Which is very different from a typical
IT consulting kind of arrangement. That means (among other things)
that you can make a lot more profit, because the profit is no longer
constrained by the number of employees you can hire, it's just based on
how many sales you can make, which is a function of how good your code
is. So if you write good code, you probably want to start getting into
basically the licensed or hosted software business, where there's some
kind of scale, there's this scaling that you can do that doesn't
require you to bring on more warm bodies. And that's really the
long-term goal.
In the early days of Fog Creek when I was
trying to evangelize this idea to people, I would always draw two
charts. One was showing a line going up linearly and saying "Your
profits are a function of the number of people and that's the
consulting business, but we also want to build a software business,"
and a software business you sort of superimpose a hockey stick on that
line, so it takes a while to start up, but when it does, it goes up a
lot faster than the number of people and pretty soon the core of the
business is in selling software licenses or in hosting software that
you provide for other people. And it scales a lot better and you can
make a lot more money, faster.
And one thing, which really
surprises me, and this is the only way I’m gonna touch on the
offshoring question of people in Argentina and Eastern Europe and
India, that are doing this kind of offshoring. Is they are all looking
at Hyderabad and Bangalore as their model. Which is they wanna be,
they wanna do the drudge work for cheap for American companies that
don’t wanna this stuff instead of looking at Israel as their model.
And the Israeli model is not offshoring, or outsourcing or taking the
drudge work, or taking the programming work and just dumping it in some
country where the wages are lower. The Israeli model is: "we're gonna
make some companies and these companies are gonna do highly innovative
things and they gonna sell software, and they're gonna make big
profits," instead of just providing kinda warm bodies that are neatly
bundled for you to use in packs of ten with a program manager and two
testers. So one thing that’s always a little depressing to me about
much of the offshoring world is that they're just not ambitious enough,
you know they’re not ambitious enough to make real software companies
and to make product companies. They are still, they are still trying
to do this kind of low wage programming kinda thing. Which to me is,
you know, a quick way to make a buck and to get started, but in the
long run you really wanna be selling something where what you’re
selling is intellectual property, because it can be sold again and
again and again and eventually becomes much much more profitable.
Atwood: Right. And I think that falls under the umbrella of “just try to be good at your job”.
At
this point I pressed the pause button on my mp3 player. Jeff, were you
even listening to Joel? Nothing, nothing he said had anything to do
with your banal "just try to be good at your job". Imagine if the
clear, well-structured essay that Joel delivered off-the-cuff had
been a text in an SAT test. A test question could have been:
The best title for this passage is:
a) Scaling of Different Software Business Models
b) But I Don't Want to Learn C!
c) Programmer Wages Around the World
d) Just Try To Be Good At Your Job
If you picked d), then congratulations on your acceptance to San Diego Community College of Beauty.
So, between being tired, and the traffic, the long hours on the road, and Jeff Atwood, I was on the edge, fragile.
A
week later in the Jeff and Joel's real world, but just a few miles down the road in my accelerated time (Ann Arbor to Battle Creek),
there was an exchange in podcast #16 regarding office furniture.
Whereas many companies spend a lot of money on desks, with the chairs
being an afterthought, Joel explained that the better way is to spend a
lot of money on great chairs, even if that means cheap tables from
Staples. Joel continued on to mention...
Spolsky:
...height adjustable tables, which is one reason I would actually not
recommend going with the Staples folding-leg tables, those are actually
a couple of inches high, and so, your arm is going to angled at kind-of
an uncomfortable angle if you're typing on a keyboard on one of those
standard, folding-leg [corey: emphasis mine] cheap-o tables that you get at Staples.
Atwood: Leg height is supposed to be a straight angle. You're not supposed to have your knees bend too much.
Jesus
Christ Jeff Are You Listening? Joel was talking about TABLE legs, not
HUMAN legs. Jeff is like Ginger in the iconic Larson comic. Maybe
all he heard was the word "leg" and that triggered his neurons assigned
to the "leg" key to fire and he retrieved "You're not supposed to have
your knees bend too much" as the value related to that key?
Right when I was in this agitated, irritated mental state, right when my mental rant
was going full throttle and my judgement was impared, I started to hear a funny sound come from the
backside of the car - a rental car, by the way - and so I paused the mp3 player to hear it better. It was hard to tell if it was coming from the car, or maybe the sound of the tires on the pavement, which was under construction and so had an unfinished texture. I was thinking, Eh, it's probably nothing, and anyway, it's a rental car. I guess I'll ignore it. And anyway, I gotta get back to listening for what inane platitude Jeff will
utter nex...
BOOOOM!
Explosion! Smoke! Smell of Something Burning! Terrible Grinding Noise! Have to struggle to control the car, bring
it to a controlled stop, off the road, without hitting anything. Jesus
what was that? I pull over onto an exit ramp, get out, afraid that the
car is going to catch on fire. I get out and and take a look: the right rear tire has disintegrated into little smoking shreds. Me, I'm shaking from the shock and
fear, awash with adrenalin. I felt lucky that I wasn't dead.
I blame Jeff.
It's because of him that I ignored the noise. I was too irritated.
Too absorbed in the PLEASURE of being irritated by him. "Tony Parker
just made the worst pass in the history of Western civilization!"
Okay,
so I'm on the shoulder of the exit ramp. I'm shaking with adrenalin.
I really was in some sort of fragile, traumatized state. I step
around to the passenger side, open the door and bend down to get my
cell phone off the seat but I'm still so shaken that when I bend down I
miss the opening of the door, smashing my face and, what's worse, my
$400 progressive bifocal glasses into the door frame. (My nose-pieces
are now permanently out-of-alignment. Damn! Mis-aligned nose-pieces
make me feel so...unsexy. Just saying the words "nose pieces" makes me
feel unsexy.).
I gotta tell you about my cell phone. I got
my first cell phone about three years ago. I bought it for $5 from son
who was 12 at the time, and was upgrading. This was a Virgin Mobile
pre-pay-plan phone ( the only kind anybody in our family has ever had.
Very humiliating for my teenage children ) I had the phone for months
and barely ever used it. I just don't have a life style that
necessitates a phone. My kids don't want to talk to me. I don't
really care where they are, as long as they stay out of the local
newspaper's weekly Police Blotter column. One time me and this
immigrant Korean mom were both at the mall to pick up our kids from
their "date". We were chatting while we were waiting, the mom
speaking reserved and polite halting English. When the kids were
overdue the mom suggested that we call them. I told her that I didn't
have a cell phone. Suddenly the reserved and polite Korean mom went
Yiddish comedian on me: "What? You don't own a cell phone? What are
you, Amish?".
So, what I had with me was a Virgin Mobile pre-paid
cell phone with about $8 worth of minutes on the account. I was worried that I might run out of minutes just while being
on hold waiting to talk to a human at Enterprise. With fingers still
shaking, I dialed Enterprise.
Voice Menu.
Press one for English.
Empressar numero dos para espanol.
Jesus. My minutes are evaporating!...
Fortunately, without having to jump too many voice menu hurdles, I find myself talking to a human. Let's call her Amber.
Me:
Hi, uh, first of all, I'm calling from a cell phone and I think I'm
going to run out of minutes real soon, so please don't put me on hold,
ok?
Amber: Yes, sir. What can I help you with?
Me: The car has
a flat tire. A disintegrated tire. I'm between Detroit and Chicago
but I want to get back to Chicago, where I rented the car.
Amber:
Sir, I can help you with road service, and then I can transfer your
call to somebody else who can help you with getting another car. Do
you need a tow truck?
At this point I pause, because I guess I
really don't need a tow truck. I can change a tire. But, I was a
little worried that maybe I had done damage to the rim, the wheel,
because the tire had so disintegrated. I figured it couldn't hurt to
have somebody else just look at it. And, deep down, feeling shakey
and frail, I just wanted the comfort of somebody else's presence.
Me: Okay, yeah, send a tow truck.
Amber: Ok sir. What's your home address?
Me:
What do you need my home address for? Please, I told you, I'm worried
about my phone dying any second, and I don't want to be stuck here.
Please write this down. I'm on the shoulder on the ramp of exit 94B,
westbound I94, near Battle Creek. Did you write that down?
Amber: [icy] Sir, I need to fill out all the information.
Me: I'm not at home. I'm here. Westbound I94, exit 94B.
Amber: Sir, I can't do anything unless I fill out the form.
Me: Okay, my home address is...
And I give her my home address, 123 Main Street....
Amber: What color is the car?
Me:
Amber, please, please. I'm running out of time. It's the only car
here. You can't miss it. It's the one with the smoke rising from
where the right rear tire used to be! I don't want to be stuck here
overnight.
Amber: Okay Mr. Trager. We're done.
Me: Great.
Amber: Let me just go over the information with you to make sure I have it all correct. I have your home address as....
Me:
Aaayyeee. Oh, please Amber! Can we skip this step? Can you please connect me to
the person who can get me another car, before my minutes are gone, and
all the businesses close?
You know the Enterprise commercials?
I had imagined that a knight in a shiny Taurus would deliver a fresh car to
me. Doesn't work that way. I was stuck in Battle Creek until the next
day. So, I got a room at the Motel 6, manager Bharat Patel. And it
wasn't so bad. Turned on the TV and the Bears were playing the Eagles.
The football was good therapy for the multiple psychological traumas I
had suffered, from the tire, Amber, and from Jeff Atwood.