← All writing
EngineeringLeadership

Thinking in Pieces: Part III — Prioritization

From a Clear Map to a Smart Route

Photo by Kelly Sikkema on Unsplash


From a Clear Map to a Smart Route

In our last piece, we established the core discipline of Decomposition: taking a big, messy problem and breaking it down until each piece is almost trivial. It’s how you get the full blueprint of a system, making the complexity visible and feasible.

But having a perfectly clear map isn’t the same as having a good route. You might have 50 small, solvable tasks, but if you start work on piece #42 before piece #1, your entire engineering team will grind to a halt.

Prioritization, in the software engineering context, is about “what needs to be built first to unblock the rest of the system.” It’s turning your component map into a guided route.

The Dependency Discipline

When we prioritize, we’re not just ranking tasks by importance; we’re identifying functional dependencies. This is where programming logic meets project management. Just like a function needs the correct input before it can run, a feature needs its foundational components to be ready.

If you ignore dependencies, you create a “bottleneck”, like a developer waiting on an API endpoint that should have been done last week or the whole team waiting a design definition of a new screen. We can split our decomposed tasks into two categories based on this discipline:



1. Hard Dependencies

These are the non-negotiable pieces. They must be resolved first because they provide the foundation that crucial parts of the system rely on.

  • Example 1: Authentication. You can’t start building the User Profile Page or the Logged-in Home Screen until the Login API and Session Management are ready. The front-end team needs a working endpoint now to design and hook up the core flows.
  • Example 2: Core Data Schema. Defining the primary data models and their relationships. Every single piece of logic and persistence relies on this foundation.

Attacking these first ensures that the most critical path is paved, giving everyone else a clear runway to start working.

2. Parallel Tracks

These are important tasks that are self-contained and don’t block the main delivery pipeline. They can and should be developed concurrently to maximize throughput.

Example: Drafting the Terms of Service markdown, optimizing a background job’s performance, or implementing a minor design tweak that is isolated to a non-critical page.

A mistake many teams make is treating a soft dependency like a hard one, wasting valuable time when the foundational blocks should be the priority.

Avoiding the Bottleneck

Once you’re operating at a mid or senior level, your job isn’t just to write code: it’s to safeguard the flow of the entire team when a vague idea lands on your desk

Imagine the front-end team is waiting for the API, but the backend developer is spending a week building a highly optimized search algorithm that won’t be used for three months. That’s a flow killer. The velocity of the team drops to zero while they wait for the essential “key” to unlock the next room.

The goal of smart prioritization is simple: Always keep the next piece unblocked.

This means asking questions like:

  • What’s the absolute minimum data structure required for the design team to start mocking the interface?
  • What’s the smallest slice of clarity I can deliver — just enough interface and data definition — to let the team move forward while I craft the high-fidelity prototype?
  • What is the one API endpoint the front-end needs today to stop making assumptions?
  • Which high-risk component (the tricky third-party integration, the complex payment flow) should we tackle early to de-risk the project schedule?

While some people use formal methods (like Gantt charts or PERT diagrams) to map this out, the core discipline is simply creating a mental model of who needs what and prioritizing the producers of dependencies.

Iteration, Not Perfection

Prioritization should always look ahead to the next viable iteration of your product.

Instead of building a feature to 100% completion, prioritize the simplest, functional version of a component that still allows the dependent piece to move forward.

The real power here is consistency. When you follow this process, you guarantee that every engineer always has something meaningful to work on, reducing friction and minimizing wait states.

The output of decomposition is clarity. The output of prioritization is velocity. When you master both, you gain an unstoppable advantage: you don’t just solve problems; you coordinate the solution efficiently.

Final Note

We’ve now covered Decomposition and Prioritization. Both are about imposing clarity and order on a messy world.

In the next piece, I’ll take this a step further and talk about how this precise sequencing strengthens collaboration and how you can use this structure to communicate better with product, design and code.

Originally published on Medium.