The California Guys
Some lessons in contracting learned by being a slave programmer.
When the tech bubble burst, I was young and inexperienced. The local ISP where I’d been learning PHP laid me off, so I struck out on my own doing freelance web development. They say you have to learn through mistakes1, and software engineering books usually enumerate the kinds of mistakes available for you to make. Fortunately for my learning, I made all of these mistakes in one project.
The Project
A guy from California found my site and gave me a call. He was so authoritative and businesslike and American that he swept me up for a ride. He was ex-middle management from a Fortune 500 company in Silicon Valley, and he was founding a startup on a very limited budget. He quickly became known to my friends and family as California Guy.
The product he envisioned was a hosted project management web app. The starting point was some open source PHP code that had been abandoned by its creator. His request was for a fixed bid on a set of improvements, both design and functionality.
This opportunity both excited and frightened me. The previous contract I’d done was a site from scratch and had taken about 80 hours, and I’d learned a lot since then. Based on that information, for improving an existing system I bid using 50 hours at $20/hour2. I thought $20/hour was workable, since at the ISP I was making less. I thought wrong.
As you may know, fixed bids are very dangerous things to make. Even for hourly projects, you might not bill for every single hour you spend, depending on how diligent you are about billing for administration time, estimates, and such. Of course, fixed bids can work if you have crystal clear requirements, a strict scope, and strong understanding of the task at hand. I had none of those things. I wasn’t even allowed to see the code before I made the bid, although I talked my way into seeing the system in action via webcast.
Taking Off
The web app was rendering using a clutter of frames, which obviously had to go. The visual design was horrible, the usability was horrible, the whole thing was horrible. At first, this excited me because making improvements to something horrible should be easy. It was, at first.
At first glance I thought the variable names were weird, but I wasn’t so fortunate. The variable names were actually in Russian. Ripping out the frames proved out of the question, since they weren’t a design choice, but rather an architecture choice. Soon I was spending a lot of my time fighting against a vortex of tight coupling, magic numbers, presentational HTML, and variable names I couldn’t read.
This is when the “requirements” started to rear their ugly head. Although I knew in principle that having good requirements is important, I didn’t have a firm grasp on what that meant. For example, our bullet point “Supports popular, modern browsers” to me meant IE 5.5+, Mozilla, Safari. To him, it meant IE 5, various versions of his favourite browser Opera, and (seriously) Netscape 4. At this point Netscape 4 had about 1% market share, and didn’t really support CSS.
Crashing Down
Pretty soon, all-nighters were the norm to meet the milestone deadlines. The visual design parts were some of the deadliest, since he was using me to iterate all sorts of ideas and approaches. With a properly designed sematics-markup site this wouldn’t be too bad, but just changing the colours on this thing could take hours in Photoshop and PHP. Although I became wary of his change requests, I was too eager to please the customer to stick up for myself, and he knew how to get what he wanted.
After a couple months of this, I burnt out. Once I’d worked five times the number of hours in my estimate, I had to call it the end. Of course any sane individual would have walked away long before this, but I hadn’t had an income in months and was irrational. I needed to get paid, right then. Although he wished we had met the original “requirements”, he was very positive on the work I’d done, and thanked me effusively for everything.
Months of repeated reminders later, I finally got the cheque. Well, I got a cheque: he underpaid by 20%. When I complained, he said that I under-delivered. I ended up making way less than minimum wage3, and I’m pretty sure he didn’t feel bad about it. I was resentful, insulted, bitter, and getting sick of ramen noodles.
Redemption
It wasn’t until years later that I was contacted by another California Guy. I was then working for a company that did software contracting. I did internal projects that had nice users, nice code, and nice hours. When California Guy 2 came along, my instinct was to run like hell.
Initially, California Guy 2 was almost exactly like the first. He didn’t know exactly what he wanted, but he wanted a lot of it, and he wanted it ASAP. The project was to base a polished product off of incomplete open source PHP, whose code was disorganized. He wanted fixed bids, and even lived within miles of the last Guy.
The Guy was similar, but I was different. Having learned an expensive lesson, I structured the project very differently. I did hours of analysis beforehand, developing requirements and detailing what he meant by them. Since he wanted fixed bids, I bid on small chunks at a time, capped at a certain number of hours. All time I spent, including meetings and email, counted against the total. Sometimes I felt bad about counting 15 minutes for a quick email, but if there’s no cost for a service, the demand is going to skyrocket.
When he wanted arbitrary design changes or creative requirements changes, I would always oblige. Before I did, though, he had to choose what other thing he wanted to punt from this phase into the next one. He didn’t always like it, but pretty quickly he got a sense of how long certain things would take, and prioritized his requests based on their cost.
At first I was skeptical, tense, and irritable. The haunting memories of the last California Guy kept me suspicious that the project would fail. Instead, after each phase he came back for more. We got paid promptly by offering to suspend work on the current phase if a cheque was late. After quite a few equally-sized bids and successes, both sides parted ways amicably. We got paid, I got to sleep, and today his site is still running, almost exactly as I left it.
Long ago I wanted to meet the first California Guy so I could tell him off. Now, I want to meet him so I can thank him.
- Some disagree, but failure was the learning tool I had at my disposal. [↩]
- He talked me down from $25, which he said was high. This is always hard to fend of for people starting off who don’t have connections in the industry. I was a newbie, and we both knew it. [↩]
- This was much less fun than when I did it on purpose. [↩]
Mar 5 2009
3:31 pm
Great story.
Mar 5 2009
3:39 pm
Thanks! It makes me wonder how the first California Guy’s project would have turned out if it was managed the way the second California Guy’s was.
Mar 5 2009
3:56 pm
Well, he’d probably have been happy with the result. :)
Mar 5 2009
3:58 pm
The weird thing is, when I was done with the first California Guy, he was happy. He thanked me, he wanted me to work on more stuff for him (I told him I wanted to be paid first.) I think the only reason he underpaid was because things went downhill on his side, and he knew he could get away with it.
Mar 5 2009
4:10 pm
Great story – had similar experiences when I was a young contractor. What I still find fascinating, and at the same time disturbing in our software development world, is that we still can’t reliably/accurately answer the two most often asked questions of any size project: how much will it cost and when will it be done.
If you ever decide to run your own software company, you may find this useful: http://softwareindustrialization.com/BridgewerxProductSuccessBusinessFailure.aspx
Keep up the good writings,
From another guy in Vancouver (Gibsons actually)
Mar 5 2009
4:28 pm
I didn’t realize that, that’s sucky.
Mar 5 2009
7:13 pm
yeah, if I ever get in a fixed bid system for web design, I bid REALLY high. I think your story illustrates what happens all of the time. As you said, you are better off for it.
Mar 5 2009
7:33 pm
Great story, everyone has had something like this happen. Glad you shared it.
Mar 5 2009
8:37 pm
Have to say, I’ve been there before. I wrote a project and did it on broad spec from several users (and then provided customizations to it). Customization is one thing I will NEVER do again because you end up with unmanageable code. From that point on, I’ve decided a customization, while coming along with a price, will have to fit into the overall specs that the project requires (when it’s a multi-client project). We use a system at work for Accounts Payable and General Ledger, and we have customizations in it (which cost upwards of $30,000+). Whenever a bug surfaces in the app, we can’t apply a service pack or epatch as we’ll lose our customizations.
I guess after this late hour rambling, I know project management much better now and know how to handle potential problematic clients.
Mar 5 2009
8:49 pm
I could have sworn that I started up a new blog in a drunken haze, your story is nearly identical to my contract with “California guy”, except my variables were encoded in Hindi rather than Russian. I also learned a very important lesson:
Never sign onto an uncompleted and abandoned project as the sole developer unless you are starving and unable to find any other work. There is always a good reason why it’s abandoned: the original developer was an amateur coder and couldn’t fulfill the requirements (bad code), the project manager is difficult to work with, or the original developer died from a brain aneurysm as a result of stress.
Mar 5 2009
9:16 pm
Great post, Allen.
But I think you should follow this redditor’s advice:
“This would be a way better article if it was ‘HOWTO get sucked off during your first programming contract’” – turdfurg
I’m just saying is all.
Mar 5 2009
9:23 pm
Although the project itself was horrible, I’m not sure it was doomed from the outset. If I learned anything from the second California Guy, it was that contract programming’s success has as much to do with how you manage it and what the task is. Maybe I’m an optimist, but I think if the first California Guy came to me now, I be able to make a good fixed bid – on the complete rewrite that was necessary.
Mar 5 2009
9:29 pm
Also, I’d like to welcome all you Redditors and Hacker News folk – so far every comment, message, and remark I’ve received has been positive and/or thoughtful. Keep up the feedback – cheers!
Trackback Hugh Buchanan
Mar 5 2009
9:52 pm
Contract Programming… Fun?…
I recently came across a blog poast (http://www.antipode.ca/2009/the-california-guys/) that was unfortunately not news to me. In summary, the author, one Allen Pike (who I don’t know) writes about some bad experiences doing contract programming…
Mar 6 2009
12:24 am
Allen, you’ve picked a spectacular blog-picture.
$20/hr? That seems ridiculously low.
What would you estimate to be a fair price for professional PHP services?
Mar 6 2009
6:44 am
Thanks for the great post. I’m an independent contractor, but for each of the two contracts I’ve had thus far, I went through an agency where my corporation was being paid by the agency, and the agency was being paid by the client. So they dealt with the clients on financial matters, while I could just concentrate on the hourly-paid work. This is great from a hassle perspective, but it also means you get the privilege of forking up to 40% of your hourly rate to the agency (though, it’s invisible to you – you get an hourly rate from the agency, and they charge whatever they want/can to the client). I feel fortunate that for each of the two contracts I’ve had so far I’ve had great clients, but reading this post gives me a good sense of what to expect if or when I eventually connect with clients directly.
Thanks again, and best of luck to you in future endeavors!
Mar 6 2009
8:32 am
$20/hr is ridiculously low, definitely. Consulting rates should be substantially higher than what you’d make at a “normal” job.
You have to account for the time you spend getting clients, managing them, sick time, vacations, the risk you incur, discounts you might give, health and dental, rent, hardware and software, and more. It seems to be a good rule of thumb that if you double what you would earn hourly at a stable job, that should account for those variables.
Mar 6 2009
11:48 am
I’ve tried the independent contractor thing several times in my youth, and none of them really worked out.
The first time is when I was in high school. I made a garish looking (well, it looked good when I was 15!) website for a friend of my father’s who sold medical supplies. It was a fixed rate deal for $2000 for a bunch of static pages and it probably took me 20 hours worth of work to finish. However, when it came time to pay, the guy wanted to give me only $400 despite the fact we had agreed in writing for $2000. No matter what we couldn’t convince him to pay up, so we didn’t give him the site and I walked away with nothing.
My second experience was doing work with a friend of mine. We were contracting for a startup that was making USB security keys (somewhat aking to RSA). We refreshed their website and redid a bunch of documentation. I don’t remember how much money was involved, but my friend/partner was the contact on our side. Apparently he took all the money, used it to pay his rent, and I didn’t hear from him for the next few years…
Pingback links for 2009-03-06 | acervus.ca
Mar 6 2009
3:04 pm
[...] HOWTO get sucked in on your first programming contract [...]
Pingback links for 2009-03-06 « My Weblog
Mar 6 2009
8:06 pm
[...] Antipode – Article – The California Guys (tags: freelance) [...]
Pingback Antipode - Article - What your time is worth
Mar 8 2009
6:01 pm
[...] lot of people who read the story of my poorly-priced development contract have asked me what they should charge as freelancers. I have a simple formula for [...]