Putting Max on the Back Burner
This note is to inform JUnit Max subscribers that I will not be actively developing Max further (extraordinary events notwithstanding). Customers wishing to cancel their subscriptions are welcome to do so, as long as they stop using Max. Anyone wanting a refund will be granted one, no questions asked. Subscribers are welcome to continue using Max for the duration of their subscription, but no further subscriptions or renewals will be accepted.
Max addresses a genuine need: dedicated TDDers really do need better, faster feedback. Max’s approach of risk-first test execution and an embedded UI modeled on syntax error reporting successfully deliver that feedback. There is an audience who can effectively use what Max delivers.
The business problem with Max is that there just aren’t enough of us who rely on tests minute-by-minute. Even allowing for my marketing and sales mistakes, the data suggests that there are at most a few thousand Java programmers actively practicing TDD. That’s not a large enough market to sustain a business, especially as the market turned out to be price sensitive. Even if every Max subscriber successfully convinced 100 of their friends to sign up, there wouldn’t have been enough revenue.
And so, much as I love the concept of better, faster test feedback and extending the benefits of developer testing, I will henceforth be investing my time in other products and in my consulting clients. I am not closing the door to future business–if someone comes along with a 10,000 seat order or offers to buy Max in order to donate it to the Eclipse foundation, I’ll be glad to discuss the possibilities.
I learned a lot developing, marketing, and selling Max. One thing I learned is that I love being involved in the entire business. There were days in the middle where I felt fully engaged, fully alive. I’d like more of that in my life.
Here are some more specific lessons I learned:
- Release early and often. The phrase, “If you aren’t embarrassed, you waited too long to release,” was very helpful to me. My first release was the tiniest sliver of what I imagined, but it gave me market validation (even if Erik and Saff were the only two people to buy it) and, more importantly, energy. The rapid release cycle let me experiment with features that I hoped would drive sales (none did) and fix blocking defects.
- Ship it and fix it. The product needs to provide value from the first, but it doesn’t need to provide everyone with value all the time. Early sales answer questions about the market size. Early users accept some rough edges if they get to be first and you fix the problems. Not reflexively fixing every defect was a hard transition for me, but, often, answering the next business question was tmy highest priority. I would recommend installing real-time remote error reporting for anyone bringing client software to market. It was nerve-wracking at first to see all the errors, but in the end the feedback was invaluable.
- End-to-end. I wish I had implemented a tiny sliver of the server functionality earlier. My ambition for Max was always larger than what I delivered, but implementing something of the service offering, however small, would have communicated that vision more clearly. Given the market size problem, it wouldn’t have made a difference in the end, though.
- Cut your losses. The exponential revenue growth turned down in May (negative second derivative). June was worse. It was six weeks from the first signals that the market was saturated to today.
- Lean startup. The most helpful advice I got came from Eric Ries and his Lean Startup ideas. Balancing time between the problem team and the solution team is a challenge for me, as I like making things.
Until We Meet Again
This is a sad kind of post to write. I had a vision of programming for my living, making tools to help make the work of other programmers go more smoothly. That’s not going to happen, not now with this product.
I’d like to thank all the Max subscribers for their feedback and forebearance with a young and rapidly evolving product. Ilja Preuss, David Gageot, and Eric Lefevre-Ardant were particularly generous with their time. Most of all I’d like to thank David Saff for telling me exactly what he thought of Max and for giving up some of his precious JUnit programming time listening to me vent.
It’s never easy to give up one dream and move to the next. My problem monitoring the behavior of Max in the field turns out to be common, and there are few good general solutions available. I’ll soon be launching a new product for developers of Eclipse-based products to deliver real-time feedback about errors. We’ll see if I get enough revenue to get the wheels off the ground of this one. If you have an Eclipse-based application deployed and want to find out what’s going on “out there”, drop me a line.