Archive for the ‘Uncategorized’ Category

Revenue Sharing

Problem

If you’ve read any of my previous posts, you know that revenue sharing is mostly evil. Everyone who has ever held an iPhone has an idea for an app that will (in their mind) make them millions. The number of people who can execute on those ideas, on the other hand, is exceptionally, vanishingly small proportion of developers.

Being one of those developers who knows what he’s doing, I get an awful lot of inquiries from flakey “revenue sharing” people. Up until recently, 90% of my inbox (and at least 75% of my work time) was spent dealing with these people. Let me give you a few humorous examples:

[App name] is a twin stick shooter that requires players to play smart. There are no game [sic] like this out there on any platform therefore we believe that it should sell well as the first of its kind. If you can program the enemies and world to have vibrant or eye catching movment [sic] it will add to the overall fun factor of the game. The game itself is very simple if you are willing to add any elements you see fit then feel free.
As for bosses and level of complexity I first need to know how much time you are willing to put into this project. If you are willing to do more then I will add different enemy types and levels to this.

Here’s some actual artwork I got along with that eloquent description. Keep in mind this artwork had absolutely no explanation or diagram as to what anything was actually supposed to be.

Another actual inquiry:

I am a video game consumer and unemployed wannabe-idea-man. I have this great idea about a game that could work for many platforms, in many different layers of complexity, and it involves cats. Iphone, web-flash, full PC sim…whatever. It will do it all.
I am not very experienced at this video game creation thing, but I am willing to learn. And I am sure that if you love cats, and know games, that once you hear my idea you will want to play the game.

So if you can imagine getting dozens of these in a day, you can see how chasing after nonexistent projects can suck up all your time. Not only was I not coding, I wasn’t even talking to people who would pay me to code.

Solution

I tried a lot of things.  The first thing I did was I started replying to all inquiries without even reading them, just to ask what their budget was.  A few failed to respond, and thus were filtered out, but the vast majority simply said something cagey like “We’re not sure”.  Now I have all the sympathy in the world for a real paying client who doesn’t actually know what the right budget for a project should be, but the number of inquiries like that are less than a sampling error.  Substantially more than 95% of those inquiries were from people who were quite sure that they wanted the work done for free.  So this plan of attack was not effective.

The next ‘wave of attack’ was to try to quote all these projects so that I could get them to a price “instantly” without wasting any more time.  Now for “real inquiries” I produce fairly detailed estimates, which explain to nontechnical clients in some detail what each feature is, and how it affects the others.  Anyone in software development knows this is a difficult (some would say impossible!) task, but I think it’s important to explain what parts are hard and what parts are easy to nontechnical folks.

Obviously that approach wasn’t going to scale to dozens of inquiries a day.  As much as I’d like to give everybody accurate estimates, there’s only so much time in the day, and I’d like to spend most of it, you know, actually coding.  So again, without actually reading the app description at all, I simply fired off an e-mail like this:

Hi <name>.  I’ve received your information and a project like this is typically about 6-7k.  Let me know if this is agreeable to you and I’ll draw up an agreement for this project.

Having to do this bothered me on two fronts.  It bothered me, first, because if I was a real client I wouldn’t like being treated this way.  I tend to believe the best in people, and in spite of the data indicating to me that these were all (or nearly all) shady “idea people”, I insisted on believing that a sizeable minority were genuinely confused about their budgets.  And it bothered me again because this sort of “estimate” wasn’t anywhere near my standards.  Maybe the project was just a “hello world” app, and so the price was high?  On the other hand, maybe the project was a triple-A 3D game with multiplayer servers and all, and so it really was a 50k+ project.  But I really didn’t have time even to skim the e-mails, so what else was I supposed to do?

Well, what actually happened once I started sending out these “fake estimates” is that 1-2% responded agreeing to the terms, 70% started pushing for a “revenue sharing” deal, and the rest never got back to me.  I deleted all the e-mails other than those agreeing to the terms, and things started looking up.  I was no longer wasting whole workweeks  writing detailed estimates for hundreds of people who had no intention of paying me anything.  And those triple-A 3D games?  I would assume that if they heard 6k for their app they would follow up, but nobody ever has.  So I can pretty safely assume I was worrying about a non-issue.

However, even as my workweek was brightening up, I slowly started realizing how much time I was actually spending copy-pasting my default reply.  As my blog posts started to get picked up on the front page of Google for common search strings like “find an iPhone developer”, the number of “shady” inquires I got started massively increasing.  At times I was fielding hundreds of replies a day, and every time one came in I was distracted from coding.  I considered moving the inquiry e-mail to another account so it wouldn’t interfere with my “real clients”, but this seemed like a poor solution.  There has to be a simple, elegant solution to this problem.  And there was.

I started by removing all the ways to contact me from my iPhone landing site, drewcrawfordapps.com.  I replaced them with this clever contact form:

Looks like your standard, poorly-styled contact form.  But here’s the brilliant part.  Try selecting a budget range:

If you pick the wrong range, you’ll get an error message and the submit button is greyed out.  No more spending time fielding e-mails from people with flakey budgets!

Analysis

While I was reworking the contact form, I decided it was as good a time as any to get some really advanced analytics code installed so I can figure out exactly what people are up to on my landing page.  I’ve been tracking the data for over a month now, and I’ve come to some really surprising conclusions.

First and foremost, a lot of people hit that message and bounce.  I was hoping that would happen; it’s by design.  But it’s nice to get some data to back it up.

Second, I’ve noticed that everybody picks the $0-4k budget first.  There has never been a person in hundreds of thousands of hits to that page who have ever started out picking a higher budget.  Does.  Not.  Happen.

Thirdly, when people hit the “low budget” message, if they don’t bounce, they actually rethink their budget.  By forcing them to actually think, instead of filling out a box, they actually try a few different options just to see how the numbers look “in black and white”, perhaps to visualize them spending the money.  It’s a very solid minority of users, and most of them convert to a real lead.

Fourth, this form has made me a lot of money.  Not only am I saving hours every day not fielding silly inquiries, but people are actually much more receptive to my estimates after being “prepped” by this form.  It’s a very statistically significant effect, and one that I want to explore a bit more.

Aftermath

Crisis averted!  Problem solved!  …Right?

Well… it turns out that revenue sharing people can be remarkably persistent.  Not most of them.  But either there are just so many of them that there are a really persistent few merely by chance, or something about not actually providing much value breeds a certain persistence just to survive.  In either case, I still get a few bad apples through the cracks every so often, although these are cleverer than most.

Sometimes they are really clever.  For instance, the other day I got an inquiry from people who had actual roles in startups that you’ve heard of.  They had an actual idea that might be moderately successful, unlike most.  But they wanted me to work for free.

You see, if I want to invest my sweat in something, I will invest in myself.  I have plenty of apps of my own that I pursue during my free time.  But I would never ask other freelance artists, designers, or other professionals who work on my apps to put their sweat equity at risk for something in which they have no control.

Ideas are never successful the first time.  They only become successful after a lot of failure at product/market fit.  And unless I have the authority or the control to make them become successful, I might as well just be throwing work away.  So unless I’m in a cofounding role, a pure-equity deal makes absolutely no sense.  It would be a better use of my time to stock shelves at the grocery store.

So for these new, enhanced breed of clever revenue-sharing guys, I’ve created a third wave of attack: demand either founder-level equity (giving me the authority I need to make the project successful), or demand nonmonetary compensation (i.e. bartering).  A lot of these people are talented teams with a good designer, and I am always in need of cheap iOS art, so it seems like the perfect deal on my end.  But so far, nobody has taken me up on the offer.  They’re fully confident that they’re going to have all this upside to go around after I put in a month of development work, but not confident enough to lend me their designer for a month in compensation.  Hmm… I think I’ll pass on that deal.

CGContextSetStrokeColor

I discovered the weirdest behavior *ever* today.

	#define DRAW_COLOR [UIColor redColor]
CGContextSetStrokeColor(context, CGColorGetComponents([DRAW_COLOR CGColor]));

For some bizarre reason, this line of code works fine as long as you are drawing into a “screen” context (e.g. one set up by drawRect).

If you are drawing to a bitmap context (e.g. UIGraphicsBeginImageContext), it will for some random reason set the stroke color to transparent (WTF?)

The correct way (and as far as I can tell, nearly equivalent) to get drawing behavior to work for both types of contexts is this:

	CGContextSetStrokeColorWithColor(context, [DRAW_COLOR CGColor]);

The only conclusion that I can come to is that somehow the colorspace for bitmap contexts and screen contexts are slightly different. This is because the buggy line requires the device to be using an rgba colorspace, whereas I don’t think the second line depends on the colorspace or colorcomponents of the color.

Reverse Engineering

This is, more or less, how I taught myself x86 assembly. By reverse-engineering Skype.

http://www.secdev.org/conf/skype_BHEU06.pdf

It wasn’t quite that difficult back in the 90s. And these guys got way further than I ever did. But a lot of the binary protection (polymorphic checksumming, dynamic calling, a really clever packer, RSA verification, etc) is close or identical to what I was playing with.

Play with that stuff long enough and, well, you’ll get really good at asm. A lot of really clever ideas of mine came out of things I saw in their binary.

I tracked down one of the exe packers I helped write way back when, and turns out that malware protected with it has been detected by McAfee over half a million times now. So that’s kinda cool… even if it’s a little scary.

But sort of the holy grail of reversing right now is Kaspersky. Those guys are hardcore. Their engine can pick apart a lot of packers these days, even stuff it’s never seen before. I’ve heard stories of people who have written decent custom packers that get detected automatically. They’ve got a static analysis tool that can follow not just off-by-one byte alignment tricks or decompress LZW blocks automatically, but it can simulate execution in a sandboxed environment and use the binary’s own decryption routines to decrypt it, even on binaries that only decrypt a few pieces at a time. It’s incredibly hardcore.

Timely landing page

Just for fun, I’ve thrown together a quick&dirty landing site for Timely from some templates.  I’m interested in seeing whether having a high-quality landing page causes an uptick in sales as well as whether AdWords is profitable for a decent niche iPhone app.  Will report back with results.

In other news, my consulting landing page has been a huge success–I’ve landed close to $15k in clients for a total AdWords outlay of under $200.  I actually had to turn off AdWords months ago because I simply had way too many inquiries.  There’s room for improvement here–I want to implement a “inquiry” web form designed to turn away the revenue sharing people–but I think to do so myself at this precise moment would be penny-wise and pound-foolish.  Any students out there who want to do a small webapp contract job?

WWDC was really fantastic–I met some great people and have some great ideas for some new apps.  One is currently in private beta.  Don’t have a whole lot of time to pursue my own stuff with my contract work, but I’m doing what I can in the cracks.  Also, finding high-quality, reliable artists for iPhone stuff is a pain.

A modest proposal: Advertise a utilization ratio

You know what sucks?  US Broadband.  More specifically, caps seem to be getting more and more popular.

Now I have nothing against caps, in theory.  Charging by usage works fine for electricity and water.  The problem is:

  • Growth.  Data is one of those resources that you keep using more of.  GMail has solved this problem– it keeps giving you more space every day.  When are the caps renegotiated?  Maybe never.
  • Cost.  Data is often sold at profit margins of 1000%+.  I understand you need to make some money–just keep it realistic, k?

I have a modest proposal to solve this problem.  Alongside every advertisement of “up to” 10Mbps (which is a whole other post in itself), require advertisement of the percentage of time you can actually max out this connection.  For instance, if you have a 100GB monthly cap, you could actually sustain your 10Mbps for 8000 seconds before hitting the cap.  There are 2,592,000 seconds in a month, so your advertized utilization for this service (the amount of time you can actually use the advertised speeds) is 3/10ths of 1 percent, a.k.a. .3%.  That will strike fear into the heart of a consumer.  That will force them to start competing on caps.

Actual stats from real ISPs:

Cox Premier – “up to” 20Mbit, 3.8% utilization

AT&T 3G: “up to” 7.2Mbit, 0.08% utilization

Longview Cable: “up to” 10Mbit, 1.1% utilization

Letourneau University: (a little hard to calculate) 5Mbit measured speed, 1.1% utilization

HughesNet: “up to” 5Mbit, 0.09% utilization

SealedAbstract data loss

Due to hardware problems, I’ve managed to lose quite a bit of data. My most recent full backup was from 2009.

If you know me, you know I have a very ridiculous backup setup, with stuff stored on multiple continents and pretty much instantly restorable going back years. Unfortunately, Sealed Abstract was not part of that setup (it is now…)

I’ve taken the opportunity of cleaning house. Getting rid of some old posts, and reimporting new ones from Google’s Cache. I’ve also adjusted the permalink structure, something I wanted to do for awhile but was afraid of breaking existing links.

I think I’ve got SA and DrewCrawfordApps (and a few other sites hosted here) back up. I’m still working to restore some custom servers I had running here.

If you see anything seriously missing, I probably have it around here somewhere… shoot me an e-mail and I’ll put it back up.

New host

I just moved this site over to a new VPS. Should be a little snappier.

Summer Employment

I ended up accepting a part-time  research position here at LeTourneau University.  I’m also doing some contract iPhone work, and working on my startup.  I think this turned out to be the perfect mix of interesting, fun projects that let me work from my room on my own equipment, pay well, and feel really rewarding.

So how did the job search go?

Note:  I won’t identify the companies I talk about by name unless they specifically promote themselves as having a unique/positive hiring methodology.  I think that’s fair to everyone.

Google

I was really excited about interviewing with these guys.  Unfortunately, I was rather disappointed.  One phone screen was a no-show, and the other was half an hour late.  There was a stack of questions HR forced them to ask that they seemed very disinterested in, and skipped half of them to get to their own questions, which were largely (but not entirely) trivia questions about obscure sorts.  The HR rep was (surprisingly) very helpful, and was open and honest throughout the entire process.  Google is a very big company, and my sampling size was very small, but I find it hard to shake the impression that they seemed rather interested in things that could be found in any reference book or through their own search engine rather than algorithmic thinking.

Fog Creek

Overall, I had the best experience interviewing with these guys.  They were very professional, asked great questions, were timely, and very open and honest.  My only real complaint is their excessive reliance on the phone interview, which I argue is a few steps removed from actually coding.  In the real world, it’s perfectly acceptable to think before you code, but on a phone interview, spinning your wheels for a few minutes is a no-no.  They also seemed particularly tied to C, which is a great language, but I got the strong impression that someone with a few years of C would do better in their process than a great hacker with little C experience.  Ultimately, though, I think they’ve got quite a bit going for them.

Unnamed SF-bay area startup

These guys hired a consultant that was incredibly unprofessional.  On four separate occasions I was confused with another applicant (I received one e-mail, two phone calls, and almost interviewed as someone else).  I was asked to choose an interview timeslot, after which a week would go by before I was informed that the timeslot was now filled.  The only reason I continued with the process was because the company’s reputation was very strong and their problem domain was interesting.  For anything less than a steller company, I would have moved on the first time I got a mis-addressed e-mail.  Think before you let a consultant represent your firm.

This company opened with a written exam, which I blew out of the park (writing, for me, is much closer to coding than talking on the telephone).  They followed it up with two phone screens: I did well on the first, but there was so much consultant fail for the second interview that I was a little exasperated and certainly wasn’t on top of my phone-interview game.

Unnamed YC startup

I’m an avid Hacker News reader, and YC startups hold a special place in my heart.  This company opened with a coding exercise (woot!  Actually hiring me based on code I write!).  I came up with a decent solution, and included a paragraph of text about why I chose this solution, drawbacks and bottlenecks, and gave some O-notation.  They made me an offer on the spot.

Unfortunately, their offer was about half what I made last summer, and about a quarter of what I can make as an iPhone contractor.  Plus the cost-of-living differential between SF Bay and where I currently live is huge.  So in spite of their awesome office, cool product, and YC-ness, I couldn’t justify taking a huge pay cut and moving across the country.

What I learned

I learned that my strengths lie much more in coding than talking about code on the phone.  I need time to carefully think through my code, and for me, that includes copious amounts of silence.  It just doesn’t play well on a phone screen.  I’ve got about a 60% pass rate for a very difficult phone screen–so I can get through 1 fine.  But when you start compounding the probabilities of two or three phone screens, the chances of me getting through are pretty low.  Conversely, my pass rate for people who looked at my code was closer to 90%.

I learned that interview processes are often long and arbitrary, and the longer and more arbitrary it seems, the less likely it is that you’re going to get an offer.  I should have bailed on several of them (to recover my time to work on my startup, school, prep for other interviews, etc.) but I kept hoping things would magically change.

UPDATE: Since press time, someone at Fog Creek has indeed taken a close look at my code, ostensibly in reaction to this blog post.  If you’re reading this, as I said above, you guys were the best and the most professional, and the fact that you actually poked around in response to a random blog entry from an undergrad only confirms that.

I learned that nobody actually reads your resume.  I included several prominent links on my resume to actual websites that I’ve coded, and nobody (NOT ONE PERSON) clicked through the resume links to play with a live site I wrote.  There were also click-through links to actual algorithmic code I’ve written that you can download and stare at (novel approaches to classic CS problems) and nobody (NOT ONE PERSON) clicked through to examine what sort of code I actually write, whether or not I document things, etc.  That was extremely disappointing, as if I were to hire a coder who included either source or live demos on his resume, the first thing I would do is see, you know, what kind of things he codes.

All in all, I think I ultimately found the right mix of good projects at good pay that give me enough autonomy and flexibility.  I’m excited about the things I work on now, which is a good change from schoolwork last semester and the largely-frustrating interview process.  And the people that I’m working with are really top-notch.

Return top