Advice for Computer Science College Students

Despite the fact that it was only a year or two ago that I was blubbering about how rich Windows GUI clients were the wave of the future, college students nonetheless do occasionally email me asking for career advice, and since it’s recruiting season, I thought I’d write up my standard advice which they can read, laugh at, and ignore.

Most college students, fortunately, are brash enough never to bother asking their elders for advice, which, in the field of computer science, is a good thing, because their elders are apt to say goofy, antediluvian things like “the demand for keypunch operators will exceed 100,000,000 by the year 2010” and “lisp careers are really very hot right now.”

I, too, have no idea what I’m talking about when I give advice to college students. I’m so hopelessly out of date that I can’t really figure out AIM and still use (horrors!) this quaint old thing called “email” which was popular in the days when music came on flat round plates called “CDs.”

So you’d be better off ignoring what I’m saying here and instead building some kind of online software thing that lets other students find people to go out on dates with.

Nevertheless.

If you enjoy programming computers, count your blessings: you are in a very fortunate minority of people who can make a great living doing work they enjoy. Most people aren’t so lucky. The very idea that you can “love your job” is a modern concept. Work is supposed to be something unpleasant you do to get money to do the things you actually like doing, when you’re 65 and can finally retire, if you can afford it, and if you’re not too old and infirm to do those things, and if those things don’t require reliable knees, good eyes, and the ability to walk twenty feet without being out of breath, etc.

What was I talking about? Oh yeah. Advice.

Without further ado, then, here are Joel’s Seven Pieces of Free Advice for Computer Science College Students (worth what you paid for them):

  1. Learn how to write before graduating.
  2. Learn C before graduating.
  3. Learn microeconomics before graduating.
  4. Don’t blow off non-CS classes just because they’re boring.
  5. Take programming-intensive courses.
  6. Stop worrying about all the jobs going to India.
  7. No matter what you do, get a good summer internship.

Now for the explanations, unless you’re gullible enough to do all that stuff just because I tell you to, in which case add: 8. Seek professional help for that self-esteem thing.

Learn how to write before graduating.

Would Linux have succeeded if Linus Torvalds hadn’t evangelized it? As brilliant a hacker as he is, it was Linus’s ability to convey his ideas in written English via email and mailing lists that made Linux attract a worldwide brigade of volunteers.

Have you heard of the latest fad, Extreme Programming? Well, without getting into what I think about XP, the reason you’ve heard of it is because it is being promoted by people who are very gifted writers and speakers.

Even on the small scale, when you look at any programming organization, the programmers with the most power and influence are the ones who can write and speak in English clearly, convincingly, and comfortably. Also it helps to be tall, but you can’t do anything about that.

The difference between a tolerable programmer and a great programmer is not how many programming languages they know, and it’s not whether they prefer Python or Java. It’s whether they can communicate their ideas. By persuading other people, they get leverage. By writing clear comments and technical specs, they let other programmers understand their code, which means other programmers can use and work with their code instead of rewriting it. Absent this, their code is worthless. By writing clear technical documentation for end users, they allow people to figure out what their code is supposed to do, which is the only way those users can see the value in their code. There’s a lot of wonderful, useful code buried on sourceforge somewhere that nobody uses because it was created by programmers who don’t write very well (or don’t write at all), and so nobody knows what they’ve done and their brilliant code languishes.

I won’t hire a programmer unless they can write, and write well, in English. If you can write, wherever you get hired, you’ll soon find that you’re getting asked to write the specifications and that means you’re already leveraging your influence and getting noticed by management.

Most colleges designate certain classes as “writing intensive,” meaning, you have to write an awful lot to pass them. Look for those classes and take them! Seek out classes in any field that have weekly or daily written assignments.

Start a journal or weblog. The more you write, the easier it will be, and the easier it is to write, the more you’ll write, in a virtuous circle.

Learn C before graduating

Part two: C. Notice I didn’t say C++. Although C is becoming increasingly rare, it is still the lingua franca of working programmers. It is the language they use to communicate with one another, and, more importantly, it is much closer to the machine than “modern” languages that you’ll be taught in college like ML, Java, Python, whatever trendy junk they teach these days. You need to spend at least a semester getting close to the machine or you’ll never be able to create efficient code in higher level languages. You’ll never be able to work on compilers and operating systems, which are some of the best programming jobs around. You’ll never be trusted to create architectures for large scale projects. I don’t care how much you know about continuations and closures and exception handling: if you can’t explain why while (*s++ = *t++); copies a string, or if that isn’t the most natural thing in the world to you, well, you’re programming based on superstition, as far as I’m concerned: a medical doctor who doesn’t know basic anatomy, passing out prescriptions based on what the pharma sales babe said would work.

Learn microeconomics before graduating

Super quick review if you haven’t taken any economics courses: econ is one of those fields that starts off with a bang, with many useful theories and facts that make sense, can be proven in the field, etc., and then it’s all downhill from there. The useful bang at the beginning is microeconomics, which is the foundation for literally every theory in business that matters. After that things start to deteriorate: you get into Macroeconomics (feel free to skip this if you want) with its interesting theories about things like the relationship of interest rates to unemployment which, er, seem to be disproven more often than they are proven, and after that it just gets worse and worse and a lot of econ majors switch out to Physics, which gets them better Wall Street jobs, anyway. But make sure you take Microeconomics, because you have to know about supply and demand, you have to know about competitive advantage, and you have to understand NPVs and discounting and marginal utility before you’ll have any idea why business works the way it does.

Why should CS majors learn econ? Because a programmer who understands the fundamentals of business is going to be a more valuable programmer, to a business, than a programmer who doesn’t. That’s all there is to it. I can’t tell you how many times I’ve been frustrated by programmers with crazy ideas that make sense in code but don’t make sense in capitalism. If you understand this stuff, you’re a more valuable programmer, and you’ll get rewarded for it, for reasons which you’ll also learn in micro.

Don’t blow off non-CS classes just because they’re boring.

Blowing off your non-CS courses is a great way to get a lower GPA.

Never underestimate how big a deal your GPA is. Lots and lots of recruiters and hiring managers, myself included, go straight to the GPA when they scan a resume, and we’re not going to apologize for it. Why? Because the GPA, more than any other one number, reflects the sum of what dozens of professors over a long period of time in many different situations think about your work. SAT scores? Ha! That’s one test over a few hours. The GPA reflects hundreds of papers and midterms and classroom participations over four years. Yeah, it’s got its problems. There has been grade inflation over the years. Nothing about your GPA says whether you got that GPA taking easy classes in home economics at Podunk Community College or taking graduate level Quantum Mechanics at Caltech. Eventually, after I screen out all the 2.5 GPAs from Podunk Community, I’m going to ask for transcripts and recommendations. And then I’m going to look for consistently high grades, not just high grades in computer science.

Why should I, as an employer looking for software developers, care about what grade you got in European History? After all, history is boring. Oh, so, you’re saying I should hire you because you don’t work very hard when the work is boring? Well, there’s boring stuff in programming, too. Every job has its boring moments. And I don’t want to hire people that only want to do the fun stuff.

I took this course in college called Cultural Anthropology because I figured, what the heck, I need to learn something about anthropology, and this looked like an interesting survey course.

Interesting? Not even close! I had to read these incredibly monotonous books about Indians in the Brazilian rain forest and Trobriand Islanders, who, with all due respect, are not very interesting to me. At some point, the class was so incredibly wearisome that I longed for something more exciting, like watching grass grow. I had completely lost interest in the subject matter. Completely, and thoroughly. My eyes teared I was so tired of the endless discussions of piling up yams. I don’t know why the Trobriand Islanders spend so much time piling up yams, I can’t remember any more, it’s incredibly boring, but It Was Going To Be On The Midterm, so I plowed through it. I eventually decided that Cultural Anthropology was going to be my Boredom Gauntlet: my personal obstacle course of tedium. If I could get an A in a class where the tests required me to learn all about potlatch blankets, I could handle anything, no matter how boring. The next time I accidentally get stuck in Lincoln Center sitting through all 18 hours of Wagner’s Ring Cycle, I could thank my studies of the Kwakiutl for making it seem pleasant by comparison.

I got an A. And if I could do it, you can do it.

Take programming-intensive courses.

I remember the exact moment I vowed never to go to graduate school.

It was in a course on Dynamic Logic, taught by the dynamic Lenore Zuck at Yale, one of the brightest of an array of very bright CS faculty.

Now, my murky recollections are not going to do proper credit to this field, but let me muddle through anyway. The idea of Formal Logic is that you prove things are true because other things are true. For example thanks to Formal Logic, “Everyone who gets good grades will get hired” plus “Johnny got good grades” allows you to discover the new true fact, “Johnny will get hired.” It’s all very quaint and it only takes ten seconds for a deconstructionist to totally tear apart everything useful in Formal Logic so you’re left with something fun, but useless.

Now, dynamic logic is the same thing, with the addition of time. For example, “after you turn the light on, you can see your shoes” plus “The light went on in the past” implies “you can see your shoes.”

Dynamic Logic is appealing to brilliant theoreticians like Professor Zuck because it holds up the hope that you might be able to formally prove things about computer programs, which could be very useful, if, for example, you could formally prove that the Mars Rover’s flash card wouldn’t overflow and cause itself to be rebooted again and again all day long when it’s supposed to be driving around the red planet looking for Marvin the Martian.

So in the first day of that class, Dr. Zuck filled up two entire whiteboards and quite a lot of the wall next to the whiteboards proving that if you have a light switch, and the light was off, and you flip the switch, the light will then be on.

The proof was insanely complicated, and very error-prone. It was harder to prove that the proof was correct than to convince yourself of the fact that switching a light switch turns on the light. Indeed the multiple whiteboards of proof included many skipped steps, skipped because they were too tedious to go into formally. Many steps were reached using the long-cherished method of Proof by Induction, others by Proof by Reductio ad Absurdum, and still others using Proof by Graduate Student.

For our homework, we had to prove the converse: if the light was off, and it’s on now, prove that you flipped it.

I tried, I really did.

I spent hours in the library trying.

After a couple of hours I found a mistake in Dr. Zuck’s original proof which I was trying to emulate. Probably I copied it down wrong, but it made me realize something: if it takes three hours of filling up blackboards to prove something trivial, allowing hundreds of opportunities for mistakes to slip in, this mechanism would never be able to prove things that are interesting.

Not that that matters to dynamic logicians: they’re not in it for useful, they’re in it for tenure.

I dropped the class and vowed never to go to graduate school in Computer Science.

The moral of the story is that computer science is not the same as software development. If you’re really really lucky, your school might have a decent software development curriculum, although, they might not, because elite schools think that teaching practical skills is better left to the technical-vocational institutes and the prison rehabilitation programs. You can learn mere programming anywhere. We are Yale University, and we Mold Future World Leaders. You think your $160,000 tuition entititles you to learn about while loops? What do you think this is, some fly-by-night Java seminar at the Airport Marriott? Pshaw.

The trouble is, we don’t really have professional schools in software development, so if you want to be a programmer, you probably majored in Computer Science. Which is a fine subject to major in, but it’s a different subject than software development.

If you’re lucky, though, you can find lots of programming-intensive courses in the CS department, just like you can find lots of courses in the History department where you’ll write enough to learn how to write. And those are the best classes to take. If you love programming, don’t feel bad if you don’t understand the point of those courses in lambda calculus or linear algebra where you never touch a computer. Look for the 400-level courses with Practicum in the name. This is an attempt to hide a useful (shudder) course from the Liberal Artsy Fartsy Administration by dolling it up with a Latin name.

Stop worrying about all the jobs going to India.

Well, OK, first of all, if you’re already in India, you never really had to worry about this, so don’t even start worrying about all the jobs going to India. They’re wonderful jobs, enjoy them in good health.

But I keep hearing that enrollment in CS departments is dropping perilously, and one reason I hear for it is “students are afraid to go into a field where all the jobs are going to India.” That’s so wrong for so many reasons. First, trying to choose a career based on a current business fad is foolish. Second, programming is incredibly good training for all kinds of fabulously interesting jobs, such as business process engineering, even if every single programming job does go to India and China. Third, and trust me on this, there’s still an incredible shortage of the really good programmers, here and in India. Yes, there are a bunch of out of work IT people making a lot of noise about how long they’ve been out of work, but you know what? At the risk of pissing them off, really good programmers do have jobs. Fourth, you got any better ideas? What are you going to do, major in History? Then you’ll have no choice but to go to law school. And there’s one thing I do know: 99% of working lawyers hate their jobs, hate every waking minute of it, and they’re working 90 hour weeks, too. Like I said: if you love to program computers, count your blessings: you are in a very fortunate minority of people who can make a great living doing work they love.

Anyway, I don’t think students really think about this. The drop in CS enrollment is merely a resumption of historically normal levels after a big bubble in enrollment caused by dotcom mania. That bubble consisted of people who didn’t really like programming but thought the sexy high paid jobs and the chances to IPO at age 24 were to be found in the CS department. Those people, thankfully, are long gone.

No matter what you do, get a good summer internship.

Smart recruiters know that the people who love programming wrote a database for their dentist in 8th grade, and taught at computer camp for three summers before college, and built the content management system for the campus newspaper, and had summer internships at software companies. That’s what they’re looking for on your resume.

If you enjoy programming, the biggest mistake you can make is to take any kind of job–summer, part time, or otherwise–that is not a programming job. I know, every other 19-year-old wants to work in the mall folding shirts, but you have a skill that is incredibly valuable even when you’re 19, and it’s foolish to waste it folding shirts. By the time you graduate, you really should have a resume that lists a whole bunch of programming jobs. The A&F graduates are going to be working at Enterprise Rent-a-Car “helping people with their rental needs.” (Except for Tom Welling. He plays Superman on TV.)

To make your life really easy, and to underscore just how completely self-serving this whole essay is, my company, Fog Creek Software, has summer internships in software development that look great on resumes. “You will most likely learn more about software coding, development, and business with Fog Creek Software than any other internship out there,” says Ben, one of the interns from last summer, and not entirely because I sent a goon out to his dorm room to get him to say that. The application deadline is February 1st. Get on it.

If you follow my advice, you, too, may end up selling stock in Microsoft way too soon, turning down jobs at Google because you want your own office with a door, and other stupid life decisions, but they won’t be my fault. I told you not to listen to me.

News

Most college students, fortunately, are brash enough never to bother asking their elders for advice, which, in the field of computer science, is a good thing, because their elders are apt to say goofy, antediluvian things like “the demand for keypunch operators will exceed 100,000,000 by the year 2010” and “lisp careers are really very hot right now.”

I, too, have no idea what I’m talking about when I give advice to college students. But that’s never stopped me from writing before.

College Advice

News

Brett has written up instructions for upgrading PHP to the latest version and getting it working with FogBugz. These instructions should be useful to anyone who needs to upgrade PHP due to the recent security flaw.

Happy Fifth

Tomorrow is the fifth anniversary of Joel on Software!

Job Openings

Organize my life and run the office at Fog Creek Software: Executive Assistant / Office Manager (filled).

And don’t forget, when you’re home for the holidays and you see all your cousins, siblings, and aunts who have been away at college: we have great summer internships, so please encourage them to apply!

News

Mercury News: “Accounting rule makers handed down long-awaited final guidelines Thursday that will force companies to deduct the value of billions of dollars of employee stock options from reported profits starting in mid-2005.”

Here’s some old discussion of what this means.

The old Silicon Valley hands are unhappy with the general concept of expensing stock options, and one reason they often give for this is the difficulty of figuring out the value of stock options. But anybody in the investment industry, and indeed, anyone with a rudimentary understanding of financial accounting knows that accounting for the value of an illiquid asset is always a problem yet something you always have to do anyway, and just because the value of stock options changes over time or because it is not possible to fix exactly does not mean it shouldn’t be accounted for consistently.

News

“When you’re setting a price, you’re sending a signal. If your competitor’s software ranges in price from about $100 to about $500, and you decide, heck, my product is about in the middle of the road, so I’ll sell it for $300, well, what message do you think you’re sending to your customers? You’re telling them that you think your software is ‘eh.’ I have a better idea: charge $1350. Now your customers will think, ‘oh, man, that stuff has to be the cat’s whiskers since they’re charging mad coin for it!’”

Camels and Rubber Duckies

Camels and Rubber Duckies

You’ve just released your latest photo-organizing software. Through some mechanism which will be left as an exercise to the reader, you’ve managed to actually let people know about it. Maybe you have a popular blog or something. Maybe Walt Mossberg wrote a rave review in the Wall Street Journal.

One of the biggest questions you’re going to be asking now is, “How much should I charge for my software?” When you ask the experts they don’t seem to know. Pricing is a deep, dark mystery, they tell you. The biggest mistake software companies make is charging too little, so they don’t get enough income, and they have to go out of business. An even bigger mistake, yes, even bigger than the biggest mistake, is charging too much, so they don’t get enough customers, and they have to go out of business. Going out of business is not good because everybody loses their job, and you have to go work at Wal*Mart as a greeter, earning minimum wage and being forced to wear a polyester uniform all day long.

So if you like cotton uniforms you better get this right.

The answer is really complicated. I’m going to start with a little economic theory, then I’m going to tear the theory to bits, and when I’m finished, you’ll know a lot more about pricing and you still won’t know how much to charge for your software, but that’s just the nature of pricing. If you can’t be bothered to read this, just charge $0.05 for your software, unless it does bug tracking, in which case charge $30,000,000 for it.

Now. Where was I.

Some Economic Theory

Imagine, for the moment, that your software costs $199. Why $199? Well, because I have to start somewhere. We’ll try other numbers real soon now. For now, imagine that you charge $199 and that gets you 250 customers.

Let me plot that:

This little chart I made means that if you charge $199, 250 people will buy your software. (As you see, economists are very odd people, and they like to put the quantity sold on the x-axis with the price on the y-axis. If 250 people bought your software, it must mean that you charged $199!)

What would happen if you raised the price to $249?

Some of the people who might have been willing to pay $199 are going to think $249 is too much, so they’ll drop out.

Obviously, people who wouldn’t even buy it for $199 are certainly not going to buy it at the higher price.

If 250 people bought at $199, we must assume that less than 250 people would buy it at $249. Let’s guess, oh, 200:

What if we charged less? Say, $149? Well, everyone who would buy it for $199 will certainly buy it for $149, and there will probably be even more people who think $149 is affordable, so let’s say we could sell 325 copies at $149:

And so on and so forth:

In fact rather than graphing a few discrete points here, let’s draw the complete curve that includes all these points, and while I’m at it I’ll fix the x-axis so it’s to scale:

Now you can tell me any price between $50 and $400 and I’ll tell you how many people will buy your software at that price. What we have here is a classic demand curve and the demand curve is always downward-sloping, because the more you charge, the fewer people will be willing to buy your software.

These numbers are not, of course, real. The only thing I’m asking you to believe, so far, is that the demand curve is downward sloping.

Augustin Cournot(If it’s still bothering you that I put the quantity on the x-axis and the price on the y-axis, when clearly the quantity is a function of the price, not the other way around, please take it up with Augustin Cournot. He probably has a blog by now.)

So how much should you charge?

“Uh, $50, because then I sell the most units!”

No no no. You’re not trying to maximize units, you’re trying to maximize profits.

Let’s calculate profits.

Assume each unit of software that you sell costs you an incremental $35.

Maybe it cost you $250,000 to develop the software in the first place, but that’s a sunk cost. We don’t care about that anymore, because the $250,000 is the same whether you sell 1000 units or 0. Sunk. Kiss it goodbye. Set any price you want, the $250,000 is gone and therefore not relevant any more.

At this point all we can worry about is the incremental cost of selling each additional unit. That might include shipping and handling, that might include tech support, bank service charges, CD duplication and shrinkwrapping, whatever; I’m going to be really hand-wavy here and use $35 as my incremental cost.

Now we can whip out our handy-dandy copy of Visicalc:

 

Here’s how to read that spreadsheet. Each row is a scenario. Row 3: If we were to charge $399, then we would sell 12 copies, making $364 profit per copy, for a total profit of $4368.

NOW WE’RE GETTING SOMEWHERE!

This is really cool. I think we’re on the verge of solving the problem of how much to charge for software! I’M SO EXCITED!

The reason I’m so excited is it looks like if you plot price against profit, you get a nice curve with a big hump in the middle! And we all know what humps mean! Humps mean local maxima! Or camels. But here they mean local maxima!

In this chart the actual data is shown as little blue diamonds, and I’ve asked Excel to draw a nice polynomial trendline on top. So now all I have to do is drop a line straight down from the peak of the hump to find out the price I should charge to make a maximal amount of profit:

“O frabjous day! Callooh! Callay!” I chortle. We have found the optimum price, $220, and that’s how much you should charge for your software. Thanks for your time.

Ahem.

Thank you for your time! Nothing more to see here! Move along now!

You’re not leaving.

I see.

Some of the more observant members of my audience have detected through careful analysis of the scrollbar position in their web browser that I might have something more to say other than “$220.”

Well, maybe. There’s just a tiny little loose end I left untied which I might as well tie up now if you’re all still up for it. Ok? OK!

You see, by setting the price at $220, we managed to sell, let’s say, 233 copies of the software, at a total profit of $43,105, which is all good and fine, but something is distracting me: all those people who were all ready to pay more, like those 12 fine souls who would have paid a full $399, and yet, we’re only charging them $220 just like everyone else!

The difference between $399 and $220, i.e., $179, is called consumer surplus. It’s the extra value that those rich consumers got from their purchase that they would have been perfectly happy to do without.

It’s sort of like if you were all set to buy that new merino wool sweater, and you thought it was going to cost $70, which is well worth it, and when you got to Banana Republic it was on sale for only $50! Now you have an extra $20 in found money that you would have been perfectly happy to give to the Banana Republicans!

Yipes!

That bothers good capitalists. Gosh darn it, if you’re willing to do without it, well, give it to me! I can put it to good use, buying a SUV or condo or Mooney or yacht one of those other things capitalists buy!

In economist jargon, capitalists want to capture the consumer surplus.

Let’s do this. Instead of charging $220, let’s ask each of our customers if they are rich or if they are poor. If they say they’re rich, we’ll charge them $349. If they say they’re poor, we’ll charge them $220.

Now how much do we make? Back to Excel:

Notice the quantities: we’re still selling the same 233 copies, but the richest 42 customers, who were all willing to spend $349 or more, are being asked to spend $349. And our profits just went up! from $43K to about $48K! NICE!

Capture me some more of that consumer surplus stuff!

But wait, that’s not all. After selling all these 233 copies, I felt kind of bad about the people who were only willing to spend $99. After all, if I could sell a few more copies to those guys at $99, I’d still be making some money, since my marginal cost is only $35.

What if we called up all the customers who said “no thanks” at $220, and offered them the software at $99?

At $99, we have 450 potential customers, but don’t forget that 233 of them already paid full price, leaving us with 217 extra customers who just wouldn’t go along with the program and pay the full price:

Babymosesinabasket, I think we just made $62K in profit! All in all, an extra twenty thousand buckeroos, cash spendable money, which goes a loooong way towards a down payment on that fishing boat you’ve had your eye on. All from the power of segmentation: separating your customers into different groups according to how much they are willing to pay, and extracting the maximal consumer surplus from each customer. Holy Segments, Batman, how much money could we make if we ask every customer to tell us their maximum willingness to pay and then charge them that?

Surreal! Almost $80K! That’s almost double the profits we made having just one price! Capturing the consumer surplus is clearly quite profitable. Even the 350 annoying people who only want to give me $49 each are making some contribution to the profits. All these customers are happy because we’re asking them to pay the amount they were willing to pay already, so it’s not like we’re ripping anyone off. Kind of.

Here are some examples of segmentation you’re probably familiar with:

  • Senior citizen discounts, since older people tend to be living on a “fixed income” and are willing to pay less than working-age adults
  • Cheap afternoon movie matinees (useful only to people without jobs)
  • Bizarre airfares, where everyone seems to be paying a different price. The secret about airfares is that people who are flying on business get their company to reimburse them, so they couldn’t care less how much the ticket costs, while leisure travellers are spending their own money and they won’t go if it costs too much.

Of course, the airlines can’t just ask you if you’re travelling on business, because pretty quickly everyone would catch on and lie to get the cheaper fares. But business travellers almost always travel on weekdays, and they hate spending a weekend away from home. So the airlines instituted policies that if you’re staying over a Saturday night, you’re probably not travelling on business, and they give you much cheaper fares if you stay over a Saturday night.

    There are more subtle ways to segment. You know those grocery coupons you see in the paper? The ones that get you 25 cents off a box of Tide detergent if you clip them out and remember to bring them to the store? Well, the trouble with grocery coupons is that there’s so much manual labour involved in clipping them, and sorting them out, and remembering which ones to use, and choosing brands based on which coupons you have, and so on, and the net effect is that if you clip coupons you’re probably working for about $7.00 an hour.

    Now, if you’re retired and living off of social security, $7 an hour sounds pretty good, so you do it, but if you’re a stock analyst at Merrill Lynch getting paid $12,000,000 a year to say nice things about piece-of-junk Internet companies, working for $7 an hour is a joke, and you’re not going to clip coupons. Heck, in one hour you could issue “buy” recommendations on ten piece-of-junk Internet companies! So coupons are a way for consumer products companies to charge two different prices and effectively segment their market into two. Mail-in rebates are pretty much the same as coupons, with some other twists like the fact that they reveal your address, so you can be direct marketed to in the future.

    There are other ways to segment. You can market your products under different brand names (Old Navy vs. The Gap vs. Banana Republic) and hope that the rich people conveniently remember to buy their clothes at the Banana while the po’ people go to Old Navy. In case there was any risk of people forgetting and going to the wrong store, the Banana Republic stores are conveniently situated in neighborhoods full of $2,000,000 condos while the Old Navy store is near the train station where you haul your poor tired ass back to New Jersey after a day of hard manual labor.

    In the world of software, you can just make a version of your product called “Professional” and another version called “Home” with some inconsequential differences, and hope that the corporate purchasers (again, the people who are not spending their own money) will be too embarassed at the thought of using “Windows XP Home Edition” at work and they’ll buy the Pro edition. Home Edition at work? Somehow that feels like coming to work in your pyjamas! Ick!

    Quick trick: if you’re going to try to pull the segmenting idea, you’re probably going to be better off offering a discount to certain users rather than trying to charge some users a premium. Nobody likes feeling ripped off: people would rather buy a $199 product for $99 than a $59 product for $79. Theoretically, people should be rational. $79 is less than $99. Realistically, they hate feeling like someone is ripping them off. They’d much rather feel like they’re getting a bargain than feel like they’re getting gouged.

    ANYWAY.

    That was the easy part.

    The hard part is that everything I just told you is sort of wrong.

    Working my way backwards, this business about segmenting? It pisses the heck off of people. People want to feel they’re paying a fair price. They don’t want to think they’re paying extra just because they’re not clever enough to find the magic coupon code. The airline industry got really, really good at segmenting and ended up charging literally a different price to every single person on the plane. As a result most people felt they weren’t getting the best deal, and they didn’t like the airlines. When a new alternative arose in the form of low cost carriers (Southwest, jetBlue, etc.) customers had no loyalty whatsover to the legacy airlines that had been trying to pick their pockets for all those years.

    And God help you if an A-list blogger finds out that your premium printer is identical to the cheap printer, with the speed inhibitor turned off.

    So, while segmenting can be a useful tool to “capture consumer surplus,” it can have significant negative implications for the long term image of your product. Many a small software vendor has seen their revenues go up and the amount of customer bickering about price go way down when they eliminated coupons, discounts, deals, multiple versions and tiers. Somehow, it seems like customers would rather pay $100 when everyone else is paying $100 than pay $79 if they know there’s someone out there who got it for $78. Heck, GM made a whole car company, Saturn, based on the principle that the offered price is fair and you don’t have to bargain.

    Even assuming you’re willing to deal with a long-term erosion of customer goodwill caused by blatant price discrimination, segmentation is just not that easy to pull off. First of all, as soon as your customers find out you’re doing it, they’ll lie about who they are:

    • Frequent business travellers rearranged their tickets to include dual Saturday-night stays. For example a consultant living in Pittsburgh and working in Seattle Monday through Thursday would buy a two week trip from Pittsburgh to Seattle and then a weekend trip home in the middle. Both trips included Saturday night stays, it was the same flights they would have taken anyway, just much cheaper.
    • Got an academic discount? Everyone who is even vaguely related to someone vaguely associated with academia will start using it.
    • If your customers talk amongst themselves, they’re going to find out about the price you’re offering the other people, and you’ll find yourself forced to match the lowest prices for everyone. Especially the big corporate purchasers who theoretically should have the “maximum willingness to pay” since they represent rich customers. Corporations have full time purchasing departments staffed with people whose entire job is whittling down prices. These people go to conferences where they learn how to get the best price. They practice saying “no. cheaper.” all day long in front of mirrors. Your sales guy doesn’t stand a snowflake’s chance in hell.

    There are two forms of segmentation that slightly-too-clever software companies engage in that are not such great ideas:

    Bad Idea #1: Site Licenses.

    The opposite of segmentation, really. I have certain competitors that do this: they charge small customers per-user but then there’s a “unlimited” license at a fixed price. This is nutty, because you’re giving the biggest price break precisely to the largest customers, the ones who would be willing to pay you the most money. Do you really want IBM to buy your software for their 400,000 employees and pay you $2000? Hmm?

    As soon as you have an “unlimited” price, you are instantly giving a gigantic gift of consumer surplus to the least price-sensitive customers who should have been the cash cows of your business.

    Bad Idea #2: How Much Money Do You Have? Pricing.

    This is the kind used by software startups founded by ex-Oracle salesmen where the price isn’t on the website anywhere. No matter how much you search to find the price, all you get is a form to provide your name, address, phone number, and fax number, for some reason, not that they’re ever going to fax you anything.

    It’s pretty obvious here that the plan is to have a salesman call you up and figure out how much you’re worth, and then charge you that much. Perfect segmentation!

    This doesn’t work so good either. First of all, the low end buyers are just going to move on. They will assume that if the price isn’t listed, they can’t afford it. Second, the people who don’t like salesmen harassing them will just move on.

    Worse, as soon as you send a message that your price is negotiable, you’re going to end up reverse segmenting. Here’s why: the big companies you sell to, the ones who should be willing to give you the most money, are incredibly sophisticated about purchasing. They’ll notice that your sales guy or gal is working on commission, and they’ll know that he’s got quarterly quotas, and they’ll know that both the salesperson and the company are going to be incredibly desperate to make a sale at the end of the quarter (the salesperson to get his commission, and the company to avoid getting their knees shot off by their VCs or Wall Street). So the big customers will always wait until the last day in the quarter and end up getting a ridiculously good price which somehow involves weird accounting shenanigans so the company can book a lot of revenue that they’re never really going to get.

    So, don’t do site licenses, and don’t try to make up prices as you go along.

    BUT WAIT!

    Do you really want to maximize profits? I glossed over something. You don’t necessarily care about maximizing profits this month. You really care about maximizing all your profits, over time, in the future as well. Technically, you want to maximize the NPV of the stream of all future profits (without ever having your cash reserves dip below zero).

    Diversion: What’s an NPV?

    What’s worth more, $100 today or $100 in one year?

    Obviously $100 today, because you can invest it, say, in bonds, and at the end of the year you’ll have, like, $102.25.

    So when you’re comparing the value of $100 in one year to $100 today, you need to discount the $100 based on some interest rate. If the interest rate is 2.25%, for example, those $100 in the future should be discounted to $97.80, which is called the net present value (NPV) of $100 one year in the future.

    Go even further into the future, and you need to discount even more. $100 in five years, at today’s interest rates, is worth only $84 today. $84 is the net present value of $100 in five years.

    Which would you rather earn?

    OPTION ONE:
    $5000, $6000, $7000 over the next three years

    OPTION TWO:
    $4000, $6000, $10000 over the next three years

    Option two sounds like a better deal, even after discounting the future earnings. If you take the second option, it’s like investing $1000 in year one and getting $3000 back two years later, which is a very respectable investment!

    The reason I bring this up is because software is priced three ways: free, cheap, and dear.

    1. Free. Open source, etc. Not relevant to the current discussion. Nothing to see here. Move along.
    2. Cheap. $10 – $1000, sold to a very large number of people at a low price without a salesforce. Most shrinkwrapped consumer and small business software falls into this category.
    3. Dear. $75,000 – $1,000,000, sold to a handful of rich big companies using a team of slick salespeople that do six months of intense PowerPoint just to get one goddamn sale. The Oracle model.

    All three methods work fine.

    Notice the gap? There’s no software priced between $1000 and $75,000. I’ll tell you why. The minute you charge more than $1000 you need to get serious corporate signoffs. You need a line item in their budget. You need purchasing managers and CEO approval and competitive bids and paperwork. So you need to send a salesperson out to the customer to do PowerPoint, with his airfare, golf course memberships, and $19.95 porn movies at the Ritz Carlton. And with all this, the cost of making one successful sale is going to average about $50,000. If you’re sending salespeople out to customers and charging less than $75,000, you’re losing money.

    The joke of it is, big companies protect themselves so well against the risk of buying something expensive that they actually drive up the cost of the expensive stuff, from $1000 to $75000, which mostly goes towards the cost of jumping all the hurdles that they set up to insure that no purchase can possibly go wrong.

    Now, a quick glance around the Fog Creek website reveals that I’m firmly in camp #2. Why? Selling software at a low price means that I can get thousands of customers right away, some small, some large. And all those customers are going to be out there using my software and recommending it to their friends. When those customers grow, they’ll buy more licenses. When people working at those customers move to new companies, they’ll recommend my software to those new companies. Effectively I am willing to accept a lower price now in exchange for creating grassroots support. I see the low price of FogBugz as being an investment in advertising that I expect will pay off many times over in the long run. So far, it’s working very well: FogBugz sales have grown more than 100% for three years without marketing, solely based on word-of-mouth and existing customers buying additional licenses.

    By comparison, look at BEA. Big company. Big price tag. The price alone means almost nobody has experience with their product. Nobody comes out of college and starts a dotcom using BEA technology, because they couldn’t afford BEA technology in college. A lot of other good technologies have doomed themselves with high prices: Apple WebObjects was irrelevant as an application server because it started at $50,000. Who cared how good it was? Nobody ever used it! Anything made by Rational. The only way these products get into the hands of users is with an expensive full-frontal sales pitch. At these prices, the sales pitch is made to the executive, not the techie. The techies may well actively resist bad technology with good sales that the executives force down their throats. We have lots of FogBugz customers who have high-priced Remedy, Rational, or Mercury products sitting on the shelves after investments of well over $100,000, because that software isn’t good enough to actually use. Then they buy a couple of thousand dollars worth of FogBugz and that’s the product they really use. The Rational salesperson is laughing at me, because I have $2000 in the bank and he has $100,000. But I have far more customers than he does, and they’re all using my product, and evangelizing it, and spreading it, while Rational customers either (a) don’t use it or (b) use it and can’t stand it. But he’s still laughing at me from his 40 foot yacht while I play with rubber duckies in the bathtub. Like I said, all three methods work fine. But cheaper prices is like buying advertising and as such is an investment in the future.

    OK.

    Where was I.

    Oh yeah, before I started frothing at the mouth, I was picking apart the logic of deriving a demand curve. When I walked you through that whole discussion of the demand curve, you were probably asking yourself, “How do I know how much people are willing to pay?”

    You’re right.

    That’s a problem.

    You can’t really find out what the demand curve is.

    You can have focus groups and ask people, but they’ll lie to you. Some people will lie to show off their generosity and wealth. “Heck, yeah, I’d buy a pair of $400 jeans in a New York Minute!” Other people will lie because they really want your thing and they think you’ll decide to charge less money if they tell you a low number. “Blogging software? Hmm. I’d pay, at most, 38 cents.”

    Then you ask another focus group the next day, and this time, the first man to speak has a crush on a pretty woman in the group, and he wants to impress her, so he starts talking about how much his car cost and everyone is thinking Big Numbers. And the day after that, you serve Starbucks during the break, and while you’re in the john everyone unbeknownst to you gets into a side conversation about paying $4 for a cup of coffee, and they’re in a real frugal mood when you ask them about their willingness to pay.

    Then you finally get the focus group to agree that your software is worth $25 a month, and then you ask them how much they would pay for a permanent license and the same people just won’t go a penny over $100. People seriously can’t count.

    Or you ask some aircraft designers how much they would pay and they sort of think $99 would be a maximum price, even though aircraft designers regularly use software that costs on the order of $3000 a month without being aware of it, because someone else does the purchasing.

    So from day to day you get radically, and I mean radically different answers when you ask people how much they’re willing to pay for something. The truth is, the only way to determine how much someone will pay for something is to put it up for sale, and see how many people actually buy it.

    Then you can try twiddling the prices to measure price sensitivity and try to derive the demand curve, but until you have something like 1,000,000 customers and you are absolutely sure that customer A will not find out you are offering a lower price to customer B, you will not get statistically meaningful responses.

    There’s a real strong tendency to assume that experiments done on large populations of people should work out just like experiments done with chemicals in a high school lab, but everyone that has ever tried to do experiments on people knows that you get wildly variable results that just aren’t repeatable and the only way you can be confident in your results is to carefully avoid ever doing the same experiment twice.

    And, in fact, you can’t even be sure that the demand curve is downward sloping.

    The only reason we assumed that the demand curve is downward sloping is that we assumed things like “if Freddy is willing to buy a pair of sneakers for $130, he is certainly willing to buy those same sneakers for $20.” Right? Ha! Not if Freddy is an American teenager! American teenagers would not be caught dead in $20 sneakers. It’s, like, um, the death penalty? if you are wearing sneakers? that only cost $20 a pair? in school?

    I’m not joking around here: prices send signals. Movies in my town cost, I think, $11. Criminy. There used to be a movie theatre that had movies for $3. Did anyone go there? I DON’T THINK SO. It’s obviously just a dumping ground for lousy movies. Somebody is now at the bottom of the East River with $20.00 cement sneakers because they dared to tell the consumer which movies the industry thought were lousy.

    You see, people tend to believe that you get what you pay for. The last time I needed a lot of hard drive space I invested in some nice cheap hard drives allegedly designed by Mr. Porsche himself that went for about $1 a gigabyte. Within six months all four had failed. Last week I replaced them with Seagate Cheetah SCSI hard drives that cost about $4 a gigabyte because I’ve been running those since I started Fog Creek four years ago without a glitch. Chalk it up to “you get what you pay for.”

    There are just too many examples where you actually do get what you pay for, and the uninformed consumer is generally going to infer that the more expensive product is better. Buying a coffee maker? Want a really good coffee maker? You have two choices. Find the right issue of Consumer Reports in the library, or go to Williams-Sonoma and get the most expensive coffee maker they have there.

    When you’re setting a price, you’re sending a signal. If your competitor’s software ranges in price from about $100 to about $500, and you decide, heck, my product is about in the middle of the road, so I’ll sell it for $300, well, what message do you think you’re sending to your customers? You’re telling them that you think your software is “eh.” I have a better idea: charge $1350. Now your customers will think, “oh, man, that stuff has to be the cat’s whiskers since they’re charging mad coin for it!”

    And then they won’t buy it because the limit on the corporate AMEX is $500.

    Misery.

    The more you learn about pricing, the less you seem to know.

    I’ve been nattering on about this topic for well over 5000 words and I don’t really feel like we’re getting anywhere, you and I.

    Some days it seems like it would be easier to be a taxi driver, with prices set by law. Or to be selling sugar. Plain ol’ sugar. Yep. That would be sweet.

    Take my advice, offered about 20 pages back: charge $0.05 for your software. Unless it does bug tracking, in which case the correct price is $30,000,000. Thank you for your time, and I apologize for leaving you even less able to price software than you were when you started reading this.

    News

    All these people griping about how writing software isn’t fun anymore probably didn’t notice that here in the northern hemisphere, we’re only about a week away from the shortest day of the year. Install some bright lights, drink some coffee, take a vacation in Tahiti, and tell me in April if you still think software development is depressing.

    Google Suggest

    I had to change my home page back to regular Google due to a fairly blatant usability bug in Google Suggest. Repro steps:

    1. Move your mouse so it’s over the “Google Search” button
    2. Type “Joel”
    3. Click the mouse button immediately

    The bug: often, the timing is such that the Google Suggest popup appears after I type Joel but before I click the mouse, so I think I’m clicking on the “Google Search” button intending to search for, say, Joel, not that I would search for myself, after all, I’m right here, but I’m really clicking on the popup listbox item for “Joel Turner”, whoever that is. Any relation to Tina? Or Bachman?

    I still think Google Suggest is important—I’m sure they’ll fix this little problem. It’s important not for searching, but because it’s going to teach web users to expect highly responsive user interfaces:

    • If you have a website that shows a map, and the user clicks to zoom in, they’re going to expect the map to zoom in, quickly—they will no longer tolerate the full-page-reload-and-scroll-to-the-top that Mapquest has conditioned them to accept.
    • If you show a list, and let people click on the column headers to sort by different columns, they’re no longer going to tolerate the full-page-reload-and-scroll-to-the-top that certain unnamed bug tracking applications have conditioned them to accept.
    • If you have an email application, and you show people a list of email and give them a button to delete email as spam, they’re going to expect virtually instantaneous response time, not the full-page-reload-and-scroll-to-the-top that most web email programs have conditioned them to accept.

    That’s what I meant by “raising the bar.”

    More Google

    Attention, FogBugz competitors: a court has ruled that you are welcome to continue to advertise your products when people search for FogBugz on Google. I actually don’t think there’s anything wrong with this although it does show a certain lack of class, mm, don’t you think? You don’t see Wal*Mart advertising when you search for Tiffany.