Ship Your Code Before You Write It
Customer love
Above is a picture of one of our teams in a moment of great achievement. In the front, an engineer is holding a basket of emoji cookies that were sent to the team by a happy customer. These cookies represent positive impact in someone’s life. The work they did together actually means something to someone. They achieved, in the most literal sense, the initiative that you see posted on the wall directly behind them. They made a customer love us!
This is why my teammates and I come to work each day. Our satisfaction comes from seeing the smile on a customer’s face, or hearing the joy in a customer’s voice, because of something we did.
So, you may ask yourself, “how is it that this team came to be standing here holding a basket of cookies from a customer? What did they do such that a customer would go to the trouble of tracking this specific team down to give them a gift?”
The answer: this team shipped their feature before they implemented it.
Huh?
Ship the feature today
Here’s the story. A while back, we had a subset of customers that ran their businesses in a way that our system didn’t handle very well. As a result, these customers spent three full days every month manually entering data into the system. It was a huge pain for them.
The team pictured above was tasked with solving this problem. They got on the phone with one new customer who was having trouble with this. They had just realized they would need to spend a bunch of time manually entering data each month and they were very unhappy with us.
When the team got off the phone they asked themselves the question, “if we had to solve this problem in a single day, what would we do?” Much to their surprise, they came up with a solution. They called the customer back and said, “ok, we have a feature that will solve your problem. All you need to do is take your spreadsheet and instead of manually entering it into the system, just send it to this special AppFolio email address. Our new database import system will get it uploaded and you will receive a confirmation email when it’s complete.” The customer was elated and amazed. After all, they had just talked to the team two hours ago.
So how did the system work? Well, the customer sent their spreadsheet of information to the special email address, that email address forwarded to the product manager on the team, the product manager divided the data between the members of the team, and they all manually entered it into the system on behalf of the customer.
Boom. Problem solved...sort of.
Looking behind the curtain
It’s like the Wizard of Oz. It’s the man behind the curtain. It’s painful for the team and it takes a long time to manually enter data, but there are many advantages to starting the project this way. First, the team solved customer pain in a single day and turned a difficult situation into a really positive one.
Second, the team gained a true understanding of the customer’s pain because they subjected themselves to this same pain. It gave them empathy for the customer.
Third, it gave the team immediate access to real customer data. They got a feel for the different formats they would need to handle. This beat speculating about it.
Fourth, the customer data came from a 3rd party vendor. There was some question as to whether they would be required to integrate with this 3rd party to suck the data directly out of their API. We validated without writing any code that this was not necessary.
Finally, the team gained immediate feedback from the customer. For example, the customer could have said, “nice feature, but having to email my spreadsheet sucks. I’d rather upload it directly into the system.” Or possibly, “I love that I can just email the spreadsheet rather than having to upload it.” The team was able to focus on what was important to the customer and ignore everything else.
Implement the feature tomorrow
As you might guess, manually entering the customer’s data is not a good long-term solution and it doesn’t scale across our whole customer base. So next, the team wrote a simple script to automate the process of entering the data into the system. This was slightly more scalable and it allowed the team to release to more customers. It provided them with more feedback and prepared them for building the feature directly into our system.
As the team listened, they understood that customers generally want to be able to upload the file directly rather than sending an email. Notice how much progress the team made before writing even a single line of production code. They validated many assumptions and had a very good idea of how to solve the customer’s problem. Their first cut of a production version of the feature contained nothing but an upload button in the app. They released this to a larger beta pool of customers who began using it.
Next, customers told us they wanted to be able to preview the uploaded data before it was saved to the database. The team responded by releasing a preview page. Then customers wanted an easy way to reverse mistakes. Again the team took the feedback and responded. The team continued to iterate until finally customers said, “I love this feature. It’s easy to use and it solves my problem. Thank you.” A month later, the team received a basket of cookies in the mail.
Focus on the customer
As I work with teams, there are two things I see them do that make projects really successful. First, they establish a tight feedback loop with the customer very early on in the project. In the example I gave above, the team established this loop by delivering a feature in a matter of hours, committing to do the work manually on the backend.
Second, these teams work hard over the course of the project to maintain and strengthen the feedback loop. In our example, the team did this by asking after each release, “what will it take for us to release this to even more customers?” Initially, they supported the feature by hand. Then they wrote an automated script to increase the scope of the release to strengthen the feedback loop. The team enabled the feature for more customers after each subsequent iteration.
Why do these elements make for a successful project? Because they keep the team laser focused on the real goal: a satisfied customer. If a team delivers the feature or product before it’s actually implemented, they are on the hook for providing a service to a customer manually. They have no choice but to listen to and focus on the things that are important to the customer. By strengthening the feedback loop, the team continues to learn. They avoid the risk of building features that are valuable to only a small number of users.
These two elements ensure we always listen to our customers. And this is why our customers love us.
We’re hiring!
AppFolio’s mission is to revolutionize vertical industry businesses with easy to use software services. We’re hiring great engineers at AppFolio. Apply online and help us continue making happy customers!