Skip to content

Commit

Permalink
chore(piqued): a note on selling change
Browse files Browse the repository at this point in the history
Your efforts to right the ship needs to be sold to a number of stakeholders.
Each group of stakeholders want to know how they will benefit from your efforts.
Managers are often the biggest decision makers but are typically
the simplest to persuade as well. With management and other non-engineerng IC
stakeholders, the first thing we need to do is to stop using the phrase tech
debt. This phrase is not prioritized with these stakeholders.
Let's first take look through the eyes of management:

1. What do managers care about?
    * They care about getting their teams tasks done

2. What does your manager's manager care about?
    * About all their teams getting their tasks done

3. What does the manager's manager's manager's manager care about?
    * Making their mark... and that requires everyone finishing their tasks

<img style="display: block; margin: auto;" src="piqued/interest_piqued.gif" alt="my interest is piqued">

The common thread when talking to management is that they are mostly bean
counters wanting to make their bosses happy 👻. I'm mostly joking,
but I imagine its not far off for a lot of you. For the rest of you all
that have competent leadership, make it easy for your management to
sell your efforts up the chain of command!

When we're talking to these stakeholders, we need to phrase our endeavor in
terms of improved velocity, improved quality, reduced defects, and an
overall win for every effort going forward. It doesn't have to be hard
and fast numbers to support this.

Take a small example of a task your team has to complete. Write down
what's required to get it done following the status quo/legacy software.

Here are some items to capture:

* What's the amount of work involved?
   * Take a guess, t-shirt size it
* Take note of how much rework/non-value added work is required to get this done
   * Non-value work are often necessary, but mountains of it are eveidence of a systemic problem
* Write down how much risk is inherent to the part of the system impacted by the task
* How easy is it to test?
   * If its difficult or impossible to test we're increasing our risk of defect dramatically
   * If you have data, even if its anectodotal, speak to that
* Do we have a safe means to rollback in the event of an issue?
   * What's the likelihood of encountering that situation?
* Take note of the concern from the team regarding the work
   * Is there a general feeling we're dealing with a house of cards?
* Acknolwedge the on call experience
   * Has it been getting better/worse/stayed the same?

Taking a few moments to answer the above helps you build a coalition around
your new design endeavors to your non-engineering stakeholders. Notice we
never mentioned anything about CPUs/jenkins/kubernetes/etc. We kept it at
the language of management.

Take a moment to explore what this task will look like when you have the
redesign in place. Do not include the time it takes to bootstrap
that new design. We'll get to that *cost* in a bit. Capture the same items
from the list above, only this time do so as if you have your legacy
replacement in place. I recommend making one addition to the list above.
I recommend you add a line item for things that you can now do that
were once _impossible_. The more meaningful that item is to your stakeholder
the better they'll receive the whole of your argument for change.

Quick note about the *cost* of the legacy replacement. If you start by
talking about the cost of the legacy replacement, you're going to be facing an
uphill battle. Management will miss the forest for the trees. Your
management's head will immediately go through the thought exercise of trying
to explain something they don't fully understand to their boss. Not only is
it a design they likely won't fully understand, they'll also have no idea
what true *value* they'll get out of the design. Instead postpone that
discussion until **after** you've provided the *value* of the work.

Now all you have left to do is add everything up and summarize it by stakeholders.
Stakeholders include but are not limited to the following:

<details><summary>Management</summary>

Note how much your velocity could improve across the board. Also,
make note of the ability to test and assure quality earlier in the code's
lifecycle. Ideally, you're able to create a strong integration test footprint.
This raises the bar of quality you're delivering to your stakeholders. If
you take it a step farther and include end to end tests and continuous
deployment tests.... you're in an **insanely strong** position.

<details><summary>On Continuous Deployment Tests</summary>

After I had learned to design and test well I still found issues in
deployment. We aren't deploying in a vaccuum. If you're deploying in
the cloud, you have some sort of cloud infrastructure that has to be
available/setup to do what you need to do. Regardless of where or how
you deploy, you have some environmental dependencies. Any of those can
create an issue when they do not line up with expecations. There's a
lot more to the problem than what we see in a continuous integration (CI)
pipeline.

If you do not have continuous deployment tests, try creating a CLI/scripts
that codifies your deployment tests. These can be issued after a deployment
reducing the risk of defects. Since the tests are codified into a CLI/scripts,
your whole team has a simple way to repeat the process. Once again, we're creating
standardized work. This can take you quite far. When you have the means to deploy
tests that run in your deployment environments, you can take what's in that
CLI/script and reuse it in the tests you setup. A giant standardized win!

</details>

These test feedback loops improve your ability to understand the system.
Increasing the bus factor beyond one is a huge win. That is a (often
undisclosed) risk associated with any team. If a team has high attrition
rate and its largely due to the dysfunction created by the miserable
developer experience and the flawed shortcuts they often produce... you
can help move the needle here by improving the entire team's experience
working within the system. Retention rates are often tied to management
compensation, so if you can make an impact here, you're directly improving
your management's position. The manager has skin in the game to make sure you
can succeed.

When you're talking to management, its about the broader picture. Its
about improving how team as a whole can react to the needs of the business.
Improving your team's feedback loop's in the dev cycle, improves the
bottom line. The more successful the engineers become, the more successful
the manager becomes. Attrition drops, comraderie increases, and you're
seeing a greater impact on the company's performance! Its a win-win situation.
Make sure you sell it as such!

</details>

<details><summary>Engineers</summary>

This is typically an easy sell. If you are feeling the pain, then
undoubedbly others on the team are feeling it as well. When you're
providing a rope to climb out of this mess, they tend to listen. Not
all engineers will entertain the thought of something new. Realistically,
you're going to face engineers wearing at least one of the three hats
mentioned in the [introduction](#1-introduction-top). The folks who have
acclimated, are the biggest resistance you'll face. These often include
managers :sigh:. Often times they understand the tribal knowledge and
believe the struggle they went through to get to this point, are what
everyone should go through. You'll know survival bias when you see it.
The thing to remember with those who have acclimated, is that they
may have some knowledge that could help you improve the bottom line, but
they withold it knowningly or unknowingly. Providing them a space to air
their grievances with a potential new shiny design and the existing
design will prove fruitful more often than not. It'll also help build
trust with those who have concerns about any *changes*. Providing
a tiny prototype to show off the wares your selling, goes a **long**
way with engineers. If they can taste the sweetness of this new
design, they will back it and they will fight for it.

</details>

<details><summary>Yourself</summary>

The first thing you have to remind yourself.... start small! Don't
try and boil the ocean. Build up incrementally wherever possible. This
makes it so much easier to vet assumptions, provide progress to your
other stakeholders, and reaffirm your commitment to the new design. Those
small milestones are motivating. When you identify a bad assumption, its
much easier to rethink your inks when its a small change. As the old adage
goes:

> The only thing youre guaranteed with a big bang design, is a big bang

After you've established the first few updates, you'll hit the ground
running. Remember, its a work in *progress*. You'll be working on progress
for a while if you want to completely sunset the legacy code. If you
don't mind having multiple versions at a time, you can use the 80/20 rule
and pick out the small subset of behavior from the legacy design and replace
it. Once those are in place, and you and the team reap the benefits,
it'll be hard to stop the team from finishing the rest in my experience 🙃.

</details>
  • Loading branch information
jsteenb2 committed Jul 5, 2024
1 parent 98c8963 commit 67e349e
Showing 1 changed file with 0 additions and 0 deletions.
Binary file added piqued/interest_piqued.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 67e349e

Please sign in to comment.