On Friday March 18, the HomeAdvisor tech team took a day off from our backlogs to play with new technology. Our semi-annual day of innovation, commonly known as a software hackathon or codefest, allows team members to explore new languages and technologies in the hopes of improving some aspect of development or production, or just learn something new. We’ve adapted the practice from Atlassian’s “Shipit Day” made popular in a Dan Pink TED talk on motivation… because we have one day to deliver the goods. In this post we’ll discuss how we run our semi-annual day of innovation at HomeAdvisor, and discuss some of the projects we saw.
How It Works
We typically pick a Friday that is deconflicted from our normal development schedule. However, because we work in 2 week sprints, every Friday is either a delivery day or the last day of a sprint. While our developers don’t directly participate in deliveries, they may be called upon to support any issues that arise. As you would expect, production issues and showstopper bugs always take precedence over innovation.
Aside from that, Fedex Friday actually begins several weeks beforehand. In order to try and maximize participation, the day is scheduled multiple sprints ahead of time. This gives the teams ample time to plan for it and account for the “lost” day in their sprint planning. Developers can also toss around ideas and try to hone in on what they want to work on.
In the week or so leading up to Fedex Friday, developers finalize their project and optionally pair up if they want. One of the keys that makes Fedex Friday so successful is that there are no restrictions on what constitutes a valid project. While we typically gravitate towards ideas that directly improve either development or production environments, sometimes we just want to play with a new toy, whether that be a new language or technology. It wouldn’t truly be a day of innovation if developers were restricted in their choices or projects.
As for day of, we start the morning off with a nice catered breakfast to make sure everyone is fueled and ready to go. We skip our morning standups so everyone can remain focused on their projects. In fact, unless there are real world problems that need attention, the entire day really is spent working on projects. No backlogs, no sprint planning, no meetings. Nothing but innovation, and perhaps the occasional game of ping pong.
At some point in the afternoon lunch is brought in. After all, nobody has time to innovate if they’re busy figuring out where to eat lunch. After another few hours, we prepare for demos at 4pm. Since these are on Fridays, we don’t want to keep everyone too late so 4pm is a bit of a hard deadline. Demos usually last about an hour, and everyone enjoys some snacks and beer while marveling in what other’s have accomplished.
So without further ado, let’s take a look at some of this year’s projects.
Jira and Jenkins Slack Integrations
While we predominantly use HipChat for team communication, we’ve started experimenting with Slack lately. We’ve found it to be a bit more reliable and easier to integrate with bots that can help automate tasks in development. To that end, one of the projects this Spring was to create two new bots. The first is a Jira bot that can tell us things about a team’s current sprint like which stories are planned, the status of each story and who it’s assigned to, and more. This is a great shorthand from having to visit the Jira home page, and can help with morning standups to get everyone synched up with the state of the backlog.
The second is a Jenkins bot that can help manage software builds. It listens for commands to start builds on one of our development sandboxes, and then reports back the status of the build after it completes. This is great for keeping teams informed of which development machines are being used by other developers, and provides a nice notification mechanism for when our sandboxes are ready for testing by QA (or need a rebuild due to a failure).
One of our Android developers took the opportunity to start building a new HomeAdvisor application for the Android TV platform. The application ties into our YouTube channel and allows users to browse and watch our selection of videos. In the future it will hopefully allow consumers to find, book appointments, and instantly connect with our network of service professionals right from their TV.
One of the struggles that many large software teams have is sharing knowledge. Lots of information gets exchanged in e-mails, chats, sticky notes, one-on-one conversations, Wikis, Confluence, etc. Trying to find a good place to store knowledge has always been a challenge, especially as we hire new developers and try to make them as productive as possible from day one. Knowing which application log messages to hone in on or which configuration to use is usually second nature to a developer who has worked on the system for a long time, but may not be as obvious to a new hire or someone who is working outside of their normal application.
Enter Mamute, an open source question and answer system based on the StackOverflow platform. Mamute allows anyone to ask a question and anyone to answer. Questions can be tagged to make searching and grouping easier. Answers can be rated based on correctness and usefulness. And information is stored in a single location, making it easier to find and pass along to new developers. We’ll have to wait awhile to see if Mamute catches on here at HomeAdvisor, but it certainly looks promising.
IntelliJ Maven Dependency Plugin
As we discussed in our move to microservices, one of the pain points we identified was the explosion in software repositories. At HomeAdvisor we use Jenkins, Git, and Maven to manage our software builds, and as we pull more and more functionality out of our software monolith, we find ourselves with more and more Git repositories. This leads to longer software builds and more complex libraries dependencies. Sometimes just trying to sort out which software repositories have changed for a particular story and the proper order to building them is the most difficult part of fixing something.
To help alleviate some of this pain, one of the projects was an IntelliJ plugin that examines all of the Git repositories that have changes, and then builds a visual dependency graph to show the proper order of building and merging code. It also generates some text that can be used as input into our home grown tool that issues the Jenkins commands to build and restart applications. This last piece is accomplished by using some standard graph algorithms (namely Depth First Search) to traverse the final graph data structure. Because our modules create directed acyclic graphs, it is fairly trivial to walk the graph and discover the dependency hierarchy.
Elo Rating System
One of our developers took the opportunity to build a tool that helps fill one our most critical needs: player rankings for pool, ping pong, and foosball. At HomeAdvisor, it’s no secret we love to take a break every now and again to play games. And periodically we like to make things interesting with tournaments. But until now, we didn’t have a nice way to seed our tournaments based on past performance.
With this glaring need in mind, one of our developers used Groovy on Grails to build a new application that allows us to register new players, enter the results from any type of game, and display the current rankings for each game type. Rankings are determined using the Elo ratings system, which tracks performance of a player relative to others. Whenever a match finishes, the winner “takes” points from their opponent based on the relative difference in their ratings prior to the match. Not only will we have a better way to start our tournaments and create more fair teams for doubles matches, we now have a tangible means for people to claim bragging rights over their co-workers.
These are just a few of the projects, and all told we had close to 20 demos. A few highlights of other projects include:
- A product owner creating HomeAdvisor heads Up mopbile app so she could learn iOS SDK.
- A development team prototyping our existing development workflow using Gitlab.
- A SQL console that remembers useful queries and includes a rating system to help identify commonly used queries.
- A new tool that helps us create test data to quickly test very specific edge cases that don’t always occur organically, and then clean it up after the test completes.
- A RESTful web interface for executing HTTP, DB, and other commands and asserting constraints across the responses.
- A live video stream of our game room that can identify when the room is occupied and aid in scheduling games.
And several more. It’s always amazing to see what people can accomplish in just a single day of coding, and what problems they try to solve or which technologies they want to learn. From increasing developer productivity to enhancing our consumer or service professional experiences, there’s always a nice diversity in projects and technology that are used. As we’ve seen in the past, many of these projects go on to become important pieces of our technology stack, and we can’t wait to see how many of this Spring’s projects become integrated into our every day lives.