This really echoes with me - I see too many startups focusing on the wrong things or more importantly forgetting that they need to do everything...
1) You still have to do the things that you're bad at
You're a developer/designer/architect/[insert profession] so that's what you do. You build great apps or you design beautiful pixels. That's probably what people have paid you to do and that's also what you're good at. It's also highly likely that you enjoy it. The problem is that you focus too hard on what you can do and not on things you can't do. This means that you launch products that are half-baked. Most people launch without focus on customers or marketing but sometimes it's a lack of focus on design or user interaction. The point here is that you need to start looking at things that you don't enjoy because that's probably the area that needs the most attention. Now, this doesn't mean you have to learn how to be something you're not. You can outsource it, hire someone, partner with someone... but you do need to do it if you want to be successful.
2) Do the unscalable things
This is of course copied from pg's essay [1] but it is so relevant to startups. Early in the life of a startup, you need to make sure you have excellent customer service and a thirst for growth. 'Moving the needle' is what counts - you need to do it quickly. When you're bootstrapping this can often mean cold calling or 'shoe leather'. Many first-timers brush this aside as 'old marketing' and 'it'll never work'. It does work. However, it's hard work. Focus on the things that move the needle early on, however troublesome and manual, because you then you will learn what's important enough to build. You can then automate much of what you already know and move on to the next challenge.
I always thought the idea was that the LTV is in getting a lot of users and you do that by making as good an impression as possible on your first users. Even if you are spend several times what your initial users bring in supporting them, if that creates enough traction to get a lot of users down the line you come out ahead.
I think the main point about doing things that don't scale is so you can really understand what's going on in your market. No point in scaling a system that doesn't work.
Don't go overboard though. The whole world doesn't play out with a hindsight bias, and just asking yourself in the morning "why is this important" wont necessarily actually improve your choices. I have seen some incredible successes coming from very unexpected places, places where had somebody asked themselves "is this likely a giant waste of time" the answer would have been yes.
At the end of the day, if your startup is going to succeed then you are going to have to do something amazing. If you are spending all your time stifling your own instincts to follow somebody else's playbook, you probably are in trouble anyways.
Just wanted to add another view on this: wasting a few days creating a perfect design for something that you never even create is not necessarily wasted time. During that time you're thinking through all the different interactions your product could have and getting experience on putting together a good design for when you do need one. It's pretty good training and you learn the same whether you wasted the time or not. It's obviously better to not waste the time, but don't knock yourself short for having done it after the fact since you probably learned a lot of important stuff that will help in the future.
Great point, Ryan. There's definitely value in this process and thinking through the problem and potential solution. The question is: is it the most valuable use of your time?
This is a great post, and it's a good illustration of the difference between fun hacking/project buildling, and actually creating a business around software.
The ugly fact is, when you're creating a startup, only about 5% of your time is spent on the fun coding stuff, the main implementation of your whole idea.
The other 95% is spent on "plumbing" -- refactoring, credit-card integration, e-mail newsletters, browser bugs, server administration, and so on. And that's even before you get to things like hiring, fund-raising, and such.
Of course, it depends on your definition of quality, but for the sake of argument I'm assuming that we're including things like test coverage, code complexity, code cleanliness/readability, structural soundness (cohesion over coupling, the single reponsibility principle etc) and so on.
The point with all of these things is that as much as they might seem to be a waste of time when people can be hacking on something else, they (imho) save orders of magnitude more time than that in terms of maintenance of a codebase: being able to quickly fix issues as they occur; how quickly new developers can grok the codebase; how easy it is to add new features that were not part of the original design.
Unfortunately I have no hard data to back that opinion up, but it is what I intuitively believe to be true based on experiences.
It is dependent on the definition of quality. I'm not saying just throw crap code over the wall as quickly as possible! I've seen the consequences of that often enough. But I've also seen a lot of premature optimization masked as "quality", and at a certain inflection point, it becomes so time-consuming that it threatens the project.
For example, do you really need 100% unit test coverage of all corner cases?
If it is the front end to a banking app, or otherwise involved with account security, then yes. If it is an "Angry Elves" game with no login, then probably not.
As always, these memes are useful to guide/test our thinking, but not very useful if used without reflection.
In the initial stages of a product lifetime, you shouldn't focus on code quality. Releasing a crappy product beats waiting until it is well polished before releasing it, every single time.
But you should absolutely work on replacing, refining or polishing the crappy parts that turn out to be actually successful, or you'll end up in a dead end where you can't make your product evolve anymore without breaking everything. Or you'll get hit by the 'unlikely to be exploitable and difficult to fix' security flaws.
Crappy alpha code is good. Crappy legacy code, not so much.
Waiting for quality for release is always a mistake.
Release, refine and re-release. And A/B test, run the funnels and measure change as it happens.
Productivity on day #1 with bad code is a technical debt you take up - it will catch up to you if you ignore it for too long.
The day your app goes viral is not the day you want to learn about db sharding and data-architectures.
You'll want to grab all the users and keep them instead of 503'ing.
But if you do get past that phase, you can hire people like me to redo things and replace the bubblegum/fishing-line architecture with something more robust :)
However, if you're writing katamari code (that is, a tangled ball of garbage), you're sacrificing long term productivity. It seems like most people definitely don't err on the side of too high quality.
Oh, I totally agree (and +1 for the katamari reference. Your king will be around to insult you soon!). Most code is awful and doesn't meet even minimum standards. The industry error is strongly on the negative side.
I'm just arguing against the case I've heard from many programmers that better code is always better. At a certain point, you hit diminishing returns and lose sight of the goal.
I think it depends on how you define code quality. If you mean it's been re-factored (for example) as much as possible, then I agree. . .you are just polishing the apple. But if you mean acceptably (to the customer) bug-free, then I think your work was worth it.
If you spend an excessive amount of time on a problem, sure, you lose that time immediately.
The far more likely case is that your code quality is too low, which means you're sacrificing untold amounts of productivity later on. Well-written, self-explanatory code is a piece of cake for later developers to modify. Code repetition and counterintuitive naming has a good chance of wasting other people's time for no reason (if it doesn't bite you personally). In larger enterprises and startups alike, I suspect more productivity is lost revisiting badly-documented hacks than doing gold-plated "elegant" work for the first time.
further validate ideas found while talking to business owners in my niche, also setup a time to talk to a competitor in my niche that offered to share pains and problems common in my niche that he's found over the years. Lastly, respond to emails from several business owners in my niche who were willing to talk about their pains and problems...and where I can provide a software solution to them. Notice there is no wireframing, code writing, blog posts, etc etc in my todo list. Until I have 5-10 prepaid customers...I'm not touching my code editor.
In the end when I read "Combatting Fake Progress" it sound so real. It seems that so many companies are trapped in real bondages and they just seems to be running without any kind of plans.
1) You still have to do the things that you're bad at
You're a developer/designer/architect/[insert profession] so that's what you do. You build great apps or you design beautiful pixels. That's probably what people have paid you to do and that's also what you're good at. It's also highly likely that you enjoy it. The problem is that you focus too hard on what you can do and not on things you can't do. This means that you launch products that are half-baked. Most people launch without focus on customers or marketing but sometimes it's a lack of focus on design or user interaction. The point here is that you need to start looking at things that you don't enjoy because that's probably the area that needs the most attention. Now, this doesn't mean you have to learn how to be something you're not. You can outsource it, hire someone, partner with someone... but you do need to do it if you want to be successful.
2) Do the unscalable things
This is of course copied from pg's essay [1] but it is so relevant to startups. Early in the life of a startup, you need to make sure you have excellent customer service and a thirst for growth. 'Moving the needle' is what counts - you need to do it quickly. When you're bootstrapping this can often mean cold calling or 'shoe leather'. Many first-timers brush this aside as 'old marketing' and 'it'll never work'. It does work. However, it's hard work. Focus on the things that move the needle early on, however troublesome and manual, because you then you will learn what's important enough to build. You can then automate much of what you already know and move on to the next challenge.
[1] http://paulgraham.com/ds.html