Safely Migrating from Paperclip to Active Storage

By on in Development, Rails

Active Storage was introduced into Rails version 5.2. It is a highly anticipated addition to handle integrations with asset management such as AWS S3. For a long time, the field has been dominated by outside gems, including Paperclip, which has been around longer than many people have been Rails developers. Now that Active Storage has been released, Paperclip is being deprecated, creating even more incentive to migrate if you weren’t already considering it.

I recently performed the migration from Paperclip to Active Storage on production. It felt a bit like transferring trains without stopping at a station. You’re setting up Active Storage, replacing the code, and performing a data migration that relies on the code you’re refactoring out from under you. Continue reading …


Using Strategy as a Prioritization Tool

By on in Product Management

We <3 Prioritizing

In modern software processes, prioritization is at the core of what we do.

We prioritize because we don’t like waste. Waste:

  • Of human effort, which is disrespectful.
  • Of money.
  • Of time.

If you’re wasting one of them, you’re probably wasting all of them.

Prioritizing is variously simple, complicated, demanding, exhausting, and strangely emotional.

In this series, we introduce some tools that can help you successfully navigate prioritization on your product, at every level and every phase of product definition and development. Continue reading …


How to Promote Psychological Safety on Your Team

By on in Culture, Everything Else

Psychological Safety is the shared belief that everyone within an organization can take risks without feeling insecure or embarrassed. Almost as simple as it sounds – it’s the idea that employees feel safe to do their best work.

When an organization prioritizes psychological safety it creates an environment that also promotes inclusivity. It ensures that everyone from different backgrounds, mindsets, and life experiences can share their thoughts or ideas and not be punished for them. Organizations that are struggling to retain employees or attract new and diverse talent should look at their processes for encouraging employees to take calculated risks without punishment. Continue reading …


How to Structure a Learning Group at Work

By on in Culture, Everything Else

With any field, and especially programming, learning is integral. Technology changes. The field of programming is vast. To be a good programmer, you need to continue to learn and develop. In addition to learning outside of work, co-workers are often excited to learn together at work or through work. I know personally, I’m a social learner and enjoy the camaraderie that comes from struggling through a new topic together. Continue reading …


The 2×2 Method

By on in Product Management

In a discussion about prioritization among product managers at C5, we were in consensus that a 2×2 is a powerful tool in many prioritization scenarios from assessing risks to the product or business to working out the path forward when faced with competing priorities for a product.

As a visualization tool, a 2×2 gets the team on the same page to externalize relative risks or priorities and work through next steps. When things seem murky or like everyone isn’t giving the same weight to particular options, try out a 2×2. Continue reading …


Lightweight dependency injection in Elixir (without the tears)

By on in Development, Elixir

In our last Elixir blog post, “Functional Mocks with Mox in Elixir”, we discussed how testing across module boundaries could be made easier by creating a Behaviour for a collaborating module, then utilizing the wonderful framework Mox to substitute a lightweight mock module in tests.

This approach is well and good when you have very concrete module boundaries that are well-defined and coarse enough to warrant the ceremony of wiring up a behavior for a module boundary. But what if we aren’t necessarily interested in all the work in creating a mock, and we need something simpler and more lightweight?

Join us as we discuss some alternative ways to write lightweight tests across function or module boundaries.

Continue reading …


“We don’t need a designer for this.” (Yes, you do.)

By on in Design

Design is an important part of the development process and we don’t want you to take it away without considering the risks.

Carbon Five has been practicing design for 10 years and in that time we have had the privilege of working with many design-driven companies. However, even the most design-focused companies get cold feet. Here are some things we have learned over the years on the (thankfully rare) occasion the value of design is called into question. Continue reading …


The First Rule of Agile is Don’t Talk About Agile

By on in Product Management

I asked a group of fellow product managers if they’ve ever read through the Agile Manifesto with product owners / clients. They all said “no”, and the general consensus was that doing so wouldn’t be well received. This is interesting. Even though Carbon Five is well-respected for our process, and we definitely practice agile, we’re guarded about discussing it. Continue reading …


Comparing Dynamic Supervision Strategies in Elixir 1.5 and 1.6

By on in Development, Elixir

Classroom

Let’s say you’re managing complex process state in your Elixir application and you need a way to spin up and down new processes as your app runs. This requirement is known as dynamic supervision, the ability for a supervisor to add processes to its supervision tree at runtime.

This post will explain how to implement a process under dynamic supervision with Elixir 1.5, and discuss how Elixir 1.6’s new DynamicSupervisor is easier to configure and is more flexible.

Continue reading …