Hacker News new | ask | show | jobs
by ChrisMarshallNY 1907 days ago
This pretty much defines how I work.

I “move slow,” taking the time to test carefully, and leave clean, concise, well-documented code, but I’m told that I actually move at a blistering pace.

I have found there is absolutely no substitute for having an operational, full-feature implementation (I hesitate to call it a “prototype,” because it needs to be fully functional, not just eye candy). I am not a fan of lash-up prototypes, because they invariably become ship code, and starting on a foundation of sand is a very, very bad idea. I short-circuit that, by writing everything as ship code; even my A/B experiments. I can often recycle the rejected code for other projects. It also saves a lot of testing time, as the code is being constantly tested from the start, and being tested while still in scaffolding (meaning more complete testing, overall).

For example, in the app I’m developing now, I’m working on a dropdown screen that allows the user to define search criteria for a database lookup. It’s a complex and fraught operation, and I’ve already had to make a number of changes, based on actually using the facility, as opposed to thinking about using it. If I had simply solidified my original design, it would have been a mess.

I will also be making sure that the facility works for different regions and languages, despite the first implementation being only for the US. It has been my experience that this kind of thing should be built in from the start, as retrofitting it is a nightmare (and bug farm).

My approach does mean that I often need to rewrite a lot of finished, tested code, or throw out big chunks (which is one reason I have a bunch of small, polished, standalone package projects). It’s taught me to design and implement very flexible code (which is actually dangerous, so I often go back, and remove flexibility, once I have settled on an implementation). Nevertheless, I have found it’s the best way to end up with a usable, relevant, high-quality, finished product, that meets the customer’s needs, in a remarkably short time.

DISCLAIMER: This is a viable way to design UX (the kind of code I usually write), but may not be the best approach for “engine” or algorithm code.

1 comments

To prevent a prototype or proof of concept from shipping, you need to leave it feature-incomplete.

The mistake people often make with such things is building it thoroughly enough that it can be shipped.

If you hit that problem, you didn't build a proof of concept - you built sloppy production code.

Good point, but I have found that just doing it right the first time works for me. In fact, I'm doing it right now. In the Xcode window, I'm building a test release that the team will run and review for usability issues and bugs.

If they find any bugs or issues, I fix/address them before moving on to the next function implementation.

The significant advantage that this confers, is that the app is constantly in "release-ready" form; although incomplete.

Useful, for when we want to ask people to give us money. We just get an NDA, loop them into the TestFlight group, and let them have at it. No need for chaperones from Marketing, or sacrifices to the demo gods.

Perfectly reasonable workflow.

I lean towards POCs these days because I have experienced the requirements turning out to be all wrong far too often. It's hard for people to know what they want or need before they can try something sort of real.

The problem i have is I get told to write a fast proof of concept. I make it clear that its hacky, poor quality code. Then ill be told to make it live to test it.

Then it ends up in production. Then they want to add stuff to it, which is a nightmare as the code is terrible.

Every time.

I'm sorry. That sounds miserable. :(

Like I said - a proof of concept is only a POC if major features and plumbing are just missing.

You only build the parts you need to show the concept is possible. The bits you don't know exactly how to do already.

If it can be pushed to production usefully, it's too full-featured to call a POC, in my view.

Yup. My experience, as well.

That's exactly why I work like I do, now.

Unfortunately, I can't do it when I'm working for anyone else. They never let me do it the way that I do it. I have to be doing it on my own.

It works. It really works, if I write top-quality code, the whole time; even if I have to throw away or drastically refactor/write production-quality code.

My experience is that the final product:

1) Is of almost jaw-dropping quality (it was tested thoroughly, the entire time),

2) Is tailored exactly to the needs of the end-user (which deviated substantially from their original requirements), and

3) Arrives very, very quickly (this always surprises people).