Let's Play TDD #161: The UserEnteredDollars Value Object
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #160: End of Week 1
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
April 23rd to 27th in New York City: The Art of Agile (Training)
Diana Larsen and I are partnering with Cyrus Innovation to deliver our acclaimed "Art of Agile" training course in New York City from April 23rd to 27th. There's also an option to attend just the planning or delivery section of the course if your schedule doesn't permit you to attend a full week. For details and registration, visit the Art of Agile NYC web site.
April 11th and 12th in Philadelphia, PA: Emerging Technologies Conference
I'll be speaking at the Philly Emerging Technologies conference taking place on April 11th and 12th. The title of the talk is "Kanban, Lean, and Large-Scale Agile." Here's the blurb:
Agile methods work beautifully for a single team. But what do you do when you have multiple, interdependent teams, all working on a single product or product suite? How can Agile scale without losing sight of its core principles? In this session, we'll examine how to apply Lean and Agile principles to the problems of large-scale Agile. We'll combine a pinch of theory, a dash of experience, and a heaping helping of crazy ideas to give you something to try on your large-scale projects.
Let's Play TDD #159: How Do We Store Data?
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #158: writeFile() and readFile()
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
January 18th in Portland, OR: Agile Tune-Up
The AgilePDX user group is having its yearly Agile Tune-Up this month and I'm facilitating. The event is free to all. Location and times are on Calagator. Here's the blurb:
It's time for your yearly Agile tune-up! Has your Agile team made its new year's resolutions yet? If not, this month's AgilePDX meeting will help. It's all about helping you understand what you can do to improve the state of your Agile practice.
James Shore will kick things off with a description of Agile Fluency. He'll describe multiple levels of proficiency and help you figure out where your team is today. Then, he'll provide specific techniques and practices to focus on as you work to reach the next level.
Next, we'll turn it over to you! You'll break into groups focused on the issues that matter most to your teams. You'll have the opportunity to learn from each other's experiences and to discuss how you can improve your team. Experienced Agile practitioners will be on hand to answer questions and help you figure out which improvements will make the most difference for you.
This event is free and is at Puppet Labs. It begins at 6:30 pm with pizza, sponsored by PNSQC (Many thanks to both Puppet Labs and PNSQC for supporting agile in Portland).
The program starts at 7:00 pm.
After the program you're invited to join us for a no-host gathering at a nearby brewpub for further discussion of agile fluency.
Let's Play TDD #157: Datum
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #156: Persistence, for Realsies
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #155: Transitioning to SaveFile
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #154: Save and Cancel... Done!
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #153: Push the Button
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #152: No-ckito
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Minimum Viable Hypothesis
In today's Portland Entrepreneurs' Salon, we were talking about Lean Startups. As we talked, I had a realization.
In Lean Startup, there's a lot of focus on creating a Minimum Viable Product (MVP). Like Sprints in Scrum, it's an easy concept that people latch onto right away. But perhaps that's the wrong focus. Maybe it's not MVP we should focus on, but MVH: Minimum Viable Hypothesis.
The Minimum Viable HypothesisIn working on Rabu, Diana and I ran into a common problem. We were in love with our product. We loved designing it, thinking about it, creating it. We focused on creating an MVP, and when our target market didn't respond, we said, "Well, that must have been too minimal. Let's make it more robust." And we dived back into product development. We ended up with a nice product that hardly anyone uses. Then we ran out of money.
We were following the build-measure-learn cycle, but falling into an easy trap: persevering when we should have pivoted. I think it's because we were focusing on MVP at the expense of MVH.
With MVH, the first step after figuring out the problem to solve isn't to create a minimum viable product. Instead, the first step is to brainstorm market hypotheses. Which groups have the desire and funds for a solution? One way to brainstorm would be to put a big graph on a flipchart with "Desire" on the X-axis and "Funds" on the Y-axis. Potential markets would be brainstormed onto sticky notes and placed onto the chart. The guess in the upper right--the one with the most desire for a solution and the most collective funds to pay for it--is the first market to test. It's your best guess market.
It's still a guess, though. So rather than going out and creating an MVP, test the market. That's what an MVP is for, too, but I'm shifting the emphasis. For me, and I think for most people, it's way more tempting and fun to work on product than it is to work on marketing. But in the early stages of a startup, when you're discovering product-market fit, "market" is just as important as "product," and much less tempting to work on.
At the end of the build-measure-learn cycle, you have a decision to make: Pivot? Or persevere? Our mistake with Rabu was that we persevered when we should have pivoted. Our measurements showed us, over and over again, that people weren't using what we had built. We assumed that the problem was in our product, but I think it was much bigger than that: the market we had chosen didn't actually care that much about the problem we were solving. But because we were focused on our product, we kept investing in improving the product rather than pivoting to a new market.
Instead, I wish we had tested our market assumptions. We had made two implicit assumptions: that programmers on Agile teams wanted a tool to help them collaborate with their sponsors (desire), and that enough of them would pay us to customize such a tool to their situation (funds). We did test those assumptions once, with a successful landing page, but then we shifted gears to creating an MVP. We should have stayed focused on our assumptions.
The minimum viable hypothesis provides that focus. Product is built as a last resort. Each MVH is focused on providing an un-ignorable answer to the pivot or persevere question. To define an MVH, look at your market assumptions. Consider which are the riskiest, and ask yourself, "What unambiguous test would I trust so much that I would abandon this market and pivot if the test failed? What's the smallest test that I could perform that would give me that confidence?" The important part is to create this MVH in advance, with a clear and unambiguous pass/fail criteria, so you can overcome the temptation to simply press on when you're in the throes of development.
The MVH doesn't validate your market; instead, it helps you fail fast. Once you have your MVH, you go through the build-measure-learn loop: build the test, measure the results, and learn from them. Using your pre-established criteria, if the test failed, you abandon the market and choose a different one. If the test passed, you've validated one assumption, but more will remain. Choose the next riskiest, define another MVH, and build-measure-learn again.
ConclusionI'm not changing any of the fundamental Lean Startup ideas. Testing hypotheses is what MVPs are for, after all. But by focusing on product rather than creating an explicit hypothesis, I found it was human nature to spend way more time on the fun product stuff than I should have. I'm hoping the MVH approach will help prevent that mistake next time.
In summary:
- Don't start with a product.
- Instead, start by brainstorming potential markets. Choose the one that looks most promising.
- Consider your riskiest assumptions about the market. Pick one to test.
- Define a test that you'll trust if it comes back negative. Figure out the cheapest/fastest way to perform the test. This is your MVH: minimum viable hypothesis.
- Build-measure-learn. Build the MVH, measure the results, and take action:
- If the test failed, discard that market and pivot. Start over with step 2.
- If the test passed, persevere. Continue with step 3.
Thanks to Willem Larsen of Language Hunters fame for providing the case study we used to catalyze our discussion on this issue.
Let's Play TDD #151: Mockito
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #150: Mulling Over the Persistence Design
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #149: Polishing Off the Save As Dialog
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #148: Asynchronous Assertions
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
Let's Play TDD #147: Finding the Dialog
The source code for this episode is available here. Visit the Let's Play archive for more episodes!
Many thanks to Danny Jones for figuring out the HD Youtube embed code.
"Evolutionary Design Illustrated" Video
At this year's Norwegian Development Conference, I gave a new presentation on evolutionary design, and NDC was good enough to record it and put the video online. It's a highly visual look at how evolutionary design has worked in practice on three projects I've been involved in. It's good to watch if you've ever wondered how evolutionary design plays out in practice. Here's the blurb:
In an agile environment, programmers must deliver working software in the first iteration. Requirements may change at any time, so there's no way to design the software in advance. Instead, you must design your software based on its current needs, and evolve the software design as the requirements change. This process is called evolutionary design. (It's also called continuous design, or iterative and incremental design.)
But how does it work? How can evolutionary design result in high-quality code? In this visual and example-filled session, James Shore will demonstrate how evolutionary design works in practice, using real-world examples culled from his decade of Agile development experience. You'll see how designs evolved in response to external forces, and how responding to those forces yielded in designs that were clean, flexible, and maintainable.
(Note that the video is in MP4 format, which may not work in your browser. If it doesn't, you can download the video using the link below.)
Download the video here (MP4 format).
NDC has graciously made all of the conference videos available as a Torrent as well as individual downloads. Find them here.
(Thanks to Camen Design for the Video for Everybody code. Thanks also to Longtail Video for the JW Player Flash video player.)