Blog Posts

Until Your Eyes Bleed: Lessons from reviewing hundreds of resumes

  You’re a software hiring manager! Yay! Or maybe you despise the idea, but either way it is now your job to sift through resumes until your eyes bleed. At this point in my career, I have been through hundreds upon hundreds of resumes as a hiring manager at multiple companies, and today I would like to share some of the things that I have learned while sorting through all of those resumes.  

How to Scan a Resume

(Read more...)

The Dog People Dig Data - Part 2: Fostering a Culture of Data Self-Service

Welcome back to The Dog People Dig Data. Last time, we talked about the self-service data culture we have at Rover, where business units fetch and interpret their own data independently. In this installment, we explore some of the techniques we use to maintain and improve our Organizational Data Literacy even while we grow rapidly.

(Read more...)

Letting Go of the Past: Finding Memory Leaks on Android

A memory leak in Java happens when memory that the app no longer needs can’t be garbaged collected because some other code holds an unneeded reference. In an Android app, the most common memory leaks happen when a long running operation keeps a reference to an Activity’s context. Normally, when a user backs out of a screen, the memory used by the screen’s UI can be collected. But if a long running operation like a slow network call maintains a reference to the Activity – in a callback for example – the Activity and its UI can’t be garbage collected, creating a leak.

(Read more...)

Migrating to Jenkins 2: A Continuous Integration Odyssey

It doesn’t matter what language your application is written in or how it’s structured, if you want other people to use it, you need some way to take changes made by a developer and get them on to a production server connected to the rest of the world. Oh, and you probably want to test those changes along the way, too.

(Read more...)

Query Performance Omniscience in Django

Most Django performance discussions focus on the object-relational mapper (ORM). This is because the performance profile of typical applications is dominated by the efficiency of the queries they make. For example, a common performance issue in Django applications is the presence of N + 1 queries, which can be eliminated using select_related and prefetch_related.

(Read more...)

Painless Scoring with Decay Curves in Elasticsearch

At Rover, we use Elasticsearch as an important part of our search infrastructure. Elasticsearch is a powerful, scalable, and feature-rich search backend which provides many options for fine-tuning the scores of matched documents.

(Read more...)

Reading External Configuration in Terraform Using S3 Objects

Here at Rover, the engineering team uses terraform quite extensively to manage and define our technical infrastructure in code. We even use terraform to manage our datadog monitors.

(Read more...)

Protocols in Swift: A Journey Into Protocol Oriented Programming

Object oriented programming (OOP) is one of the most widely used programming paradigms today and it’s hard to imagine the majority of large software projects without it. While OOP is popular, drawbacks such as complicated inheritance and passing around objects to functions by reference (instead of value) lead to an unsafe and hard to maintain code base.

(Read more...)

The Dog People Dig Data - Part 1: How Rover Does Data

Welcome to the first in a multi-part series about data at Rover! To kick it off, I’ll talk about our culture of data self-service, what that means to us, and why we think it’s so important. Later on, I’ll go in depth on how we cultivate our data practice, specific challenges we face, and tactics we use.

(Read more...)

Being a Rover at Rover

At previous jobs I have had to wear many hats. Despite the frequent context switching, it has never really been an issue for me. It keeps me well-rounded and I rather enjoy that.

(Read more...)

Vuex Mixins: A Proposal

Our web application is in the process of being iteratively migrated from Backbone to Vue (for UI) and Vuex (for state management). As we write more and more code in these new frameworks, patterns begin to emerge. In Vue components, there is a mechanism for extracting common horizontal patterns: mixins. We’ve used component mixins in several places and they have helped to simplify our code. However, there is no comparable method of “mixing in” functionality to Vuex stores and modules. What follows is an explanation, justification and proposal for Vuex mixins.

(Read more...)

How Far I've Really Gone: Kalman Filtering GPS Coordinates

At Rover, we have started taking advantage of the benefits of having a native app to create features like GPS tracked walks. These Rover Cards are great for owners to see the route taken on a dog walk, or verify that a sitter visited your pet during the day. One feature of these Rover Cards is to display the distance that a sitter has walked with your dog. As you can imagine, calculating distance from a bunch of location data points comes with many challenges.

(Read more...)

The Needle in the Haystack: Wrangling Celery Workflows

We want Rover’s website and mobile apps to be fast for our users. One way we try to keep everything speedy is by offloading as much work as we can to asynchronous tasks which are processed outside our web application’s request/response cycle. For example, Rover’s messaging system allows our owners and sitters to communicate through email, text, calling, and in-app messaging and is mostly handled through asynchronous tasks.

(Read more...)

Being a Good Code Reviewer

At Rover, we practice peer code review as one way to improve the quality of our code. Taking a little extra time to look over each other’s work saves a lot of time debugging code later. There are a few things you can do to be a good citizen when reviewing someone else’s code.

(Read more...)

Downsizing the storage of your live PostgreSQL RDS instance

As you might know from previous posts, we are hosted on Amazon Web Services (or AWS). We’re using the awesome Relational Database Service (or RDS) for our RDBMS backends. Let’s suppose you have a production database that kept growing and growing until it reached a point when the hosting fees exceeded 20% of the entire production environment hosting costs. What do you do? Well, the Rover Engineering team got itself into this situation, so in this post we’ll present our approach to solving the problem.

(Read more...)

Why MKMapView and UITableView don't play nice

TL/DR: Anytime you stop displaying an MKMapView in UITableViewCell don’t forget to set showsUserLocation = false.

(Read more...)

Storing Secure Config in Amazon S3 for AWS ECS, Lambda, and More

We run containerized services in Amazon ECS (EC2 Container Service) and wanted a way to set environment variables containing sensitive configuration in running containers without defining those environment variables in ECS task definitions. We do this by storing encrypted (at rest) key/value JSON objects in S3 and reading them into the environment in either a docker entrypoint script or in the application’s bootstrap process. We wrote Snagsby (https://github.com/roverdotcom/snagsby) to make this process easier. We’ve found it a convenient way to read configuration into lambda functions as well.

(Read more...)

Optimizing Webpack: An Adventure

Here at Rover, our team of front-end engineers and engineers contributing to the web client projects is growing rapidly along with the company. In order to facilitate that growth, we recently spent some time looking at ways to improve the developer experience.

(Read more...)

Making Django Upgrades Easy(er)

At Rover Engineering, we recently undertook a major project to upgrade our Django version from 1.8 up to 1.11. As a team, we’ve done our share of Django upgrades before. This time however, we were particularly ambitious in upgrading three versions plus dependencies back-to-back with a goal of little to no interruption to the other projects going on in the tech team. (And we were already busy!) A couple months in, things are going pretty smoothly - we’ve managed to successfully land our other big projects, make significant progress, and we’re now about ready to put the final pieces out into production. It used to be a fairly painful process to upgrade, but we’ve definitely learned a few lessons along the way, and made our lives easier with some smart planning. Here are the lessons we’ve learned through this process:

(Read more...)

Build time optimization with pip and virtualenv

Using pip and virtualenv to manage your Python dependencies is a no brainer for development. The ability to ensure all developers use consistent versions, simplfy development environment bootstrapping, and quickly test new dependencies versions in an isolated environment are all huge wins for development. What about in a production environment or with continuous integration?

(Read more...)

Doggie Bag: Night Owl Edition

A weekly bag of snacks to take home after the meal, curated by Rover Tech.

(Read more...)

Doggie Bag: Guacamole Edition

A weekly bag of snacks to take home after the meal, curated by Rover Tech.

(Read more...)

Speeding up Django test runs by optimizing Factory Boy

From the very beginning at Rover, we’ve focused on making deploying code as fast and painlessly as possible. One important piece of our deployment infrastructure is Jenkins. As soon as we merge to master, (via a pull request) Jenkins runs our test suite—if the suite passes Jenkins automatically deploys the new version. As our app and our test suite have grown, these builds started taking longer than we’d like, so we decided to spend some time optimizing performance.

(Read more...)

JavaScript Error Reporting using Source Maps and Sentry in Django

Sure, you have error reporting for when your app 500’s, but do you know when your latest JavaScript changes to your core funnel interactions block your users from doing anything at all? Errors are far easier to catch and test for on the backend using automated unit tests, but the front-end of the web is everything but predictable. You can test to your heart’s content with qUnit or Jasmine, and automate your testing in tools like Browserstack and DalekJS, but even our best efforts will have bugs falling through the cracks.

(Read more...)

Doggie Bag: Free as in Internet Edition

Rover Tech’s weekly bag of snacks to take home after the meal.

(Read more...)

Can you code better than this rap?

In this job market, a company has to do everything it can to attract top developers

(Read more...)

Doggie Bag: Programming Sucks Edition

Rover Tech’s weekly bag of snacks to take home after the meal.

(Read more...)

How I removed email from my life

Of the many things that are really great about Rover, one of them is that we have a very healthy “email culture”. We mostly talk face-to-face or in a chat room. Most mornings, I arrive at work with very few new emails in my inbox.

(Read more...)

PhantomJS, Selenium, and Django: Headless browser testing for the rest of us

Rover.com is a Django shop, but I personally come from a Rails background. The Rails world has great tooling and infrastructure for automated functional tests - capybara, capybara-webkit, and the new hotness poltergist. Underneath poltergeist lies PhantomJS, a headless webkit with very few dependencies, excellent for automated testing. Unfortuantely, PhantomJS version 1.5 dropped Python bindings, leaving us Djangonauts out to dry. There also isn’t a great capybara equivalent in the Python world (Ghost.py is the closest).

(Read more...)

Who We Are

Rover.com connects pet parents with the nation's largest network of pet sitters and dog walkers. On Rover, pet parents can easily discover, book, and manage personalized care for their dogs including pet sitting, dog walking, and doggy day care. Founded in 2011 on the belief that everyone should have the opportunity to experience the unconditional love of a dog, Rover improves and simplifies life for pet parents and the dogs they love.

We're headquartered in downtown Seattle. We're an agile, fast-growing startup, and our leadership comes from some of the country's most respected tech companies. We've been named among Seattle's "Best Places to Work" in Seattle Met magazine, Seattle Business Magazine, and the Puget Sound Business Journal." We're also a recipient of Seattle Business Magazine's 2015 Tech Impact Awards. Needless to say (but we're going to say it anyway)-we love dogs, and we wouldn't dream of going to work without them by our sides.

Join Our Engineering Team

GitHub Repos

@roverdotcom on GitHub