It’s already been a year and a half since I wrote my original article on how developers work at TaxJar.
Since then we’ve doubled in size. We’ve changed our development process and the software we use to get work done. That in itself is a wonderful thing — at TaxJar we’re always looking into better ways to ship faster and collaborate effectively. With that said, certain things about TaxJar will never change. We always do the right thing for our customers. It’s part of our DNA. Everyone at TaxJar provides hands-on support, including our talented software engineers. They innately understand that in order to build a truly great product, you have to know your customers.
In this article, we’ll discuss how things have changed and jump into a typical day working as a developer at TaxJar in 2018.
Agile Product Teams
Development has morphed into a set of smaller, more agile teams focused on a specific area of TaxJar.
When it comes to sales tax, accuracy is everything. Merchants need to collect the right amount of sales tax from their customers to avoid under-collecting and remitting additional tax out of their own pocket. There’s a myriad of product exemptions, sourcing rules, and jurisdiction-based tax rates (down to the street address) to implement and manage on a recurring basis. It’s important that we get it right for trust and reliability. The Accuracy team works on the underlying engine to power sales tax calculations for reporting and filing within the TaxJar app as well as the SmartCalcs API.
TaxJar’s automated sales tax filing engine is truly one of a kind. On the surface, it only takes a couple clicks to enroll in AutoFile from the TaxJar app. Behind the scenes, it’s the most advanced product we’ve ever designed and the culmination of years of hard work. The AutoFile team directly supports the filing team by investigating and fixing issues, improving enrollment forms and external communication, improving data verification, maintaining our filing APIs, and automating as much as possible.
To handle an ever-growing volume of transactions and API requests on a daily basis, reliability and performance is key. Merchants depend on TaxJar to collect and remit sales tax. The Platform team scales our systems to avoid impending doom and ensure millions of transactions are imported every single night. If that wasn’t enough, they also directly maintain the SmartCalcs API and build out new features in the TaxJar app such as our new Sales and Transactions Checker for economic nexus.
Our customers use many different platforms to sell things online. All of these platforms need to accurately calculate sales tax and efficiently push transactions into TaxJar. The Platform Integrations team builds and maintains customer-facing integrations for some of our most popular eCommerce channels with thousands of customers including Magento. They’re also responsible for growing our ecosystem of 3rd party integrations with developer-friendly API clients and documentation, working closely with the Platform team to release new API features and improvements.
Each team has a technical lead to assist with communication, hiring, and project management. In general, each team has a similar development process with some variation in timing:
- Multiple weekly standups to discuss and review tasks
- Biweekly one-on-ones with your team lead
- Code review guidelines
- Release schedules
Basecamp now powers all communication at TaxJar. We made the switch from Flowdock to Basecamp for multiple reasons. As the team grew we realized we needed a way to write and discuss longer messages in a message board rather than simply chatting about it. Secondly, we wanted to manage tasks and documents using the same tool. With Basecamp, we’re able to use chat, messages, tasks, and documents in a single app.
You’ll wake up in the morning to your Heystack — unread notifications for messages and chats awaiting your review. Your team will have its own dedicated team page with a chat room and message board. Some teams directly use Basecamp for task management while others use JIRA.
Depending on the day of the week, you’ll have a morning standup with your team on Zoom. Here’s an overview of your weekly team and cross-team meetings:
- Mon 9am PST – Your Team Standup
- Tues 9am PST – All Development Call (Biweekly)
- Wed 9am PST – Your Team Standup
- Fri 11am PST – All Company Call (Weekly)
Throughout the day you’ll chat and post messages throughout various teams and projects in Basecamp. Using pings, you can privately message your teammates with questions or just to say hello.
We finally made it to the fun part. Your team lead will assign you a project that already has a clear set of requirements so you can get up and running quickly. From there, you’ll spin up the text editor or IDE of your choice to start coding. Our engineers prefer Nvim, Vim, VS Code, Atom, or Sublime. In addition to Ruby, we’re now using Elixir to power our importers and the next version of our API for blazing fast performance and rock-solid reliability. Our Platform team loves Elixir. One of our engineers built his own TaxJar Elixir API client before even joining the company.
Over the last couple of years we’ve done a lot to improve developer happiness. For one thing, everyone gets a company MacBook Pro. As a gift for our 5th year anniversary, remote road warriors now have an Omnicharge to power their laptops on the go. If you really want to get things done while away from your remote office, I recommend an iPad with a Luna Display.
TaxJar engineers also deeply care about developer tooling to make their lives easier. Internal tools have been built to get snapshots of state-based reports at specific filing periods, compare tax calculations between internal datasets, speed up monthly jurisdiction boundary updates, and more. For Ruby projects we use Rubocop and Pronto for linting and automated code review to maintain coding standards. We even have a productivity hacks thread in Basecamp with a growing list of “knowledge bombs 💣” — useful tips and tricks to speed up your development:
We’re always improving our stack. Beyond Elixir, we’ve added ES6 and Vue.js to our front-end via Webpack for richer user experiences. We continue to invest in more AWS infrastructure for scalability and performance. For continuous integration, we use Codeship to run thousands of specs via RSpec and Poltergeist. Several Codeship pipelines run groups of specs concurrently for faster builds and unfortunately, less virtual sword fighting:
For version control, we continue to use Bitbucket for most of our internal projects at TaxJar. Open source projects for our API clients and external integrations are hosted on GitHub. All updates must be done in a separate branch off master. When submitting a new PR, here’s our standard procedure:
- To signal that your PR is ready for review, approve your PR first.
- PRs will not be merged until 3 engineers (author + 2 others) have approved the PR.
- Specs must be passing on Codeship for the PR to be merged.
- PR should be click-tested (either locally or staging) by at least 1 other engineer.
While conducting a PR review, one or more of the following typically happens:
- Logic, syntax, and style is carefully reviewed to meet our standards
- Click-testing locally or via staging
- Running the specs locally
We encourage positive comments, emoji (🎉 🙌 🔥), and asking questions like “Why did this change?” or “Can you explain how this works?”. After you’ve submitted your pull request, specs are passing, and it’s been thoroughly reviewed, it’s time to ship it.
Once your PR is fully approved, your team lead will merge your pull request into master and deploy it to production. From there, the rest of our team will handle the rollout strategy: Informing internal stakeholders, reaching out to customers for feedback, and updating support articles / documentation. Your work will be recognized in our internal release notes and shared throughout all of TaxJar. Congratulations! 👏
Gigabit internet for everyone? Telepathic communication goes mainstream? While I can’t necessarily promise either of those by 2019, I do know for certain that many exciting things will happen at TaxJar and fundamentally change how we work by next year. If you enjoy writing Ruby, Elixir, or PHP and prefer getting things done with an experienced team, consider joining us. Mention that you’ve read this article from top to bottom and I guarantee you’ll at least get your foot in the door.
See you again next year!