<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VSM on Andrew Khoury</title><link>https://www.drewkhoury.com/tags/vsm/</link><description>Recent content in VSM on Andrew Khoury</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Copyright © 2021, Andrew Khoury; all rights reserved.</copyright><lastBuildDate>Wed, 24 Nov 2021 19:22:11 +0000</lastBuildDate><atom:link href="https://www.drewkhoury.com/tags/vsm/index.xml" rel="self" type="application/rss+xml"/><item><title>Value Stream Map (VSM) Visualization</title><link>https://www.drewkhoury.com/post/2021-11-24_value-stream-map-visualization/</link><pubDate>Wed, 24 Nov 2021 19:22:11 +0000</pubDate><guid>https://www.drewkhoury.com/post/2021-11-24_value-stream-map-visualization/</guid><description>
&lt;p>This post is based on a repo I created to Visualize VSMs: &lt;a href="https://github.com/drewkhoury/vsm">https://github.com/drewkhoury/vsm&lt;/a>&lt;/p>
&lt;h2 id="how-traditional-value-streams-work">How traditional value streams work&lt;/h2>
&lt;p>&lt;a href="https://en.wikipedia.org/wiki/Value-stream_mapping">Value-stream mapping&lt;/a> on wikipedia.&lt;/p>
&lt;p>&lt;img src="https://www.drewkhoury.com/vsm/ValueStreamMapParts.png" alt="ValueStreamMap Parts">&lt;/p>
&lt;p>Each step is represented in a uniform fashion on the diagram. You can scan the diagram and find out that 6 days is the largest lead time, however this takes more effort to do the more steps we add. There's a high cognitive burden when trying to process numbers and find the largest one.&lt;/p>
&lt;p>This &lt;strong>isn't the only way&lt;/strong> we can represent the data, and our visulizations shouldn't stop here!&lt;/p>
&lt;p>What if we could &lt;strong>more easily&lt;/strong> visulaize the flow of work, and the biggest contraints in the system?&lt;/p>
&lt;h2 id="vsm-visualizer-the-perfect-companion-to-the-vsm">VSM Visualizer (The perfect companion to the VSM)&lt;/h2>
&lt;p>This script creates a &lt;strong>Value Stream Map Visualization&lt;/strong> in Miro, using Google Sheets as in input.&lt;/p>
&lt;p>&lt;img src="https://www.drewkhoury.com/vsm/vsm.gif" alt="vsm">&lt;/p>
&lt;p>It's a slightly different way to view the data that's captured in a VSM workshop that can compliment more traditional daigrams.&lt;/p>
&lt;h2 id="running-the-script">Running the script&lt;/h2>
&lt;p>The script connects to miro and sheets APIs, and expects some env vars and an authentication file &lt;code>credentials.json&lt;/code>.&lt;/p>
&lt;p>Once you have the &lt;a href="#authentication-and-setup">required auth/setup&lt;/a>, run the script with the following commands:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>export MIRO_TOKEN=&amp;#39;XXX&amp;#39;
&lt;span class="ln">2&lt;/span>export MIRO_BOARD=&amp;#39;XXX&amp;#39;
&lt;span class="ln">3&lt;/span>
&lt;span class="ln">4&lt;/span>export SHEET_ID=&amp;#39;XXX&amp;#39; # or skip this to use the example sheet
&lt;span class="ln">5&lt;/span>
&lt;span class="ln">6&lt;/span>python3 ./vsm.py
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;a href="https://docs.google.com/spreadsheets/d/1uazcbZjvfpCHL2ZwPoVc0gWjK7R5pMO9D8cxkKQ40C0/">Example sheet&lt;/a> and miro board:
&lt;img src="https://www.drewkhoury.com/vsm/sheet-and-miro.png" alt="sheet and miro">&lt;/p>
&lt;h3 id="controlling-the-grid-optional-env-vars">Controlling the grid (optional env vars):&lt;/h3>
&lt;p>This part isn't required, but for those wanting more control on how the diagram looks, there are two env vars that you can use.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Env Var&lt;/th>
&lt;th>Default&lt;/th>
&lt;th>Info&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>GRID_X&lt;/code>&lt;/td>
&lt;td>largest value in sheet which is calulated and stored in &lt;code>D2&lt;/code>&lt;/td>
&lt;td>Specifies how large the grid should be along the X axis&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>GRID_Y&lt;/code>&lt;/td>
&lt;td>&lt;code>1&lt;/code>&lt;/td>
&lt;td>Specifies how large the grid should be along the Y axis&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="default-grid-one-row">Default grid (one row)&lt;/h4>
&lt;p>The default values result in a single row for each step, with each neatly fitting below the other and no wrapping or varied spaces between steps.&lt;/p>
&lt;p>It's easy to tell which steps are the longest, though for large numbers you'll have to zoom out to see the whole VSM.&lt;/p>
&lt;p>&lt;img src="https://www.drewkhoury.com/vsm/grid-single.png" alt="grids">&lt;/p>
&lt;h4 id="custom-grids">Custom grids&lt;/h4>
&lt;p>It's possible to specify any grid size (e.g 5x5, 2x12, 100x3), with grids repeating in the X axis as needed. This can be desirable to make use of vertical space when you steps have large numbers.&lt;/p>
&lt;p>Here's the same data, with &lt;code>GRID_X=5&lt;/code>,&lt;code>GRID_Y=5&lt;/code> (creating a 5x5 grid for each step, and for steps with more than 25, multiple grids along the x axis):
&lt;img src="https://www.drewkhoury.com/vsm/grids.png" alt="grids">&lt;/p>
&lt;p>The script ensure uniform spacing between steps based on the largest possible row size, in this case &lt;code>GRID_Y=5&lt;/code>. This means more space between steps that don't have large numbers.&lt;/p>
&lt;h2 id="authentication-and-setup">Authentication and Setup&lt;/h2>
&lt;p>You will need authentication for both miro and google sheets.&lt;/p>
&lt;p>&lt;strong>Miro&lt;/strong>&lt;/p>
&lt;p>Create miro token: &lt;a href="https://developers.miro.com/docs/getting-started">https://developers.miro.com/docs/getting-started&lt;/a>&lt;/p>
&lt;p>Create miro board (or use existing):&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span> curl --request POST \
&lt;span class="ln">2&lt;/span> --url &amp;#39;https://api.miro.com/v1/boards?fields=foo&amp;#39; \
&lt;span class="ln">3&lt;/span> --header &amp;#39;Accept: application/json&amp;#39; \
&lt;span class="ln">4&lt;/span> --header &amp;#39;Authorization: Bearer XXX&amp;#39; \
&lt;span class="ln">5&lt;/span> --header &amp;#39;Content-Type: application/json&amp;#39; \
&lt;span class="ln">6&lt;/span> --data &amp;#39;
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Env vars for the script:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>export MIRO_TOKEN=&amp;#39;Bearer XXX&amp;#39;
&lt;span class="ln">2&lt;/span>export MIRO_BOARD=&amp;#39;XXX&amp;#39;
&lt;span class="ln">3&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Google Sheets&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://console.cloud.google.com/apis/dashboard">https://console.cloud.google.com/apis/dashboard&lt;/a>
enable apis and services &amp;gt; sheets&lt;/p>
&lt;p>&lt;a href="https://console.cloud.google.com/apis/credentials">https://console.cloud.google.com/apis/credentials&lt;/a>
oauth &amp;gt; desktop&lt;/p>
&lt;p>save as &lt;code>credentials.json&lt;/code>&lt;/p>
&lt;p>Env vars for the script:&lt;/p>
&lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>export SHEET_ID=&amp;#39;XXX&amp;#39; # or skip to use the example sheet
&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>