<?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: Tiana</title>
    <description>The latest articles on DEV Community by Tiana (@tiana_dev).</description>
    <link>https://dev.to/tiana_dev</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3874787%2Fe923d91f-943f-4238-b455-67f9f80634cd.jpg</url>
      <title>DEV Community: Tiana</title>
      <link>https://dev.to/tiana_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tiana_dev"/>
    <language>en</language>
    <item>
      <title>Focus Factor fixed my sprint planning. Here is the method and a tool I built for it</title>
      <dc:creator>Tiana</dc:creator>
      <pubDate>Tue, 21 Apr 2026 06:12:00 +0000</pubDate>
      <link>https://dev.to/tiana_dev/focus-factor-fixed-my-sprint-planning-here-is-the-method-and-a-tool-i-built-for-it-45ig</link>
      <guid>https://dev.to/tiana_dev/focus-factor-fixed-my-sprint-planning-here-is-the-method-and-a-tool-i-built-for-it-45ig</guid>
      <description>&lt;h2&gt;
  
  
  The pain
&lt;/h2&gt;

&lt;p&gt;When I was a team lead, sprint planning was my constant pain.&lt;/p&gt;

&lt;p&gt;Every planning meeting was the same. Engineers gave estimates in hours, I stacked the sprint to the top of the team's calendar, everyone said "we can do this", and two weeks later we were past the release date and nobody was surprised.&lt;/p&gt;

&lt;p&gt;The retro would conclude "we need to be more realistic" and we would repeat the exact same pattern next sprint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;My department head showed me Focus Factor. The core idea is embarrassingly simple: &lt;strong&gt;a developer does not write product code for 8 hours a day.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A working day has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DSMs, code review, estimation, demo, retro, planning (the recurring process load)&lt;/li&gt;
&lt;li&gt;Support tickets, bug fixes, monitoring, legacy work&lt;/li&gt;
&lt;li&gt;Meetings outside the recurring process&lt;/li&gt;
&lt;li&gt;Fly-in tasks that land during the sprint&lt;/li&gt;
&lt;li&gt;Shortened days, vacations, other projects, external commitments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you subtract all of that, the real product time per sprint is usually 50-75% of the calendar, not 100%.&lt;/p&gt;

&lt;p&gt;So you plan the sprint &lt;strong&gt;from that real number&lt;/strong&gt;, not from "working days × 8".&lt;/p&gt;

&lt;h2&gt;
  
  
  What the metric actually is
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total Time    = working days × 8
Task Time     = Total - (Processes + Support + Meetings + Fly-in + Wind)
Focus Factor  = Task Time / Total Time × 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Color buckets we used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;0 - 49%&lt;/strong&gt; red - the team is drowning in operational work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;50 - 74%&lt;/strong&gt; yellow - it works but it is unstable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;75%+&lt;/strong&gt; green - strong focus on the product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A realistic ceiling is 70-75%. If you see 90% sustained, your data is lying.&lt;/p&gt;

&lt;p&gt;A couple of related metrics that paid off quickly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stability Factor = 1 - (Fly-in / Total Time)           // &amp;lt; 0.85 means unstable planning
Support Ratio    = Support / Total Time                // &amp;gt; 0.25 means quality problems
Adjusted Focus   = Task Time / (Total Time - Wind)     // fair for partial availability
Team Focus       = Σ Task Time / Σ Total Time          // the one you actually manage by
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key mindset shift: &lt;strong&gt;Focus Factor is not a productivity metric for people. It is an indicator of organizational noise.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If focus drops, the problem is in the system (support load, fly-in discipline, meeting bloat), not in someone's motivation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyemz1nxxlcx07dr9db5s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyemz1nxxlcx07dr9db5s.png" alt="Closed sprint report: KPIs (Focus, Adjusted, Stability, Support), per-member hour breakdown, stacked bar chart per member"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Excel to a tool
&lt;/h2&gt;

&lt;p&gt;We ran this in Excel for months. Formulas, colored cells, weekly updates, per-team tab. It worked, but it was painful to compare sprints, keep the roster in sync, and share a clean view with stakeholders.&lt;/p&gt;

&lt;p&gt;So I wrote a small open-source tool to stop living in spreadsheets.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/tiana-code/sprint-pulse" rel="noopener noreferrer"&gt;https://github.com/tiana-code/sprint-pulse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stack: Kotlin + Spring Boot 3, JPA, Liquibase, H2 or Postgres, React + TypeScript + Vite + Tailwind + Recharts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Planning from Focus Factor
&lt;/h3&gt;

&lt;p&gt;A sprint in &lt;strong&gt;Planning&lt;/strong&gt; status has an editable hour matrix per member. Focus Factor, Adjusted Focus, Stability and Support Ratio recalculate live. When the sprint starts or closes, the table becomes read-only - this matters, because editing history after the fact destroys trend data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hkj12lpe26xsrdknonj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2hkj12lpe26xsrdknonj.png" alt="Planning page with editable hour matrix per member and live Focus Factor  recalculation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sprint report
&lt;/h3&gt;

&lt;p&gt;Every sprint gets a full report: per-member hours, team totals, KPIs, a time-breakdown chart per member, and an auto-generated recommendation (focus critical, support high, stability low, healthy).&lt;/p&gt;

&lt;h3&gt;
  
  
  Compare sprints over time
&lt;/h3&gt;

&lt;p&gt;Pick any two or more sprints, get a delta column and a side-by-side chart. This is where you catch "our focus dropped from 73% to 45% and support load doubled - something broke in the last release cycle".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbtiqfnexhyodrs1amx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbtiqfnexhyodrs1amx7.png" alt="Sprint-vs-sprint compare view with delta column and side-by-side KPIs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Team-level view
&lt;/h3&gt;

&lt;p&gt;Two screens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Teams comparison&lt;/strong&gt; - one row per team with average and latest Focus Factor, capacity, stability, support share&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trends&lt;/strong&gt; - Focus Factor, time breakdown and stability-support lines over sprints for a single team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6hexbgd55u6r83xng0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6hexbgd55u6r83xng0b.png" alt="Teams comparison table with per-team average focus, capacity and support share"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7sz73w9y566vf6k2caz0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7sz73w9y566vf6k2caz0.png" alt="Trends chart: Focus Factor and time breakdown across consecutive sprints for one team"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Shareable report link
&lt;/h3&gt;

&lt;p&gt;Every sprint has a public read-only link you can drop into a work chat for sprint review. No auth. Good for a quick "here is what we delivered, here is what the numbers say" without screenshots.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is next
&lt;/h3&gt;

&lt;p&gt;Jira integration. The plan is to pull sprint scope, members, working days and support hours from Jira / Tempo and stop retyping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it locally
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/tiana-code/sprint-pulse
&lt;span class="nb"&gt;cd &lt;/span&gt;sprint-pulse

&lt;span class="c"&gt;# backend&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./gradlew bootRun
&lt;span class="c"&gt;# http://localhost:8081, login admin / admin&lt;/span&gt;

&lt;span class="c"&gt;# frontend&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../frontend &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev
&lt;span class="c"&gt;# http://localhost:5173&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two demo teams with four to seven sprints are seeded at startup so you can click around without typing anything. &lt;code&gt;SEED_ENABLED=false&lt;/code&gt; disables it for prod.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What metrics and tools actually fixed sprint planning for you? Not what a book recommended - what you were still using after six months. Drop them in the comments.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>scrum</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
