Aha!
6 months ago
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.
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…
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…
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…
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…
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…
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…
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…
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…
Improving the editing experience in Aha! whiteboards
Our team at Aha! loves using Aha! software. Its 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…
Debugging Ruby the hard way
Normally when you encounter a bug with Ruby, or any other interpreted language for that matter, using the languages provided debugging tools is all you need to diagnose the problem and find a…
More feedback! Quantity becomes quality
In David Bayles and Ted Orlands book, Art & Fear, theres a captivating storythat has always stuck with me. This is a story that highlights a timeless argument:quantity versus quality. It goes like…
Ruby enumerables considered helpful
Rubys Enumerable methods help youmake powerful code simple — by filtering, transforming, and processing data likethe best engineers do. These methods are available on Arrays, Hashes, and many(many…
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…
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 oftenused to create command-line utilities. Many of…
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…
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…
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…
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 skilledyou get, you will still run into situations that completely baffle you.Sometimes you can hack around the situation, but…
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…
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 youre building Aha! Develop extensions. GraphQL has given us a more consistent, more flexible, and often more…
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…
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…
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…
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…
Technical debt isnt 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…
Engineering onboarding at Aha!
Software engineers are always eager to make major contributions upon joining a new company. But thats not always realistic with a large codebase. Aha! is a Rails monolith that has grown to quite a…
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 customers requests. However, we also want the…
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…
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…
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…
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…
Optimizing with the PostgreSQL deterministic query planner
Feed the planner, trust the plan Of all the Aha! engineering tool expenses, the money Im happiest to spend is on a big RDS instance running PostgreSQL. It powers our full-text search, our reporting…
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…
Advent of Code, and the Amb Operator
There is nothing quite like friendly competition to refuel your passions. Our team at Aha! recently sponsored 2021s Advent of Code, an annual event posing a series of programming puzzles that can be…
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…
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…
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…
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…
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+…
Web components and implicit slot names
Since the dawn of the internet, web developers have had an unfulfilled desire. Weve wanted living elements that can automatically react to state changes and user input. Weve wanted something with…
3 steps to an engaging new user experience for developers
First impressions matter a lot when youre 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…
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 teams ideal workspace. We made extensions with…
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…
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…
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…
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…
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…
Transaction deadlocks on ActiveRecord associations
Everyone is thrilled with the new feature you’ve just deployed! But as it startsto gain popularity, you wonder if there might be a bug despite all the testingand code review that you and your team…
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…
How do you test multiprocess code in Node?
A little while ago, I wrote about using Nodes 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…
Put your engineers on support
Lets 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…
Improve reliability with a Node.js library
A Node.js process runs a single thread. Single-threadedness isnt 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…
Use `with` and `describe_instance_method`
Want specs that look like this? Read on. Like most of America, lately Ive been trying Marie Kondos method of tidying up around my house. Around the Aha! codebase, Ive likewise been trying to get my…
Our Secret Sauce Is React Native
Its 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…
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…
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 trackers text editor, complete with photos and a short screencast. Then your co-worker, who left their…
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…
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…
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…
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…
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…
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, theyre a lovable bunch of nerds — right? On weekends they probably…
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…
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…
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…
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 engineers dream come true. They empower the engineers on their team to build…
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…
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…
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…
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…
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…
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…