<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Moein Hosseini</title>
    <description>The latest articles on DEV Community by Moein Hosseini (@moein7).</description>
    <link>https://dev.to/moein7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F416475%2F2a23bc69-8512-4c90-a1f3-ecde338ae781.jpeg</url>
      <title>DEV Community: Moein Hosseini</title>
      <link>https://dev.to/moein7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/moein7"/>
    <language>en</language>
    <item>
      <title>Software Isn't a List of Tasks—It's a Network of Dependencies</title>
      <dc:creator>Moein Hosseini</dc:creator>
      <pubDate>Sat, 04 Jul 2026 06:02:40 +0000</pubDate>
      <link>https://dev.to/moein7/software-isnt-a-list-of-tasks-its-a-network-of-dependencies-5h7m</link>
      <guid>https://dev.to/moein7/software-isnt-a-list-of-tasks-its-a-network-of-dependencies-5h7m</guid>
      <description>&lt;p&gt;If you've worked on a software team long enough, you've probably experienced this.&lt;/p&gt;

&lt;p&gt;Sprint planning goes well. The team breaks down a feature into tasks, estimates each one, assigns owners, and everyone leaves the meeting feeling confident.&lt;/p&gt;

&lt;p&gt;A few days later, reality hits.&lt;/p&gt;

&lt;p&gt;A backend change requires a database migration nobody considered.&lt;/p&gt;

&lt;p&gt;The frontend team is blocked because an API isn't ready.&lt;/p&gt;

&lt;p&gt;QA discovers edge cases that require additional implementation.&lt;/p&gt;

&lt;p&gt;Another developer is waiting on work from someone in a different team.&lt;/p&gt;

&lt;p&gt;Suddenly, the original sprint plan no longer reflects reality.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;For a long time, I thought this was simply part of software development. But after seeing the same problems across multiple projects, I started wondering:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if we're trying to manage software using the wrong model?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem Isn't Estimation
&lt;/h2&gt;

&lt;p&gt;One of the biggest discussions in Agile teams is estimation.&lt;/p&gt;

&lt;p&gt;Should we estimate using story points?&lt;/p&gt;

&lt;p&gt;Hours?&lt;/p&gt;

&lt;p&gt;Planning Poker?&lt;/p&gt;

&lt;p&gt;Velocity?&lt;/p&gt;

&lt;p&gt;Yet, no matter which method we choose, estimates are often wrong.&lt;/p&gt;

&lt;p&gt;Not because developers can't estimate.&lt;/p&gt;

&lt;p&gt;But because &lt;strong&gt;you can't estimate work that you don't know exists yet.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every project contains unknowns.&lt;/p&gt;

&lt;p&gt;As development progresses, new requirements appear.&lt;/p&gt;

&lt;p&gt;Hidden dependencies are discovered.&lt;/p&gt;

&lt;p&gt;Technical limitations surface.&lt;/p&gt;

&lt;p&gt;Someone realizes another service also needs changes.&lt;/p&gt;

&lt;p&gt;A task that looked like "three days" suddenly becomes "two weeks."&lt;/p&gt;

&lt;p&gt;The estimate didn't fail.&lt;/p&gt;

&lt;p&gt;Our understanding of the work changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  We Plan Tasks Instead of Understanding Features
&lt;/h2&gt;

&lt;p&gt;Today's project management tools are excellent at tracking tasks.&lt;/p&gt;

&lt;p&gt;A typical feature might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Login Feature

• Backend API
• Frontend UI
• Database
• Testing
• Documentation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This answers one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What needs to be done?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But software development is rarely about individual tasks.&lt;/p&gt;

&lt;p&gt;It's about how those tasks interact.&lt;/p&gt;

&lt;p&gt;Questions like these are much harder to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which task is blocking mine?&lt;/li&gt;
&lt;li&gt;If my task is delayed, who else is affected?&lt;/li&gt;
&lt;li&gt;Which developer depends on another developer?&lt;/li&gt;
&lt;li&gt;How many teams are involved in this feature?&lt;/li&gt;
&lt;li&gt;Are we actually close to finishing?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To answer those questions, we usually have to search through Jira tickets, comments, Slack conversations, and meetings.&lt;/p&gt;

&lt;p&gt;The information exists.&lt;/p&gt;

&lt;p&gt;It's just scattered.&lt;/p&gt;




&lt;h2&gt;
  
  
  Software Is a Network
&lt;/h2&gt;

&lt;p&gt;A feature isn't a checklist.&lt;/p&gt;

&lt;p&gt;It's a network.&lt;/p&gt;

&lt;p&gt;Take something as simple as a login feature.&lt;/p&gt;

&lt;p&gt;It might involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI&lt;/li&gt;
&lt;li&gt;Backend API&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;Session Management&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these exist independently.&lt;/p&gt;

&lt;p&gt;They depend on each other.&lt;/p&gt;

&lt;p&gt;Instead of looking like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Login Feature

□ Backend
□ Frontend
□ Database
□ Tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It actually looks more like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            Feature Map

             Feature
          /     |      \
       API     UI     Database
        |       |         |
     Auth    Forms     Migration
        \      |        /
          Integration Tests
                 |
             Deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells a completely different story.&lt;/p&gt;

&lt;p&gt;Instead of seeing isolated tasks, we see relationships.&lt;/p&gt;

&lt;p&gt;And relationships are what determine whether a project moves forward or becomes blocked.&lt;/p&gt;




&lt;h2&gt;
  
  
  Hidden Dependencies Cost More Than Bad Estimates
&lt;/h2&gt;

&lt;p&gt;Most sprint failures aren't caused by someone estimating four days instead of five.&lt;/p&gt;

&lt;p&gt;They're caused by discovering work too late.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We forgot the migration."&lt;/p&gt;

&lt;p&gt;"The mobile app also needs changes."&lt;/p&gt;

&lt;p&gt;"Ops needs monitoring before deployment."&lt;/p&gt;

&lt;p&gt;"This API change affects another team."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These aren't estimation errors.&lt;/p&gt;

&lt;p&gt;They're visibility problems.&lt;/p&gt;

&lt;p&gt;If these dependencies had been visible from the beginning, the plan would have been completely different.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Missing Layer: Feature Maps
&lt;/h2&gt;

&lt;p&gt;I believe we're missing something between &lt;strong&gt;planning&lt;/strong&gt; and &lt;strong&gt;implementation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of representing a feature as a list of tickets, what if we represented it as a dependency graph?&lt;/p&gt;

&lt;p&gt;I call this idea &lt;strong&gt;Feature Maps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each node represents a piece of work.&lt;/p&gt;

&lt;p&gt;Each connection represents a dependency.&lt;/p&gt;

&lt;p&gt;Every node knows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who owns it&lt;/li&gt;
&lt;li&gt;What it depends on&lt;/li&gt;
&lt;li&gt;What it blocks&lt;/li&gt;
&lt;li&gt;Its current status&lt;/li&gt;
&lt;li&gt;Its progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of opening twenty Jira tickets to understand a feature, the relationships become immediately visible.&lt;/p&gt;

&lt;p&gt;The map becomes the feature.&lt;/p&gt;

&lt;p&gt;The tickets become implementation details.&lt;/p&gt;




&lt;h2&gt;
  
  
  "Done" Should Mean More Than Closed Tickets
&lt;/h2&gt;

&lt;p&gt;One thing I've noticed is that teams often say a feature is &lt;strong&gt;90% done&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But what does that actually mean?&lt;/p&gt;

&lt;p&gt;Imagine instead that completion is structural.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Login Feature

✅ UI
✅ Backend
✅ Database
✅ Authentication
✅ Testing
❌ Monitoring
❌ Documentation
❌ Deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The feature isn't complete until every required component is complete.&lt;/p&gt;

&lt;p&gt;No assumptions.&lt;/p&gt;

&lt;p&gt;No forgotten tasks.&lt;/p&gt;

&lt;p&gt;No surprises before release.&lt;/p&gt;




&lt;h2&gt;
  
  
  Better Planning Starts With Better Visibility
&lt;/h2&gt;

&lt;p&gt;This idea isn't about replacing Agile.&lt;/p&gt;

&lt;p&gt;Agile helps teams organize work.&lt;/p&gt;

&lt;p&gt;Issue trackers help teams execute work.&lt;/p&gt;

&lt;p&gt;But neither gives us a complete picture of how the work connects.&lt;/p&gt;

&lt;p&gt;When developers understand the full network of dependencies, something interesting happens.&lt;/p&gt;

&lt;p&gt;Missing work is discovered earlier.&lt;/p&gt;

&lt;p&gt;Blocked tasks become obvious.&lt;/p&gt;

&lt;p&gt;Communication becomes easier.&lt;/p&gt;

&lt;p&gt;Estimates naturally improve—not because people became better at guessing, but because the team has a better understanding of the problem they're solving.&lt;/p&gt;




&lt;h2&gt;
  
  
  Looking Forward
&lt;/h2&gt;

&lt;p&gt;As software systems become larger, our planning tools haven't evolved much.&lt;/p&gt;

&lt;p&gt;We still represent complex systems as flat lists of tickets.&lt;/p&gt;

&lt;p&gt;But software isn't a list.&lt;/p&gt;

&lt;p&gt;It's a living network of services, people, teams, and dependencies.&lt;/p&gt;

&lt;p&gt;Maybe the next evolution of project management isn't another estimation technique.&lt;/p&gt;

&lt;p&gt;Maybe it's changing how we visualize work.&lt;/p&gt;

&lt;p&gt;Maybe before asking &lt;strong&gt;"How long will this take?"&lt;/strong&gt;, we should first ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Do we actually understand everything this feature depends on?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts.&lt;/p&gt;

&lt;p&gt;Do you think today's tools give enough visibility into dependencies, or is there room for a different way of planning software?&lt;/p&gt;

&lt;p&gt;example:&lt;/p&gt;

&lt;h2&gt;
  
  
  A Real-World Example
&lt;/h2&gt;

&lt;p&gt;Let's imagine a team is building a new &lt;strong&gt;User Authentication&lt;/strong&gt; feature.&lt;/p&gt;

&lt;p&gt;During sprint planning, the work is broken down into Jira tasks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AUTH-101 - Create Login API          (Bob)
AUTH-102 - Build Login UI            (Carol)
AUTH-103 - Database Migration        (Alice)
AUTH-104 - JWT Authentication        (Bob)
AUTH-105 - QA Testing                (David)
AUTH-106 - Deployment                (Emma)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything looks organized.&lt;/p&gt;

&lt;p&gt;Each task has an owner.&lt;/p&gt;

&lt;p&gt;Each task has an estimate.&lt;/p&gt;

&lt;p&gt;The sprint begins.&lt;/p&gt;

&lt;p&gt;Three days later, reality starts to diverge from the plan.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Carol (Frontend) can't finish because the Login API isn't ready.&lt;/li&gt;
&lt;li&gt;Bob discovers the API requires changes to the database schema.&lt;/li&gt;
&lt;li&gt;Alice realizes the migration is more complex than expected.&lt;/li&gt;
&lt;li&gt;David (QA) is waiting for both the frontend and backend.&lt;/li&gt;
&lt;li&gt;Emma (DevOps) can't deploy until QA is complete.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everyone starts asking questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What's blocking the API?"&lt;/li&gt;
&lt;li&gt;"Can I start my work yet?"&lt;/li&gt;
&lt;li&gt;"Who's waiting on me?"&lt;/li&gt;
&lt;li&gt;"How much of this feature is actually finished?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The answers exist—but they're scattered across Jira comments, Slack messages, stand-up meetings, and people's memory.&lt;/p&gt;

&lt;p&gt;The project isn't missing information.&lt;/p&gt;

&lt;p&gt;It's missing visibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Same Feature as a Feature Map
&lt;/h3&gt;

&lt;p&gt;Now imagine the feature is represented as a living dependency graph instead of a flat list of tickets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Authentication Feature
                       │
        ┌──────────────┬──────────────┐
        │              │              │
 Database         Backend API     Frontend UI
(Alice)             (Bob)          (Carol)
    │                  │              │
 Migration       JWT Authentication   │
        └──────────────┼──────────────┘
                       │
                    QA Testing
                     (David)
                       │
                   Deployment
                     (Emma)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At a glance, everyone understands how the work is connected.&lt;/p&gt;

&lt;p&gt;Carol knows she's waiting for Bob.&lt;/p&gt;

&lt;p&gt;Bob knows he's blocked by Alice.&lt;/p&gt;

&lt;p&gt;David knows QA cannot begin until both frontend and backend are complete.&lt;/p&gt;

&lt;p&gt;Emma immediately sees why deployment hasn't started.&lt;/p&gt;

&lt;p&gt;No searching through dozens of tickets.&lt;/p&gt;

&lt;p&gt;No asking the same questions during every stand-up.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Project Changes...
&lt;/h3&gt;

&lt;p&gt;Now imagine Bob discovers something unexpected.&lt;/p&gt;

&lt;p&gt;The authentication service also requires a &lt;strong&gt;Token Refresh Service&lt;/strong&gt; that wasn't identified during planning.&lt;/p&gt;

&lt;p&gt;Instead of creating another disconnected ticket, Bob adds it directly to the Feature Map.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 Backend API
                      │
              JWT Authentication
                      │
            Token Refresh Service   🆕
                      │
                Session Manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Immediately, the entire team can see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new task has appeared.&lt;/li&gt;
&lt;li&gt;Bob owns it.&lt;/li&gt;
&lt;li&gt;It blocks frontend integration.&lt;/li&gt;
&lt;li&gt;QA will also be delayed.&lt;/li&gt;
&lt;li&gt;The feature isn't as close to completion as everyone thought.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The team's understanding evolves the moment the project evolves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Status Isn't Enough
&lt;/h3&gt;

&lt;p&gt;Most project management tools track only one thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Progress&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But "In Progress" doesn't tell the team very much.&lt;/p&gt;

&lt;p&gt;Instead, every node in the Feature Map could expose its &lt;strong&gt;health&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task:
Database Migration

Owner:
Alice

Status:
In Progress

Health:
🟡 At Risk

Reason:
Unexpected schema conflicts with production data.

Blocks:
Backend API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task:
Backend API

Owner:
Bob

Status:
Blocked

Reason:
Waiting for Database Migration.

Blocks:
Frontend UI
QA Testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task:
Frontend UI

Owner:
Carol

Status:
Ready

Health:
🟢 Healthy

Waiting For:
Backend API

Progress:
80%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the conversation during the daily stand-up changes.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm still working on AUTH-102."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The update becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The Backend API is now blocked by a database issue. This affects Frontend, QA, and Deployment. I also discovered a new Token Refresh task that needs to be completed before authentication is finished."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's much more valuable.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Missing Piece Isn't Better Estimation
&lt;/h3&gt;

&lt;p&gt;Software projects don't fail because developers estimate poorly.&lt;/p&gt;

&lt;p&gt;They struggle because our understanding of the project changes every day, while our planning tools remain static.&lt;/p&gt;

&lt;p&gt;A Feature Map becomes a living representation of the project.&lt;/p&gt;

&lt;p&gt;It doesn't just show &lt;strong&gt;what people are working on&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It shows &lt;strong&gt;how everyone's work is connected&lt;/strong&gt;, &lt;strong&gt;what's blocking progress&lt;/strong&gt;, &lt;strong&gt;where new work has appeared&lt;/strong&gt;, and &lt;strong&gt;how changes affect the entire team&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In my opinion, that's the missing layer between planning and implementation.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>agile</category>
      <category>projectmanagement</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
