The Ungiving Box

Once upon a time (at a company definitely not the one I’m working at now) there was an administrative assistant who thought that the group she worked in was not giving enough. So one holiday season she set up a “giving box” in the lobby, and put a sign on it saying that the box was for donations of toys. The idea was that you would buy a new toy, put it in the box, and the box would be sent to some place with lots of kids who didn’t have toys.

Whatever her perception, this group was already pretty full “about up to here” with giving requests.  So several days went by, and when she checked there were no toys in the box. So she sent email to the department, she had managers remind their employees about the box, and she put up flyers in the hallways and in the break rooms. Meetings in the group typically began with a written agenda on a whiteboard, and soon the toy box was discussed first in nearly every meeting.

A week went by. No toys. Soon everyone was being inundated with memos, stickies left on monitors, and random button-holings about the toy box. And there was resentment.

Indeed, at the end of two weeks, the box contained a single toy: A rubber chicken.

“She’s really upset,” said one manager, drying a tear from an eye.

—-

A year went by, and the admin tried again, this time with a gaudier box, and even more publicity and pushyness.

I heard the next part from that manager: At the end of two weeks, the box contained the very same rubber chicken (which had apparently not been donated to a kid who didn’t have a toy, and had been liberated from the group’s storage room), and nothing else.

I do not know what happened after that.

An ultimately unsuccessful interview

[No names, and I’m deliberately fuzzy about dates. Not even names of technologies. There were some really good and quite nice people at this company — if you’re reading this, you know who you are 🙂 ]

—-
… so after that start-up I took nine or ten months off to decompress. My needs were modest: I had a small mortgage, plenty of savings (certainly enough for several years of just going to coffee shops and bookstores), and I didn’t really want to do anything serious for a while. I motorcycled some, visited relatives, and finished a lot of books. Mucked around with a bit of code, but nothing epic.

Boredom set in, and with it, bad judgment.

I made the mistake of going to a “Brass Ring” high-tech job fair, more out of morbid curiosity about what jobs were available than actually wanting to find work. The job fair was a “fair” in the same sense that “camps” are sometimes used to hold prisoners of war; it was not a happy, joyful place. Silly Valley was six months or so into of one of its periodic downturns, and the lines of hopefuls were ten or twenty deep in front most of the booths. The anxiety was practically visible as people jostled each other, presented sweat-stained resumes and tried look confident and competent instead of abject and desperate. You could smell the fear, and I’m not kidding. I was detached, relaxed and had brought along just five copies of my resume, with the intent to be choosy and not give out any more than those copies.

Lockheed was there, or maybe it was Martian Douglas or Huge Aircrash, in any event some massive, soulless defense firm was looking for US Citizens Only eager to help blow things up with software and lots of government surplus money. There were some telecom companies, now long gone, and Cisco was looking for hardware engineers and sales types with flexible ethics. There were also a dozen companies I’d never heard of (and you haven’t either) with standard-issue Silly Valley names consisting of the letters X, Y and Z stirred in with some vowels and a light serving of other consonants: XyGroove, Zilyow, ZoodBarf, YankDix and Zxwzzyz. I’ve always wondered how someone answered the phone at Yrzyqk, and how many callers thought they had misdialed the Yrkzogistan Consulate.

One booth screamed “Low budget start-up!” — no frills, just the standard tables that the fair provided, and some wickedly uncomfortable Costco-issue chairs [I know those God damned chairs; they’re cheap and they last exactly two VC rounds and if you don’t sit down in them carefully you can tear off important bits of your anatomy]. The company had a cheap plastic banner with a generic company logo.

This job fair was being held in the Time of the Swooshies, and all corporate logos were required to have arcs representing excited arms, people leaping around in joy, and maybe stars and comets falling to earth (thus forshadowing the dot-com industry’s later crash). The logo belonging to this company was a Medium Swooshie — not a complete disaster, just uninspired, like the company’s name (which had only one ‘Y’ and no other selections from the right-hand half of the alphabet).

I took a closer look. The poster summarizing their open positions looked like a match of the stuff I liked to do. I waited politely for someone to talk to, handed over my resume and introduced myself.

The fellow looked at my resume. “Twenty years of C experience?”

“Um, yeah. I did –”

Twenty. You were at Apple? Um, when can you interview?”

Just like that. I did a whirlwind interview early the next week, and a day later I had a pretty good offer. Now there was just one weekend left of my long vacation and too many books to finish in that time. Dammit, I was working again. How’d that happen?

I had a hint then that their process for finding engineers was fairly weak. I’d forgotten that interviews need to go both directions, especially with start-ups.

—-

The day I arrived, the developer I was most looking forward to working with gave two weeks’ notice. A couple days later I was starting to copy his attitude and catch-phrases.

Train wreck.

The build system was primitive, basically some batch files that didn’t even check for errors. You had to manually scan the output of the file to catch broken builds by looking for words like “Error” and “Failed.”

No source control, naturally.  Who would need that?  Just put the files on the server in the right spot, and Alf will run the build script . . .

Part of the build required a bunch of files to be copied by hand from point A to point B (on the machine that had been dedicated to run the company’s mail system, be the print server, oh, and by the way, do builds), and carefully renamed so that the installer builder (another batch file with minimal attention to detail) wouldn’t choke. “Alf,” a Q/A engineer who had been roped into doing builds, proudly showed me his skills. It took most of an afternoon, and reminded me of nothing less than someone shoveling coal around with a mouse instead of a shovel.

For lack of anything better, and since it was a Microsoft shop, I stuck a loose collection of the company’s latest stuff into a SourceSafe database. A few more days of mucking about and we had a build system that was capable of figuring out that the build was broken if someone checked in a breaking change (someone promptly broke it and it stayed that way for a couple of weeks). Well, it was progress. A few days later I had the installer being automatically built, with daily build notifications and change list emails being sent out, and the IT guy was finally doing backups of the engineering server. All the stuff you need to get nice, repeatable builds and make sure that a croaked disk drive doesn’t take down your whole start-up.

During a meeting I gave a short presentation to the engineering and Q/A staff about the new automated build system. I finished, and asked if anyone had questions.

Alf looked confused and afraid. “I don’t get it,” he said, “Where’s the part where I copy the files and rename them and build the installer and rename those files?” It was then that I realized that I’d taken half of Alf’s responsibilities away, and that he was going to have to find something else to do.

Cargo-cult

Someone had read the Software Patterns book, because about every third source file implemented a factory; I’m pretty sure there were factories for making factories. Now there are perfectly good reasons to write factories, fine and wonderful reasons to have abstract instantiation, but what was going on in the bulk of this company’s code was fear, realized with indirection and thousands of lines of creative procrastination, and an attempt to be “grown up” with stuff copied from a popular book on design without doing any actual design. There was no reason to have all the factories and singletons and flyweights and visitors other than someone thought they were cool. To make a simple change to the product often involved modifying a dozen source files, carefully coordinating checkins with other developers who had pent-up breaking changes of their own.

Much of the code didn’t do anything, and it did it in some of the most indirect and complicated ways possible.  Tracking down how a line of code got run could take hours; it wasn’t as simple as just setting a breakpoint on something and letting a test case rip because entire flotillas of processes were launched in the course of a run.   This was organically grown software with all the architecture of a bowl of soup, with mystery floaty bits on top as a bonus.
Shrink

A couple months into my stint, the company brought in a psychologist to interview all of the technical staff. We were given a few days’ warning. And, as promised, a shrink showed up and started having hour-long sessions with everyone on staff.

I wish I had a good story on top of this, but I don’t. I have a little experience talking to shrinks, and it’s not like you’re taking a polygraph or anything. You give ’em something to chew on (“Doc? My editor reminds me of my mother…”) and shut the hell up about what you really think about things.

What this really meant was that this company knew it was screwed up and that things weren’t functioning, but the people in charge didn’t have the honesty and guts to find out what was wrong themselves, or to make any hard decisions. In the end nothing happened (well, the psychologist got paid) and things ran on as before (well, the worker bees were a little more cynical now).

Beef


Well, I rarely saw my boss; his door was nearly always closed. He was in there doing something with the company’s “architect” (who was a buzzword luminary in the particular technology this company was heavily invested in). Every couple of weeks I’d see one of them and ask a question; I never got a good response. I saw the architect every month or so; he never sent email, and I never saw a design from him that was less than a year old or that read as anything more than a set of vaporous bullet points you might find on a marketing hand-out at a trade show.
I was starting to look for another job, but at the same time we were also interviewing candidates. I thought it would be tough to give a technical interview for someone to work on a product that I didn’t really believe in, but I was wrong; you can detach yourself and do a technical assessment. The moral quandary being, is this a good place to work?, and nobody asked that question.

Two of the big investors had heard rumors and were concerned about the company, and they decided to start digging to see how their money was being spent. So a number of us got dragged into the offices of one of the VCs and we were asked to spill our guts. I’d already decided to bail, so it wasn’t hard.

The culmination of this was a Sunday morning meeting at a local bank where some independent technical experts grilled the daylights out of the engineers. The company’s president gave a ten minute song and dance at the beginning of the meeting; he was brushed aside quickly and the two heavies started drilling down. It didn’t take long.

“Where’s the beef?” asked one, looking incredulous. In twenty minutes they’d drilled down into the company’s technology and come up with a pile of ashes in their hands and the smell of burning money.

I shrugged. A couple of my worker-bee cow-orkers shrugged. There was no beef anywhere, not really. The product did more or less what it was supposed to do, but fundamentally it didn’t do anything very interesting. It was a little bit like a start-up for doing toothpaste; there’s nothing wrong with toothpaste, even a new kind of toothpaste, but technological advances in toothpaste are incremental at best, and it’s crazy to sink VC money into something that is mostly perception and marketing.

—-

I learned some valuable lessons from this:

Interviews work both ways. Ask hard questions. Is this a good place to work, do you use your own product, what is the turnover like, are you excited to come to work every day, how much of the technology actually works well and is innovative, are you planning to quit any time soon?

Don’t be afraid to throw away crap. In its short history this company had accumulated tens of thousands of lines of bad, boat-anchor-class code, and this self-inflicted pain made it very hard for them to do anything new. The delete key is your friend. Sometimes the best thing that can happen to a company is catastrophic loss of its source code repository . . . and I’m not even close to kidding about this.

Hire carefully. This company had very poor hiring practices. I mean, they probably shouldn’t have hired me. What they needed was a strong development team; what they got was a loose collection of developers of various strengths and random skills. Combine this with poor product vision and weak management and you have a recipe for a money-burning party.

—-

I quit after six months. I found my next job (which was a lot better) when I ran into an ex-cow-orker at a technical bookstore; we chatted, I mentioned that I was looking, and pretty soon I had a slightly longer commute.

That’s the way to do it. Job fairs suck.

Cat memory

We got our cat used; I think she was a couple of years old.  We’ve had her for about 8 years.  The whole time she’s been with us we have fed her solid (crunchy) food, lately an organic brand that has gotten her weight down.

Last week, due to a medical issue, we had to start feeding her canned food.

I opened the first tin. It made that metallic “snick-scrliffff!” noise.  And she teleported right next to me, and she started meowing.

What a memory.

This comment deserved some expansion.  Let the fur fly.

Does this mean we can stop now?

 No.

Can the pain finally end?

What pain?  If it’s painful, stop doing that.  Feel better now?  Great!

Can we have integers that really are integers and not integers modulo 2 to the power of (something indefinite-1)?

We did that in the 60s.  Remember BCD-based computing?  It sucked real hard.  A modern “bignum” architecture might be interesting, but its numerics would be toasted in performance-sensitive applications like graphics.  You could go “floats everywhere” as long as you don’t care about correct answers.

Really, numerics are a small part of life to a programmer.  Mostly what I deal with are packing and unpacking issues; I don’t worry about addition or multiplication, I worry about this-fitting-into-that, what transformations are made on data, and how to abstract stuff.  At the end of the day, if I need a 64 bit something, I’ll make it so.

Can we have char’s that are signed, or unsigned, I mean can’t we just decide!

Agree with you here.  This is a continuing irritation (however, it does not keep me awake at night).

Can we finally admit “unsigned” is just a storage space optimization?

Only if you can cram an extra kilobyte or so into the embedded system I worked on six years ago.  [This will seem to contradict my earlier statement about “just make that sucker 64 bits,” but engineering is all about cost tradeoffs, and knowing when to make them.]

Can we have garbage collection please? That stuff was done and sorted a decade ago!

Excellent, I can allocate memory in my interrupt handlers now!  It’s solved only if you have a runtime available that supports GC — if you are writing performance-sensitive code, or systems-level stuff, you don’t have this facility available.  [Now would be a great time to point out the research paper I missed on doing incremental GC from within an interrupt handler or something.]

I still seriously like LISP machines . . . but only a few years ago learned that most of them spent their lives running with GC turned off.

Can we have a sane way of specifying, packing and unpacking serialized data?

This is a well-solved problem.  Actually, it’s a great class of what I like to call a “too-solved” problem; in all probability there are millions of ways to pack and upack serialized data, thousands that are robust enough to call “real,” and of these a few are standard.  However, the standard ones mostly suck.

The way to stop this collective madness is, of course, to get a committee on that and get a decent standard together.  No, wait . . . . you wanted sane.

[kills self]

The last time we did that we got XML, and no, the pain has not ended. Indeed, I would echo your whole comment, but change “C” to “XML” and poise a knife over my wrist.

Can we all just stop using C!  Pretty Please!

Thank you for asking nicely.  However, the answer is: No, not today.  However, many problems that would once have been madness to use a higher-level language for are now perfectly reasonable to write in (say) C# or Java or Erlang. Or Visual Basic, for that matter.

I expect the use of C to erode over the next few decades, but I do not think we will ever be utterly rid of it.  I have seen interesting environments (LISP or C# on bare metal) that look promising, and the idea is frankly exciting, but we’re not there yet.

I also noticed…

Anomolous increase in diurnal temps in the US after flights were grounded for 3 days following the 9/11 attacks.  (Link).

Also, I noticed that after a couple of days, the birds were (for lack of a better word) acting cocky.  Obviously I had no way to measure this, but I’m wondering if they think that airliners are high-flying predators?