What I hear when you "just want to reach out directly"

name message
Recruiter I've got two positions for a Java contractor, a PHP developer position, and a Flash developer position, and I think they really speak to your skills as a developer.
Recruiter I realize that you're happy at your current position, but I just wanted to reach out to you directly to tell you about these exciting opportunities.
Translation I ARE A DUMB


My last day at Yahoo will be 2010-01-22.

I’ve gotten an offer from Proofpoint which is too good to ignore. The opportunity to drive the direction of a product at an early stage, including having a lot of input about the choice of technology and team, is very exciting. Also, though this was not the primary factor, the position is significantly more financially rewarding than I believe that the next few years would be if I stayed at Yahoo.

Yahoo has been a mostly great company to work for, and YUI is by far the best team that I’ve worked on here. It’s a shame that I didn’t join YUI sooner; I still feel like I just got here. The quality of this team made the decision very difficult, and that says a lot about the job that Eric Miraglia and Thomas Sha have done building it.

If you ever get a chance to work at Yahoo, take it.

I feel so very fortunate to have met so many of Silicon Valley’s bright minds in the last 4 years, and to have learned so much about the web, about business, about people, and about the science and art of software development. I’ve been a student, a teacher, an expert, an amateur, a mentor, and a mentee.

Thank you all so much for what you’ve given me.

How Not to Get Real (and die trying)

Recently, Auston of the Dashboard Leadlog startup in Florida posted a somewhat snarky blog post about one of the responses to a job opening at their company. I more or less said the same things that appeared on Hacker News. Eventually my comment may show up, but it’s buried at #20, so I thought I’d post it here, as well.

Auston, this is for you.

While his tone was a little condescending, I completely see where this person was coming from. I have all of these skills, and if I was on the market, I’d skip right over your ad. I wouldn’t even consider it, and I probably wouldn’t be kind enough to tell you why. If anything, he wasn’t harsh enough, and you’d be wise to find the grain of truth in his criticism.

Money isn’t just important as a way to pay the bills. I could pay my bills on a lot less than I make today. Money is important because it shows how much an employer values me and my skills, which is also an indication of the work environment. Moreover, labor is a market. I’m not even going to consider an employer who can’t pay what the market will bear. Put another way, why would I want to work for anyone other than the employer who values me the most?

When you hire someone, however you’re compensating them, it’s more than they could get anywhere else. Think about that for a moment. If you get a Porche at a Honda price, don’t be surprised if the motor doesn’t live up to the salesman’s promises. You offered the highest price he could get for it, and it wasn’t a very good price. Maybe the other buyers know something you don’t.

Of course, salary isn’t the only kind of compensation. If they really believe in your company, they’ll push for equity, because they’ll believe that the equity is more valuable than the paycheck. If that’s the kind of belief you want, then you need to structure the compensation to be competitive to people who feel that way.

Your ad describes an expert frontend/backend guru-level ops/designer/architect (who also doesn’t mind slogging through maintenance tasks). And to compensate them, you’re offering…. a big monitor? Ping pong? JOKES!? Are you SERIOUS? Talking about a “comfortable and fun work environment” is a red flag. If you have to go out of your way to keep your engineers entertained and comfortable, that usually means that your product very boring and unpleasant. No thanks.

It sounds like you want a CTO or chief architect. If you can’t afford several hundred thousand per year in salary (which most startups can’t), you’d better be prepared to hand over a sizable chunk of your company to them. Skip the stuff about your killer break rooms, they probably have better chairs and toys at home. Sell them on the concept and the business plan instead. Anyone with those skills knows what they’re worth. You’re recruiting a partner, not an employee, but your ad clearly shows that you don’t get that.

If you balk at giving up so much, then ask yourself this: why else would someone with with that value choose to invest it in YOU, when they can do half the work and make 4 times as much at Google or Yahoo, or probably start their own company and compete with you directly? You’re hunting tigers, and frankly, it doesn’t sound like you’re up to the task.

If you don’t need that level of expertise, then don’t ask for it. When you want a Honda, and you can afford a Honda, you go to a Honda dealership. Job ads are not the place to shoot for stretch goals. This is the equivalent of the resumes that list every buzzword under the sun, when the person has real experience in maybe two or three.

We’re two biz dev guys, a ux guru and a hacker with solid business experience.

So, you’re 4 people, and only one of you writes code? Good luck with that. No wonder you need so much help. One of the biz dev guys should probably sell their equity to the other three, and go “dev” some other “biz”. Then maybe you’d be able to afford the CTO you need. It’s going to be a tough sell, though, given the childish attitude towards compensation.

Why I'm Not Working on My Startup (Yet)

I’m not sure if it’s nature or nurture, but either way, the savvy gambler will bet that I’m going to run my own company at some point. I grew up in an entrepreneurial house. I share a Y-chromosome with a guy who built up a company and made it work with the (un)usual combination of moxie and dedication and wit that makes any business work. And, he did so with two small children. No small feat.

I’ve always planned on starting my own company. I’ve been a fan of Paul Graham’s writing ever since I discovered it. I live in Silicon Valley, and the startup vibe is in the air. I work as a web developer, and I’m good at what I do. I am very interested in the business of software, and have a lot of ideas about how things could be done in new and better ways. It’s not so much “if”, but “how” and “when”.

I’ve worked at Yahoo for 2.5 years now, already about 6 months longer than I’d initially expected to. Compared with working at a small company, it has many advantages. I’ve had the opportunity to be a part of several different projects, and Yahoo can afford to pay quite a bit more than my former employer ever could. I’ve been able to talk to and work with some of the most gifted hackers I could ever hope for. When I got the job, it was really a dream come true, and I’m still proud to be one of the cogs in this engine. It’s been even more satisfying than I’d thought it would be.

But there are drawbacks as well. In a company of Yahoo’s size, bureaucracy creeps in. Decisions are sometimes made very far from the code, and even further from the users. Despite Jerry’s and Ari’s best intentions—and sternest directives—when they talk about Open Initiatives, the “not invented here” syndrome can cause big problems. I don’t think I coined the term, but I’ve taken to referring to the malaise as the “purple cloud”, a stifling and noxious gas that obscures reason and reduces visibility. No doubt about it: that part of the job sucks.

On an almost daily basis, I’m tempted to quit and strike out on my own. Yahoo is an unusually good employer. But despite the perks, as long as I work at Yahoo, I don’t work for Isaac. I might love the company, love what we’re doing, love the opportunities it affords, but there is a definite lack of control and lack of ownership that leaves me unsatisfied sometimes. Being a manager wouldn’t solve the problem; it would make it much much worse. At least as a hacker, I fully own the code I write. If I can’t be on the top, I’d rather be as close to the code as possible. (Best would be both at once, of course.)

So Why Not Leave?

I’ve been reading a lot of articles recently with titles like Why you should quit your job and start a company and Why you should keep your day job and work on your startup at night. I know my hacking rhythm pretty well by this point.

What I’ve gathered from these resources and my own introspection is:

  1. It’s incredibly hard to focus on a startup and also have a separate full-time job.
  2. It’s even harder to focus on a startup and not pay rent or eat.
  3. If I spend less than 50 hours a week working, I’ll go crazy.
  4. If I spend more than 30 hours a week working on something I don’t love, I’ll go crazy.
  5. If I’m working on something I love, and I’m not working on it all the time, I’ll go crazy.

Going crazy is not an option. This isn’t the fun crazy with mania and interesting delusions; more like the super-depressed, hate-my-life, stop-communicating-with-other-humans kind of crazy. I’ve been there before. Life’s too short for that.

The “8+2” workday wouldn’t work for me. I’ve tried it. I hated it, with a burning passion. I’ve always had side projects, but they remain on the side (like this blog.) I go through phases of being very interested and working hard on them, and completely ignore them at other times. If I had to focus on them enough to turn them into something that users would pay money for, it would have to turn into a full-time gig. My ventures into paying side-projects were tremendous failures for that reason.

Even more importantly, I can’t work just 8 hours a day. Either you ride the biorhythm, with its highs and lows, and capitalize on every bit of go-time that your brain gives you, or you crank out boring hours for your handful of dimes. “Healthy work-life balance” is for bank tellers. An artist doesn’t stop being an artist when he goes home.

I love what I do at Yahoo, and I care enough about what we create that I want to focus all my energy on creating value for users. It’s good practice. But as long as I work at this job, I won’t have enough left over at the end of the day to seriously invest in anything else. Some people can find a middle ground there; I’ve learned that I can’t, and I’m ok with that.

I also really hate worrying about bills. One joy of working for Yahoo is that I get paid enough that I don’t know exactly how much a cup of coffee costs. In poorer times in my life, I was acutely aware of every nickel increase in the cost of a pack of cigarettes. That sucks. Living economically is just good sense; deciding whether your last $10 should be spent on gas or dinner seriously gets in the way of enjoying life.

Having My Cake…

Here’s my plan: keep working at Yahoo for the next 2-3 years or so. Pare down my expenses as much as possible during that time, and sock away as much money as I can. When I have enough saved to live for at least a year without a job, I’ll quit my job and work on whatever idea seems the most promising at that time.

You see, the idea is the cheapest part. Ideas are so plentiful once you learn how to cultivate them, they may as well be falling from the sky. And my ideas have tended to be at least good enough, even if they’re not exactly earth-shattering. In the last year, I’ve seen two startups execute on ideas I’d had, and they seem to be having some success, which I find extremely comforting. I’m not trying to claim that I could have had the same success, but clearly, “finding an idea” isn’t a limiting factor.

So, assuming that my idea will be there when I’m ready to work on it, I’m saving up to buy myself a year off to work on it, whatever it ends up being. I’ve considered getting a part-time job when the date rolls around, just to bring in enough of a baseline income to pay a few bills without sapping my creativity too much. In a way, it’s a bit like creating an angel investor, one who believes in me 100% and is 100% committed to my success like no one else ever could be.

I realize that this plan is a bit risky. The risk is laziness. A dream without execution has a funny way of staying a dream forever. But I’ve made plans like this in the past, and have managed to be ready when the time came to act. That’s how I got to California, after all.

The real challenge is that I’m really not sure exactly what a year costs. I can sit down and crunch numbers, but everything seems way off. I don’t have nearly enough hard data about my lifestyle, and even less about what it could be. Depending on how I spin my estimates, the range ends up being about ±50% or so, which is useless.

I know that I can live cheaper than I am, but I’m not sure which things ought to be cut, and which things are worth the cost. Maybe coffee is worth $1.46, but not $1.55, when balanced against the PITA of brewing it myself and the joy I get from drinking it, multiplied by the number of cups of coffee I buy. I’m not sure. I do know that, while nicotine is a pleasure I deeply enjoy, there’s really no way to justify the physical and financial cost, and withdrawal will be a serious distraction. So, I’ve been wearing a patch—and breathing easier—since June 1, 2008.

A wise man once said, Never optimize before you profile. Then he said it again and again, because no one seems to listen. When it comes to optimization, our intuitions and guesswork are almost always wrong, and only hard data can be trusted. For the last few months, I’ve been tracking my expenses using mint.com and trying to just “act naturally”. Over the next 6 months, I hope to collect enough information about my habits to make wise adjustments.

The 6 months after that will be spent living-as-if, and trying to strike a workable balance. Considering that I make more than double the national household average, and don’t have any kids, I should be able to save enough within 2 years to be able to coast for at least a year, if I just make a concerted effort to stop pissing away so much of it, even at SFBay prices.

Advice Welcome

This sort of plan flies in the face of the white-knuckle hardcore hacker work ethic that seems so prevalent in the startup culture of Silicon Valley. In a way, this is just a rationalization for wimping out. Why put it off until my 30s when I could take that leap of faith now? The way I see it, if a bus is coming along later, why run?

It strikes me as foolish and irresponsible to throw away the opportunity that Yahoo gives me just because I have a distaste for being an employee. (The fact that I have a non-trivial pile of stocks vesting at the end of next year speaks to the wisdom of procrastination, as well.)

I don’t suspect that Foo Hack really draws in the financial planner crowd, but if anyone has any suggestions or experience that might help in the temporary-retirement project, I’d love to hear it. Is this crazy? Am I going about this all wrong? Have you ever done anything like this?

Programming Puzzles and Our Mismatch Problem

In interviewing candidates for programming jobs, a common technique is to ask them to solve some programming puzzle. Makes sense, right? If the guy’s smart enough solve random silly questions, he’s probably good at programming, since that’s most of what programming is.

As it turns out, this bit of common sense is common bullshit. It’s just another mismatch problem, along with requiring elementary school teachers to have lots of formal education, cops to be big and strong, and law school applicants to have great grades in high school. It doesn’t predict success even a little.

A Tale of Two Coders

Feel free to skip to the fun stuff.

Let me tell you about two programmers I’ve worked with.

The first graduated from Stanford University in the top 10% of his class with a degree in Computer Science, and went on to get an Master of Science in the subject. He knew about B+ trees and maps. He could tell you what a directed acyclic graph was, and what it should be used for. He built an MVC system from scratch to design business cards in a web browser, 2 years before Ajax was “teh new hotness”. He interviewed well, and had a host of companies to choose from. He chose a job, and was one of the highest paid new hires in the history of the company.

The second graduated from high school, and had absolutely no intentions of ever taking classes again if he could help it. Not sure what to do with his life, he worked at a local electronics store (Circuit City, I believe) for a few years. He’d messed around with computers plenty, programmed a bit, but nothing serious. A friend of his worked at a software company, and managed to get him a job, despite his lack of experience and education, and despite the fact that he interviewed terribly. He came in at the low end of the pay scale.

Who was the better programmer?

Since I tipped my hand by talking about the mismatch problem, you’re probably guessing that the second one was better. You’d be right. But I doubt you’d realize just HOW right you are.

Despite the fact that I think he deserves any reputation his lack of skill earns him in life, it strikes me as being in poor taste to name him here. Let’s call the first programmer “X”.

Over a year after X left the company, one of the other guys found that he could reliably predict and fix crazy strange bugs by searching for the guy’s initials in the codebase. (There was a fairly strict rule about commenting changes in existing code, which, thankfully, X followed.) I’m talking real bone-headed stuff like:

If Len(".837") = 3 Then

When is “.837” ever 3 characters?! To make matters worse, that If block was wrapping about 250 lines of code, some of it essential to our customers getting paid. X was clearly operating in some kind of alternate universe. Real DailyWTF type shit. And, he was the kind of asshat who was nearly impossible to work with. I mean, imagine any quality that a programmer needs to have, except for IQ, and he lacked it. He was arrogant, rude, passive aggressive, and lazy. He was a bully who would go out of his way to make people feel uncomfortable once he decided that he didn’t like them. Every design discussion was an Argument from Intimidation—either you agreed with his idea and stroked his ego, or you were an idiot, plain and simple. He was good at (useless) puzzles, but his attention to detail in real work was beyond terrible.

Within 2 years at the company, the second guy—the uneducated, inexperienced, bad interviewer—was one of the go-to architects who really grokked how everything was supposed to work. He picked up Visual Basic fast enough to pass by most of the existing team, some of whom had been writing code since he was in high school. He was responsible for designing and implementing a part of the software that was the primary killer feature. He redesigned a huge chunk of the program that never quite worked right. He was in databases, in the presentation layer, and in between. By any estimation, a very significant portion of the product’s value was entirely his doing.

After we’d both left that place, I referred him to Yahoo. Despite not having very much experience in front-end web development, and again interviewing terribly, the hiring manager was wise enough to heed my very strong recommendation. And good thing, because he very quickly became one of the most important members of the Yahoo Games team. (And he occasionally reads this blog and comments on stuff. Hi, Geoff.)

So, at this point, you might be thinking, Well, if the super educated brainiacs are bad programmers, and the lazy hobbyists are good programmers, then we just need to flip the test around, and use it in reverse. Then we’ll find the Geoffs, and avoid the Xes.

If only it was that easy.

You see, there actually are quite a few very good programmers that are very good at silly puzzles and have degrees in Computer Science. Almost every problem has some kind of mathematical component; a lot of the theories were discovered because they’re true and relevant. Some of X’s abilities are quite useful, so having both the will and the skill is best. The hobbyists eventually find that they have to hit the books and learn theory at some point, or else they get passed by.

But those skills aren’t nearly as useful or predictive of programming ability as we might think. Geoff has the attitude of a great hacker and a mind that is capable of learning quickly, which, as it turns out, is much more useful in the long run, and much harder to test for. X had a big brain and a bad attitude. Most of programming is not solving puzzles with algorithms. Most of programming is communication, attention to detail, and a relentless desire to build something beautiful.

Some Puzzles

Despite the fact that programming puzzles are almost 100% useless in the hiring process, they’re fun, and a good mental work-out to keep your thinking sharp. They’re a good part of a practice regimen. Here are a few that I’ve come across lately that were pretty interesting. (Sadly, my beliefs about the foolishness of puzzles-as-hiring-tool are not shared by all of my managers, and I learned about two of these because they are used in our interview process.)

I’ll edit this post to include solutions later. I didn’t make up any of these, but I did revise them somewhat. The goal in each of them is to devise a program or algorithm that will find a solution in the least number of steps/iterations/whatever.

Square the Sum

For all 6-digit numbers from 100000 to 999999, find the numbers that, if you add the top three digits to the bottom three digits, and square the result, it will equal the original number.

For example, for 123456, you’d add 123 and 456, which equals 579. Then, square that sum, which yields 579 * 579 = 335241. 335241 ≠ 123456, so 123456 is not in the set.

Dropping Eggs

Let’s say that you have 2 eggs, and a building that is 100 floors tall. You need to figure out how high up you have to drop the egg to have it break when it hits the pavement. Assume that the egg either breaks completely or is completely undamaged. That is, repeatedly dropping from the second floor will not make it more likely to break. (Hypothetical eggs are very hard, but when they break, they really BREAK.)

For example, if you drop the egg from floor #50 or below, it won’t break. But if you drop it from floor #51 or above, it will break.

What is the optimal approach to testing floors? Assuming that you take that approach, and the egg breaks on the last floor you test, how many times did you have to drop it?

Part 2

As the number of floors n increases to a very large number (millions, billions, whatever—since it’s really not floors and eggs but a sorted database of records or something), how does your solution scale?

Let’s say that you have 3 eggs. What’s the value now?

As the number of eggs increases, how does the worst-case number of tests change? If you had an unlimited supply of eggs, is there a better solution?

I heard this one at work, and it sounded kind of familiar, but I didn’t remember the solution right away. I dug up my textbook from “CSC212: Data Structures and Algorithm Analysis”, and sure enough, it was one of the examples Dr. Sayed used to teach us big-O notation.

Non-Repeating Digits (Cedric’s Challenge, slightly revised)

Find the count of all natural numbers below a certain number of digits that have no repeated digits. For example, for length=2, the following numbers all satisfy: 10, 12, 21, 23, 32, 34; but these don’t: 11, 22, 33. For length=3, 97 and 102 are valid, but 99, 100, and 101 are not.

Additionally, find the two consecutive numbers that are furthest from one another, and the difference between them. For example, in the length=3 case, the greatest difference between two consecutive numbers is 4, between 98 and 102.

For example, in length=2, there are 90 matches. (1-99, except for 11,22,33,44,55,66,77,88,99.) The biggest jump between two consecutive numbers is 2, between 10 and 12.

Part 2

In addition to specifying the length in digits, also make the base variable. For example, in the (base=3,length=3) set, the following numbers are valid: 10, 12, 20, 21, 102, 201.

Compute the values for length=100,base=1000. Speed matters.

Part 3 (Cedric’s Challenge + arbitrary bases)

Print all the numbers in order before printing the count and difference. (Hint: if this doesn’t make it any more complicated, then you didn’t do parts 1 and 2 properly.)

Since the base can be arbitrarily high, express numbers in bases greater than 10 as a comma-delimited tuple rather than using character digits, optionally with a trailing comma. For example, the base-16 number normally written as “FA9” could be printed as either “15,10,9,” or “15,10,9”.