28

This thread in Ask Joel about offshoring/outsourcing is much better than anything I could have written on the subject myself. Ken sets up the strawman; eloquent readers from around the globe tear it down.

27

I hope you’re not all missing the excellent stuff going down on the Ask Joel forum.

On Apress: “ And although they would not put a doggie on the cover of my book as I requested, because a certain other book publisher threatens to sue his competitors when they put anything animal like within 90 feet of their covers, their graphic designer worked overtime to create underground cover art called User Interface Design for Doggies complete with three golden retrievers, which they framed and sent to me. ”

On Microsoft Program Managers: “ So the programmers think they’re deciding everything and the program managers think they’re deciding everything. How can they both be deciding everything? They can’t. Who is really deciding, then? Let me give you a hint. Of the program managers and developers you know, on the whole, who has better people skills? eh? speak up boy, I can’t hear you. Duh! Of course it’s the program managers. You knew that. Developers couldn’t people-skill their way out of a summer intern party at BillG’s lakeside mansion. Developers have such weak people skills they can’t even imagine what people skills could be used for, other than the purely theoretical concept of getting a theoretical date (“I … like … big BUTTS and I can not LIE…”), so it’s no wonder they’re not even aware of the secret that I can finally reveal today. ”

On Lisp: “And I have the ultimate respect for Paul Graham — I think there’s a good probability that in a year or two we will credit him with being the man who solved spam. But I think that if you try to ignore the fact that millions of programmers around the world have learned lisp and don’t prefer to use it, you’re in the land of morbid cognitive dissonance. ”

On Big-M Methodologies: “ Everything about RUP, for example, is obsessed with figuriing out what the business objects and business rules are so you can do a payroll system. We do things like add spell checkers to an editor window. ”

On Usable Programming APIs: “Indexes are one based. That’s how humans count. Zero-based is better, I agree, but one-based is what humans expect, and the program model must conform to the user model for ease of use.”

On Starting Fog Creek: “ The law firm that was recommended to us was big and famous and wanted a $30,000 retainer just to talk to us. There was a time during dotcom mania where you weren’t someone unless your law firm was VLG or MoFo. I was literally told that you had to use VLG or maybe, distant second, MoFo, or I could never convince VCs to invest. “They won’t take you seriously if you don’t have a serious lawfirm.” I snorted up my milk. ”

On teaching your boyfriend C++: “ Forget it! Give up! …  Teach me about women’s shoes and I will feign interest and then promptly forget everything you told me.”

On software pricing: “With software sold in corporations, as soon as your price gets up in the $3000 level, the amount of approval it needs is so absurd that you are not going to sell products without a salesperson making a few visits. Hiring the salesperson, sending them out to make presentations, hotels, airfare — now it costs $50,000 to get the sale done just in sales closing costs. That’s why you see a lot of software products at $100,000 and a lot under $3000, but anywhere in-between and it’s impossible to make sales. ”

20

Ask Joel

I’m running out of my own ideas for article topics. I was going to write about how the search for autotrephination on Google only has one result, which is surprising, considering how there’s an entire movie on the subject, although I realized most people probably think autotrephination would mean “automatic-drilling-of-holes-in-the-head” when it’s perfectly obvious to me that it should mean “drilling-of-holes-in-one’s-own-head” but, hey, what does a word mean that has only been used once in the entire history of Google? And what does it mean to say that a word means something if nobody has ever used it? Anyway, I decided that writing about this would be so headache-inducing you all would try to drill a hole in my head so I didn’t write anything about it.

Luckily, I have my readers for topic ideas. A lot of times people email me saying, “I’d love to hear what you think about X.” Sometimes, that’s enough to motivate me to write a long essay. But more often, my opinion is far too shallow and insipid to justify such an effort, so I dash off a paragraph or two to the email correspondent, or, more often, file away the email in a folder full of things I would love to respond to if we lived on Pluto and the day was 153.4 hours long and humans didn’t require that much sleep.

I decided to try out one of Philip Greenspun’s ideas — the Ask Philip Forum. So, without further ado, I have recycled the dreary old “New Yorkers” forum, which was something of a ghost town anyway, into the shiny new Ask Joel Questions forum. There are still some old New York-related topics there. Ignore them. Put the drill away. Thank you.

Linkers

The appropriate person at Microsoft blew off my request for a linker. The strongest argument he makes is that Microsoft wants to be able to patch security bugs in the CLR after I’ve shipped my program. This is a valid concern; when a major security hole was found in zlib everybody had to figure out which programs they had that used it and recompile them all. I wasted a day of my life on that particular bug. But it’s easily solved by a simple technology of shims or jump tables. Put on your thinking hat and you’ll figure out how to make a linker that produces a single executable plus a jump-table that Microsoft can patch when they find a security hole. PS. Apple had this technology in the original Macintosh, 1984.

His other argument about working set size is a decision that should be left to developers. Let me pick the tradeoff I want to make between ease of installation and working set size.

Look, I used to be a program manager at Microsoft, and there’s a really strong tendency in that culture to treat customer requests as fun intellectual challenges to be fended off like exercises in debating class. But I’ve been talking to customers since the days of the Visual Basic 1.0 runtime in 1991 — thirteen years ago! who have been begging for this problem to be addressed. Jason, why don’t you go talk to somebody on the FoxPro team. In the late 80s FoxPro clobbered dBase in the market mainly on the strength of the fact that it compiled standalone executables. FoxPro had a linker. xBase developers pleaded with Ashton-Tate, makers of dBase, to develop or acquire a linker, but Ed Esber, reviled CEO of Ashton-Tate, refused to give them one. Learn from your own history. (Thanks to Rick Chapman for reminding me of history repeating itself.)

ISV’s that I talk to agree that this is the #1 weakness of VB1-6 and .Net. I’m forced to conclude that Microsoft has grown so large they are living in a reality-distortion field. I suppose it’s not unusual for someone working on a campus with 45 buildings all full of Microsoft employees to lose track of what the outside world is thinking and doing.

OK, anyway, there are third party alternatives. Jitit makes a thing called Thinstall. I haven’t tried it. If someone out there wants to write an in-depth technical review of this thing, please contact me and I’ll try to get you a review copy.

Elsewhere

Blogs I’ve been reading lately: Rory, Scoble, Raymond, Phil.

I loved the style, wittiness, humor and erudition of Why’s (Poignant) Guide to Ruby but I can’t say I learned much about Ruby. Maybe in the next chapter?

31

Geodog: “So I walked into the cafe tonight and looked around for the Joel group — like any other geek, I was too shy to ask anyone, but when I spotted a big table lined entirely with males, mostly in their mid-twenties to early forties, not too well dressed, predominantly European-American, I knew that I had found the geek gathering.”

Please Sir May I Have a Linker?

For some reason, Microsoft’s brilliant and cutting-edge .NET development environment left out one crucial tool… a tool that has been common in software development environments since, oh, about 1950, and taken so much for granted that it’s incredibly strange that nobody noticed that .NET doesn’t really have one.

The tool in question? A linker. Here’s what a linker does. It combines the compiled version of your program with the compiled versions of all the library functions that your program uses. Then, it removes any library functions that your program does not use. Finally, it produces a single executable binary program which people can run on their computers.

Instead, .NET has this idea of a “runtime” … a big 22 MB steaming heap of code that is linked dynamically and which everybody has to have on their computers before they can use .NET applications.

Runtimes are a problem, much like DLLs, because you can get into trouble when application version 1 was designed to work with runtime version 1, and then runtime version 2 comes out, and suddenly application version 1 doesn’t work right for some unpredictable reason. For example right now for some reason our internal company control panel is rounding sales figures to four decimal points, as a result of upgrading from 1.0 to 1.1 of the runtime. Usually the incompatibilities are worse.

In fact .NET includes an extensive technology system called “manifests” which are manifestly complicated and intended to insure that somehow only the right runtime will be used with a given application, but nobody I know can figure out how to use them.

This calls for a story. At the Fog Creek New Year’s Eve party, we wanted a bunch of computer screens in the main room to display a countdown until midnight. Michael wrote an application to do this in C# with WinForms in about 60 seconds. It’s a great development environment.

My job was getting countdown.exe to run on three computers. Sounds easy.

Nope. Double click the EXE, and I got a ridiculously user-hostile error message about mscoree.dll or something, followed by a gratuitous dump of my path. No mention of the fact that the problem was simply that the .NET runtime was not installed. Luckily I’m a programmer and I figured that must be the problem.

How do you install the runtime? The “easiest” way is through Windows Update. But Windows Update really wanted me to get all the critical updates first before I installed the runtime. That’s reasonable, right? Two of the “critical” updates were a Windows service pack and a new version of Internet Explorer, both of which required a reboot.

All told, for each computer I needed to run this little .NET application on, I had to download something like 70 or 80 MB (good thing we have a fast net connection) and reboot three or four times. And this is at a software company! I know how long it took, because the first time it started downloading, I put Office Space on the big screen TV, and by the time the movie was over, the installation process was almost finished. Every ten minutes during the movie I had to jump up, go to each computer, and hit OK to some stupid dialog box.

This is frustrating enough for our in-house apps. But think about our product CityDesk. Almost all of our users download a free trial version before buying the product. The download is around 9 MB and has no additional requirements. Almost none of these users has the .NET runtime yet.

If we asked our trial users, usually small organizations and home users, to go through a movie-length installation hell just to try our app, I think we’d probably lose 95% of them. These are not customers yet, they’re prospects, and I can’t afford to give up 95% of my prospects just to use a nicer development environment.

“But Joel,” people say, “eventually enough people will have the runtime and this problem will go away.”

I thought that too, then I realized that every six or twelve months Microsoft ships a new version of the runtime, and the gradually increasing number of people that have it deflates again to zero. And I’ll be damned if I’m going to struggle to test my app on three different versions of the runtime just so I can get the benefit of the 1.2% of the installed base that has one of the three.

I just want to link everything I need in a single static EXE that runs without any installation prerequisites. I don’t mind if it’s a bit bigger. All I would need is the functions that I actually use, the byte code interpreter, and little bit of runtime stuff. I don’t need the entire C# compiler which is a part of the runtime. I promise CityDesk doesn’t need to compile any C# source code. I don’t need all 22 MB. What I need is probably five or six MB, at most.

I know of companies that have the technology to do this, but they can’t do it without permission from Microsoft to redistribute bits and pieces of the runtime like the byte code interpreter. So Microsoft, wake up, get us some nice 1950s-era linker technology, and let me make a single EXE that runs on any computer with Win 98 or later and no other external dependencies. Otherwise .NET is fatally flawed for consumer, downloaded software.

28

For some reason, Microsoft’s brilliant and cutting-edge .NET development environment left out one crucial tool… a tool that has been common in software development environments since, oh, about 1950, and taken so much for granted that it’s incredibly strange that nobody noticed that .NET doesn’t really have one.

Please Sir May I Have a Linker?

** Heute verwende ich die deutsche Version von CityDesk um mein Weblog zu erstellen. No, I don’t speak German, but I know CityDesk well enough to find my way around!

27

Reminders:

  • Thursday morning I’ll be giving a free lecture at UC Davis
  • Friday evening,  7:30 PM, I’ll be meeting up with a huge group of Joel on Software folks at Au Coquelet Cafe, 2000 University Ave. at Milvia, in Berkeley, California. Tell them you’re with the “Joel” group.
  • Not in California? I’m working on a Fog Creek open house in New York Real Soon Now.
  • Anywhere else? Join our Meetup group and hang out with other Joel on Software readers in your city on Wednesday, February 18th. So far 28 cities in the world have hit critical mass (5). The London group is already up to 29 members!

In the meantime entertain yourself with some of Rory Blyth’s inspired comix.

This one’s a riot: “Ooooooh! I know! We could print out the data, scan it in, and then paste the image into Excel!”.

And some disclaimers:

  • The remark yesterday in tiny print could not possibly be homophobic, because I’m gay and thus granted automatic diplomatic immunity from all charges of homophobia.
  • Putting spaces in front of commas is really not that bad, but I stand by my claim that it’s not very professional looking, and, merely as a point of information, at least on the resumes I get, this particular error occurs on 37% of cover letters from people with Indian names and 0% of the cover letters of people without Indian names.
  • Anyway talking about punctuation is really, really boring, so please let’s stop.
  • There’s nothing like 100,000 incoming links from Slashdot to uncover those rare people without a sense of humor… but you can’t tell people, “no, it’s a joke, you just didn’t get it” because the one thing common among all people without a sense of humor is that they inevitably think they have a very good sense of humor; your joke just wasn’t funny.

In the spirit of the escalator

The number one best way to get someone to look at your resume closely: come across as a human being, not a list of jobs and programming languages. Tell me a little story. “I’ve spent the last three weeks looking for a job at a real software company, but all I can find are cheezy web design shops looking for slave labor.” Or, “We yanked our son out of high school and brought him to Virginia. I am not going to move again until he is out of high school, even if I have to go work at Radio Shack or become a Wal*Mart greeter.” (These are slightly modified quotes from two real people.)

These are both great. You know why? Because I can’t read them without thinking of these people as human beings. And now the dynamic has changed. I like you. I care about you. I like the fact that you want to work in a real software company. I wanted to work in a real software company so much I started one. I like the fact that you care more about your teenage son than your career.

I just can’t care about “C/C++/Perl/ASP” in the same way.

So, maybe you won’t be qualified for the job, but it’s just a lot harder for me to dismiss you out of hand.

Getting Your Résumé Read

I’ve been going through a big pile of applications for the summer internship positions at Fog Creek Software, and, I don’t know how to say this, some of them are really, really bad. This is not to say that the applicants are stupid or unqualified, although they might be. I’m never going to find out, because when I have lots of excellent applications for only two open positions, there’s really no need to waste time interviewing people that can’t be bothered to spell the name of my company right.

So here are a few hints to review, if you’re sending out résumés.

  • A résumé is a way to get to the next stage: the interview. Companies often get dozens of résumés for every opening … we get between 100 and 200 per opening. There is no possible way we can interview that many people. The only hope is if we can screen people out using résumés. Don’t think of a résumé as a way to get a job: think of it as a way to give some hiring manager an excuse to hit DELETE. At least technically, your résumé has to be perfect to survive.
  • If you don’t have the right qualifications, don’t apply for the job. When the job listing says “summer intern,” don’t ask for a full time job. You’re not going to get it and you’re just going to waste your time. (It won’t count against you in the future, of course, because your original application was deleted so quickly I’ll have no memory of you when we do get a full time opening and you apply for it.)
  • OK, this one really bugs me. Learn where spaces go in relation to other punctuation. Whenever you have a comma, there is always exactly one space and it’s always after the comma and never before it. Thank you.
  • In the olden days résumés were sent out in the mail and included a cover sheet on top which explained why the résumé was being sent. Now that we use email, there is no reason whatsoever to send the cover letter as an attachment and then write a “cover cover” letter in the body of the email. It’s just senseless.
  • Even stupider is submitting two big Word documents with no body text in the email. This just gets you spam filtered. I don’t even SEE these.
  • Please do not use cover letters that you copied out of a book. If you write “I understand the position also requires a candidate who is team- and detail-oriented, works well under pressure, and is able to deal with people in departments throughout the firm” then at best people will think you’re a bullshit artist and at worst they will think that you were not born with the part of the brain that allows you to form your own thoughts and ideas.
  • The personal pronoun “I” is always capitalized. All sentences must end in a period. If your cover letter looks like this I will not even look at your résumé:

i m interested in your summer job.
here is my resume
——————————————————————————–
Do you Yahoo!?
Yahoo! SiteBuilder – Free web site building tool. Try it!

  • And while I’m on it, anonymous email accounts and AOL accounts just don’t send a good message. They won’t exactly disqualify you since so many people use them, but crazydood2004 at hotmail.com does not really impress me as much as name at alumni.something.edu. Do you really need to know if I Yahoo!? Do you really want to advertise Yahoo! SiteBuilder, a competitor to one of Fog Creek’s products, when you’re actually applying for a job at Fog Creek?
  • In most of the English speaking world it is not considered polite to open letters to a Mr. Joel Spolsky by writing “Dear Spolsky.” One might write “Dear Mr. Spolsky,” or “Dear sir,” or perhaps, “Hi Joel!” But “Dear Spolsky” is usually followed by some story about embezzled funds and needing to borrow my bank account.
  • Don’t tell me about one of the requirements of the position and then tell me that you don’t want to follow it. “One of the requirements for Summer Internship says that you need to interview in person in New York City. I am interested in the position but I stay in East Nowhere, TN.” OK, that’s nice, hon, you stay there. Another PS, I thought we said in the requirements “Excellent command of written and spoken English.” Oh, yes, indeed, that was our first requirement. So at least do yourself a favor and get someone to check your cover letter for obvious mistakes. Like I said, don’t give me an excuse to throw your résumé in the trash.

I don’t know why I need to spell these out because they’re probably listed in every single “how to send out résumés” book on the planet, right there in chapter 1, but I still get more résumés that show an appalling lack of concern for what it takes to get an interview.

Let me try not to be so negative and provide some constructive advice.

  • Proofread everything a hundred times and have one other person proofread it. Someone who got really good grades in English.
  • Write a personal cover letter that is customized for the job you are applying for. Try to sound like a human in the cover letter. You want people to think of you as a human being.
  • Study the directions that are given for how to apply. They are there for a reason. For example our website instructs you to send a résumé to jobs@fogcreek.com. This goes into an email folder which we go through to find good candidates. If you think for some reason that your résumé will get more attention if you print it out and send it through the mail, that you’ll “stand out” somehow, disabuse yourself of that notion. Paper résumés can’t get into the email folder we’re using to keep track of applicants unless we scan them in, and, you know what? The scanner is right next to the shredder in my office and the shredder is easier to use.
  • Don’t apply for too many jobs. I don’t think there’s ever a reason to apply for more than three or four jobs at a time. Résuméspam, or any sign that you’re applying for 100 jobs, just makes you look desperate which makes you look unqualified. You want to look like you are good enough to be in heavy demand. You’re going to decide where you want to work, because you’re smart enough to have a choice in the matter, so you only need to apply for one or two jobs. A personalized cover letter that shows that you understand what the company does goes a long way to proving that you care enough to deserve a chance.

Some of this stuff may sound pretty superficial. Indeed, what we’re really looking for when we look at résumés is someone who is passionate and successful at whatever they try to do. We like people who are passionate about software. Writing a shareware app when you’re a teenager is just as good a qualification to us as getting into MIT. This is your life story, and by the time you’re applying for a job it’s probably too late to change that.

Would I reject someone just because they don’t quite understand the relationship between the comma and the space? Well, not necessarily. But when I have to find two summer interns out of 300 applicants, here’s what I do with the résumés: I make three piles: Good, OK, and Bad. I give the same résumés to Michael and he does the same thing. There are always enough people that we both put in the Good pile that those are really the only people that stand a chance. In principle if we can’t find enough people we like that we both rated as “good” we would consider some people who got Good/OK, but in practice this has never happened. Much as I’d love to be able to consider everyone on their merits instead of on superficial résumé stuff, it’s just not realistic, and there’s just no reason a college graduate can’t get this right.

(Added 1/27/2004)

The number one best way to get someone to look at your resume closely: come across as a human being, not a list of jobs and programming languages. Tell me a little story. “I’ve spent the last three weeks looking for a job at a real software company, but all I can find are cheezy web design shops looking for slave labor.” Or, “We yanked our son out of high school and brought him to Virginia. I am not going to move again until he is out of high school, even if I have to go work at Radio Shack or become a Wal*Mart greeter.” (These are slightly modified quotes from two real people.)

These are both great. You know why? Because I can’t read them without thinking of these people as human beings. And now the dynamic has changed. I like you. I care about you. I like the fact that you want to work in a real software company. I wanted to work in a real software company so much I started one. I like the fact that you care more about your teenage son than your career.

I just can’t care about “C/C++/Perl/ASP” in the same way.

So, maybe you won’t be qualified for the job, but it’s just a lot harder for me to dismiss you out of hand.