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.
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!"
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.
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...
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.
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.
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.