<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Jonathan's Blog]]></title><description><![CDATA[Mindful Leadership and Technology]]></description><link>https://jonathanfries.net/</link><image><url>http://jonathanfries.net/favicon.png</url><title>Jonathan&apos;s Blog</title><link>https://jonathanfries.net/</link></image><generator>Ghost 2.25</generator><lastBuildDate>Tue, 31 Mar 2026 18:24:01 GMT</lastBuildDate><atom:link href="https://jonathanfries.net/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[The Great Resignation: A Few More Thoughts]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>As I was writing the post on <a href="https://jonathanfries.net/celebrate-every-departure/">Celebrating Every Departure</a>  It got me thinking about The Great Resignation and my previous thoughts on the impact of changes (organizational, family, personal, societal) on an employee.  To sum it up: with every change comes an emotional journey that looks like this (up</p>]]></description><link>https://jonathanfries.net/the-great-resignation-a-few-more-thoughts/</link><guid isPermaLink="false">6171779e0ab42d05cd3d079d</guid><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Wed, 10 Nov 2021 16:34:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>As I was writing the post on <a href="https://jonathanfries.net/celebrate-every-departure/">Celebrating Every Departure</a>  It got me thinking about The Great Resignation and my previous thoughts on the impact of changes (organizational, family, personal, societal) on an employee.  To sum it up: with every change comes an emotional journey that looks like this (up on this scale is positive, energizing emotions and down is disturbing, energy-draining emotions):</p>
<!--kg-card-end: markdown--><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jonathanfries.net/content/images/2021/10/Abstract-Coaster.png" class="kg-image"><figcaption>Emotional journey that comes with change.</figcaption></figure><!--kg-card-end: image--><!--kg-card-begin: markdown--><p>I borrowed this from <a href="https://complete-coherence.com/team/dr-alan-watkins/">Dr. Alan Watkins</a>,  especially his book, <a href="https://www.amazon.com/gp/product/1398601187/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1398601187&amp;linkCode=as2&amp;tag=jonathanfri09-20&amp;linkId=edf0b1aaa24d9e1878f4827436f5c898">Coherence</a></p>
<p>The emotions, as one steps through this process look like this:</p>
<ol>
<li>Denial</li>
<li>Resistance</li>
<li>Anxiety</li>
<li>Frustration</li>
<li>Despair (bottom of the curve)</li>
<li>Exploration (starting go up)</li>
<li>Discovery</li>
<li>Adjustment</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p><strong>Section 1 - The Current Situation</strong></p>
<p>When you add up everything that is going on in the life of most humans (aka employees), it is a lot.  COVID, worldwide economic challenges, political drama, and family add up to a lot of stress that is unavoidable.  And I did not yet mention work.</p>
<p>Depending on where you work, where you are in your career, what you do - there is a lot happening as well.  What you end up with is a lot of overlapping curves that look like what I've shown above, but all happening at once and all happening with different amplitudes and wavelengths. The experience of change and its emotional aftermath looks like this for many humans today:</p>
<p><img src="https://jonathanfries.net/content/images/2021/10/Mutlichange.png" alt="Mutlichange"></p>
<p>As leaders, we can either recognize this and do what we can to help our employees manage the changes and stress level that come along with this, or we can prepare for them to look elsewhere for those who will.</p>
<p>Managing this does not mean that we can help them with everything in their personal life or if they choose to over identify with external forces.  We can't.  We can help them isolate what is work related and what isn't and seek to understand where they are on those slopes, and see if we can help them.</p>
<p>For direct reports in many situations, it is also appropriate and helpful to know what is going on in their life and have a sense of what other events may be impacting them.  This is probably obvious, but that does not mean that you can effectively help them with how they are managing the change.  A helpful way to think of this is to look at the work related items and be willing to dig in on those (and to acknowledge there is often more than one).  Perhaps something like this:</p>
<p><img src="https://jonathanfries.net/content/images/2021/10/WorkNotWork.png" alt="WorkNotWork"></p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p><strong>Section 2 - Responsibility</strong></p>
<p>All of this can be very trying, for everyone.  There's a lot going on in the world and to have it show up on top of work challenges is difficult. There's a temptation I feel at times to revert back to my earlier approaches.  This largely consisted of  ignoring people's personal problems and emotions.  In my head, this sounded like this, &quot;Focus on the work while you're at work and worry about your home life when you're at home.&quot;</p>
<p>This works for some people, but for a lot of others it doesn't.  Some people are good at compartmentalizing, and some people are good for a while until they aren't.  But even for them it doesn't mean that they aren't experiencing these things.  The curves in green are still there and they are still the concern of leadership, if you want top performers and if you want your projects to go well.</p>
<p>So, I'll say this:  none of this is your responsibility.  Managing emotions is the responsibility of every individual.</p>
<p>But knowing and caring and guiding are things that you can do and that you may want to do, and they can be done in the name of performance and outcomes.</p>
<p>Regardless of the kind of leader you want to be, you employ humans (most of you) and that means that they experience this.  You aren't responsible, but guiding people and offering help can lead to higher performance and better outcomes.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p><strong>Section 3 - What You Can Do</strong></p>
<p>Here is a list of things (some that I've been a part of implementing, and some that sound like good ideas) to deal with the large rate of change inside and outside the workplace:</p>
<ol>
<li>Multi-level Check-ins - having additional check-ins with individuals outside of the normal supervisor check-ins.  This is informal, but I do try to meet with a wide swath of employees, regardless of level. I have heard of companies implementing official programs to encourage directors/VPs/C-Level folks to meet with people below their normal direct reports.  This gives you a gauge on what is happening and a chance to let people talk outside of normal meeting conventions, relationships, etc.</li>
<li>Starting Something New - a good remedy for all this change is more change.  I've found that starting new programs, get-togethers, professional development opportunities, happy hours, volunteer opportunities, etc. can be good for people to have something to look forward to.  This does not directly address the challenge itself, but it helps to balance the scales and see companies listening and operating in a positive way.</li>
<li>Willingness to Listen  - a bit of a cliché, but true none-the-less.  Be willing to listen (for real and in an active way) and search for places to use insights you gather.</li>
<li>Train Others to Listen, Especially New Managers - Often when people are transitioning into management they want to see things happen a certain way, or they believe that leading has to look a certain way.  This type of certainty usually leads to not listening well to others.  Listening and ideas can be seen as challenging to this orthodoxy or that orthodoxy because people don't agree or simply don't understand.  Listening can help with that.</li>
<li>Be willing to circle back around to challenging topics without waiting for others to bring them up.</li>
<li>Follow Up - do the stuff that you say you are going to do.</li>
<li>Discerning Transparency - Where it doesn't damage the business, share what is going on.</li>
<li>Positive Reinforcement - Balance the noise and challenging emotions with your own voice - let people know how they are doing, and reinforce the things that are going well.  Always link your positive reinforcement to specific, concrete things.  Saying &quot;Julio is great.&quot; or &quot;Regina did an awesome job.&quot; is almost like saying nothing at all. Better to say, &quot;Julio really killed it in the client presentation yesterday, he was totally prepared and was able to respond to the client's questions in real time.&quot;  This is real, positive reinforcement that focuses on what you want to recognize.</li>
<li>Compassion - Have compassion for those around you.  It is easy to look at things through the lens of numbers or through the lens of your problems and why certain things are hard for you.  Try to look at it through other people's eyes and understand where they are coming from.</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>Change is hard.  The big the change the greater the impact on an organization and it's people.  A great leader understands this and constructs an organization to help people gather their own strength and bring their best to a business.</p>
<p>We can't protect people from change, but we can give them support to bolster their own resilience and a place where they know they will be listened to.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[IPv4 Address Price - Single Static IP - October 12, 2021]]></title><description><![CDATA[<p>Here are the spot prices today for single static IP addresses (based on a 30 day month):</p><p>October 12, 2021</p><p>Azure: <a href="https://azure.microsoft.com/en-us/pricing/calculator/">https://azure.microsoft.com/en-us/pricing/calculator/#</a><br>Google: <a href="https://cloud.google.com/compute/pricing#ipaddress">https://cloud.google.com/compute/pricing#ipaddress</a><br>Amazon: <a href="https://aws.amazon.com/ec2/pricing/on-demand/">https://aws.amazon.com/ec2/pricing/on-demand/</a></p><!--kg-card-begin: markdown--><h3 id="azureeastusbr">Azure - East US<br></h3>
<table width="100%">
    <tr><td width="30%">Basic:</td><td> $2.</td></tr></table>]]></description><link>https://jonathanfries.net/ipv4-address-price-single-static-ip-october-12-2021/</link><guid isPermaLink="false">61659d090ab42d05cd3d070e</guid><category><![CDATA[IPv4 Address Price]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Tue, 12 Oct 2021 14:57:04 GMT</pubDate><content:encoded><![CDATA[<p>Here are the spot prices today for single static IP addresses (based on a 30 day month):</p><p>October 12, 2021</p><p>Azure: <a href="https://azure.microsoft.com/en-us/pricing/calculator/">https://azure.microsoft.com/en-us/pricing/calculator/#</a><br>Google: <a href="https://cloud.google.com/compute/pricing#ipaddress">https://cloud.google.com/compute/pricing#ipaddress</a><br>Amazon: <a href="https://aws.amazon.com/ec2/pricing/on-demand/">https://aws.amazon.com/ec2/pricing/on-demand/</a></p><!--kg-card-begin: markdown--><h3 id="azureeastusbr">Azure - East US<br></h3>
<table width="100%">
    <tr><td width="30%">Basic:</td><td> $2.59/month</td></tr>
    <tr><td width="30%">Basic ARM:</td><td> $2.59/month</td></tr>
    <tr><td width="30%">Standard ARM:</td><td> $3.60/month</td></tr>
</table><!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="googleiowabr">Google - Iowa <br></h3>
<table width="100%">
    <tr><td width="30%">In Use (Standard VM):</td><td>$2.88/month</td></tr>
    <tr><td width="30%">In Use (Preemptible VM):</td><td>$1.44/month</td></tr>
    <td>Not in Use:</td><td>$7.20/month</td>
</table><!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="amazonuseastnvirginiabr">Amazon - US East N. Virginia<br></h3>
<table width="100%"><tr><td width="30%">First IP while In Use:</td><td> $0/month</td></tr>
<tr><td>First Not Running or Additional:</td><td> $3.60/month</td></tr></table>
<br><!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>Price remains pretty constant so there does not seem to be any demand issues influencing the price of IP addresses.  In fact, Azure price seems to have moved down slightly, over and above my mistake in using Azure's default 730 hour month calculation last time (there are no months with 730 hours in them, that I know of).</p>
<p>Perhaps this is the new, metric February we've been hearing so much about.  :)</p>
<p>I think it is time to seriously look at the issues with security and factor that into the equation.  Will be creating a blog post on this topic in the coming weeks.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[As a Leader, Celebrate Every Departure]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Once someone has made up their mind to leave for a new job - once it's final and there is no convincing them otherwise - it is time to celebrate.</p>
<p>Yes, every time.</p>
<p>People leave jobs all the time.  It is one of the great things about the USA: our</p>]]></description><link>https://jonathanfries.net/celebrate-every-departure/</link><guid isPermaLink="false">615f2c140ab42d05cd3d0658</guid><category><![CDATA[Leadership]]></category><category><![CDATA[Mindfulness]]></category><category><![CDATA[Great Resignation]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Fri, 08 Oct 2021 23:32:00 GMT</pubDate><media:content url="https://jonathanfries.net/content/images/2021/10/departure.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jonathanfries.net/content/images/2021/10/departure.jpg" alt="As a Leader, Celebrate Every Departure"><p>Once someone has made up their mind to leave for a new job - once it's final and there is no convincing them otherwise - it is time to celebrate.</p>
<p>Yes, every time.</p>
<p>People leave jobs all the time.  It is one of the great things about the USA: our freedom to take our talents where we like for the best or most benefit.  And that system works best when people feel confident and mobile in their careers.</p>
<p>This doesn't make it any less painful for the company that loses an employee.  Often, this is very inconvenient and can feel scary.</p>
<p>Of course, if you are working hard to build trust you will get the opportunity with some people to intervene early, but even then, things are going to happen, people will be headhunted, and you will have instances of the grass looking greener.  People will leave.</p>
<p>When they do it is time to celebrate their accomplishments, both individual and team based, and to wish them well.  Not just on the surface, not just as lip service, but also honestly and with the joy of seeing people succeed and move on.</p>
<p>My path to this realization has been long.  It isn't that I wished people ill or got angry.  I always tried to be supportive, but inside I was often full of fear - this person was key to an account or integral to a project, how will we succeed without them.</p>
<p>But really, what else can be done?  Holding on to resentment isn't helpful.  They're going to leave anyway. This is a thing to celebrate and I believe that regardless of the circumstances celebrating is appropriate.</p>
<p>It was a sales manager that I worked with that really made me see this.  He finally had to say to me, &quot;You're hanging on every person who leaves with a lot of stress.  What if you celebrated all of them instead?  We should be happy that they have grown and can be successful.  We need to let them go.&quot;</p>
<p>It went against a lot of years of fighting to keep everyone all the time, but I came around.  Here are my reasons why:</p>
<ol>
<li>Show your employees that you care about their long term success.  By celebrating each person who leaves you show them, publicly, that you don't harbor any hard feelings toward someone.</li>
<li>Make it easy for people to come back - when someone goes and you celebrate you build up good feelings that make them think of you when they are looking again (it may be sooner than they think).</li>
<li>Build team resilience - if the team sees that you are celebrating the departure because it is a natural part of life, they will move more easily through the change making them and the company more resilient.  Being in resistance to the change will not make it easier and it won't stop it from happening.</li>
<li>Move more freely to the solution - once you stop resisting that it is happening you can think about what to do in the short term and long term.</li>
</ol>
<p>This is challenging.  As I've written in the <a href="https://jonathanfries.net/emotional-rollercoaster-vs/">past</a>, you can't expect everyone to move as quickly in their response to change as you can. As a leader you're likely more adaptable and more experienced with change.</p>
<p>This is especially true when people are leaving.  Be sure to include time in your celebration for the sadness people feel - let the celebration be part of the process of moving on.  But don't let the sadness overwhelm or define the event.</p>
<p>In this case, you may need to push yourself as a leader and a manager - maybe you need to move through the curve even a little faster than you're comfortable with.  Use it as an opportunity to grow.  Say goodbye and stay in touch with people, they may have opportunities for you in the future.</p>
<p>Build the best work place you can, build culture, work to retain people, work extra hard for the superstars.  Do all that.  But eventually some will go.  Take a deep breath, you did everything you could, time to celebrate as they move on to the next adventure.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Infrastructure that can Never be Down - The Password Manager]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Our password manager (a well-known SaaS product) is down this morning.  This is a problem.</p>
<!--kg-card-end: markdown-->]]></description><link>https://jonathanfries.net/infrastructure-that-can-never-be-down-password-manager/</link><guid isPermaLink="false">611535400ab42d05cd3d063f</guid><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Thu, 12 Aug 2021 14:52:05 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Our password manager (a well-known SaaS product) is down this morning.  This is a problem.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Assuming Positive Intent]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I've written a decent amount over time about assuming positive intent.  Whether it is employee recognition or finding ways to include gratitude - I think that this these types of tools are very important to battle our <a href="https://jonathanfries.net/negativity-bias/">inherent bias toward negativity</a>.</p>
<p>I recently received <a href="https://blog.trello.com/trello-hanlons-razor">this</a> article in an email from</p>]]></description><link>https://jonathanfries.net/assuming-positive-intent/</link><guid isPermaLink="false">61040bc50ab42d05cd3d05e7</guid><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Fri, 30 Jul 2021 14:40:58 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I've written a decent amount over time about assuming positive intent.  Whether it is employee recognition or finding ways to include gratitude - I think that this these types of tools are very important to battle our <a href="https://jonathanfries.net/negativity-bias/">inherent bias toward negativity</a>.</p>
<p>I recently received <a href="https://blog.trello.com/trello-hanlons-razor">this</a> article in an email from <a href="https://trello.com/">Trello</a>.  It is a good read, and I recommend it.  They use a modified form of Hanlon's razor to seek out a more nuanced vision for why people do things.  To quote them:</p>
<blockquote>
<p>Never attribute to malice or stupidity that which can be explained by moderately rational individuals following incentives in a complex system of interactions.</p>
</blockquote>
<p>This really works for me, though I prefer the much simpler maxim from an old boss of mine:</p>
<blockquote>
<p>Assume positive intent</p>
</blockquote>
<p>I think that it can be very hard to assume positive intent.  It may be easier (in fact it may only be possible) to use the version that they came up with.  I don't have to extend myself (though I do have to do work) to think about <em>moderately rational individuals following incentives</em>.</p>
<p>I believe you do have to extend yourself a little bit to assume positive intent.  By which I mean, I have a desire to see my own motives in a positive light and I have to extend this to others and see me in them (and them in me) in order to assume positive intent.</p>
<p>Let's be straight though, it's hard sometimes.  So I appreciate having a fallback position.  When I can't see positive intent, I can look for moderately rational individual following incentives.  And this much better than some of the alternatives that we sometimes come up with.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[IPv4 Address Price - Single Static IP - April. 20, 2021]]></title><description><![CDATA[<p>Just because I still think about it sometimes, here are the spot prices today for single static IP addresses (based on a 30 day month):</p><p>April 22, 2021</p><p>Azure: <a href="https://azure.microsoft.com/en-us/pricing/calculator/">https://azure.microsoft.com/en-us/pricing/calculator/#</a><br>Google: <a href="https://cloud.google.com/compute/pricing#ipaddress">https://cloud.google.com/compute/pricing#ipaddress</a><br>Amazon: <a href="https://aws.amazon.com/ec2/pricing/on-demand/">https://aws.amazon.com/ec2/</a></p>]]></description><link>https://jonathanfries.net/ipv4-address-price-single-static-ip-april-22-2021/</link><guid isPermaLink="false">6081f8d00ab42d05cd3d057e</guid><category><![CDATA[IPv4 Address Price]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Thu, 22 Apr 2021 22:55:40 GMT</pubDate><content:encoded><![CDATA[<p>Just because I still think about it sometimes, here are the spot prices today for single static IP addresses (based on a 30 day month):</p><p>April 22, 2021</p><p>Azure: <a href="https://azure.microsoft.com/en-us/pricing/calculator/">https://azure.microsoft.com/en-us/pricing/calculator/#</a><br>Google: <a href="https://cloud.google.com/compute/pricing#ipaddress">https://cloud.google.com/compute/pricing#ipaddress</a><br>Amazon: <a href="https://aws.amazon.com/ec2/pricing/on-demand/">https://aws.amazon.com/ec2/pricing/on-demand/</a></p><!--kg-card-begin: markdown--><h3 id="azureeastusbr">Azure - East US<br></h3>
<table width="100%">
    <tr><td width="30%">Basic:</td><td> $2.59/month</td></tr>
    <tr><td width="30%">Basic ARM:</td><td> $2.59/month</td></tr>
    <tr><td width="30%">Standard ARM:</td><td> $4.38/month</td></tr>
</table><!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="googleiowabr">Google - Iowa <br></h3>
<table width="100%">
    <tr><td width="30%">In Use (Standard VM):</td><td>$2.88/month</td></tr>
    <tr><td width="30%">In Use (Preemptible VM):</td><td>$1.44/month</td></tr>
    <td>Not in Use:</td><td>$7.20/month</td>
</table>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="amazonuswestncaliforniabr">Amazon - US West N. California<br></h3>
<table width="100%"><tr><td width="30%">First, In Use:</td><td> $0/month</td></tr>
<tr><td>Not Running/Additional:</td><td> $3.60/month</td></tr></table>
<br><!--kg-card-end: markdown--><!--kg-card-begin: markdown--><p>That's it.  Not a lot of price movement in the last 18 months.  Azure has tweaked their Standard ARM up a little, but has removed it's penalties for additional IP addresses above 5 in other categories.</p>
<p>Google now allows you to select by region, but the region prices are the same.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Firebase Errors for Humans - aka Best Error Ever]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I'm working on a system for positive behavioral recognition and metrics using Firebase and React. This is a hobby/side project that I work on usually on nights and weekends.</p>
<p>This weekend I had an issue with Firestore (the newer of the two data solutions inside the Firebase product).  I</p>]]></description><link>https://jonathanfries.net/best-error-ever/</link><guid isPermaLink="false">5eb966bd0ee59966f463b6a1</guid><category><![CDATA[Firebase]]></category><category><![CDATA[Software Development]]></category><category><![CDATA[Positive Behavioral Metrics]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Tue, 12 May 2020 04:14:00 GMT</pubDate><media:content url="https://jonathanfries.net/content/images/2020/05/GlitchPic.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jonathanfries.net/content/images/2020/05/GlitchPic.png" alt="Firebase Errors for Humans - aka Best Error Ever"><p>I'm working on a system for positive behavioral recognition and metrics using Firebase and React. This is a hobby/side project that I work on usually on nights and weekends.</p>
<p>This weekend I had an issue with Firestore (the newer of the two data solutions inside the Firebase product).  I was querying on multiple data attributes in a collection. This is not allowed in Firestore, unless you have created an index that includes those two attributes.</p>
<p>I had no such index, so I got this error:</p>
<!--kg-card-end: markdown--><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jonathanfries.net/content/images/2020/05/Firestore_Error_1.png" class="kg-image" alt="Firebase Errors for Humans - aka Best Error Ever"><figcaption>Does that say, "You can create it here:" ?</figcaption></figure><!--kg-card-end: image--><!--kg-card-begin: markdown--><p>Yes, the short answer is that that link says, &quot;You can create it here.&quot;  And you can click on it and it takes you to the page where you can build the index.</p>
<p>AND...</p>
<p>And it has pre-populated the index for you with the two fields that you need so that you can click, &quot;OK&quot;.  And the index builds, just like you need it:</p>
<!--kg-card-end: markdown--><!--kg-card-begin: image--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://jonathanfries.net/content/images/2020/05/Firestore_Index_1.png" class="kg-image" alt="Firebase Errors for Humans - aka Best Error Ever"><figcaption>OK, thanks, that was easy.</figcaption></figure><!--kg-card-end: image--><!--kg-card-begin: markdown--><p>This is really pretty amazing and I have never seen an error like this.</p>
<p>Often, errors are very generic and it takes time to search through forums trying to find someone with the same error who is actually having the same problem as you.</p>
<p>I have seen a number of errors in React that offer suggestions as to where your bug is and they are often correct.  This is very helpful and a huge improvement.</p>
<p>The Firestore error takes that level of customer service to a new level: here's your problem, here's how to fix it, and here's a link that will basically fix it for you.</p>
<p>I would very much like to see more of this.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>What has happened here is that someone at Google (Firebase is a Google product) has applied the ideas of user experience to the error handling in their product.  Developers are the users of the error system, so thank you for that!</p>
<p>Firebase is a web-based product, so there is no reason why it can't know enough to point you in the right direction.</p>
<p>If you are in software development, though, you can appreciate that this is a high bar to jump over:</p>
<ol>
<li>Someone had to think of this early on, so that it could be woven into the product.</li>
<li>Leadership had to include time and budget to implement it.</li>
<li>Their UX had to be consistent enough to allow it.</li>
<li>The error system handling system had to be built smart enough to make it all work.</li>
</ol>
<p>All of this to say - a lot had to happen technically, organizationally, and culturally to make this happen.</p>
<p>When you think about the amount of time that often goes into error handling and management, it makes this all the more amazing.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>Developers ARE the users of your error system, your API, your toolkits, and your documentation. Doing things like this makes your tool attractive to developers, managers, and business decision makers.</p>
<p>Why managers and business decision makers?  Because it makes good developers better and faster, and it makes new developers far more productive than they would be if you didn't have it.</p>
<p>New developers spend a lot of time searching for answers online and asking more senior team members for help.  Imagine a world where the platform itself can answer your questions and guide you through solving the problem.</p>
<p>Kudos to Firebase/Google on an amazing innovation.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[How are you doing?]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I am repurposing my answer.</p>
<p>It's always been a little strange to use this question in a business context.  It is a polite greeting, a way of saying 'hi', but really 'hi and a little more'.</p>
<p>It isn't a brutally honest solicitation of a persons true feelings - most of</p>]]></description><link>https://jonathanfries.net/how-are-you-doing/</link><guid isPermaLink="false">5e88f8980ee59966f463b50c</guid><category><![CDATA[Mindfulness]]></category><category><![CDATA[Gratitude]]></category><category><![CDATA[Leadership]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Tue, 07 Apr 2020 02:11:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1551044962-a8a5d9914c6e?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1551044962-a8a5d9914c6e?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="How are you doing?"><p>I am repurposing my answer.</p>
<p>It's always been a little strange to use this question in a business context.  It is a polite greeting, a way of saying 'hi', but really 'hi and a little more'.</p>
<p>It isn't a brutally honest solicitation of a persons true feelings - most of the time.</p>
<p>Today, you could answer, &quot;I'm feeling anxious.&quot; or &quot;I'm nervous about the economy.&quot; and those would be honest answers.  But they may not be what you want to project in that meeting.</p>
<p>And, it is now difficult to use 'fine' or 'good' the way we all used to, because you risk sounding dishonest or callous.</p>
<p>&quot;What?  You're fine?  How can you be fine?&quot;</p>
<p>Last week I decided that the best way to answer this question was to choose to answer positively, with a focus on gratitude.</p>
<p>So, when I attend a business meeting or sales call and someone says &quot;How are you?&quot; or &quot;How are you doing?&quot;  my answer is that I'm grateful for something.</p>
<p>Grateful for my health.<br>
Grateful my kids are learning at home.<br>
Grateful that I have a job.<br>
Grateful to be alive.<br>
Grateful that it is spring out and the sun is shining.</p>
<p>All of these are true and are much more meaningful and uplifting to me than 'fine' anyway.</p>
<p>I may just keep doing it when Covid is less present in our lives.</p>
<p>Hopefully a lot less present and that will be one more thing to be grateful for.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Art and the VUCA World]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>For those unfamiliar with the acronym, VUCA stands for Volatility, Uncertainty, Complexity, and Ambiguity.</p>
<p>It is a relatively trendy way to describe our modern world.  It is a VUCA place.</p>
<p>Of course, the world has always been three of those things - volatile, uncertain, and ambiguous, and maybe all four</p>]]></description><link>https://jonathanfries.net/art-and-vuca/</link><guid isPermaLink="false">5e31ca76aff34f1d3dee3afb</guid><category><![CDATA[VUCA]]></category><category><![CDATA[Art]]></category><category><![CDATA[Leadership]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Fri, 13 Mar 2020 01:41:00 GMT</pubDate><media:content url="https://jonathanfries.net/content/images/2020/02/Vuca2.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jonathanfries.net/content/images/2020/02/Vuca2.png" alt="Art and the VUCA World"><p>For those unfamiliar with the acronym, VUCA stands for Volatility, Uncertainty, Complexity, and Ambiguity.</p>
<p>It is a relatively trendy way to describe our modern world.  It is a VUCA place.</p>
<p>Of course, the world has always been three of those things - volatile, uncertain, and ambiguous, and maybe all four depending on who you ask.  If you asked a farmer at any time over recorded history he could tell you that his fortunes and those of his family were impacted by things out of his control.  The world of most people has always been, at least, V, U, and A.</p>
<p>It is only recently, where we came to think of the world as NOT those three things.  i.e. We could expect a certain amount of regularity, certainty, and definitiveness.  But alas (or maybe not), no more.</p>
<p>As the pace of knowledge creation, globalization, and business speeds up we are more exposed to VUCA and we must develop ways to prepare for and manage the world.</p>
<p>It helps if we realize that this is a state of affairs that we evolved to deal with - the acronym may be new, but the conditions really aren't.  We humans evolved to meet these types of challenges, are brains are big and we can handle the related stress, assuming we put some time and energy into it.</p>
<p>As for complexity, I think humans have introduced a lot more of that recently, but I also believe we have the tools to manage that.</p>
<p>If you're looking for somewhere to start - use the <em>7 Habits of Highly Effective People</em> you can cut down by a lot of VUCA simply by focusing on what is in your power to control.  Eventually you will get more power, simply by not trying to change that which you can't.  Steven Covey covers that much better than I can.  If you haven't read it, read it.  If you read it and forgot, read it again.</p>
<p>There are other books that deal with this subject head on, such as Dr. Alan Watkins' <a href="https://www.amazon.com/4D-Leadership-Competitive-Advantage-Development/dp/0749474645/">4D Leadership</a>.  In that book Dr. Watkins outlines paths to personal development that make us more resilient and more capable to deal with all the V, U, C, and A that we run into.</p>
<p>Beyond that though, what other tools are available to help us cope with the VUCA-ness of our present world?</p>
<p>I'm a firm believer that art - engaging with it, thinking about it, looking at it, trying to understand it - makes us more tolerant of the VUCA world.</p>
<p>Here is how art helps with each of the 4 areas:</p>
<ol>
<li><strong>Volatility</strong> - Engaging with art a little bit every day can take you out of your comfort zone on multiple fronts and help to prepare you mentally for all those volatile challenges that you are going to face.  Art itself can be volatile - as it relates to traditions or other art.  And it can show us ways of grappling with volatility, such as French painters in the 19th century beginning to look at the urban landscape and explore outside the 'approved' arenas for artwork.  Much of modern art is challenging and a great many people simply ignore or disregard it because it may be non-representational. Do they take the time to think about it?  Do they consider why the artist wanted to challenge us as viewers?</li>
<li><strong>Uncertainty</strong> - art is a means of digesting and facing the challenges of the world and allowing you to see how others wrestle with things.  Don't want to think about war or crime or poverty or disease?  Here it comes anyway. art exposes you quite directly to another mind.  That mind may be wrestling with or interested in the same things as you, but doing so in very different ways.  Reading a poem written by another person or looking at a painting can help to expose you to different angles and you will not always know what is coming.  Also, because the artist is not providing you with a written set of instructions, you walk into every artistic experience with a certain degree of uncertainty that is instructive if you are willing to open up to it.</li>
<li><strong>Complex</strong> - Art can deal with complex topics and it can be, in and of itself, quite complex.  Re-reading or extended observation is often key.  To really appreciate, sometimes, frankly, to understand, you need to spend some time to appreciate the art, maybe do some additional research on the subject matter.  This is helpful to get us ready to ask questions and understand the complex systems and situations we confront.  Move beyond your first impressions, move beyond your initial read.  Re-evaluate, think, engage.</li>
<li><strong>Ambiguous</strong> - Some art may attempt to get a hold of a subject and tie it down for explanation, but most art rarely does this.  We are given the artist's point of view, but that point of view can be ambiguous.  Even when it isn't ambiguous, our own reaction may be.  Self-reflection and self-evaluation help us to grapple with such ambiguity.  Do I agree with this?  Would I have written it this way?  Does this help?</li>
</ol>
<p>This is not how art or art appreciation is taught, but it is how I have used it and I have found it useful.</p>
<p>At times, with the best work that you encounter, you can find an antidote to all this VUCA-ness.  A well written book or poem that speaks to you deeply can make the world seem suddenly clear and not ambigous at all.  Great art can lift you up and offer you new ways of seeing things.  You won't find this all the time or in every interaction, but when you do it is a powerful and uplifting.</p>
<p>Even when you don't encounter this feeling, you can still improve your faculties and increase your mental resilience by engaging with and thinking about a difficult topic.</p>
<p>A few resources worth considering:</p>
<ol>
<li>Look around - nearly everywhere you go has some artwork on display: photogrpahs, paintings, sculpture.  Take some time to look at this stuff and think about it.  Take a notebook with you, write things down.</li>
<li>Review You High School/College Syllabus - was there a book that you hated?  Why did you hate it?  Read it again as an adult and see if there is wisdom there that you overlooked.</li>
<li>Poetry Dail - I'm partial to <a href="https://poems.com">Poetry Daily</a>.  They publish and re-publish the best of contemporary poetry.  With a new, very good poem every day.  It is worth the time, and it is always there, offering something new and challenging.</li>
</ol>
<p>Not every piece of art will speak to you.  Not every book will help.  But every artwork can be turned around in the mind and examined for the resources it provides.  If you find none, your mind has spent time engaged in an activity that strengthens it and which can provide you meaning in itself.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Manager - 2020]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>You're my manager and a leader in my organization.  Could you please:</p>
<ol>
<li>Understand my Work</li>
<li>Recognize great work when it is done by myself and others</li>
<li>Listen more, ask more questions, talk less</li>
<li>Be willing to have hard conversations (with me and with other leaders), when necessary</li>
<li>Be a defender</li></ol>]]></description><link>https://jonathanfries.net/manager2020/</link><guid isPermaLink="false">5e160737aff34f1d3dee3733</guid><category><![CDATA[Leadership]]></category><category><![CDATA[Technology Management]]></category><category><![CDATA[Management]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Tue, 28 Jan 2020 02:45:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1541844053589-346841d0b34c?ixlib=rb-1.2.1&amp;q=80&amp;fm=jpg&amp;crop=entropy&amp;cs=tinysrgb&amp;w=1080&amp;fit=max&amp;ixid=eyJhcHBfaWQiOjExNzczfQ" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://images.unsplash.com/photo-1541844053589-346841d0b34c?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ" alt="Manager - 2020"><p>You're my manager and a leader in my organization.  Could you please:</p>
<ol>
<li>Understand my Work</li>
<li>Recognize great work when it is done by myself and others</li>
<li>Listen more, ask more questions, talk less</li>
<li>Be willing to have hard conversations (with me and with other leaders), when necessary</li>
<li>Be a defender of positive energy, in all situations</li>
<li>Bring energy and enthusiasm to spare so that you can lift up the whole team, when things are difficult</li>
<li>Help to find solutions in difficult situations</li>
<li>Predict the Future</li>
<li>Create a balanced space where I can be a whole person, but be protected from too many messy impacts from other people</li>
<li>Allow me to innovate and create room for innovation within our organization</li>
<li>Help non-specialists understand my special work and what makes me special</li>
<li>Offer feedback at the right moment - hitting me with constructive criticism when I am walking out of successful meeting takes away from the success of the meeting, find a better time even if you have to wait</li>
<li>Encourage me to stretch</li>
<li>Pick me back up again, when I have failed, encourage me to try again.</li>
</ol>
<p>I work in technology, so maybe some of this stuff is specific to the tech world, but I don't really think so.</p>
<p>I have been asked for number 8 on multiple occasions, and I've also been asked to help people get better at predicting the future.  We came up with a system for it, but of course it was imperfect.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>Number 9 may be the hardest one to do.  This is more difficult than predicting the future (if you work in a rational organization people will understand that you're doing your best to predict the future and that it is hard).</p>
<p>Even rational organizations may struggle with understanding why we need to let people have rooms to be their whole selves at work.</p>
<p>We need whole people to show up at work because we need their energy and innovation and you get this most effectively when people feel comfortable being who they are.  You also have to have some order and some sanitizing and professionalism.  This can be a tricky balance.  Sometimes people's whole person is messy.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>There were several things I deleted off this list that fall under the category of <em>hard conversations</em>.</p>
<p><em>Setting realistic goals</em> is one of those things. We are often put under pressure to pursue unrealistic goals, a manager needs to push back on the unrealistic and make sure other leaders understand the trade-offs.</p>
<p>Another thing I removed was <em>focus on the long term</em>.  Long-term sacrifices in favor of short-term gains are something we should consider carefully.  A good manager will daylight the long-term costs and push for what will make his teams lives better in the long run.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>Five and Six are different.  Defending positive energy may not be a completely positive act.  Once the act of defending the positive energy is done, you need to then supply positive uplift to bring everyone back up.  The defense and uplift require two different approaches.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>Vision is not on the list because this is a list about management.</p>
<p>Almost all leaders are managers, and all managers are leaders in some fashion.</p>
<p>But not all managers are <em>visionary</em> leaders.  That skill can be learned, but it isn't required to be a great leader of people.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>Is this hard to do?  It is <em>very hard</em> to do everything well on this list, but then many things worth doing well are hard.</p>
<p>Providing everything on this list as a team is OK - it may be too much for any one person to do all of it.  If you work with a great leadership team it may be that</p>
<p>Even still, you will probably feel a bit like the leader in the picture, at times.  That is, isolated.  Seeking other managers and leaders with whom you can share your insights and challenges is critical.</p>
<p>You will probably stumble.  You will make mistakes.  Being resilient isn't on the list, because we all need that in the VUCA world, not just managers.</p>
<p>Managers have to be resilient for others, as well as themselves, that is why we have 14.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Positive Behavioral Metrics - How does it work?]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>In my last post I jumped right into the fray of describing a whole system for data-driven software development that includes normal stuff (Business KPIs, OKRs, Software metrics) but also some weird stuff - what I call Positive Behavioral Metrics.  I didn't describe what I meant, so I am going</p>]]></description><link>https://jonathanfries.net/positive-behavioral-metrics-how-does-it-work/</link><guid isPermaLink="false">5e20b10caff34f1d3dee3998</guid><category><![CDATA[Positivity Bias]]></category><category><![CDATA[Positive Behavioral Metrics]]></category><category><![CDATA[Management]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Fri, 17 Jan 2020 04:38:00 GMT</pubDate><media:content url="https://jonathanfries.net/content/images/2020/01/colorful_numbers_magazines.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jonathanfries.net/content/images/2020/01/colorful_numbers_magazines.jpg" alt="Positive Behavioral Metrics - How does it work?"><p>In my last post I jumped right into the fray of describing a whole system for data-driven software development that includes normal stuff (Business KPIs, OKRs, Software metrics) but also some weird stuff - what I call Positive Behavioral Metrics.  I didn't describe what I meant, so I am going to do that now.</p>
<p>I also didn't describe what to do with the other half of that coin - negative feelings and behavior - but I am going to do that separately, in a future post.</p>
<p><strong>Positive Behavioral Metrics</strong> is keeping track and counting all the good stuff that people do.  A system to do this (could be software-based or not) should have the following characteristics:</p>
<ol>
<li>A means to create and track 'wins' or instances of people doing good stuff.  This could be someone who gave a great presentation, won significant new business, or contributed to the positive roll-out of a new initiative. Really anything that is good (for individuals, teams, or the organization in general) - large or small does not matter.  Concrete behavioral information is preferred - a specific good thing is better than a vague good thing.  But honestly, even starting with vague is better than nothing.</li>
<li>Notification - the person should always be notified when someone recognizes them.</li>
<li>Notification of Others - the person's boss and their boss's boss (if applicable) should be notified about the good thing that was done.</li>
<li>Reports - a person should be able to go in and see all the good things that they did in a time period (last month, this year, a certain year) so that it can be used in reviews.</li>
<li>Track positive behavior to company values: any time that someone does something good and it is tracked, they person entering should have the ability to track this to some part of the company's values.</li>
<li>Provide a report on people who consistently recognize other people.  These are your energy fountains - the people producing energy in your organization.  This is another key number, in addition to the people who get recognized the most.</li>
<li>Organization-level Reports: should include reports on <strong>doers</strong> - those doing the good stuff and <strong>recognizers</strong> those doing the recognizing.  For both you want to know how much of it is happening, where it is happening, and to be able to drill down and see who is doing it and who they work for.</li>
</ol>
<p>This is really pretty straightforward - honestly this can be built for very little $$ and you could get away with 1,2, and 3 to get started.  You don't need more than that.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>Outside of the system, you need a program around the raw numbers and reports to really drive maximum effect.  And I don't mean prizes or gift cards.  I honestly think that tying it to rewards or awards isn't terribly interesting or effective.</p>
<p>I'm really talking about how this applies to people's growth, to their careers, and to their happiness.  This is what will make it the most powerful.  This should generally include:</p>
<ol>
<li>Personal recognition - by which I mean, if you're in charge and you get the emails about people doing awesome stuff, then walk around or visit the people and talk to them and show them that you are aware of what they do.  You can take them to lunch if you want, or have a dinner or something, but do some form of recognition where their peers see you talking to them about what they did.</li>
<li>Thank you notes - I'm personally terrible at this, but many people swear by it.  Sending handwritten thank you notes to people (or their spouses) is something that can be very effective.</li>
<li>Use of reports - encourage people to review their data, especially at review time to be sure that they use this data when filling in their reviews or 360 evaluations.</li>
<li>Encourage managers to recognize - use the <strong>recognizer score</strong> to ensure that recognition is happening and that you have even consistent coverage in your organization.</li>
</ol>
<p>There are many other things you can do.  These are simple examplesthat you can start with that don't cost much but <em>do</em> build a lot of energy in your organization.</p>
<p>Next up: what to do with the <em>negative</em> stuff.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Pillars of Data-Driven Software Engineering]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I've spent quite a while in companies where metrics and KPIs are important: they are valuable tools, when used correctly.  Everyone is more empowered when they see the business succeeding and see their own role in making it happen.</p>
<p>But I chose the image for the header of this post</p>]]></description><link>https://jonathanfries.net/pillars-of-data-driven-software-engineering/</link><guid isPermaLink="false">5e053622aff34f1d3dee35f6</guid><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Tue, 07 Jan 2020 01:30:00 GMT</pubDate><media:content url="https://jonathanfries.net/content/images/2020/01/People_Working.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jonathanfries.net/content/images/2020/01/People_Working.jpg" alt="Pillars of Data-Driven Software Engineering"><p>I've spent quite a while in companies where metrics and KPIs are important: they are valuable tools, when used correctly.  Everyone is more empowered when they see the business succeeding and see their own role in making it happen.</p>
<p>But I chose the image for the header of this post intentionally - it shows people working together, not a bunch of numbers or a pie chart.  This is because people must engage with the data, and ideally, they should be the ones requesting more data to do their jobs better.  This only happens if you take them into account at the beginning of any such program and figure out what makes them want to succeed, and what they need to do their jobs better.</p>
<p>When it comes to KPIs and metrics, I've seen  problems crop up with them that usually fall into 3 big categories:</p>
<ol>
<li>The creation and roll-out is ham-handed and focuses on management without listening to people, understanding what they need or want, and addressing their fears.  People will be afraid - engage the fear or risk the disengagement that will follow.</li>
<li>What happens if a business, department, or team has an off year/quarter/month?  How can you keep team members engaged?  How do you keep your KPIs or data-based management from feeling like a flogging?</li>
<li>How do you balance the contributions of teams and individuals?  How do you strike a balance between team metrics that measure (and reward) team success vs. those that recognize individual contributions?  Both are important.</li>
</ol>
<p>Because I've been getting exposure to OKRs through some client work recently, I think it is worth looking into how a successful metrics/OKR system can be constructed and avoid the problems up above.</p>
<p>I have created this diagram to show how the elements should work together:</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: image--><figure class="kg-card kg-image-card"><img src="https://jonathanfries.net/content/images/2019/12/Pillars-of-Engineering---Page-5.png" class="kg-image" alt="Pillars of Data-Driven Software Engineering"></figure><!--kg-card-end: image--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>Here is a quick overview of the 5 major components:</p>
<ol>
<li><strong>Company Vision</strong> is critical.  It really comes from outside and is separate from the pillars, but it influences them strongly and should determine (especially in the case of KPIs and OKRs) what they are.  Company vision is the 'Why' of the company and you should see this strongly reflected in KPIs and OKRs.</li>
<li><strong>KPIs</strong> (Key Performance Indicators) measure the ongoing business performance of the organization, including its profitability and how it achieves its vision.  If your KPIs miss one of these marks (I've seen it) then your employees will be disconnected from it.</li>
<li><strong>OKRs</strong> (Objectives and Key Results) - these are measurable goals that are more transitory than KPIs.  OKRs should be a measure of what you are doing NOW (this month, this quarter, this year) in order to achieve and improve results.  OKRs done well should result in improved KPIs - at their best they show us that we have selected the right work and done it well.</li>
<li><strong>Software Metrics</strong> - this has proved elusive in organizations that I have worked for.  What is the measure of good software development?  What is the measure of a great developer?  We're currently starting to use <a href="https://www.pluralsight.com/product/flow">GitPrime - now part of Pluralsight</a>, internally and with some clients.  Good engineering metrics should result in agreed upon set of standards for software engineers, a high bar for quality of work, and they should drive us to deliver more and better features, so that we can do more valuable work.</li>
<li><strong>Positive Behavioral Metrics</strong> - I will spend some time outside the bulleted list on why this is important and how this works.  But if you're skimming this then you only need to know that the orange arrows tell you <em>why</em> this is important.  When you have a down quarter, when a team struggles, what gives people energy and lifts them up so they can deliver anyway? What makes them carry on? What makes them feel that it is <em>worth it</em> to do so?  This is driven by positive behavioral metrics.</li>
</ol>
<p>Don't buy it?  Wishing for comprehensive behavioral metrics?  Let me explain why <em>positive</em> is so key here:</p>
<ol>
<li>You never have to look far to hear negative behavioral information. It's there everyone knows about it, the focus here is to gather up the positive stuff to act as a counter balance.</li>
<li>Your other pillars - KPIs, OKRs, Software Metrics leave plenty of room for the realistic and pessimistic.  If there are issues, they will show up there.</li>
<li>If you have a real, true behavioral problem on your team somewhere, you know it.  You need to deal with it.  Waiting around for a mid-year or annual review is wrong.  The lack of presence of some type of negative ledger should create MORE urgency for you as a manager - not less.  Deal with your drains, negatrons, and nasty actors - do it now.</li>
<li>HR already has systems and paperwork for negative behavioral problems.  You don't really need another one.</li>
<li>An empty ledger says a lot - if someone has no items in their positive behavioral tracking system. Essentially the system for sending out positive vibes, you can assume that they are not a force for inspiration and energy on a team.</li>
<li>Link positive behavior to your company vision and guiding principles whenever possible.  The arrows in the diagram show everything flowing out from your company vision, and this is how it should be.  Your vision and mission (or whatever you call it) should be your barometer and benchmark for what you do.  But, when people succeed, if you link this back to parts of your mission or principles, this can help to reinforce why what they did was important, and later on you can look at where and how your principles are being re-inforced, and see if there are any gaps worth thinking about.</li>
</ol>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p><strong>Challenges with 'Comprehensive' Behavioral Metrics</strong></p>
<p>In one of the organizations that was very metrics focused, we had a metrics section for behavioral traits.  This was not exclusively about <strong>positive</strong> behaviors.</p>
<p>The rating's were from 1 (not at all cool in any way) to 5 (godlike).</p>
<p>There were a lot of 3's and 4's handed out by managers.  Which was correct and how the scale was designed, but it lead, almost exclusively to problems.</p>
<p><strong>Problem 1:</strong> Most people view themselves as 4s or 5s. As a result, the reactions that people had to pretty realistic, generally positive reviews (say a 3.5) was one of disappointment, &quot;You mean I'm not a 5?&quot;  When the system was set up so that almost no one could ever get a 5.</p>
<p>Did anyone ever move up from being a 3 to a 5?  A few, but it didn't have anything to do with the review process or the behavioral traits metrics.  It had to do with great managers and mentors making a real difference in people's careers, so that they were uplifted and excited to come to work.  Getting a 3 (out of 5) on a performance review never does that.</p>
<p><strong>Problem 2:</strong> By the time you were handing out a 2 or a 1, it was too late and you should have fired that person already.  I can think of only one exception to that, and it was a 2.5, not a 1.</p>
<p>This is why I have a pretty dim view of behavioral metrics, and see that focusing on the positive is the most valuable way to come at this.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p>The diagram up above is how I see this all working together. I am currently working with Weekdone for OKRs and I like how you can essentially set and use this at the granularity you prefer.  You can have team OKRs and you can have individual OKRs, and they can roll up or not.</p>
<p>I think this is an excellent pivot point between the team/individual and it allows you to customize this to your needs.</p>
<p>For software development I think a lot of your engineering metrics are going to be on an individual level (# of commits, accepting pull requests, etc).</p>
<p>This allows you to keep KPIs at the global or divisional level, where I think it is good to have a strong focus on the team and the sum of the parts working together.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: hr--><hr><!--kg-card-end: hr--><!--kg-card-begin: markdown--><p><strong>How To Get It All Done</strong></p>
<p>&quot;Sure,&quot; you say, &quot;that is a nice diagram Jonathan, but who has time for all of this stuff?&quot;</p>
<p>Or perhaps you say something less flattering.</p>
<p>This is a fair criticism, our time and our energy are our most precious commodities as leaders, so a bunch of extra paper pushing does not help anyone.</p>
<p>Here is a cost effective way to approach these, get started, and grow it as you see which is most valuable for you.</p>
<ol>
<li><strong>KPIs</strong> - Most KPIs should be an accounting function, and those that are not either should be, or they should be baked into the software product you develop as a key management function, end of story.  <strong>Beware of special cases and subdivisions that make reporting on KPIs more work.</strong> Everyone should get the same measurement, that is what makes it a KPI.  Large organizations with true business divisions can subdivide. If that is you, great.  If it isn't you, don't spend your time one it.</li>
<li><strong>OKRs</strong> - Experiment and scale as necessary.  I mentioned using Weekdone, and I think it is a fine tool with a nice free-to-use option for getting started.  You could also create some basic OKRs for teams for a quarter and use a spreadsheet to track them.  That would be a fine way to start.  Just be sure you're getting the spreadsheet out periodically and discussing it.</li>
<li>Engineering Metrics - Here you need a tool.  There are a number of these now, and I do not have experience with all of them, but engaging your development team in understanding their work better is the key here - fine a tool that helps you engage them in understanding their work and how to get more done.  What are the roadblocks?  What works well?  What is challenging?  To the extent that it is possible: <strong>get the teams themselves to engage with and suggest ways to use these numbers.</strong> Homegrown metrics that are seen by the team as serving <strong>them or their fellow devs</strong> is the maxim you should go with.  Make suggestions, sure.  But the more this can be owned by the people building stuff, the better off you'll be.  Here are few tools that are available in this space, I do not know all of them well:</li>
</ol>
<ul>
<li><a href="https://www.pluralsight.com/product/flow">GitPrime- now part of Pluralsight</a></li>
<li><a href="https://www.gitclear.com/">GitClear</a></li>
<li><a href="https://codeclimate.com/">CodeClimate</a></li>
</ul>
<ol start="4">
<li>Positive Behavioral Metrics - I think a tool is helpful here, but not 100% necessary.  A tool helps you to spread the positive energy to more people because it can do automatic emails, texts, or messages.  Those messages give you a boost, show your employees and bosses that you spread that energy, and gives all of them a boost too. Just sending an email to 1 person and tracking the info in a spreadsheet doesn't do those other things.  I've had to build this tool myself at several companies and I have basic source code to do it.  I am currently developing an open source solution, and when I get it done I will share.  There are tools for employee recognition out there, I do not know how well any of them solve the core problem of multi-person recognition, up-chain recognition, general positive energy flow in organizations, and principle-based recognition.  Those are the core tenets of what my solution does (and has always done).</li>
</ol>
<p>In the absence of a great tool, you simply have to find ways to spread as much positive energy as possible and make sure you are up-reporting (sending your kudos to the person and that person's boss or boss's boss or both).  Not the world's worst assignment.  As one CEO that I worked for said to me, &quot;One of the best parts of my job is going around recognizing people for all the great things they do.&quot;   So, sending her emails about my team's successes was not hard for me to do.  It made her feel good, it made my employees feel good, and it made me feel good.  That's some positive energy.</p>
<p>If your method doesn't immediately enable superb reporting, try to keep a record somewhere - you can even use email history.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Cloud Pricing - A DevOps Feature Suggestion]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I wrote about this in an earlier <a href="http://jonathanfries.net/ipv4-address-price-single-static-ip-aug-20-2019/">post</a>.</p>
<p>Google will begin charging for in-use, public <a href="https://cloud.google.com/compute/network-pricing#ipaddress">IP Addresses</a> on January 1, 2020.  Is this the much ballyhooed supply crunch for IP v4 addresses in it's early stages?  Probably not.</p>
<p>My guess is that it is simply a reflection of the fact</p>]]></description><link>https://jonathanfries.net/cloud-pricing-devops-feature/</link><guid isPermaLink="false">5dfa560daff34f1d3dee35af</guid><category><![CDATA[Cloud]]></category><category><![CDATA[Multi-Cloud Pricing]]></category><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Thu, 19 Dec 2019 02:37:00 GMT</pubDate><media:content url="https://jonathanfries.net/content/images/2019/12/DevOp--3.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jonathanfries.net/content/images/2019/12/DevOp--3.png" alt="Cloud Pricing - A DevOps Feature Suggestion"><p>I wrote about this in an earlier <a href="http://jonathanfries.net/ipv4-address-price-single-static-ip-aug-20-2019/">post</a>.</p>
<p>Google will begin charging for in-use, public <a href="https://cloud.google.com/compute/network-pricing#ipaddress">IP Addresses</a> on January 1, 2020.  Is this the much ballyhooed supply crunch for IP v4 addresses in it's early stages?  Probably not.</p>
<p>My guess is that it is simply a reflection of the fact that Google sees this as a chance to recognize some revenue from a product/service that it has been giving away previously.  And no one is going to switch cloud providers because of a few bucks they get charged for an in-use IP Address.</p>
<p>So, why write a blog about it?</p>
<p>Because it is December 18th and they still haven't published a SKU for it, which makes it hard for me to update my IP Address pricing tool on <a href="https://www.pricekite.io">pricekite.io</a>.  This is mildly frustrating since I have some personal time this week in advance of the holidays and I was hoping to make this change.</p>
<p>For now, my information on pricekite remains accurate, in that I published the prices when Google published them.  However, I would like the dynamic piece of this to work correctly.  Right now it is simply hard-coded in the UI - not the most elegant solution.</p>
<p>In any case, this speaks to the generally opaque way that pricing and product SKUs work in the cloud world.  SKUs are published, but the exact way in which they work, interact, and are used to charge your bill is sometimes hard to understand. Which SKUs apply?  How are the discounts accounted for?  Is it one SKU or many?  how exactly will I be charged for what I am creating.</p>
<p>Each cloud provider has its own approach to this and actually Google has a decent tool <a href="https://cloud.google.com/skus/?currency=USD">here</a>.  But it still isn't perfect or always clear how it will work.</p>
<p>It would be great if the cloud providers would create a cloud pricing tool (similar to the way the Lambda permissions tool works) that showed you exactly which SKUs you were using, how discounts are likely to apply, and forecated cost with the ability to tweak scenarios.</p>
<p>Here is how the Lambda resource visualization works:</p>
<p><img src="https://jonathanfries.net/content/images/2019/12/AWS_Lambda_Designer_smaller.png" alt="Cloud Pricing - A DevOps Feature Suggestion"></p>
<p>To go a step futher, I'd like to see suggestions (based on DB structure or code being written) for how to reduce cost or make smarter choices.  I believe this would be achievable, although might be difficult to do.</p>
<p>This visualization would show all the SKUs that would be used based on the current configuration and code of a particular service, and it would have some inputs to allow you to tweak scenarios and understand the cost of your choices.</p>
<p>This would allow developers to truly embody the DevOps mindset we all are striving for.  How does my code choice impact the cost of this solution?  As currently constructed, no cloud provider offers this type of functionality.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Random Test Harness]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I created a basic random testing harness and put the code on GitHub:</p>
<p><a href="https://github.com/jonathan-fries/random_testing">https://github.com/jonathan-fries/random_testing</a></p>
<p>It is very, very basic as the ReadMe file points out.  I will most likely do some additional work on it.</p>
<p>As it stands there is no obvious problem with either</p>]]></description><link>https://jonathanfries.net/random-test-harness/</link><guid isPermaLink="false">5df3b304aff34f1d3dee3577</guid><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Fri, 13 Dec 2019 16:04:15 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I created a basic random testing harness and put the code on GitHub:</p>
<p><a href="https://github.com/jonathan-fries/random_testing">https://github.com/jonathan-fries/random_testing</a></p>
<p>It is very, very basic as the ReadMe file points out.  I will most likely do some additional work on it.</p>
<p>As it stands there is no obvious problem with either source of randomness or pseudo-randomness tested.</p>
<p>Both Math.random() and Random.org work fine.  That is, when you ask for a bunch of random numbers in a range, they return a result that looks pretty darn random.</p>
<p>This does not explain behavior that I have seen from Math.random().</p>
<p>The next two things that I plan to do are:</p>
<ol>
<li>Introduce a static, non-variable delay (already in progress).</li>
<li>Develop a basic UI for displaying the results.</li>
<li>Add Crypto.getRandomValues() as another source of randomness</li>
</ol>
<p>My reasoning for number 1 is that it is clear (so far) with this test harness that using it in a basic way, their is no pattern.</p>
<p>So the experiment would seem to dispel my hypothesis.</p>
<p>It is possible that I was simply seeing patterns where there are no patterns.  The human brain is good at that.</p>
<p>But I really did see the same number (selected out of about 1200) come up 3 to 4 times within a set of 20 numbers.  And this happened a lot.</p>
<p>So, perhaps it has to do with the way I was calling it.  And if I was creating a pattern through manual testing, perhaps a standard delay could reproduce a similar situation.  So, I will introduce a delay and see if that produces different results.</p>
<p>If nothing else, I can simply lay to rest my (perhaps human-induced) pattern recognition and sleep easier knowing that pseudo-random is really pretty random after all.</p>
<p>I don't really expect to see any pattern with Random.org.  They were just a control and I had recently written code to integrate with them, so I included them for comparison.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Struggles with Math.random()]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>I've been using Math.random() in JavaScript (both in the browser and on the server) to generate random numbers for a couple of years and, for reasons I can't explain, I get a lot of duplicates.</p>
<p>Yes, I know, it's random.  So you will get duplicates.  But I was getting</p>]]></description><link>https://jonathanfries.net/struggles-with-math-random/</link><guid isPermaLink="false">5dd426dcaff34f1d3dee34e3</guid><dc:creator><![CDATA[Jonathan Fries]]></dc:creator><pubDate>Wed, 20 Nov 2019 02:53:10 GMT</pubDate><media:content url="https://jonathanfries.net/content/images/2019/11/random_dice.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://jonathanfries.net/content/images/2019/11/random_dice.png" alt="Struggles with Math.random()"><p>I've been using Math.random() in JavaScript (both in the browser and on the server) to generate random numbers for a couple of years and, for reasons I can't explain, I get a lot of duplicates.</p>
<p>Yes, I know, it's random.  So you will get duplicates.  But I was getting duplicates on the order of every 10th number, when selecting from a range of over 1000 possibilities.  And this happened every time I looked at a sequence that long.</p>
<p>I Googled it exhaustively and found nothing meaningful.</p>
<p>It is true that Math.random() is not <em>really</em> random of course.  It is pseudo-random - computers such as you and I have on our desks, or such as you can get provisioned (easily) in cloud data centers, cannot generate real random numbers.</p>
<p>But when you look at the articles on these pseoudo-random number generators (PRNGs) you see that it should not happen as often as it was happening to me.</p>
<p>Here are some useful articles on how they work:</p>
<p><a href="https://hackernoon.com/how-does-javascripts-math-random-generate-random-numbers-ef0de6a20131">https://hackernoon.com/how-does-javascripts-math-random-generate-random-numbers-ef0de6a20131</a></p>
<p><a href="https://v8.dev/blog/math-random">https://v8.dev/blog/math-random</a></p>
<p>They're a little techy, but so is this topic.</p>
<p>Today browsers offer Crypto.getRandomValues(), which is a good deal more secure, but I simply decided that I wasn't leaving this to pseudo-random chance, I went looking for where I could get real random numbers on the internet and I found two places.</p>
<p>The first I already knew about, <a href="https://random.org">random.org</a>.  It has been around for a good long while, and it has an API.</p>
<p>The second I found was a consortium, seemingly led by <a href="https://www.cloudflare.com/">Cloudflare</a>.  I know Cloudflare as I use them on another site for DNS security, but I was unaware of their work around cryptography.</p>
<p>Here is a link to some information about Cloudflare's project 'League of Entropy' and also another cool project they have for generating their own (internal) random numbers from lava lamps:</p>
<p><a href="https://www.cloudflare.com/leagueofentropy/">League of Entropy</a><br>
<a href="https://blog.cloudflare.com/randomness-101-lavarand-in-production/">Lava Lamps</a></p>
<p>Using Cloudflare's solution was more complicated than what I wanted and I was not sure exactly how to adapt it for my needs, so I went with Random.org instead.</p>
<p>Random.org's API was very easy to use and their testing tool was very helpful.  Here is a link to their request builder:</p>
<p><a href="https://api.random.org/json-rpc/2/request-builder">https://api.random.org/json-rpc/2/request-builder</a></p>
<p>Random.org uses atmospheric radio noise to generate real random numbers. That is, they have devices (in multiple countries) tuned between commercial radio frequencies and the background noise from these radios is used to generate a random signal that produces random numbers.  <strong>Neat!</strong>  Here is a link to a faq question about it that is very interesting:</p>
<p><a href="https://www.random.org/faq/#Q1.4">https://www.random.org/faq/#Q1.4</a></p>
<p>The only thing that I did not like about it, is that I needed to round-trip to random.org to get a random number, and I had to figure out how to secure the license key.  I did not want a lot of latency and I did not want to publish my license key to every browser in the world.  Here is what my solution looked like:</p>
<ol>
<li>In browser, generate a psuedo-random number on page load.  This is a fallback if other things break.</li>
<li>In browser, make a background request to the website back-end for a real random number.</li>
<li>On the server, if I have a real random number available, send it to the browser.</li>
<li>On the server, if I don't have a real random number available, make a request for a buffer of random numbers from random.org.  Generate a pseudo-random number and send it to the browser to avoid any additional latency.</li>
<li>On the server, once I receive a buffer of random numbers store it.</li>
<li>In the browser, make use of the random number.</li>
</ol>
<p>I was a lot more worried about introducing latency than (and failures) than I was about whether or not I had a truly random number every single time, since this isn't exactly a high security system.</p>
<p>Nonetheless, I wanted a random number so I implemented the code above to give myself true randomness most of the time, with a fallback to pseudo-randomness to avoid excessive latency or failures.  It was about 3 hours to get it all working and tested for edge cases such as &quot;What happens if the web service fails?&quot; or &quot;What happens if my buffer counter for random numbers ends up in the negative for some reason?&quot;</p>
<p>I still want to get to the bottom of why I was seeing so many duplicate numbers from Math.random().  I have to believe it was something to do with my code and not with Math.random() itself.</p>
<p>I am going to branch that effort into a different project to see if I can reproduce the behavior and get to the bottom of it.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>