<?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>Forem: Evgenii Ponomarev</title>
    <description>The latest articles on Forem by Evgenii Ponomarev (@_elergy_).</description>
    <link>https://forem.com/_elergy_</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%2F138728%2F562ad573-0f37-4557-a925-2e9c2f5c9982.jpg</url>
      <title>Forem: Evgenii Ponomarev</title>
      <link>https://forem.com/_elergy_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/_elergy_"/>
    <language>en</language>
    <item>
      <title>When to Use Nested Functions</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Sun, 14 May 2023 08:54:02 +0000</pubDate>
      <link>https://forem.com/_elergy_/when-to-use-nested-functions-45ad</link>
      <guid>https://forem.com/_elergy_/when-to-use-nested-functions-45ad</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Warning: the word function appears more often than you are probably used to. Sorry.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fyash-jain-BCixU5xjRy0-unsplash--1-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fyash-jain-BCixU5xjRy0-unsplash--1-.jpg" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alright, let's begin: nested &lt;u&gt;functions&lt;/u&gt; are &lt;u&gt;functions&lt;/u&gt; defined inside other &lt;u&gt;functions&lt;/u&gt; (promised and delivered). You saw them in many forms, like this one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fpow-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fpow-1.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, the function &lt;code&gt;multiply&lt;/code&gt; is defined inside its parent, &lt;code&gt;pow&lt;/code&gt;, although it does not have to be this way.&lt;/p&gt;

&lt;p&gt;Or does it? If nothing else uses multiply, are there any reasons to move it out?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fbutton.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fbutton.jpg" alt="When to Use Nested Functions"&gt;&lt;/a&gt;Tough choice&lt;/p&gt;

&lt;p&gt;This topic regularly ignites lengthy bike-shedding conversations regardless of the programming language (&lt;a href="https://stackoverflow.com/questions/4831680/is-nested-function-a-good-approach-when-required-by-only-one-function" rel="noopener noreferrer"&gt;stack overflow about python&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/swift/comments/4f4kb5/does_nested_function_promote_clean_code/" rel="noopener noreferrer"&gt;reddit about swift&lt;/a&gt;), so I want to jump in and list some more pros and cons which you can apply for your needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you should &lt;strong&gt;&lt;u&gt;not&lt;/u&gt;&lt;/strong&gt; use nested function
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nested functions reduce readability
&lt;/h3&gt;

&lt;p&gt;The bigger a function is, the harder it is to read it.&lt;br&gt;&lt;br&gt;
Look at this example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fshow-news-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fshow-news-1.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By defining three additional functions inside &lt;code&gt;showNews&lt;/code&gt;, you make the reader's job harder: they have to scan all of them before reaching the part with actual logic.&lt;/p&gt;

&lt;p&gt;It might be much shorter:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fshow-news-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fshow-news-2.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reader still can jump to any functions to see how they work, but now it's optional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nested functions influence future growth
&lt;/h3&gt;

&lt;p&gt;One may argue that not all nested functions affect readability.&lt;/p&gt;

&lt;p&gt;In the previous example, you had three big helpers — pretty bad. What if there was only one?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fwith-error.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fwith-error.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Does having &lt;code&gt;loadNews&lt;/code&gt; inside the primary function cause any harm? After all, it is just several extra lines.&lt;/p&gt;

&lt;p&gt;The danger of this approach shows itself when someone needs to add more functionality. You should not be surprised when your colleagues follow the same style and add other nested functions next to the existing one. After all, they just follow the rules you defined as an author.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All it takes to degrade a good codebase is one example of a poor pattern and people's intent to maintain the code style.   &lt;/p&gt;

&lt;p&gt;Check the article about "&lt;a href="https://evgenii.info/reckless-reuse/" rel="noopener noreferrer"&gt;Reckless Reuse"&lt;/a&gt; for more examples of how code becomes unmaintainable without anyone noticing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  When nested functions are &lt;u&gt;good&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;Now you may have an idea that all nested functions are evil and should be avoided by any means.&lt;/p&gt;

&lt;p&gt;This is not true.&lt;/p&gt;

&lt;p&gt;In some cases, they bring some benefits that can outweigh the disadvantages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sometimes you do not want others to use your functions
&lt;/h3&gt;

&lt;p&gt;Yes, functions are meant to be reused. But you may not want it, e.g. if a function handles your particular case but is not suitable for everyone:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fis-equal-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fis-equal-1.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many cases in which &lt;code&gt;isEqual&lt;/code&gt; returns an unexpected result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fwow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fwow.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But it may be the exact behaviour you need.&lt;/p&gt;

&lt;p&gt;In this case, it will be safer to define this function inside &lt;code&gt;saveNews&lt;/code&gt; so that nobody has to deal with its peculiarities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sometimes you need access to an outer scope
&lt;/h3&gt;

&lt;p&gt;Many languages give nested functions access to the variables from the parent scope and even allow to modify them. You may need to explicitly declare such variables (Python) or capture them by reference (C++), but the benefits are the same:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fhandle-error.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fhandle-error.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case, the alternative would be passing all arguments to &lt;code&gt;reportError&lt;/code&gt; every time we call it, using &lt;code&gt;Function.prototype.bind&lt;/code&gt; or wrapping it into a factory. While I prefer different things depending on the situation, I see why somebody may use nested functions here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Some implementation details are helpful
&lt;/h3&gt;

&lt;p&gt;From the reader's point of view, there are few things worse than jumping between functions to understand how the whole thing works.&lt;/p&gt;

&lt;p&gt;Try to understand this piece:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fno-details.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fno-details.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The functions &lt;code&gt;onSuccess&lt;/code&gt; and &lt;code&gt;onError&lt;/code&gt; do not only hide implementation details but also obscure their purpose. You know something happens, but you don't know what exactly.&lt;/p&gt;

&lt;p&gt;In this case, it would be better to define &lt;code&gt;onSuccess&lt;/code&gt; and &lt;code&gt;onError&lt;/code&gt; within the primary function so that the reader knows &lt;em&gt;what&lt;/em&gt; is happening without leaving it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fmore-context.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2021%2F06%2Fmore-context.png" alt="When to Use Nested Functions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two things to note here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementation details are still hidden: you know &lt;em&gt;what&lt;/em&gt; is happening but not &lt;em&gt;how&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Try to avoid situations like this by better naming and defining better APIs. The downsides of nested functions are still there.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So, what to do?
&lt;/h2&gt;

&lt;p&gt;I usually try to avoid nested functions because they make their parents bigger and, as a result, harder to read. Even if a nested function is concise and the impact is negligible, it can potentially become a slippery slope and serve as a bad example for adding similar ones.&lt;/p&gt;

&lt;p&gt;But, as you can see, there are some situations when going this path does worth the downsides.&lt;/p&gt;

&lt;p&gt;I hope that now you can defend any side in this holy war and justify the style you prefer. Happy coding!&lt;/p&gt;




&lt;p&gt;As always, you can &lt;a href="https://evgenii.info/#/portal/signup" rel="noopener noreferrer"&gt;subscribe to Resilient Systems&lt;/a&gt; and receive new articles by email if you haven't done it yet.&lt;br&gt;&lt;br&gt;
You also can &lt;a href="https://twitter.com/_elergy_" rel="noopener noreferrer"&gt;find me on Twitter&lt;/a&gt; or somewhere else – I am always happy to chat :-)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The power of "I don't know"</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Wed, 10 May 2023 08:41:31 +0000</pubDate>
      <link>https://forem.com/_elergy_/the-power-of-i-dont-know-nfb</link>
      <guid>https://forem.com/_elergy_/the-power-of-i-dont-know-nfb</guid>
      <description>&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%2Fimages.unsplash.com%2Fphoto-1563986768609-322da13575f3%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDF8fHNsYWNrfGVufDB8fHx8MTY3MjEwMTE3OA%26ixlib%3Drb-4.0.3%26q%3D80%26w%3D2000" 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%2Fimages.unsplash.com%2Fphoto-1563986768609-322da13575f3%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDF8fHNsYWNrfGVufDB8fHx8MTY3MjEwMTE3OA%26ixlib%3Drb-4.0.3%26q%3D80%26w%3D2000" alt="The power of " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine you have a colleague named Boris. And Boris has a problem: he's been working on a new feature for five days, but now it's all falling apart. The application starts up, runs for a few minutes, and then shuts down with some weird error message and a huge stack trace.&lt;/p&gt;

&lt;p&gt;Boris tries googling the error, but no luck. It looks like it's related to one of the microservices the application uses, and it's too specific for anyone outside the company to know. So he copies the error and posts it in a team chat, asking if anyone knows what it means.&lt;/p&gt;

&lt;p&gt;You see the question, but you have no idea.&lt;/p&gt;

&lt;p&gt;What would you do?&lt;/p&gt;




&lt;p&gt;While you're thinking, let me tell you what most people would do: nothing. And that's totally reasonable: they saw the question, they don't know the answer, and they don't want to spam the chat, so they just carry on with what they were doing before. One person does it, then another, and then a few more. Soon, everyone has seen the question and hasn't said anything.&lt;/p&gt;

&lt;p&gt;But Boris is completely unaware of this. Maybe people are just busy and he needs to wait a little longer?&lt;/p&gt;

&lt;p&gt;So he waits, until someone posts something else in the chat - another unrelated question – and gets a few responses. Now Boris has to wonder if people would see his question when they open the chat.&lt;/p&gt;




&lt;p&gt;The best thing to do in this situation would be to say "I don't know" or react with a "🤷‍♀️" to keep the chat from getting too noisy.&lt;/p&gt;

&lt;p&gt;This lets Boris (and others) know that they don't need to wait for an answer from you, and it can help bring more attention to the problem, potentially leading to a quicker resolution. Or at least, Boris won't have to wait unnecessarily.&lt;/p&gt;

&lt;p&gt;Even though this isn't the biggest problem you may have (it’s not like Boris is going to wait for an answer for eight months while the company goes bankrupt because he can't complete the feature), being blocked is annoying. "I don't know" may not solve the problem, but it's a step in the right direction.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The more influential you are, the more valuable your "I don't know" is.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Boris might think &lt;em&gt;"Even the tech lead who wrote a half of all code doesn't know this error,"&lt;/em&gt; and feel a little better about being stuck.&lt;br&gt;&lt;br&gt;
A recently hired junior might think &lt;em&gt;"Wow, it's okay to admit you don't have an answer,"&lt;/em&gt; with the sense of uplift.&lt;br&gt;&lt;br&gt;
And someone who was hesitant to speak up without a definite answer, might suggest a couple of things to try since nobody else has any ideas.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>learning</category>
      <category>career</category>
    </item>
    <item>
      <title>Keeping meetings on track</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Wed, 03 Aug 2022 21:39:38 +0000</pubDate>
      <link>https://forem.com/_elergy_/keeping-meetings-on-track-4of5</link>
      <guid>https://forem.com/_elergy_/keeping-meetings-on-track-4of5</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VgxHe7v1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1525011268546-bf3f9b007f6a%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDQzfHxkaWZmZXJlbnQlMjBkaXJlY3Rpb25zfGVufDB8fHx8MTY1OTU2MjcwOA%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VgxHe7v1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1525011268546-bf3f9b007f6a%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDQzfHxkaWZmZXJlbnQlMjBkaXJlY3Rpb25zfGVufDB8fHx8MTY1OTU2MjcwOA%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" alt="Keeping meetings on track" width="880" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You organise a meeting to agree on use-cases for a new feature. It is going well, and then a colleague asks which database you plan to use.&lt;/p&gt;

&lt;p&gt;You’re preparing a response (because you haven’t decided yet), but someone suggests MongoDB.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“But why not PostgreSQL?”&lt;/em&gt; another person counters. &lt;em&gt;“We have a similar service, and it only needs one instance of PostgreSQL – I wonder why the same configuration wouldn’t work for you”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It surprises a few people. &lt;em&gt;”One instance?! What is your load?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“It’s not high at the moment. We may need to consider adding more capacity as we grow, but I think three or four instances will be enough”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Have you ever questioned why we have so many databases in the same company?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And now you understand that the meeting went off-track.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you prevent it?
&lt;/h2&gt;

&lt;p&gt;Should you ignore the question about databases? Or stop on the MongoDB suggestion? Or cut off the PostgreSQL-guy? And if yes, why him?&lt;/p&gt;

&lt;p&gt;And what if their points are not as irrelevant as you think?&lt;/p&gt;

&lt;p&gt;Here is a list of tips to help you keep meetings on track.&lt;/p&gt;

&lt;h2&gt;
  
  
  At the beginning of the meeting...
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;... explicitly state the goals.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sometimes, people are unaware of the goals – an additional reminder will not harm. Plus, it will help you return the meeting on track later; you’ll need to remind everyone what you’re trying to achieve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;... make people aware of time constraints.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;We have 60 minutes, and I need about 40 for the presentation – the rest is for the discussion and Q&amp;amp;A&lt;/em&gt; – something like that is enough to make everyone conscious of time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;... share what exactly you plan to cover.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When people know the order of topics, they won’t interrupt with questions you plan to handle later.&lt;/p&gt;

&lt;h2&gt;
  
  
  During the meeting...
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;... watch out for side conversations.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Irrelevant questions are usually not a problem because you choose how much time to spend answering them. Irrelevant comments are fine either – you can acknowledge it and follow up later.&lt;br&gt;&lt;br&gt;
Most of the time waste is caused by &lt;em&gt;side conversations&lt;/em&gt; – when several people are engaged in a dialogue about something that does not contribute to the goal. But yes, they usually start from irrelevant questions or irrelevant comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;... timebox side conversations.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It is hard to assess whether a conversation goes off-track or someone just needs more time to make a point. Decide how much time you should wait before stopping it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;... treat irrelevant conversations equally no matter how they start.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It is common to say something like &lt;em&gt;“it is probably irrelevant but …”&lt;/em&gt; before making a point that is indeed irrelevant. If you have limited time and something does not contribute to the discussion – stop it.&lt;/p&gt;

&lt;h2&gt;
  
  
  After the meeting...
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;... follow up on what was left undiscussed.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Irrelevant ≠ not valuable. You may need to stop some conversations during the meeting, but people still have ideas worth discussing. Reach out to the people whose comments or questions didn’t get proper attention for a follow-up conversation.&lt;/p&gt;




&lt;p&gt;As always, you can &lt;a href="https://www.getrevue.co/profile/elergy"&gt;subscribe to Resilient Systems&lt;/a&gt; and receive new articles by email if you haven't done it yet. &lt;/p&gt;

&lt;p&gt;You also can &lt;a href="https://twitter.com/_elergy_"&gt;find me on Twitter&lt;/a&gt; or somewhere else – I am always happy to chat :-)&lt;/p&gt;

</description>
      <category>management</category>
      <category>agile</category>
      <category>leadership</category>
      <category>beginners</category>
    </item>
    <item>
      <title>What to do if you're a bottleneck</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Fri, 19 Nov 2021 11:12:58 +0000</pubDate>
      <link>https://forem.com/_elergy_/what-to-do-if-youre-a-bottleneck-52n2</link>
      <guid>https://forem.com/_elergy_/what-to-do-if-youre-a-bottleneck-52n2</guid>
      <description>&lt;p&gt;Jackson is a go-to person when it comes to MongoDB.&lt;/p&gt;

&lt;p&gt;You have a problem — you go to Jackson. He’s an expert. Of course, you can go to anyone else – it’s a free world. You can go to Molly if you want. But you know what Molly would recommend, don’t you? She’ll tell you to ask Jackson, that overworked guy with a giant todo list.&lt;/p&gt;

&lt;p&gt;Let’s talk about what to do if you ended up being a Jackson and need a way out.&lt;/p&gt;

&lt;h2&gt;
  
  
  What kind of a bottleneck are you?
&lt;/h2&gt;

&lt;p&gt;There are two different kinds of overworked Jacksons: knowledge bottlenecks and expertise bottlenecks.&lt;/p&gt;

&lt;p&gt;Knowledge bottlenecks are the ones who answer questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Who owns Payment API?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Which database has client emails?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;When is our next release?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're one of those, write documentation. Sorry for such trivial advice, but boring problems need boring solutions.&lt;/p&gt;

&lt;p&gt;It's worth writing docs even if people don't read them. Sounds stupid, but it will serve as your second brain from where you can quickly copy answers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Watch out for an urge to share your screen and demonstrate something. It's always better to record a video (or a gif) and share it instead – this way, you will be able to reuse it later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was all about knowledge bottlenecks.&lt;/p&gt;

&lt;p&gt;Expertise bottlenecks are trickier. They don't just answer questions — they solve problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;This program crashes for Netherlands users.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;My DB query is slow.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Our photo gallery page leaks memory.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This situation is much more complicated because you need more experts to share the load. But unfortunately, there are no books or tutorials you could give to somebody and turn them into an expert – they need to build the expertise themselves. And it takes time.&lt;/p&gt;

&lt;p&gt;But how to accelerate the process?&lt;/p&gt;

&lt;h2&gt;
  
  
  Limited opportunities
&lt;/h2&gt;

&lt;p&gt;If someone wants to learn how to play the guitar, they need to practice playing the guitar. Likewise, if one wants to learn how to fix memory leaks, they need to fix memory leaks.&lt;/p&gt;

&lt;p&gt;The tricky part is there are much more opportunities to play the guitar than memory leaks to fix. They don't happen every day.&lt;/p&gt;

&lt;p&gt;Zoom out now and look where you ended up: people call you whenever a challenging problem arises because nobody else has a similar experience. And nobody else has a similar experience because you solve all the challenging problems. A chicken and egg situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Growing new experts
&lt;/h2&gt;

&lt;p&gt;The naive advice would be to stop doing what you're doing so that others can practice and build necessary expertise in time. But, unfortunately, it's overly utopian – a few companies have the luxury of accumulating unsolved problems while their best specialist sits idle and waits for new experts to emerge.&lt;/p&gt;

&lt;p&gt;But I'm not saying it's impossible – there is a way to grow new experts without slowing down the process. Here it is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick &lt;strong&gt;one&lt;/strong&gt; successor to mentor. &lt;em&gt;Learning opportunities are scarce resource, so resist the temptation to pick more than one.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Redirect all requests to this person.
&lt;em&gt;Need help? Ping Nelson, he knows this stuff.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Be available for this person.
&lt;em&gt;Answer all their questions as soon as possible, pair program or pair debug when necessary.&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eh36jyUb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/overview.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eh36jyUb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/overview.png" alt="What to do if you're a bottleneck" width="711" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The company will not slow down in critical situations – if the time is tight, the mentoree can ask you for help.&lt;/li&gt;
&lt;li&gt;You can tune your involvement depending on the circumstances to manage risks and guide the learning.&lt;/li&gt;
&lt;li&gt;This person starts earning credibility from day one, solving real problems with your invisible help.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the beginning, be prepared to play broken telephone answering proxied questions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8fVIW2xu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8fVIW2xu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/image.png" alt="What to do if you're a bottleneck" width="761" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It may look like a waste of time, but it's far from it. Yes, the future expert acts as a proxy, but they learn about the domain. Even if it's a proxy, it's a caching proxy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h7I4t55r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h7I4t55r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/image-1.png" alt="What to do if you're a bottleneck" width="764" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As their experience grows, they will start asking more complex questions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CcKGs8QE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/image-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CcKGs8QE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/image-2.png" alt="What to do if you're a bottleneck" width="764" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the point where you can return to your expert's duties, which you now can split with another person:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vZfq2tc8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/image-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vZfq2tc8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/11/image-3.png" alt="What to do if you're a bottleneck" width="671" height="462"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;This is a cross-post from &lt;a href="https://www.getrevue.co/profile/elergy"&gt;Resilient Systems&lt;/a&gt; – a newsletter about strategic software engineering.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>leadership</category>
      <category>teamwork</category>
    </item>
    <item>
      <title>The Story About a Smart Boss</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Thu, 12 Aug 2021 19:47:33 +0000</pubDate>
      <link>https://forem.com/_elergy_/the-story-about-a-smart-boss-f72</link>
      <guid>https://forem.com/_elergy_/the-story-about-a-smart-boss-f72</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ytrpi0Ko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/08/philippe-oursel-ZAF-rhUyESY-unsplash--1-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ytrpi0Ko--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/08/philippe-oursel-ZAF-rhUyESY-unsplash--1-.jpg" alt="The Story About a Smart Boss"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Molly had a very smart boss.&lt;/p&gt;

&lt;p&gt;Once, they had a system outage in the middle of the night, which nobody could solve until they called Molly. She logged in, scanned through all the changes from the day before, read the logs, did her own tests, and found the culprit – some expired certificates on one of their production clusters.&lt;/p&gt;

&lt;p&gt;When the boss saw it the following day, he gathered everyone in one place and praised her in front of the others.&lt;br&gt;&lt;br&gt;
"Thanks to Molly, the outage persisted for only 45 minutes. She was quick, accurate, and she did the exact things I would do in this situation.&lt;br&gt;&lt;br&gt;
I had numerous incidents like this in my life, you know. And now it almost feels easy — I see the symptoms, and the root cause becomes apparent. But even with all this experience, I'm not sure I could have done it faster than Molly."&lt;/p&gt;

&lt;p&gt;And everyone clapped him because he was very smart and humble, and they knew he would have found these expired certificates much quicker.&lt;/p&gt;




&lt;p&gt;Another time, the whole team were brainstorming how to reduce the latency of their API.&lt;/p&gt;

&lt;p&gt;Molly knew one or two things about it and proposed to cache frequently used data in Redis.&lt;/p&gt;

&lt;p&gt;"I think it can be a huge success," the boss commented. "It's great that you mentioned that because I've been analyzing Redis myself and was just about to create the task to begin using it. Do you guys all agree about giving it a try?"&lt;/p&gt;

&lt;p&gt;And everyone nodded because he was very smart and always had excellent and well-thought-out ideas.&lt;/p&gt;

&lt;p&gt;"Actually," the boss pointed to Molly, "considering you also proposed Redis, why wouldn't you create tasks yourself?"&lt;/p&gt;

&lt;p&gt;And everyone found it to be a good idea because wise leaders delegate work to their people.&lt;/p&gt;




&lt;p&gt;Later that day, Molly called her old friend. He was a manager in another company, and she knew they were hiring.&lt;/p&gt;

&lt;p&gt;"Is it what, my birthday?" her friend laughed. "But how is your team gonna take it?"&lt;/p&gt;

&lt;p&gt;She paused for a second. "I'll miss them... but they don't need me much anyway. I don't think anything will change".&lt;/p&gt;




&lt;p&gt;Molly was right – nothing has changed with her departure.&lt;/p&gt;

&lt;p&gt;She had a chance to see this for herself a year later when she met her former boss.&lt;/p&gt;

&lt;p&gt;"We just talked about you yesterday! There was a huge outage because of some expired certificates — put us down for 12 hours! I remember you were good at fixing those..."&lt;/p&gt;

&lt;p&gt;Molly was startled but chose to switch to something more positive. "Those certificates are always tricky, don't even remind me… So how's the cool stuff, huh? API?"&lt;/p&gt;

&lt;p&gt;"A bit slow as always, you know. But we plan to fix it soon — I think if we can implement some sort of a cache, or perhaps find an open-source thing."&lt;/p&gt;

&lt;p&gt;"Like Redis," Molly suggested.&lt;/p&gt;

&lt;p&gt;"Exactly! You know, I've been looking at it myself recently — my favourite option so far!"&lt;/p&gt;




&lt;p&gt;As always, you can &lt;a href="https://evgenii.info/newsletter"&gt;subscribe to Resilient Systems&lt;/a&gt; and receive new articles by email if you haven't done it yet.&lt;br&gt;&lt;br&gt;
You also can &lt;a href="https://twitter.com/_elergy_"&gt;find me on Twitter&lt;/a&gt; or somewhere else – I am always happy to chat :-)&lt;/p&gt;

</description>
      <category>career</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Challenges with driving technical initiatives</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Mon, 05 Apr 2021 17:32:19 +0000</pubDate>
      <link>https://forem.com/_elergy_/driving-changes-how-to-deal-with-pushbacks-20i1</link>
      <guid>https://forem.com/_elergy_/driving-changes-how-to-deal-with-pushbacks-20i1</guid>
      <description>&lt;p&gt;You work on a Big Improvement: rewrite backend on Go, move services to AWS, change a task tracker — something that affects multiple people's day-to-day work.&lt;/p&gt;

&lt;p&gt;And then the initiative faces a pushback.&lt;/p&gt;

&lt;p&gt;How much it hurts depends on when you encounter it: rejected proposals feel more bearable than having to throw away the nearly finished work you've been doing for months.&lt;/p&gt;

&lt;p&gt;How to prevent it?&lt;/p&gt;

&lt;p&gt;I have repeatedly found myself on both sides of the fence — as a proponent of innovations and as a member of the sceptical camp. Now, I am pretty sure that Big Improvement's future entirely depends on its author: how they prioritise different kinds of work, address concerns and adapt to feedback.&lt;/p&gt;

&lt;p&gt;Let's figure out how to deal with yours&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For the purpose of this article, I assume that:&lt;br&gt;&lt;br&gt;
1) you did your homework and know that your company will benefit from this initiative&lt;br&gt;&lt;br&gt;
2) you are open to feedback and ready to adjust if needed&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why technical initiatives fail
&lt;/h2&gt;

&lt;p&gt;Ask yourself: why would anybody reject a &lt;em&gt;good&lt;/em&gt; initiative? Assuming nobody is malicious, the answer is obvious – they do not think it is &lt;em&gt;good&lt;/em&gt;. But why?&lt;/p&gt;

&lt;p&gt;There are many possible reasons:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CBtSU0AM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/03/image-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CBtSU0AM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/03/image-2.png" alt="Driving Changes: How to Deal with Pushbacks"&gt;&lt;/a&gt;Potential reasons for a pushback&lt;/p&gt;

&lt;p&gt;Some of them are more frequent than others, and I want to highlight these three as the most common:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;People do not believe you can reach promised goals&lt;/li&gt;
&lt;li&gt;People tried what you built and did not like it&lt;/li&gt;
&lt;li&gt;People disagree that the problem is worth solving&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's see how you can prepare to face each of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reason 1: People do not believe you can reach promised goals
&lt;/h3&gt;

&lt;p&gt;Imagine a medieval kingdom that has been terrorised by a gigantic dragon for centuries. The dragon mercilessly burns the fields with the best crops, devours cattle, and kidnaps the most beautiful (by dragon standards) princesses.&lt;/p&gt;

&lt;p&gt;You, a foreign knight, come in armour and on a white horse and ask for thirty armed men and two bags of gold to finish off the dragon forever – something that many have tried to do, but no one has yet succeeded.&lt;/p&gt;

&lt;p&gt;What do you expect to hear back?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pwuauWHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/strange-person-1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pwuauWHp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/strange-person-1.gif" alt="Driving Changes: How to Deal with Pushbacks"&gt;&lt;/a&gt;They look sceptical&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it may sound to you&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why do you think it would be more performant and easier to maintain? Are you sure? I'm not sure...   &lt;/p&gt;

&lt;p&gt;– Carina&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What the root cause is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The longer a problem exists, the harder it is to believe that somebody can solve it.&lt;/p&gt;

&lt;p&gt;Especially if there were many unsuccessful attempts in the past.&lt;/p&gt;

&lt;p&gt;Psychologists call this effect &lt;a href="https://en.wikipedia.org/wiki/Learned_helplessness"&gt;"Learned helplessness"&lt;/a&gt; and suggest that it can spread like a virus, infecting individuals, teams and organisations. Collectives that catch it become inert and pessimistic — it requires enormous effort to overcome the dominant belief that nothing can be done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to deal with it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Scepticism is contagious. Therefore, it is easier to prevent it than change many people's mind. But you cannot do it with bare arguments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mOSisrlb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/rabbit.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mOSisrlb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/rabbit.gif" alt="Driving Changes: How to Deal with Pushbacks"&gt;&lt;/a&gt;Never ending arguments&lt;/p&gt;

&lt;p&gt;Instead, you can benefit from applying some principles of &lt;a href="https://www.britannica.com/science/hypothetico-deductive-method"&gt;the hypothetico-deductive method&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First of all, you agree on a definition of the problem with those who already tried to tackle it&lt;/li&gt;
&lt;li&gt;Then, you propose your idea – something that should solve the problem&lt;/li&gt;
&lt;li&gt;Together, you deduce the list of consequences: what would the solved problem look like.
The list may be pretty long, so it is worth focusing on the riskiest cases: if the hypothesis is incorrect, you want to know it as soon as possible&lt;/li&gt;
&lt;li&gt;And finally, you agree on the list of experiments that may help you to disprove the consequences and fail fast&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9oLtUSwS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/03/Presentation-5.001-2-2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9oLtUSwS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/03/Presentation-5.001-2-2.jpg" alt="Driving Changes: How to Deal with Pushbacks"&gt;&lt;/a&gt;The shorter version of the method&lt;/p&gt;

&lt;p&gt;If it looks too abstract, let me bring a more concrete example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CuLJ38Jg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/03/Presentation-5.001-3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CuLJ38Jg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2021/03/Presentation-5.001-3.jpg" alt="Driving Changes: How to Deal with Pushbacks"&gt;&lt;/a&gt;How to structure a refactoring&lt;/p&gt;

&lt;p&gt;In the example above, we propose using Rust to solve existing performance problems.&lt;br&gt;&lt;br&gt;
Instead of reasoning whether it would work or not, we identify parts of the system with higher chances of performance problems, agree on how failure would look like and design the experiments that may reveal the shortcomings.&lt;/p&gt;

&lt;p&gt;Even though it may sound straightforward, it is common to see two other approaches which do not end up well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a proposal faces reasonable scepticism and does not get through not being backed by solid evidence&lt;/li&gt;
&lt;li&gt;engineers either do not identify or do not prioritise risky cases and then have to throw away a large amount of work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But anyway, it was a pretty easy one – time for the more interesting case!&lt;/p&gt;

&lt;h3&gt;
  
  
  Reason 2: People tried what you built and did not like it
&lt;/h3&gt;

&lt;p&gt;This happens a little bit later, when you think you built something good enough for others to use.&lt;/p&gt;

&lt;p&gt;You prepare a polished demo that fulfils all expectations and makes everyone's hands hurt because of incessant applause:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gKCj39BX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/first-demo-2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gKCj39BX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/first-demo-2.gif" alt="Driving Changes: How to Deal with Pushbacks"&gt;&lt;/a&gt;A well-rehearsed first demo&lt;/p&gt;

&lt;p&gt;But when others start using it... well, this happens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dYSRnGnf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/real-demo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dYSRnGnf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/real-demo.gif" alt="Driving Changes: How to Deal with Pushbacks"&gt;&lt;/a&gt;This guy does it all wrong!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it may sound to you&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I like the old way better.&lt;br&gt;&lt;br&gt;
Yes, I needed to change the code in five places.&lt;br&gt;&lt;br&gt;
Yes, the code was hard to test.&lt;br&gt;&lt;br&gt;
Yes, it was less performant.&lt;br&gt;&lt;br&gt;
But at least I could get it working because I knew what to do.&lt;br&gt;&lt;br&gt;
Now, I have no idea what's going on, and it all keeps breaking!&lt;br&gt;&lt;br&gt;
Can you de-engineer it back?   &lt;/p&gt;

&lt;p&gt;— Marcus, the early adopter&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What the root cause is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are several possible causes, and in most cases, they occur together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;u&gt;Not enough documentation&lt;/u&gt;
Writing docs is never the top priority during a turbulent time of building something new&lt;/li&gt;
&lt;li&gt;
&lt;u&gt;Unexpected bugs&lt;/u&gt;
After the flawless announcement, people may develop high expectations and forget that this is only the first version&lt;/li&gt;
&lt;li&gt;
&lt;u&gt;Unfinished implementation&lt;/u&gt;
It may be frustrating for early adopters to start working with the new thing and then stumble upon a blocker&lt;/li&gt;
&lt;li&gt;
&lt;u&gt;Rosy retrospection&lt;/u&gt;
In psychology, &lt;a href="https://thedecisionlab.com/biases/rosy-retrospection/"&gt;rosy retrospection&lt;/a&gt; is the tendency to recall the past more positively than the present (even when the facts suggest the opposite)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to deal with it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure that people have the best possible experience working with a new system from day one.&lt;/p&gt;

&lt;p&gt;It would be ideal if you provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation with exhaustive examples&lt;/li&gt;
&lt;li&gt;A list of known bugs and the current state of the roadmap to manage expectations before people start using it&lt;/li&gt;
&lt;li&gt;Support during development so that you can answer questions as they arise and unblock people&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it is impossible to do all of this because you don't have many resources, I would recommend keeping other people away from this version until it meets all criteria. The quality of the first impression means much more than time.&lt;/p&gt;

&lt;p&gt;You may have valid reasons not to wait, e.g. when other engineers want to start building something else on top of your system while it is in development. All situations are different, but my suggestion for this case would be to pair with them until they have necessary context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reason 3: People disagree that the problem is worth solving
&lt;/h3&gt;

&lt;p&gt;Imagine yourself in a group of bright scientists trying to invent powerful yet affordable quantum computers.&lt;/p&gt;

&lt;p&gt;At some point, your experiments pay off, and you find the way to manufacture inexpensive quantum chips –– with them, even smartphones would vastly outperform existing supercomputers from the IBM labs.&lt;/p&gt;

&lt;p&gt;However, there is one minor drawback. Its architecture is absolutely incompatible with what we have nowadays, &lt;em&gt;making most of our computer science knowledge redundant&lt;/em&gt;. Needless to say, some developers may find having to learn all from the beginning a little unfortunate.&lt;/p&gt;

&lt;p&gt;To say the least.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L6k_mYJk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/burn-her.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L6k_mYJk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://evgenii.info/content/images/2021/03/burn-her.gif" alt="Driving Changes: How to Deal with Pushbacks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it may sound to you&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What do you mean by 'automated releases'? All you need to do is to log in to the production machine, download new code and run three commands – I can tell you which ones.&lt;br&gt;&lt;br&gt;
You call it a problem just because you were not here 12 years ago!   &lt;/p&gt;

&lt;p&gt;– Dr Nicolas Peter, PhD&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What the root cause is&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To discuss the root cause, we need to consider two separate cohorts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Those who are used to the current way of doing things&lt;/li&gt;
&lt;li&gt;Those who somehow benefit from it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first group's reasoning is pretty obvious (just make the transition smooth for them); therefore, I will focus on the second one.&lt;/p&gt;

&lt;p&gt;Nobody introduces inefficient systems on purpose. At least, these situations are pretty rare.&lt;br&gt;&lt;br&gt;
Quite the opposite – people usually have good intentions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They see a big problem (same as you!)&lt;/li&gt;
&lt;li&gt;They implement a solution (similar to your Big Improvement!)&lt;/li&gt;
&lt;li&gt;They become experts in it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In time, the solution loses its appeal: it does not satisfy new requirements, there are open source analogues which do the same, and so on. It is time to replace it with something better, but it will imply throwing away all hard-earned knowledge, taking off an expert hat and having to learn something new.&lt;/p&gt;

&lt;p&gt;Besides, the experts know the current version like the back of their hands and see all arguments as exaggerated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to deal with it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The traditional way of constructing an argument almost guarantees resistance. This is what I call a traditional way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You state the problem&lt;/li&gt;
&lt;li&gt;You demonstrate evidence of why this problem is vast and needs solving&lt;/li&gt;
&lt;li&gt;You describe how bright the future would be if you solved this problem&lt;/li&gt;
&lt;li&gt;You explain how you are going to do it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For all its factuality, this approach is devoid of any compassion: you go to the people who built &lt;em&gt;the thing&lt;/em&gt;, to the people who use &lt;em&gt;the thing&lt;/em&gt;, and to the people who have become experts in &lt;em&gt;the thing&lt;/em&gt; and tell them not only that &lt;em&gt;the thing&lt;/em&gt; is terrible, but that it has become a huge problem and needs to be replaced immediately.&lt;/p&gt;

&lt;p&gt;The alternative approach acknowledges the history of an existing system and focuses on what changed since it was initially created. This can help build a foundation for productive collaboration with the current group of experts and get them on board.&lt;/p&gt;

&lt;p&gt;This list of questions can help have a constructive conversation with the experts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What were the initial goals of the system?&lt;/li&gt;
&lt;li&gt;Does the system still satisfy all its initial requirements?&lt;/li&gt;
&lt;li&gt;Which parts of the system are you (the expert) not happy with?&lt;/li&gt;
&lt;li&gt;Which parts of the system have degraded in time due to technical debt and negligence?&lt;/li&gt;
&lt;li&gt;Have we received new requirements that the system does not meet?&lt;/li&gt;
&lt;li&gt;How can we make it right together?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach allows you to join forces with knowledgeable people to find out much more about current and potential use cases, identify hidden problems, and not repeat old mistakes. Experts, in turn, can retain and update their experience after replacing the existing system. Win-win.&lt;/p&gt;

&lt;h2&gt;
  
  
  One final tip
&lt;/h2&gt;

&lt;p&gt;Rejection can be painful. Fear of rejection is real.&lt;/p&gt;

&lt;p&gt;You may want to avoid this by not letting anyone into your plans until everything is perfect.&lt;/p&gt;

&lt;p&gt;Do not fall into this trap because building what nobody needs is much worse than facing a pushback.&lt;/p&gt;

&lt;p&gt;Instead, be wise in driving your initiative because its future depends on you: how you identify stakeholders, prioritise different kinds of work and adapt to feedback.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Liked this article?&lt;br&gt;&lt;br&gt;
&lt;a href="https://evgenii.info/newsletter"&gt;Subscribe for more&lt;/a&gt; and receive new ones by email.&lt;br&gt;&lt;br&gt;
You can also &lt;a href="https://twitter.com/_elergy_"&gt;find me on Twitter&lt;/a&gt; – I am always happy to chat :-)&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>programming</category>
      <category>development</category>
      <category>agile</category>
    </item>
    <item>
      <title>Four streams of defects for prioritising bugfixes</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Tue, 08 Dec 2020 23:13:15 +0000</pubDate>
      <link>https://forem.com/_elergy_/four-streams-of-defects-for-prioritising-bugfixes-4l9b</link>
      <guid>https://forem.com/_elergy_/four-streams-of-defects-for-prioritising-bugfixes-4l9b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is the adapted transcript of the talk I gave to my cat because all conferences had been cancelled, and my internet was too slow for online events.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nLf0ASSn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/davisco-5E5N49RWtbA-unsplash--2-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nLf0ASSn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/davisco-5E5N49RWtbA-unsplash--2-.jpg" alt="Four streams of defects for prioritising bugfixes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How urgent is it to fix bugs?&lt;/p&gt;

&lt;p&gt;The question may sound ridiculous, but the answer isn't straightforward. Well, it depends on a bug, isn't it?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3tDQNAlI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/Is_the_bug_already_in_production_--1---1-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3tDQNAlI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/Is_the_bug_already_in_production_--1---1-.jpg" alt="Four streams of defects for prioritising bugfixes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When it's not released yet, prioritisation is simple: we have to fix it before the release. Of course, there may be some exceptions, but it sounds like a reasonable rule for most of the situations.&lt;br&gt;&lt;br&gt;
What's about bugs which are already in production? What does worth fixing?&lt;/p&gt;

&lt;h2&gt;
  
  
  It's all about impact
&lt;/h2&gt;

&lt;p&gt;Do you need to fix a leaking tap on the kitchen?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lyxjgZ-R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lyxjgZ-R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-1.png" alt="Four streams of defects for prioritising bugfixes"&gt;&lt;/a&gt;Not everybody is annoyed by leaking taps [&lt;a href="https://unsplash.com/photos/LDiHT7CJyNU"&gt;source&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Usually, it depends on how lazy you are, but I'll make the decision a little bit easier by giving you more data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your partner likes to study there, and the sound of dripping water makes it hard to concentrate&lt;/li&gt;
&lt;li&gt;The water bill was $40 higher this month&lt;/li&gt;
&lt;li&gt;Last time you left some mugs in the sink, and they blocked the drain — you were just lucky to notice it and prevent the flood&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think this information will help you make the right decision without hesitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Same with bugs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As soon as you know the impact, prioritisation becomes much easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four streams of defects
&lt;/h2&gt;

&lt;p&gt;To prioritise effectively, you need to answer many questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many clients are affected?&lt;/li&gt;
&lt;li&gt;Which piece of functionality does work incorrectly?&lt;/li&gt;
&lt;li&gt;Are there other bugs we need to prioritise?&lt;/li&gt;
&lt;li&gt;When did it start happening?&lt;/li&gt;
&lt;li&gt;and so on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The way organisations deal with those questions depends on how they detect bugs. There are four big channels you can use to discover defects in your systems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customer feedback&lt;/li&gt;
&lt;li&gt;Error reports&lt;/li&gt;
&lt;li&gt;Exploratory testing&lt;/li&gt;
&lt;li&gt;Stats anomalies&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5-fDvji---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5-fDvji---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-2.png" alt="Four streams of defects for prioritising bugfixes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of the time, companies rely on only one or a couple of channels and neglect the rest – I'll show the consequences of this approach later. For now, let's talk about each of the four streams of defects and how we can make the most of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customer feedback
&lt;/h3&gt;

&lt;p&gt;That's a simple and the most ubiquitous way of finding bugs – to delegate it to your clients. They don't like something, and they complain – you just have to listen to it and schedule the work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s5W3xJcx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s5W3xJcx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-3.png" alt="Four streams of defects for prioritising bugfixes"&gt;&lt;/a&gt;Some unhappy people [&lt;a href="https://unsplash.com/photos/cUhssb9roaU"&gt;source&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Unfortunately, a lot of companies stop there and use only this channel.&lt;/p&gt;

&lt;p&gt;There is &lt;strong&gt;what it may lead to&lt;/strong&gt; :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Not all features are covered.&lt;/strong&gt;
Your clients aren't going to complain if you stop showing ads by mistake. They won't notice if you break behavioural tracking either, which is the same for all non-customer-facing features of your product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Number of complains as a prioritisation factor.&lt;/strong&gt;
Some clients naturally report more issues than others, but does it make their reports more important? What about the people who gave up and stopped using your product?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical support becomes a bottleneck.&lt;/strong&gt;
Triaging incoming requests is tedious work that requires time and coordination. If all you have is plain text messages from users – it's going to be hard. Just be prepared.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard to reason when it started happening.&lt;/strong&gt;
The fact that the bug is reported today doesn't mean it's a recent one – it may have been there for years until it bothered this particular user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How to use this channel effectively:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Make sure clients can always send their feedback.&lt;/strong&gt;
Offer multiple ways to reach out to you, especially, if you use third-party widgets for collecting feedback (such as &lt;a href="https://www.userback.io/"&gt;Userback&lt;/a&gt;). Advertise your twitter account, email-support, anything that can be a backup communication channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allow users to send you attachments.&lt;/strong&gt;
Don't expect clients to send you proper bug reports using internal jargon. You may know that "☑️" is called &lt;em&gt;a &lt;u&gt;checkbox&lt;/u&gt;&lt;/em&gt;, but for them, it's going to be &lt;em&gt;&lt;u&gt;that thing&lt;/u&gt;&lt;/em&gt; or &lt;em&gt;&lt;u&gt;that thing that doesn't work&lt;/u&gt;&lt;/em&gt;. Allow users to send you screenshots, gifs and videos in any format – it'll save lots of time for both sides.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collect as much metadata as possible.&lt;/strong&gt;
Operating system version, browser type, screen resolution, locale, local time – everything that can help you reproduce the problem and is allowed by your privacy policy. This becomes even more important when clients report accessibility issues – they may have a non-trivial setup, but that doesn't make these errors any less important.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Error reports
&lt;/h3&gt;

&lt;p&gt;Time for the next channel – error reports. You detect an exception in your code and report it to &lt;a href="https://sentry.io/"&gt;Sentry&lt;/a&gt; or something similar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FHFFf-QV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FHFFf-QV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-4.png" alt="Four streams of defects for prioritising bugfixes"&gt;&lt;/a&gt;780 users are affected [&lt;a href="https://www.youtube.com/watch?v=cp2U0E3dpO4"&gt;source&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;It compliments client feedback by addressing its shortcomings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have data for all features regardless of how important they are for users&lt;/li&gt;
&lt;li&gt;You can see the overall impact based on the number of exceptions, not the number of complaints&lt;/li&gt;
&lt;li&gt;These questions can be combined together to simplify technical support&lt;/li&gt;
&lt;li&gt;Some of the errors would correlate with releases and could be mitigated by rolling them back&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As it may look like a perfect solution, &lt;strong&gt;it still has some downsides&lt;/strong&gt; :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Not every bug causes an exception.&lt;/strong&gt;
Misaligned elements on your webpage may block important pieces of your workflow, but probably won't trigger an exception&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Number of exceptions as a prioritisation factor.&lt;/strong&gt;
Errors aren't equal, therefore prioritising bugs by a number of exceptions has the same issues as relying on the number of complaints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard to reproduce.&lt;/strong&gt;
Having an exact stack trace doesn't mean that it's going to be easy to fix, especially when an exception isn't originated in your business logic. Mysterious &lt;code&gt;cannot read property 'data' of undefined&lt;/code&gt; can appear out of nowhere and frighten all the stakeholders by how many of them you receive&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How to use this channel effectively:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Make sure you can easily locate all the recent changes.&lt;/strong&gt;
It's important to react quickly when you start receiving a new type of reports. Usually, it means that you've recently released a bug — but when and where? The more moving parts you have, the more important it is to journal all the changes and be able to correlate them with first occurrences of a new type of exception&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup SLAs for dealing with reports.&lt;/strong&gt;
Data is useless if nobody looks at it proactively. Setup the procedures for categorising new errors so you won't miss anything important&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invest in traceability.&lt;/strong&gt;
Where this incorrect request came from? How come the system reached this state? The more subsystems are involved in use cases, the harder it may be to answer those questions if your code isn't instrumented properly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Exploratory testing
&lt;/h3&gt;

&lt;p&gt;Does your company have people who continuously work to break your systems?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZeSy3cdV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZeSy3cdV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-5.png" alt="Four streams of defects for prioritising bugfixes"&gt;&lt;/a&gt;These folks are testing something, not sure what exactly [&lt;a href="https://unsplash.com/photos/Ek8oxbjnJtQ"&gt;source&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;I won't be surprised if it doesn't. Unfortunately, many businesses cut costs on manual testing as they see it outmoded and redundant. Such a view is gaining popularity because manual testing is often perceived as repetitive execution of pre-defined scenarios. This type of work indeed has to be automated.&lt;/p&gt;

&lt;p&gt;Exploratory testing, in contrary, is a process of breaking the system without predefined scenarios to find situations that developers didn't think about. When organised properly, it can cover the blind spots of &lt;em&gt;Customer feedback&lt;/em&gt; and &lt;em&gt;Error reports&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Testers can find bugs in all types of features, even if they don't generate exceptions.&lt;/strong&gt;
If the banners on your website aren't visible because of wrong CSS-styles, testers will catch it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testers can find reproduction steps for mysterious exceptions.&lt;/strong&gt;
If you vaguely know where the exception comes from, your QA team will stress-test that piece of the system in order to cause the same crash and find a way to do it reliably&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testers can test new features before you enable real clients.&lt;/strong&gt;
The biggest downside of other streams of defect is that they only catch bugs which are already impacting clients. Regardless of how good your auto-tests are, there are still use-cases the engineers haven't thought of. QA-engineers with the right tooling and good experience can make new releases smoother&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How to use this channel effectively:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Invest in tools for testing.&lt;/strong&gt;
Do your QA engineers have different environments for testing or they use the same setup for everything? Try to provide them with all the right tools: virtual machines, mobile devices, accessibility software&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate as much as possible.&lt;/strong&gt;
Obviously, it's a huge waste if smart testers have to manually do something that can be done by machine. If they need to perform the same actions every test cycle — automate it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make sure they know how your system should behave.&lt;/strong&gt;
In other words, document your features. Many teams rely on common sense and expect that testers will a bug when they see it. Unfortunately, it's not always the case: if a tester asks colleagues if something is a bug — it's a sign of unclear behaviour that should be documented.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Involve testers in prioritisation.&lt;/strong&gt;
QA engineers should not only find a bug and create a ticket — they should have all the information to assess the damage and suggest a priority. Make sure they can detect if something is a new regression, know the relative impact of different features and have all the necessary information about past and planned releases.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Stats anomalies
&lt;/h3&gt;

&lt;p&gt;Do you collect statistics? Page views, registrations, orders, clicks on advertisement? If yes, this channel can be the most important one for your business because it shows how bugs affect your key metrics.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BKPYnO0x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BKPYnO0x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/06/image-6.png" alt="Four streams of defects for prioritising bugfixes"&gt;&lt;/a&gt;Something doesn't feel right looking at this stats... [&lt;a href="https://unsplash.com/photos/JKUTrJ4vK00"&gt;source&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;You released a new version and number of registrations suddenly fell by 15% — having this data makes prioritisation much more straightforward.&lt;/p&gt;

&lt;p&gt;Although, it may sound like a panacea, using only this channel can be not enough because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Anomalies don't necessarily correlate with your releases.&lt;/strong&gt;
There are many factor which can affect your system, and you may need to dig deeper to understand how to fix it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stats may be impacted by various factors, not only bugs.&lt;/strong&gt;
Anomalies can be caused by genuine reasons: weather, public holidays, major events — not all of them are bad, even if your metrics go down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Changes aren't always rapid.&lt;/strong&gt;
It's simple when you update business logic that lives on the server-side, preferably on one instance. You introduce a bug and the metrics immediately go down — easy to catch. When it comes to front-end, mobile applications or other systems with the longer rollout, the change isn't that sharp.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;How to use this channel effectively:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Make your dashboards as close to real-time as possible.&lt;/strong&gt;
Data is much less useful when it comes with a big lag, especially if you have to wait for a Hadoop job to generate you a daily report (yes, that's a very frequent situation!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collect data about user environment.&lt;/strong&gt;
Most of the major systems for collecting metrics allow sending metadata along with stats. It can give your QA engineers enough clues to reproduce the issue or can help you to figure out a genuine reason for the anomaly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup alerts.&lt;/strong&gt;
Use all capabilities of your system — many of them allow you to setup thresholds where something is considered an anomaly, so you don't need to monitor graphs yourself.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What is your score?
&lt;/h2&gt;

&lt;p&gt;How many of those streams do you currently support? Do you rely on one of them or have multiple?&lt;/p&gt;

&lt;p&gt;All four streams can give you a very good understanding of what's going on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer feedback — what happens?&lt;/li&gt;
&lt;li&gt;Error reports — how many users are affected? when did it start?&lt;/li&gt;
&lt;li&gt;Exploratory testing — how to reproduce?&lt;/li&gt;
&lt;li&gt;Stats anomalies — how does it impact business?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, prioritisation becomes much easier, as for the leaking tap from our previous example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Situation 1:&lt;br&gt;&lt;br&gt;
All new clients are affected since we've released "XYZ" — nobody can register on our website.&lt;br&gt;&lt;br&gt;
It decreased the number of orders by 20%.   &lt;/p&gt;

&lt;p&gt;Solution: revert "XYZ"&lt;/p&gt;

&lt;p&gt;Situation 2:&lt;br&gt;&lt;br&gt;
We had two complaints from the customers, but only people with IE11 are affected.&lt;br&gt;&lt;br&gt;
It started 3 weeks ago and haven't visibly impacted any of the key metrics yet.   &lt;/p&gt;

&lt;p&gt;Solution: won't fix, show a notification that we don't support IE 11.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;As always, if you have any questions, feedback, or just want to talk about something, feel free to ping me on [Twitter], and &lt;a href="https://evgenii.info/bugfixes/#subscribe"&gt;subscribe to "Resilient Systems"&lt;/a&gt; if you haven't already.&lt;/p&gt;

</description>
      <category>agile</category>
    </item>
    <item>
      <title>Not as Productive as Others?</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Tue, 24 Nov 2020 20:30:00 +0000</pubDate>
      <link>https://forem.com/_elergy_/not-as-productive-as-others-4p8c</link>
      <guid>https://forem.com/_elergy_/not-as-productive-as-others-4p8c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This is another article about pacers – people whom we use as an example to adjust our behaviour, mostly unconsciously.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Surrounded by faster pacers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6zCES2zU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/wolfgang-hasselmann-mBccivEQvlk-unsplash--1-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6zCES2zU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/wolfgang-hasselmann-mBccivEQvlk-unsplash--1-.jpg" alt="Not as Productive as Others?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this part, we will talk about problems that may occur when &lt;em&gt;you feel&lt;/em&gt; that a lot of people in your team are much more productive than you.&lt;br&gt;&lt;br&gt;
In many cases, it doesn't lead to any problems – people happily work together and achieve great results. But sometimes their mutual influence can be destructive, and people would feel demotivated and discouraged.&lt;/p&gt;

&lt;p&gt;Several symptoms are indicating that you're affected by faster pacers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You feel guilty seeing that colleagues have achieved more than you&lt;/li&gt;
&lt;li&gt;You are afraid of taking challenging tasks which can make you stuck for a while&lt;/li&gt;
&lt;li&gt;You feel like you have to work longer hours to keep up with others&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Daily standups or any other form of sync with colleagues is the perfect time to diagnose this problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you nervous about sharing your progress?&lt;/li&gt;
&lt;li&gt;Do those meetings make you feel like you have not done enough? &lt;/li&gt;
&lt;li&gt;Do you find it challenging to describe your results and plans?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of these describes you, a closer look is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five actions to solve the problem
&lt;/h2&gt;

&lt;p&gt;The most popular advice I heard in this situation is to take it easy. It is normal to have somebody more productive than you, left alone the fact that nobody can be a top performer in all situations.&lt;/p&gt;

&lt;p&gt;Even though I fully understand the reasoning behind this suggestion, I do not think it is helpful. If somebody is nervous about attending standups, you cannot fix it by suggesting not to worry.&lt;/p&gt;

&lt;p&gt;Instead, you can face this problem, find out the reasons and prepare an improvement plan, even if the problem exists only in your imagination. Then, it's going to be up to you whether to follow this plan or not, but at least you will take matters into your own hands – that alone can be sufficient to address most of the symptoms.&lt;/p&gt;

&lt;p&gt;Let's talk about the five things which you can do to get out of this unpleasant situation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Action one: demystify top performers
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;no two writers are the same, like snowflakes and fingerprints. No one will ever write in just the way that you do, or in just the way that anyone else does. Because of this fact, there is no real competition between writers. &amp;lt;...&amp;gt; Writing is a matter strictly of developing oneself. You compete only with yourself. You develop yourself by writing.  &lt;/p&gt;

&lt;p&gt;– John McPhee&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In time, everyone develops their areas of expertise. No matter how broad or narrow they are, one is the same — people are much more productive when their job overlaps with those areas.&lt;/p&gt;

&lt;p&gt;Before bringing up your own expertise, I would recommend you you to think about your more productive colleagues. &lt;strong&gt;Every time they do something great, ask yourself what helped them to achieve those results.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Something that could sound self-deprecating at first:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mark finished this giant feature for a week. That one would take more than a month for me!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Can be rephrased and cleansed of magic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mark finished this giant feature in a week because he's been building similar ones for the past three years.&lt;br&gt;&lt;br&gt;
He did more than ten last year – now he's extremely good at it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now you can see that Mark's fast pace didn't appear overnight – it required years of deliberate practice. Moreover, you know that doing more things in this area can help you to close this gap.&lt;/p&gt;

&lt;p&gt;That is not the only way of reframing achievements. It could be something like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mark finished it in a week because he wrote the whole system since the beginning and he knows every line of code by heart.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or even this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;... because he did not have the internet at home and spent all his free time working in the office.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No matter the situation, your goal should be to stop seeing people as &lt;em&gt;just productive&lt;/em&gt; and start noticed the reasons behind their results. Most of the time, those reasons are ordinary and achievable by anybody.&lt;/p&gt;

&lt;h3&gt;
  
  
  Action two: find your comfort zone
&lt;/h3&gt;

&lt;p&gt;Simply put, there are three types of activities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Something you enjoy the most&lt;/li&gt;
&lt;li&gt;Something you are good at&lt;/li&gt;
&lt;li&gt;Most important things for the company at the moment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5KUwKAt0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/Three-types-niche.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5KUwKAt0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/Three-types-niche.png" alt="Not as Productive as Others?"&gt;&lt;/a&gt;Three types of activities at work&lt;/p&gt;

&lt;p&gt;The intersection of all three circles is your &lt;em&gt;niche&lt;/em&gt; in the team, but finding and expanding your niche deserves a separate article. For this topic, I will focus only on the comfort zone (highlighted in green).&lt;/p&gt;

&lt;p&gt;Everybody has ups and downs, and you will have many periods of not being at your best.&lt;br&gt;&lt;br&gt;
One of the smartest things you can do is to prepare something that can give you a little boost when needed — a type of work you like to be doing or an area where you can be very productive.&lt;/p&gt;

&lt;p&gt;If you do not have a comfort zone right now — build one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Familiarize yourself with plans of your team.&lt;/li&gt;
&lt;li&gt;Pick an area which will require work in the future.&lt;/li&gt;
&lt;li&gt;Start building expertise there to capitalize on it when the time comes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Action three: define expectations and track achievements
&lt;/h3&gt;

&lt;p&gt;The easiest way to not meet expectations is is to have no expectations at all. No matter what you achieve, you can always find a room for improvement.&lt;/p&gt;

&lt;p&gt;The simplest way of coping with that is to formulate your goals before you start working towards them. I find daily plans most precise and helpful for this purpose; here is one of my recent ones:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MT7hh5SL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MT7hh5SL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image.png" alt="Not as Productive as Others?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The expectations were clear and realistic, but I ended up not finishing half of what I planned to do.&lt;/p&gt;

&lt;p&gt;Was it a problem? No, because I knew that I had done more important things instead, and there was absolutely no reason to feel sad about my initial plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Action four: keep expectations reasonable
&lt;/h3&gt;

&lt;p&gt;Sometimes results are noticeably small in comparison to goals:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GtZVblrM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GtZVblrM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image-1.png" alt="Not as Productive as Others?"&gt;&lt;/a&gt;planned: 7; finished: 1&lt;/p&gt;

&lt;p&gt;While this is a call to think about what can be improved, I would recommend checking your expectations for feasibility first.&lt;/p&gt;

&lt;p&gt;There is a simple exercise to figure out if you are unrealistic in your estimations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take some tasks your team plans to work on and imagine how much time each of them would take for you. Can you complete a particular task one day? In a week? Or maybe you can do five of those in an hour?&lt;/li&gt;
&lt;li&gt;Write it somewhere.&lt;/li&gt;
&lt;li&gt;When &lt;em&gt;other people&lt;/em&gt; complete those tasks, check how their results match your estimations.
Were they working within their niches or tried something new? How did it impact them?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This exercise is also helpful when your plans are unambitious and require correction:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mPbeW-yD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mPbeW-yD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image-2.png" alt="Not as Productive as Others?"&gt;&lt;/a&gt;100% done!&lt;/p&gt;

&lt;h3&gt;
  
  
  Action five: analyse and improve
&lt;/h3&gt;

&lt;p&gt;Detailed plans can be beneficial even when everything looks good:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Yqo-cp0I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Yqo-cp0I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image-3.png" alt="Not as Productive as Others?"&gt;&lt;/a&gt;Perfect plan and execution&lt;/p&gt;

&lt;p&gt;Even though the result matched your expectation, a picky perfectionist can find some food for reflection:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_-s76LQZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_-s76LQZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/11/image-4.png" alt="Not as Productive as Others?"&gt;&lt;/a&gt;Digging deeper&lt;/p&gt;

&lt;p&gt;I rarely use this method – maybe once every two or three months, but it always helps to take control and find something I can change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prove it works
&lt;/h2&gt;

&lt;p&gt;At the beginning of this article, I mentioned that the best way of noticing this problem is to pay attention to your behaviour when you need to share your progress and describe the plans.&lt;/p&gt;

&lt;p&gt;Feeling that you have not done enough can contribute to the demotivation, which will prevent you from working at your best, which will cause dissatisfaction of not achieving enough, which will incur even more demotivation, which will further decrease your productivity, which will make it even harder to get out of this loop.&lt;/p&gt;

&lt;p&gt;The good news is that the actions above can help you to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand if your expectations are realistic and how to adjust them if they are not&lt;/li&gt;
&lt;li&gt;Find the quick way to get back on track after a period of dissatisfaction&lt;/li&gt;
&lt;li&gt;Figure out what is the exact reason for dissatisfaction and how to improve it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If anything, it doesn't leave too many reasons to worry.&lt;/p&gt;




&lt;p&gt;As always, you can &lt;a href="https://evgenii.info/newsletter"&gt;subscribe to Resilient Systems&lt;/a&gt; and receive new articles by email if you haven't done it yet :-) &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>motivation</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Who Influences Your Working Pace?</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Tue, 15 Sep 2020 19:22:27 +0000</pubDate>
      <link>https://forem.com/_elergy_/who-influences-your-working-pace-2li7</link>
      <guid>https://forem.com/_elergy_/who-influences-your-working-pace-2li7</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rXXxS5NB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/kangaroo--1-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rXXxS5NB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/kangaroo--1-.jpg" alt="Who Influences Your Working Pace?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Who has the most significant impact on your working pace? Does it help you to grow or slows you down?&lt;/p&gt;

&lt;p&gt;In this article, I'll list several types of people we may unknowingly use as pacers to adjust own behaviour. If you know them, you can control this effect and even change how you affect others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--evaQTO5Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/smartest-kindergartener.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--evaQTO5Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/smartest-kindergartener.png" alt="Who Influences Your Working Pace?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is the second article about pacers – people, who can impact the performance of teams and companies by just speeding up or slowing down.  &lt;/p&gt;

&lt;p&gt;The previous one is &lt;a href="https://dev.to/_elergy_/pacers-driving-force-of-teams-4p52-temp-slug-6432383"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Three big categories.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pacers in your team.
&lt;/h3&gt;

&lt;p&gt;It's reasonable to assume that your teammates have many opportunities to impact your pace, but the level of this impact varies from person to person.&lt;/p&gt;

&lt;p&gt;Most likely, &lt;strong&gt;colleagues with whom you interact more frequently&lt;/strong&gt; will have more influence on your attitude and productivity than others.&lt;br&gt;&lt;br&gt;
If it doesn't surprise you that &lt;a href="https://www.reed.edu/economics/parker/Peer_Effects_HEDS.pdf"&gt;students living together often achieve similar results&lt;/a&gt;, it should also sound normal when something like this happens in the office. People, who have adjacent desks, frequently synchronise schedules, including lunches, coffee-breaks and how much of productive time they have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;People with similar backgrounds&lt;/strong&gt; is a similar story. Graduated from one university? Hired in the same year? Same age as you? The more traits people have in common, the more likely they would influence each other.&lt;/p&gt;

&lt;p&gt;If you have any grading system at work, &lt;strong&gt;colleagues with adjacent ranks&lt;/strong&gt; can impact you a lot too.&lt;br&gt;&lt;br&gt;
What are people in the next grade suppose to do? May you be up for a promotion? Do you bring more value than people on a preceding level?&lt;/p&gt;

&lt;p&gt;The last two types of teammates who can influence your pace are &lt;strong&gt;the most and least productive people&lt;/strong&gt;. One shows the team &lt;em&gt;what is possible&lt;/em&gt;, while another — &lt;em&gt;what is acceptable.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
There is one caveat, though — since it's difficult to measure actual productivity, you will have to deal with &lt;em&gt;a perceived&lt;/em&gt; one. Make sure you see the entire iceberg, not the tip of it, before your perception impacts the pace.&lt;/p&gt;

&lt;p&gt;The last type definitely needs more attention, and I'll come back to it in one of the next articles. For now, let's move on to the next category.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Pacers outside of your team.
&lt;/h2&gt;

&lt;p&gt;Not anybody can find a pacer within the team — what if you're already a most prolific worker and now you need somebody to push you harder? Luckily, the world doesn’t end outside your team, so there are several options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Company-wide stars&lt;/strong&gt; is the option available for middle-size and large companies.&lt;br&gt;&lt;br&gt;
&lt;em&gt;Joined Google because one famous developer works there?&lt;/em&gt; Now you can have a chance to have more insights on how they work and pick their pace if you like to.&lt;/p&gt;

&lt;p&gt;Family and friends is probably the most obvious example of pacers you can have outside the team.&lt;br&gt;&lt;br&gt;
&lt;em&gt;Your colleagues work extra time, but you leave at 6 because this is how the pace of your partner looks like?&lt;/em&gt; A hard-working and extremely productive best-friend can be better than all motivational programs in revealing what you re capable of.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Imaginary pacers.
&lt;/h3&gt;

&lt;p&gt;Who said pacers have to be real? Some of them may exist only in your head, but it doesn't always mean that you're getting crazy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memories of yourself from the past&lt;/strong&gt; can be a genuine imaginary pacer.&lt;br&gt;&lt;br&gt;
&lt;em&gt;What did you achieve last year? Are you improving or falling behind?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
Although it may look like a good idea, it can become dangerous when those memories fade. We don't have complete control over what we remember, so our perception of how much we did and how hard it was can be very different from reality.&lt;/p&gt;

&lt;p&gt;Now I want to return for a second to &lt;strong&gt;the most and least productive people&lt;/strong&gt; because they're able to form long-lived imaginary pacers for the whole team.&lt;br&gt;&lt;br&gt;
Have you met someone who was considered extremely productive &lt;em&gt;because they were like that in the past&lt;/em&gt;? Even if they no longer produce the same results, others may still try to keep up with the pace that the original pacer could not maintain. The same can go with low performers, even after they bounced back.&lt;/p&gt;

&lt;p&gt;The last type of pacers I want to mention here is &lt;strong&gt;famous people&lt;/strong&gt; — actors, athletes, entrepreneurs, writers and even prominent open-source contributors. Not all of them show the shortcomings and failures of the public, which makes it easy to build overly idealised and hard to follow role models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting all together.
&lt;/h2&gt;

&lt;p&gt;This is the whole list of most common types of pacers which you might pick for yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In your team

&lt;ul&gt;
&lt;li&gt;Close colleagues&lt;/li&gt;
&lt;li&gt;People with similar backgrounds&lt;/li&gt;
&lt;li&gt;Adjacent ranks&lt;/li&gt;
&lt;li&gt;The most and least productive&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Outside your team

&lt;ul&gt;
&lt;li&gt;Company-wide stars&lt;/li&gt;
&lt;li&gt;Family and friends&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Imaginary pacers

&lt;ul&gt;
&lt;li&gt;Memories of yourself&lt;/li&gt;
&lt;li&gt;Memories high and low performers&lt;/li&gt;
&lt;li&gt;Famous people
&amp;lt;!--kg-card-end: markdown--&amp;gt;
## What is next?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try to identify your pacers and think about the implications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who has the biggest impact on your pace at work?&lt;/li&gt;
&lt;li&gt;Is this impact positive or negative for you?&lt;/li&gt;
&lt;li&gt;Is it possible for you to keep up with this pace in the long run?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give it a little time to check how your behaviour may affect others:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who could pick you as their pacer based on those categories?&lt;/li&gt;
&lt;li&gt;If all your colleagues copied your working pace, how would it affect the team?&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;The next article will be about demotivation and how to stay sane when your pacers are much more productive than you. &lt;a href="https://evgenii.info/who-influences-your-working-pace#subscribe"&gt;Subscribe to "Resilient Systems"&lt;/a&gt; to get it as soon as it's ready.   &lt;/p&gt;

&lt;p&gt;As always, if you like the topic and want to talk about it, ping me on &lt;a href="https://twitter.com/_elergy_"&gt;Twitter&lt;/a&gt; or here, see you soon!&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Pacers – driving force of teams</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Tue, 08 Sep 2020 19:29:49 +0000</pubDate>
      <link>https://forem.com/_elergy_/pacers-driving-force-of-teams-4dan</link>
      <guid>https://forem.com/_elergy_/pacers-driving-force-of-teams-4dan</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;— Why are some teams more productive than others?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;— Why do some people regularly overwork and eventually burn out?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;— How to create an environment where people feel safe to have ups and downs while striving for perfection?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dspJruc4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/capstone-events-s_S06Aj9MZ0-unsplash--1-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dspJruc4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/capstone-events-s_S06Aj9MZ0-unsplash--1-.jpg" alt="Pacers – driving force of teams"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the next few weeks, I’ll be writing about pacers (= pacemakers) — people, who can impact the performance of teams and companies by just speeding up or slowing down. This article is the first one that briefly touches the concept — the more practical stuff will follow soon after.&lt;/p&gt;

&lt;p&gt;Let’s jump straight to the point and start with a short Q&amp;amp;A:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6BJs-V3n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/short-q-a-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6BJs-V3n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/short-q-a-1.png" alt="Pacers – driving force of teams"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It starts with running
&lt;/h2&gt;

&lt;p&gt;Have you met Eddy, my imaginary friend, who is about to run his first marathon?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hjVqGkng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/eddy-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hjVqGkng--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/eddy-1.png" alt="Pacers – driving force of teams"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As pretty much any work, it’s about knowing what you’re capable of, preparing a plan and following it until job is done.&lt;/p&gt;

&lt;p&gt;It looks like Eddy can do all of it, can’t he? Let me ask him again short after the race:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZiUcx7p9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/eddy-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZiUcx7p9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/eddy-2.png" alt="Pacers – driving force of teams"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following the plan can be challenging when the environment doesn’t support you. It’s hard to maintain your own pace when yet another grandma outruns you with no visible effort.&lt;br&gt;&lt;br&gt;
You know that you have to follow &lt;strong&gt;your&lt;/strong&gt; pace, but it's easier said than done.&lt;/p&gt;

&lt;p&gt;Luckily, Eddy has one more chance in several weeks — would he learn anything from the recent failure?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6smxwiPx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/eddy-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6smxwiPx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/eddy-3.png" alt="Pacers – driving force of teams"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s quite an improvement — instead of chasing people whose abilities and strategies are unknown, he will run together with his friends.&lt;br&gt;&lt;br&gt;
They will play the role of his &lt;strong&gt;pacers&lt;/strong&gt; — people whose job is to be a benchmark for others.&lt;/p&gt;

&lt;p&gt;Let’s find out if it was better this time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CvoLmE3p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/eddy-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CvoLmE3p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/09/eddy-4.png" alt="Pacers – driving force of teams"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eddy managed to slow down and had enough energy to finish the race, but the pacers weren’t running fast enough for him to show the best performance.&lt;/p&gt;

&lt;p&gt;What’s about &lt;strong&gt;your&lt;/strong&gt; best performance?&lt;/p&gt;

&lt;h2&gt;
  
  
  Look at your team
&lt;/h2&gt;

&lt;p&gt;Both issues frequently happen around us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People pick up a pace they cannot maintain because their colleagues appear as more productive. With time, it leads to &lt;del&gt;overtraining and injuries&lt;/del&gt; stress and burnout.&lt;/li&gt;
&lt;li&gt;People do less than they can because their colleagues aren’t doing much either. Eventually, the whole team slows down to the point of being completely unproductive, and everybody’s skills degrade with not enough practice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Found yourself in one of those situations? Feel that somebody from your team can experience it too?&lt;/p&gt;

&lt;p&gt;You can improve it.&lt;/p&gt;

&lt;p&gt;Pacing issues may sound too hard to address, especially when you’re an engineer and who seem to have no power over the situation. But there are still several important things you can do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Help those who need a hand to increase the pace of the whole team.&lt;/li&gt;
&lt;li&gt;Control your own behaviour and be a healthy example.&lt;/li&gt;
&lt;li&gt;Talk openly about all the challenges you face to make attitude and process as visible as the final result.&lt;/li&gt;
&lt;li&gt;Never hesitate to ask for help and encourage others to do the same.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;All of these will require better coverage, and I’ll do it in the following parts. Here is the rough plan for the next articles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://evgenii.info/who-influences-your-working-pace/"&gt;Who are the pacers in your team and how we choose them&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Two types of pacers: attitude and contribution&lt;/li&gt;
&lt;li&gt;How to improve team pace&lt;/li&gt;
&lt;li&gt;Why it’s much harder with remote work&lt;/li&gt;
&lt;li&gt;Dangerous pacemakers and false pacemakers: how to identify and deal with&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;As always, if you like the topic and want to talk about it, ping me on &lt;a href="https://twitter.com/_elergy_"&gt;Twitter&lt;/a&gt; or by &lt;a href="//mailto:ponomarev.e.s@gmail.com"&gt;email&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;And &lt;a href="https://evgenii.info/pacers-driving-force-of-teams#subscribe"&gt;subscribe to "Resilient Systems"&lt;/a&gt; to get new posts sooner than anywhere else.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>How to Choose Side Projects That Won't Burn You Out</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Fri, 17 Apr 2020 16:09:41 +0000</pubDate>
      <link>https://forem.com/_elergy_/how-to-choose-side-projects-that-won-t-burn-you-out-3aam</link>
      <guid>https://forem.com/_elergy_/how-to-choose-side-projects-that-won-t-burn-you-out-3aam</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fdeadline--1-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fdeadline--1-.jpg" alt="How to Choose Side Projects That Won't Burn You Out"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do you have side projects? If not, you probably should think about it – they can be helpful in the long term.&lt;/p&gt;

&lt;p&gt;But I'd suggest being mindful when you're starting one – otherwise, it can cause unpleasant and unnecessary headache, as it did for me many times. But how can we avoid it? What defines sustainable projects? Let's think about it together.&lt;/p&gt;




&lt;h2&gt;
  
  
  "Unhealthy" side projects
&lt;/h2&gt;

&lt;p&gt;It is not always smooth. I had plenty of side-projects I wish I had never taken.&lt;br&gt;&lt;br&gt;
Sleepless nights, strict deadlines, demanding users – all of these made me want to finish it sooner and come back to the safe old world, where I had only a full-time job and nothing else.&lt;/p&gt;

&lt;p&gt;I know at least one person who experienced the same:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2F5954617224_64b00dcb77_w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2F5954617224_64b00dcb77_w.jpg" alt="How to Choose Side Projects That Won't Burn You Out"&gt;&lt;/a&gt;James Corden (Francis Henshall) – ONE MAN, TWO GUVNORS. &lt;a href="https://www.flickr.com/photos/thelowry/5954617224" rel="noopener noreferrer"&gt;Credit: Johan Persson&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Francis Henshall is the main character of the comedy "&lt;a href="https://en.wikipedia.org/wiki/One_Man,_Two_Guvnors" rel="noopener noreferrer"&gt;One Man, Two Guvnors&lt;/a&gt;". This is a setup from Wikipedia:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;lt;...&amp;gt; Francis Henshall becomes separately employed by two men &amp;lt;...&amp;gt;.&lt;br&gt;&lt;br&gt;
Francis tries to keep the two from meeting, in order to avoid each of them learning that Francis is also working for someone else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It goes normal for a minute or two until two bosses start giving him urgent orders at the same time. As a bonus, the main character holds his own personal interest, which sometimes conflicts with the goals of his employers. What can go wrong?&lt;/p&gt;

&lt;p&gt;This is the best illustration of how unhealthy side projects look like.&lt;/p&gt;

&lt;p&gt;Honestly speaking, those are not really side projects. The word "side" implies that you have something "main", like a full-time job, family, friends and other areas of your life you aren't ready to sacrifice.&lt;/p&gt;

&lt;p&gt;If a side project cannibalises your time and attention from the "main" activities, you're dealing with either of two options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The side project is unsustainable&lt;/li&gt;
&lt;li&gt;It is not a side project, and you need to be explicit about your priorities&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Which projects are "healthy"?
&lt;/h2&gt;

&lt;p&gt;I've formulated these criteria for myself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I should know an exhaustive list of goals I'm trying to achieve&lt;/li&gt;
&lt;li&gt;If I fail a project, only those goals should be affected&lt;/li&gt;
&lt;li&gt;Those goals should not be time-bounded&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Why do I emphasise the part about goals so much? Because I need to estimate a blast radius in case the project fails, which frequently happens with side projects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;– Would I let someone down?&lt;br&gt;&lt;br&gt;
– Would it affect my reputation?&lt;br&gt;&lt;br&gt;
– Would I be affected financially?&lt;br&gt;&lt;br&gt;
– Would it require unexpected extra work?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I want to be able to answer "no" to all of these questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to stress-test your projects
&lt;/h2&gt;

&lt;p&gt;As always, I need someone to demonstrate an example. Today it will be an extraverted Jane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fjane.friends.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fjane.friends.jpg" alt="How to Choose Side Projects That Won't Burn You Out"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine that a friend is asking her to build a website. What could be Jane's motivation?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fjane.build.website-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fjane.build.website-1.jpg" alt="How to Choose Side Projects That Won't Burn You Out"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These goals will not affect other duties – she will be fine even if she fails them. But what's about the friend? How urgent is it for him?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fimage-4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fimage-4.png" alt="How to Choose Side Projects That Won't Burn You Out"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the best possible response – if Jane doesn't have enough time, she will ask him to find somebody else.&lt;br&gt;&lt;br&gt;
If the time boundaries were stricter, "no" would be a preferable answer. After all, she can learn Typescript in a much more relaxed environment.&lt;/p&gt;

&lt;p&gt;Time for the last check.&lt;br&gt;&lt;br&gt;
Is there any chance that this project will become urgent?&lt;/p&gt;

&lt;p&gt;At first glance, no. There is plenty of time, why would it become urgent?&lt;br&gt;&lt;br&gt;
But it's not that simple. Imagine them in two months, after Jane built the website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fjane.urgent-1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fjane.urgent-1.jpg" alt="How to Choose Side Projects That Won't Burn You Out"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then it quickly becomes unsustainable and causes all the pain I've mentioned before.&lt;/p&gt;




&lt;h2&gt;
  
  
  What if the goals are ambitious?
&lt;/h2&gt;

&lt;p&gt;Does it really mean that you should deny everything if it can become urgent? In the end, all ambitious projects imply potential success and consequential urgency.&lt;br&gt;&lt;br&gt;
This would be quite a thoughtless strategy.&lt;/p&gt;

&lt;p&gt;Luckily, there is a way out.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You need to remove yourself from a critical path&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're building something with high potential – try to spread the load. Build a community, even if it's just a community of two. There will be much less chance that unexpected urgency will catch you off guard.&lt;/p&gt;

&lt;p&gt;Being extra explicit also serves the same purpose:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fimage-6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fevgenii.info%2Fcontent%2Fimages%2F2020%2F04%2Fimage-6.png" alt="How to Choose Side Projects That Won't Burn You Out"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same approach works with pretty much any system: you can either &lt;a href="https://dev.to/_elergy_/personal-sla-balance-at-work-part-1-25mm"&gt;strictly define the SLA&lt;/a&gt; (= agree on expectations) or add more resources (= build a community).&lt;/p&gt;

&lt;p&gt;After all, you won't do any good if you're burned out.&lt;br&gt;&lt;br&gt;
Take care*!&lt;/p&gt;




&lt;p&gt;* and &lt;a href="https://evgenii.info/side-projects/#subscribe" rel="noopener noreferrer"&gt;subscribe to "Resilient Systems"&lt;/a&gt; if you haven't already.&lt;br&gt;&lt;br&gt;
You can also do it on &lt;a href="https://www.facebook.com/resilientsystemsdev/" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt; or follow me on &lt;a href="https://twitter.com/_elergy_" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, where I share all the links.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>career</category>
      <category>motivation</category>
    </item>
    <item>
      <title>How Bob used implementation details in tests</title>
      <dc:creator>Evgenii Ponomarev</dc:creator>
      <pubDate>Mon, 23 Mar 2020 20:10:14 +0000</pubDate>
      <link>https://forem.com/_elergy_/how-bob-used-implementation-details-in-tests-i3d</link>
      <guid>https://forem.com/_elergy_/how-bob-used-implementation-details-in-tests-i3d</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tg7IZIoa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/cover.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tg7IZIoa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/cover.jpg" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you met Bob? Probably yes, if you read &lt;a href="https://dev.to/_elergy_/what-real-madrid-can-teach-us-about-leadership-38cj"&gt;What Real Madrid can teach us about leadership&lt;/a&gt; or my recent article about &lt;a href="https://evgenii.info/p/5ce841aa-a099-43fb-8b39-899735c3df30/evgenii.info/silent-grouping-for-estimation/"&gt;using "silent grouping" in estimation&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
If you haven't – don't worry, I'll introduce him now.&lt;/p&gt;

&lt;p&gt;Here is Bob:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TcoDGtnF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TcoDGtnF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-13.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One interesting fact about Bob is that he is really into testing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uRj4HFt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uRj4HFt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-12.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But something really odd happened to him recently. He wrote a new feature, covered its logic with tests and sent it to code review.&lt;/p&gt;

&lt;p&gt;Can you imagine how dumbfounded he was when Jane, his colleague from the picture above, rejected the pull request with this comment:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_vWBsI4Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/jane-rejection.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_vWBsI4Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/jane-rejection.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And it was just the beginning of a long conversation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's challenge best practices
&lt;/h2&gt;

&lt;p&gt;Bob quickly responded to Jane's comment and started refreshing the page, waiting for an answer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--x9PGjian--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/Screenshot-2020-03-08-at-19.11.38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x9PGjian--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/Screenshot-2020-03-08-at-19.11.38.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"You know that GitHub will notify you about all new comments, right?" Jane saw what he's doing and laughed at that.&lt;br&gt;&lt;br&gt;
"Do you have time now?"&lt;/p&gt;

&lt;p&gt;Bob nodded: it was his last task, and he had all the time in the world.&lt;/p&gt;

&lt;p&gt;Jane moved her chair closer to Bob's desk and looked at the screen once again. "Any real reason..." she said thoughtfully. "I don't know, it's just good practice, isn't it? People wouldn't do it if it was bad."&lt;/p&gt;

&lt;p&gt;"People recommended &lt;a href="https://en.wikipedia.org/wiki/Bloodletting"&gt;bloodletting&lt;/a&gt; not too long ago," Bob replied with the smile. "And CSS-in-JS".&lt;/p&gt;

&lt;p&gt;Jane laughed, "CSS-in-JS is cool, come on. But you have a point, let's find out a reason".&lt;/p&gt;

&lt;p&gt;She took the keyboard, opened Google and started searching.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Implementation details in tests&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She pressed enter and opened several links from the results.&lt;/p&gt;

&lt;p&gt;The majority of the pages had the same advice – to not touch anything private in the tests. But as Bob supposed, they could not find any clear rationale for not doing it.&lt;/p&gt;

&lt;p&gt;"Well...", Jane started. "These people all ask the same question – what is the point of testing private stuff if you can test public interface? Public methods will call private ones anyway, and eventually, everything will be tested".&lt;/p&gt;

&lt;p&gt;"The reason is the same as for writing any unit-tests – to test small pieces of code in isolation. If a public method calls five private functions, I'd like to have separate tests for those functions, to see which of them are failing."&lt;/p&gt;

&lt;p&gt;"But why?"&lt;/p&gt;

&lt;p&gt;"Because otherwise, I gonna have a red test for the public method, with no clue what went wrong. And I'll need to debug it to locate the exact part which caused the problem. But we can have more granular data if we have tests for private functions. If they fail, you'll see where it was broken".&lt;/p&gt;

&lt;p&gt;"You're probably right..." said Jane, her mouth tightening.&lt;br&gt;&lt;br&gt;
What Bob said made sense, but she wasn't entirely convinced. "I will approve your pull request".&lt;/p&gt;

&lt;p&gt;Her colleague saw the scepticism in her eyes, which wasn't the desired outcome he had hoped for. "Do you still disagree?"&lt;/p&gt;

&lt;p&gt;"Not really... your point sounds legit, but why all these people keep advocating against using private methods in tests? I mean, someone like you could just come and tell everybody why we need it... Unless they have some strong arguments".&lt;/p&gt;

&lt;p&gt;The first reaction that Bob had was to shrug his shoulders and merge the pull request. But then a good idea came to his mind. "Do you want to ask Lucas?"&lt;/p&gt;

&lt;p&gt;"Oh, yes!" she exclaimed. "Weird that we didn't think about it earlier".&lt;/p&gt;

&lt;p&gt;And they went to talk to their team lead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's ask the team lead
&lt;/h2&gt;

&lt;p&gt;"We just want to know what you think about using private stuff in tests," Jane started when three of them entered the meeting room.&lt;/p&gt;

&lt;p&gt;"What is &lt;em&gt;private stuff&lt;/em&gt;?" Lucas didn't seem to understand the question.&lt;/p&gt;

&lt;p&gt;"Private is something which is not public," Bob declared with a philosophical expression.&lt;/p&gt;

&lt;p&gt;Jane continued, "Like private methods, for example. Many people warn against testing them, but Bob has a point why it can be useful".&lt;/p&gt;

&lt;p&gt;"But how would you do it, when these methods are private, and you don't have access to them?"&lt;/p&gt;

&lt;p&gt;"Well..." Jane tried to explain. "There are still many ways, right?&lt;br&gt;&lt;br&gt;
Some languages have workarounds to access private elements, for example, &lt;a href="https://developer.android.com/reference/android/support/annotation/VisibleForTesting"&gt;@VisibleForTesting&lt;/a&gt; in Java. Languages like Python and Javascript may not have real privacy at all".&lt;/p&gt;

&lt;p&gt;"Privacy by convention," Bob added.&lt;/p&gt;

&lt;p&gt;"Okay, I got it," said Lucas with the look as if he got it. "The short answer – it depends".&lt;/p&gt;

&lt;p&gt;Bob rolled his eyes. He recently noticed a correlation – the more experienced people are, the more frequently they use the phrase 'it depends'. He didn't like it, but at least he knew how to look more knowledgeable.&lt;br&gt;&lt;br&gt;
"Depends on what?" he asked.&lt;/p&gt;

&lt;p&gt;"On the system you're building," Lucas said and took the marker. "Unit tests are just code, and every code has its cost."&lt;br&gt;&lt;br&gt;
He came to the whiteboard and started writing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bm_hUi9C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bm_hUi9C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-14.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"&lt;em&gt;Cow&lt;/em&gt;?" Bob laughed and put two fingers to the head, imitating horns.&lt;/p&gt;

&lt;p&gt;Lucas gave him a disappointed look and rewrote the formula:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QVbyxbD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/final-cost-formula.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QVbyxbD4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/final-cost-formula.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"It's the cost of writing. If you develop a prototype which is going to be thrown away as soon as it's demonstrated, you don't really care about future maintenance, you aim to produce correct code as fast as possible.&lt;br&gt;&lt;br&gt;
On the contrary, if you're working on something with a potentially long lifespan, you may want to invest more time on writing code, if it can save future costs".&lt;/p&gt;

&lt;p&gt;Jane and Bob nodded synchronously.&lt;/p&gt;

&lt;p&gt;Lucas continued, "Your decision whether to use private implementation details in tests or not depends on what you're trying to optimize for. Why do we need unit-tests at all?"&lt;/p&gt;

&lt;p&gt;Bob felt that it was a rhetorical question, but Lucas seemed to wait for an answer. Jade started first.&lt;/p&gt;

&lt;p&gt;"To not break anything if we change code in the future," she replied.&lt;/p&gt;

&lt;p&gt;"One," Lucas said and underlined the phrase &lt;em&gt;'Cost of Maintenance'&lt;/em&gt; in his formula. "What else?"&lt;/p&gt;

&lt;p&gt;"I do it to not test my changes manually all the time," Bob decided to try it too.&lt;/p&gt;

&lt;p&gt;"And here is your cow, man," Lucas winked and drew the line under &lt;em&gt;'Cost of Writing'&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
"If we don't need to run it manually after every change, writing code will take much less time," he continued. "There are many other reasons for writing tests, but let's not overcomplicate for now."&lt;/p&gt;

&lt;p&gt;"So, how is it related to private methods in tests?" Jane asked, confused.&lt;/p&gt;

&lt;p&gt;Lucas didn't answer but started drawing something else on the board:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g0g3uD4e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g0g3uD4e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-1.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"The problem is not only about methods," he finally said. "There are many ways how you can use implementation details in tests, and we can group them into two large categories. Does it make sense?"&lt;/p&gt;

&lt;p&gt;Jane and Bob looked at each other. "Hm... sort of..." Jane said.&lt;/p&gt;

&lt;p&gt;"Okay, okay," Lucas realized that he might have made it too complicated. He put back the marker and opened the laptop. "It's gonna be better now – I have a perfect example".&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's find some old code
&lt;/h2&gt;

&lt;p&gt;The "perfect example", as Lucas put it, was written by him three years ago. It took a while to find it in the repository's history because the code had been changed quite a bit since then.&lt;/p&gt;

&lt;p&gt;"Don't laugh, it's quite old," he hid unrelated functions from the file and turned the screen towards his colleagues.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ehDN4jpf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/library--1-.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ehDN4jpf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/library--1-.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/Elergy/f79952ffa36fbf84877c7599221127cb#file-library-js"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/elergy/"&gt;https://gist.github.com/elergy/&lt;/a&gt;...&lt;/p&gt;

&lt;p&gt;"What was it for?" Jane asked.&lt;/p&gt;

&lt;p&gt;"It was supposed to keep track on available books in the library," Lucas answered. "Physical books, not for Kindle. A &lt;code&gt;library&lt;/code&gt; keeps information inside the internal property &lt;code&gt;_books&lt;/code&gt; and gives two methods to the public: &lt;code&gt;addBook&lt;/code&gt; and &lt;code&gt;takeBook&lt;/code&gt;. Makes sense so far?"&lt;/p&gt;

&lt;p&gt;Jane and Bob didn't have anything to ask.&lt;/p&gt;

&lt;p&gt;Lucas continued "Time to test it. Which tests we would need to write to cover the method &lt;code&gt;takeBook&lt;/code&gt;? I see at least two: the one when we return null, and the one when we find a book and return it".&lt;/p&gt;

&lt;p&gt;He picked the marker again and wrote these two cases:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dg0Zj4j---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/take-book.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dg0Zj4j---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/take-book.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Sounds valid?" he asked.&lt;/p&gt;

&lt;p&gt;"Kinda..." Bob replied uncertainly and examined the code again:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--32rKQw3---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--32rKQw3---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-17.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/Elergy/f79952ffa36fbf84877c7599221127cb#file-library-fragment-js"&gt;gist.github.com/elergy/...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"We can make it more specific," he said. "We return null if the book &lt;em&gt;does not exist at all&lt;/em&gt;, right? At the same time, we return null if we request a valid book, but there are &lt;em&gt;no available copies&lt;/em&gt; in the library."&lt;/p&gt;

&lt;p&gt;"Oh, yes!" Lucas agreed. "We need many cases! In fact, we do have many cases, check it out."&lt;br&gt;&lt;br&gt;
He opened a large file with tests and randomly picked one test-case in the middle:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uTZlmR_U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uTZlmR_U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-18.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/Elergy/f79952ffa36fbf84877c7599221127cb#file-normal-test-js"&gt;gist.github.com/elergy/...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Here, we test that we cannot take a book if it's already taken.&lt;br&gt;&lt;br&gt;
Firstly, we add some books into the library: two books written by Stephen King, one – by George Orwell.&lt;br&gt;&lt;br&gt;
Then we take one book from the library and check that we can't do it once again. Sounds reasonable?"&lt;/p&gt;

&lt;p&gt;"Yep," Bob said impatiently. He was used to watching YouTube on the 2x speed, and now he regretted that he can't speed up Lucas.&lt;/p&gt;

&lt;p&gt;Lucas went on talking, "But I didn't really like the way we were writing it. The preparation phase looked cumbersome: for this case, it takes five steps, for others, it might be even longer. So I decided to try another approach".&lt;/p&gt;

&lt;p&gt;He took a red marker and circled the word "Mocking" on his first drawing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YcI-kaqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YcI-kaqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-3.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Instead of calling several methods to achieve the state we needed, we decided to &lt;em&gt;mock&lt;/em&gt; the final state – just override the property &lt;code&gt;_books&lt;/code&gt;."&lt;br&gt;&lt;br&gt;
He returned to the laptop and opened a newer revision in the repository. The test looked slightly different:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--finG5tM8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--finG5tM8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-19.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/Elergy/f79952ffa36fbf84877c7599221127cb#file-mock-test-js"&gt;gist.github.com/elergy/...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Now, the &lt;em&gt;preparation&lt;/em&gt; phase has only two steps instead of five: create a new &lt;em&gt;library&lt;/em&gt; and change &lt;code&gt;library._books&lt;/code&gt; to whatever we want. And it's always gonna be two steps, no matter which situation we need to replicate. We wrote many tests following the same approach until we saw that it wasn't as good as we thought..."&lt;/p&gt;

&lt;p&gt;Bob finally looked incredulous. The test seemed to be very decent, "Why not good? What do you mean?"&lt;/p&gt;

&lt;p&gt;Lucas spread his hands, "They quickly became unreliable. The tests were easy to write, even for some very complex examples.&lt;br&gt;&lt;br&gt;
But we had changed the code as well, and eventually, these mocks had gone out of sync. This is how the function &lt;code&gt;addBook&lt;/code&gt; looked in some time, do you see the difference?"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zMuxp-gO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zMuxp-gO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-20.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/Elergy/f79952ffa36fbf84877c7599221127cb#file-add-book-changed-js"&gt;gist.github.com/elergy/...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jane found it first, "Yes, the fields &lt;code&gt;author&lt;/code&gt; and &lt;code&gt;title&lt;/code&gt; aren't on the top-level anymore – now they're inside &lt;code&gt;info&lt;/code&gt;".&lt;/p&gt;

&lt;p&gt;"Which makes our old mock invalid," Lucas confirmed.&lt;br&gt;&lt;br&gt;
He opened the mocked state again:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6YnGSJH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-21.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6YnGSJH4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-21.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/Elergy/f79952ffa36fbf84877c7599221127cb#file-mock-js"&gt;gist.github.com/elergy/...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bob laughed, "So, you're saying that the test would still pass because &lt;code&gt;library.takeBook&lt;/code&gt; cannot find the requested book and returns &lt;code&gt;null&lt;/code&gt;?".&lt;/p&gt;

&lt;p&gt;Lucas smiled, "Exactly! And we have a weird situation – the test is green, but it doesn't check the scenario it was supposed to verify. And if we break the code, the tests will not warn us".&lt;br&gt;&lt;br&gt;
He returned to the code and removed the check for &lt;code&gt;!book.available&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NHkj8OCy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-23.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NHkj8OCy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-23.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/Elergy/f79952ffa36fbf84877c7599221127cb#file-take-book-incorrect-js"&gt;gist.github.com/elergy/...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"This code will return any known book, regardless of whether it's available or not. We can take the same book one million times, and our tests will be silent.&lt;br&gt;&lt;br&gt;
But look at the first version of the tests again:"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uTZlmR_U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uTZlmR_U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-18.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;a href="https://gist.github.com/Elergy/f79952ffa36fbf84877c7599221127cb#file-normal-test-js"&gt;gist.github.com/elergy/...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"It only uses the &lt;em&gt;publicly available methods&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
If we change &lt;em&gt;private implementation details,&lt;/em&gt; this test will continue working just as before, giving us enough confidence".&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's talk about static typing
&lt;/h2&gt;

&lt;p&gt;"Wait a minute," Bob understood the problem but didn't fully agree with the conclusion. "Isn't it a problem of Javascript? If you used Java or even Typescript, you wouldn't miss this problem – the language itself would flag that the mock has an incorrect type."&lt;/p&gt;

&lt;p&gt;"Actually, that's a good point," Lucas agreed. "How could Typescript protect us?"&lt;/p&gt;

&lt;p&gt;"It just wouldn't allow us to run these tests until we fix outdated mocks."&lt;/p&gt;

&lt;p&gt;Lucas skimmed through the file with tests, "We have sixty-two test cases. You're saying that we need to update mocks in all of them, right?"&lt;/p&gt;

&lt;p&gt;"Of course!" Bob exclaimed. "How else?"&lt;/p&gt;

&lt;p&gt;Lucas came to the board and highlighted &lt;em&gt;Cost of Maintenance:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LuT8s91g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LuT8s91g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-10.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"There is no doubt that this situation is much better than having unreliable tests. But let me say it aloud, so you can hear how ridiculous it sounds – we changed &lt;strong&gt;two lines of private code,&lt;/strong&gt; and now we need to fix &lt;strong&gt;sixty-two test cases&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It would never happen if we used only public API in tests, without mocking private details."&lt;/p&gt;

&lt;p&gt;Jane sighed deeply, "You know, I was exactly in this situation one week ago. I slightly changed the shape of the &lt;a href="https://redux.js.org/glossary/#state"&gt;Redux State&lt;/a&gt;, and then spent the whole day updating tests, which had outdated mocks..."&lt;/p&gt;

&lt;p&gt;Lucas looked interested, "Oh, Redux is a huge topic! Maybe you can check our code and think about how to avoid this problem in the future? You can even write a blog post about it later."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QZKRT0HB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QZKRT0HB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-11.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k8xESV6Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k8xESV6Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-15.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's take a break and summarize
&lt;/h2&gt;

&lt;p&gt;"That was about mocking," Lucas concluded and pointed out on the board where it still was highlighted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YcI-kaqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YcI-kaqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/image-3.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"You see what happens when you mock private implementation details in tests, right?"&lt;/p&gt;

&lt;p&gt;"Yep," Bob said.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"When we change code, &lt;strong&gt;even slightly&lt;/strong&gt; , we may have to spend &lt;strong&gt;too much time fixing tests which didn't have to be broken&lt;/strong&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"Only if you are lucky," Lucas reminded.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;" &lt;strong&gt;These tests are much less reliable&lt;/strong&gt; , because we may not notice that mocks were out of sync. You think that everything is tested, while, in fact, it's not."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;"What's about asserting?" Jane asked. "Is it okay to call private methods to verify that they work correctly?"&lt;/p&gt;

&lt;p&gt;Lucas checked his watches, "Have to run to another meeting, can we continue later?"&lt;/p&gt;

&lt;p&gt;"Can you just tell us if it's okay or not?"&lt;/p&gt;

&lt;p&gt;Lucas looked at the board as if trying to collect his thoughts and come up with a brilliant answer. Then he shifted his gaze to Bob and sighed wearily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YOvLpQeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/slice2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YOvLpQeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://evgenii.info/content/images/2020/03/slice2.png" alt="How Bob used implementation details in tests"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://evgenii.info/#subscribe"&gt;Subscribe to "Resilient Systems"&lt;/a&gt; to get all the latest posts delivered straight to your inbox&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;Credits for the camera on the cover picture goes to &lt;a href="https://unsplash.com/@b_g?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Benedikt Geyer&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/privacy?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>development</category>
    </item>
  </channel>
</rss>
