Aha! Develop is for healthy enterprise development teams — that use scrum, kanban, and SAFe frameworks


Learn more

Articles

A collection of technical posts written by the Aha! engineering team.


Justin Paulson · 2024-11-14 · engineering

We love bugs (and you should, too!)

OK, maybe "love" is a bit strong. But the Aha! engineering team has a shocking confession: We embrace bugs in our software. Our CTO, Dr. Chris Waters, often says, "If your feature ships without any…

Phil Wilt · 2024-10-28 · engineering

Transparency, autonomy, responsiveness, and education: How the Aha! engineering team works

Organizations have many different ways to approach how teammates write code. You have individual silos, pair programming, team-based work, and black box interfaces where you have no idea how the other…

Shane Tully · 2024-09-18 · ruby, rails

How we upgrade major Rails versions

As a company whose product is built on top of Ruby on Rails, conducting a major version upgrade of the underlying framework is just about the biggest upkeep item we regularly undertake. The whole…

Greg Brown · 2024-08-21

Interrupt-driven engineering: Working on what matters at Aha!

On the Aha! team, The Responsive Method (TRM) guides our interactions with customers and one another. Responding to requests quickly and thoughtfully maximizes the value we provide to customers and is…

Alex Bartlow · 2024-05-24 · platform, devops

The most important system to keep running

I heard a ring, and my heart rate spiked to 132. It was Tom Bailey, a colleague on the Product Success team. I prepared myself for a cheerful British voice to deliver bad news — the only reason for…

Michael Shiel · 2024-04-08 · ruby, rails, postgres

Using calculated attributes to help users surface delivery risks

Feature delivery can be impacted by many factors. Some are readily visible, but others are more nuanced — or buried in mountains of data. What if we could show developers and project managers the…

Percy Hanna · 2024-03-14 · react, canvas

Building a dynamic Canvas rendering engine using JSX

Our product team is busy adding many great new features to Aha! Whiteboards and Aha! Knowledge — including wireframes, voting, and improvements to viewing Aha! Roadmaps data within a whiteboard. We…

José Guerrero · 2024-02-02 · ruby, debugging, rails

From many to one: Moving our JavaScript code into a monorepo

Do we need a monorepo? When I first joined Aha!, I was surprised by how well-structured the engineering onboarding program was. I spent several weeks getting to know all the teams and learning the…

Greg Brown · 2024-01-11 · ruby, debugging, rails

Improving the editing experience in Aha! whiteboards

Our team at Aha! loves using Aha! software. It's not only a great way to build our own lovable product, but it also helps us to find rough edges before customers do and develop empathy for our users…

Shane Tully · 2023-12-14 · ruby, debugging, rails

Debugging Ruby the hard way

Normally when you encounter a bug with Ruby, or any other interpreted language for that matter, using the language's provided debugging tools is all you need to diagnose the problem and find a…

Kyle d’Oliveira · 2023-11-16 · ruby, rails

More feedback! Quantity becomes quality

In David Bayles and Ted Orland's book, Art & Fear, there's a captivating story that has always stuck with me. This is a story that highlights a timeless argument: quantity versus quality. It goes like…

Justin Weiss · 2023-09-29 · ruby, rails, refactoring

Ruby enumerables considered helpful

Ruby's Enumerable methods help you make powerful code simple — by filtering, transforming, and processing data like the best engineers do. These methods are available on Arrays, Hashes, and many (many…

Kyle d’Oliveira · 2023-08-24 · ruby, rails, debugging, race conditions

Off to the races: 3 ways to avoid race conditions

What is a race condition? I searched for a good definition of a race condition and this is the best I found: A race condition is unanticipated behavior caused by multiple processes interacting with…

Steve Lamotte · 2023-08-10 · engineering, platform, ruby, dev ops

CLI tools at Aha!

Take your command-line utilities to the next level with these Ruby gems Ruby has always been a great general-purpose scripting language and is often used to create command-line utilities. Many of…

Chris Zempel · 2023-06-27 · engineering, pull request, ruby, rails

12 Tools for Quality Pull Requests

As you stare into an empty text field, the blinking cursor invites you to engage in a crucial part of being a professional software engineer — writing a pull request. What will you write? Almost every…

Andrew Jones · 2023-05-08 · security, ruby, rails

Solving a critical bug in the default Rails caching library

An odd coincidence On March 20th, ChatGPT users reported seeing conversations that were not their own. Just a few weeks earlier I had solved a bug where the default Rails caching library (Dalli) would…

Jeremy Wells · 2023-04-27 · javascript, ruby, capybara, cypress

Migrating from Cypress to Capybara — a reluctant tale

Many months ago, our team had to have a hard conversation about Cypress. Cypress was the new kid in our CI pipeline, a browser integration testing framework. We had thought it would replace Capybara…

Jonathan Steel · 2023-03-23 · css, remote, hiring

CSS is hard no matter how good you are at it

Let us start by saying that CSS is hard. It seems that no matter how skilled you get, you will still run into situations that completely baffle you. Sometimes you can hack around the situation, but…

Jonathan Steel · 2023-01-26 · ruby, remote, hiring

Fully remote companies are better than hybrid

I have worked in many different environments throughout my career. I have worked in the same building as my teammates and even for a company that had us all in the same room. I have also worked in…

Justin Weiss · 2023-01-12 · javascript, graphql

Building a composable query generator for GraphQL

In a lot of newer projects, we use our GraphQL API. This is the same API you use when you're building Aha! Develop extensions. GraphQL has given us a more consistent, more flexible, and often more…

William Lawrence · 2022-11-10 · ruby, rails, mobile, testing

Using Capybara to test responsive code

As more users opt for mobile browsing, responsive design becomes more important — even for applications that are primarily used on a desktop. Responsive design is a key consideration for Aha! Ideas…

Kyle d’Oliveira · 2022-10-20 · ruby, rails, rubocop, testing

Writing and testing a custom RuboCop cop

Solving a problem is great — but keeping it from coming back is even better. As we resolve issues in our code base, we often consider how to keep that classification of issue out of the code base…

Jonathan Steel · 2022-10-06 · ruby, rails, hiring, onboarding

Service layer for business logic — Organizing code in a Rails monolith

Our engineering team builds the Aha! suite using a Rails monolith. We carefully weighed a number of options before determining that this would provide the most lovable solution for our users and our…

Alex Bartlow · 2022-09-22 · ruby, rails, hiring, onboarding

Platform Engineering vs. Site Reliability Engineering

Striker and goalie. Offense and defense. Deploy and recalibrate. Many disciplines have dichotomy between the tasks that accomplish a goal and tasks that protect the ability to do so. Delivering…

Jeremy Wells · 2022-09-02 · technical debt

Technical debt isn't technically debt

The term "technical debt" has entered the standard lexicon of programming and software project development and has often been called out for being an incorrect metaphor. Yet it persists as a way to…

Phil Wilt · 2022-08-04 · ruby, rails, hiring, onboarding

Engineering onboarding at Aha!

Software engineers are always eager to make major contributions upon joining a new company. But that's not always realistic with a large codebase. Aha! is a Rails monolith that has grown to quite a…

Kyle d’Oliveira · 2022-07-21 · ruby, rails, resque

Making background jobs more resilient by default

When it comes to job processing, timing is everything. Running jobs in the background helps us remove the load from the web servers handling our customer's requests. However, we also want the…

Chris Zempel · 2022-07-01 · ruby, rails, billing

How we launched a smooth billing overhaul

Aha! has evolved significantly over the past several years. What began as a single-product offering is now a suite of world-class product development tools. To keep up with our growing userbase, we…

Jeremy Wells · 2022-05-12 · develop, frontend, react, extensions, graphql

Creating charts with the Aha! Develop API and extensions

An important aspect of developer tools is being able to visualize work and progress in various ways. A well-known example is the burndown chart that agile teams use to track their progress through…

Percy Hanna · 2022-04-28 · extending the monolith

Embrace the monolith: Adding a new product to Aha!

When our engineering team first began conceptualizing Aha! Develop, we were faced with a monumental question. How should we implement the architecture of adding a brand new product? We could start…

Michel Billard · 2022-04-27 · react, javascript, fullscreen

Using the Fullscreen API with React

Making something fullscreen in browsers is surprisingly easy. All you have to do is call requestFullscreen() on any DOM node. For example: Note that the element that you choose to put in fullscreen…

Alex Bartlow · 2022-04-22 · postgresql, devops, backend, logging

Optimizing with the PostgreSQL deterministic query planner

Feed the planner, trust the plan Of all the Aha! engineering tool expenses, the money I'm happiest to spend is on a big RDS instance running PostgreSQL. It powers our full-text search, our reporting…

Steve Lamotte · 2022-04-14 · aws, backend, devops, dynamic staging, ec2, ecs, rails, rds, redis, resque, ruby, slack, staging, terraform, extending the monolith

Building a dynamic staging platform

Aha! dynamic stagings Our team at Aha! recently gained the ability to quickly create and destroy dynamic staging environments. Our platform team maintains several general-purpose staging environments…

Alex Bartlow · 2022-04-07 · ruby

Advent of Code, and the Amb Operator

There is nothing quite like friendly competition to refuel your passions. Our team at Aha! recently sponsored 2021's Advent of Code, an annual event posing a series of programming puzzles that can be…

Justin Paulson · 2022-03-31 · extending the monolith

From One, Many — Building a Product Suite With a Monolith

Aha! has now reached $100 million in annual recurring revenue with three separate software products in our available suite. We did this all without taking money and without breaking our monolith into…

Bill Rastello · 2022-02-11 · ecs, aws, platform

Migrating from EC2 to ECS Services and Tasks

Our old system architecture here at Aha! has served us well. On top of RDS, ElastiCache, and other AWS services, we had hundreds of EC2 instances running Unicorn to serve web traffic. We used nginx…

Michel Billard · 2022-02-08 · rails, javascript

Fiscal years and how JavaScript is wrong about months

Developers love working with dates. One day, someone asked themselves, what if the year didn’t start in January, but could start in any month of the year. Welcome to the fascinating world of fiscality…

Jonathan Steel · 2021-09-23 · frontend

How to build a dark theme

So you want to implement a dark theme for your app? All your favorite applications have it and your app should too. But will it be trivial or is it as daunting as it seems? Where do you even start…

Kyle d’Oliveira · 2021-06-30 · rails, backend

90% of Rails N+1 queries solved with a drop-in fix

N+1 queries come up very often when working with Rails. N+1 queries are a silent performance tax both for your application and for developers. If a developer writes new code that introduces an N+…

Nathan Wright · 2021-05-28 · web components, javascript, develop

Web components and implicit slot names

Since the dawn of the internet, web developers have had an unfulfilled desire. We've wanted "living elements" that can automatically react to state changes and user input. We've wanted something with…

Winfred Nadeau · 2021-05-27 · product engineering, develop, onboarding, new user experience

3 steps to an engaging new user experience for developers

First impressions matter a lot when you're launching a new product. Optimizing for time-until-Aha! is no easy feat. This is uniquely true for developer-facing software because your customer lives and…

Jeremy Wells · 2021-05-17 · develop, frontend, react, extensions

How we enable hot-reloading in production for extension developers

Aha! Develop is our extendable agile development tool. You can completely customize the UI, workflow, and integrations through extensions to create your team's ideal workspace. We made extensions with…

Justin Weiss · 2021-05-03 · graphql, develop, rails, api

Automatically avoiding GraphQL N+1s

Some people, when faced with an API problem, think “I’ll use GraphQL!” And now they have N+1 problems. N+1 problems occur when you want to find a deep tree of records and end up performing a SQL…

Alex Bartlow · 2020-12-14 · athena, devops, backend, logging

Log management using AWS Athena

Many SaaS providers will happily sell you a turn-key log management system, and in the early days of a startup when you value time over money, purchasing one makes a lot of sense. AWS Cloudwatch logs…

Michel Billard · 2020-09-01 · frontend, react

Building our new Gantt chart

Our old Gantt chart served us well for the past six years. It was doing what it was designed to do, but some of the things we wanted to add were either impossible or incredibly difficult to accomplish…

Zach Schneider · 2020-07-09 · javascript, npm

A treatise on JavaScript dependencies

JavaScript dependency trees are a bit of a punching bag in the programming world. Even in a small project, the node_modules directory can easily reach hundreds of megabytes in size, much to the…

Toray Altas · 2020-06-29 · quantum, development, cloud

Quantum computing in the real world

Why does it matter? As we have recently entered a new decade, I have been thinking about the next leaps in computer science and where some of those areas may be. One such area that I have read a lot…

Andrew Vit · 2020-06-24 · rails, sql

Transaction deadlocks on ActiveRecord associations

Everyone is thrilled with the new feature you’ve just deployed! But as it starts to gain popularity, you wonder if there might be a bug despite all the testing and code review that you and your team…

Zach Schneider · 2020-06-02 · gatsby, javascript, netlify

Search on a static site with Netlify functions

Recently, our team at Aha! has been working on migrating our public marketing website from a traditional Rails app to a Gatsby application hosted on Netlify. Gatsby (and static sites in general) offer…

Justin Weiss · 2019-07-30 · node, javascript, testing

How do you test multiprocess code in Node?

A little while ago, I wrote about using Node's child_process library. child_process creates other processes to do work instead of tying up a single process. When you do work in child processes, you…

Zach Schneider · 2019-07-25 · support

Put your engineers on support

Let's talk about your bug backlog. You know you have it -- somewhere in your issue tracker, a stack of dozens or maybe even hundreds of bugs awaiting attention. Sometimes new engineers will pull a few…

Justin Weiss · 2019-06-13 · node, javascript

Improve reliability with a Node.js library

A Node.js process runs a single thread. Single-threadedness isn't a problem if you run short pieces of code and let Node do other work in between. It can even be a huge benefit! One process can handle…

Alex Bartlow · 2019-04-29 · ruby, testing, development

Use `with` and `describe_instance_method`

Want specs that look like this? Read on. Like most of America, lately I've been trying Marie Kondo's method of tidying up around my house. Around the Aha! codebase, I've likewise been trying to get my…

Zach Schneider · 2019-04-17 · javascript, mobile, native, react

Our Secret Sauce Is React Native

It's been an up-and-down kind of year for React Native. Last summer, Udacity and Airbnb announced that they were moving off of the platform; Discord is sticking with React Native but still publicized…

Zach Schneider · 2018-11-27 · development, javascript, security

event-stream vulnerability explained

If you work with JavaScript at all, you probably saw a ton of noise yesterday about a vulnerability in the event-stream npm package. Unfortunately, the actual forensic analysis of the issue is buried…

Justin Weiss · 2018-04-18 · rails, collaboration, text editor

How to Build a Collaborative Text Editor Using Rails

It is a painful realization. You just added a beautiful, multi-page description into your bug tracker's text editor, complete with photos and a short screencast. Then your co-worker, who left their…

Zach Schneider · 2017-09-07 · frontend, javascript

Switching From CoffeeScript to ES6

Aha! is a Rails monolith. Although we have embraced front end technologies, such as webpack and React, Rails is the glue that holds everything together. And like many Rails monoliths, CoffeeScript…

Chris Waters · 2017-06-06 · prioritization

Smash More Bugs

Drop everything. This is what our team does when a bug is found. Recently, a customer reported an issue in a new feature that had just gone live. We quickly identified the problem, fixed it, and sent…

Chris Waters · 2017-02-28 · mundane

This Developer Finds Joy in the Mundane

I love fast food. It started as a teenager when I worked at McDonald’s in New Zealand. There were only a few locations back then and we were amazingly busy, with lines usually out the door at…

Alex Bartlow · 2017-01-31 · standardization

The New Normal for Your Engineering Teams

I still remember the chaos of my first job. A new team with new challenges. Facing critical work decisions for the first time. But there was something else that added to the chaos — a cooked-up and…

Chris Waters · 2017-01-06 · hiring

The 4 Qualities of Engineers This CTO Loves to Hire

When I first learned to program, I did not have a computer. I wrote everything out on paper and just imagined what would happen when it ran. (This was back in the days when magazines actually had code…

Zach Schneider · 2016-07-07 · communication

6 Common Misconceptions About Engineers, Debunked

Most product managers develop a close working relationship with their engineering team over time. Although sometimes a little quiet, they're a lovable bunch of nerds — right? On weekends they probably…

Alex Bartlow · 2016-06-29 · communication, process

How Much "Dev Speak" Should Product Managers Know?

Product managers need to be able to connect with the engineering team. But some product managers — and people in general — often feel excluded from the cultus of software development. I know because I…

Zach Schneider · 2015-10-14 · college

Why You Should Not Major in Engineering

My college algorithms class was the final weed-out course in the computer science program. It covered advanced topics like computational complexity and graph theory. If you passed, you would likely…

Zach Schneider · 2015-08-25 · frontend, ux

Perfecting a Smooth Scrolling Experience for Large Tables

Depending on who you ask, the <table> is a quintessential cornerstone of web development old and new; an outmoded curiosity from a time where CSS lacked floating elements; or somewhere in between. But…

Zach Schneider · 2015-08-10 · product management

How Engineers Want to Work with Product Managers

Engineers want to build the product. They do not want to manage it. So, you can see why a good product manager is an engineer's dream come true. They empower the engineers on their team to build…

Zach Schneider · 2015-07-20 · complexity, process

Code Complexity Metrics Suck — Use Them Anyway

I love contributing meaningful code to the open-source community; I do it every chance that I get. A few years back, I authored my first major open source project — a Rails application for developers…

Zach Schneider · 2015-06-26 · activerecord, sql

Using Nested Selects for Performance in Rails

Databases are fast, even at performing fairly complex operations. This is easy to forget in the age of ORMs and abstraction and many of us haven’t written a line of raw SQL in months. But a solid…

Zach Schneider · 2015-06-19 · frontend

Making Magic with contenteditable="true"

I love this team. I love the product and engineering team at Aha! because we believe in objectively prioritizing work. To truly build what matters, you must identify which feature requests will help…

Alex Bartlow · 2015-06-07 · reliability

3 Lessons From the Hacker Who Saved Apollo 11

I have been fascinated by rockets since I was young. As I get older, my appreciation has only grown for the amazing amount of engineering that goes into those majestic machines. I would like to share…

Chris Waters · 2014-12-15 · frontend, text editor

State of the Art in WYSIWYG HTML Editors

Aha! editor A common feature request from Aha! users was the ability to include images and tables inline with feature descriptions. A year or so ago we embarked on a project to improve our editor with…

Chris Waters · 2013-10-28 · devops

Why Does DevOps Think They Are the TSA?

So you are the DevOps Manager — gatekeeper of everything good — and the go-to-guy for smart code running on big iron. You help keep engineering from releasing the miserable code that QA was not able…