<?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: Igor Barsi</title>
    <description>The latest articles on Forem by Igor Barsi (@igorbarsi).</description>
    <link>https://forem.com/igorbarsi</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%2F12642%2F75bc84fb-0da9-44a9-a946-32da9b2444ea.jpg</url>
      <title>Forem: Igor Barsi</title>
      <link>https://forem.com/igorbarsi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/igorbarsi"/>
    <language>en</language>
    <item>
      <title>Just-in-Time Knowledge: Learn What You Need, When You Need It</title>
      <dc:creator>Igor Barsi</dc:creator>
      <pubDate>Sun, 26 Aug 2018 16:27:21 +0000</pubDate>
      <link>https://forem.com/igorbarsi/just-in-time-knowledge-learn-what-you-need-when-you-need-it-3f3</link>
      <guid>https://forem.com/igorbarsi/just-in-time-knowledge-learn-what-you-need-when-you-need-it-3f3</guid>
      <description>&lt;p&gt;As makers, we’re always looking for creative new ways to keep our minds sharp and skills relevant. We live in an age where a vast sea of information is available at our fingertips. &lt;strong&gt;In this knowledge economy, information is king&lt;/strong&gt;. When you take a step back to consider the possibilities this creates for personal and societal growth, it’s really quite inspiring.&lt;/p&gt;

&lt;p&gt;But what are the ramifications of such boundless access to information?&lt;/p&gt;

&lt;p&gt;The JavaScript community has been in a &lt;a href="https://medium.com/@ericclemmons/javascript-fatigue-48d4011b6fc4"&gt;state of fatigue&lt;/a&gt; for some time due to constant changes in tooling, libraries and abstractions that seem to be popping up quicker than we’re able to absorb. While the growth and influence JavaScript has had on the development community is &lt;a href="https://medium.com/javascript-scene/why-im-thankful-for-js-fatigue-i-know-you-re-sick-of-those-words-but-this-is-different-296fae0c888f"&gt;something to admire&lt;/a&gt;, it came at a cost. An onslaught of blog posts, books, video tutorials, online courses and boot camps, all claiming to teach you the latest and greatest in your field of choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Information overload is real&lt;/strong&gt; and its negative effects will &lt;a href="https://en.wikipedia.org/wiki/Boiling_frog"&gt;creep up on you&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As you begin your hunt for knowledge, you’re faced with some challenging questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Am I finding all the information I need?&lt;/li&gt;
&lt;li&gt;Is the information I found reliable?&lt;/li&gt;
&lt;li&gt;Am I looking for the &lt;em&gt;right&lt;/em&gt; things?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of stretching your mind beyond its limits by consuming 100% of the information you come across &lt;em&gt;in case&lt;/em&gt; you might need it, why not &lt;strong&gt;learn as you need it&lt;/strong&gt;?&lt;/p&gt;

&lt;h3&gt;
  
  
  Just-in-Case vs Just-in-Time Learning
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Experience is a hard teacher because she gives you the test first, the lesson afterward” — Vernon Law&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most of us are accustomed to the format of education provided by traditional schooling. Teachers instruct classrooms of students using standardized material at a fixed rate. Changes to this material are infrequent, and students are often grouped without taking different styles of learning into consideration. You’re periodically tested on the materials that you’ve been taught.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;just-in-case learning&lt;/strong&gt;, and it’s the opposite of what you experience in life outside of school. You either acquire raw knowledge without knowing how it may (or may not) be applied at a later time, or you face challenges before you learn what you need. Life is full of twists and turns. You never know what you’ll face next.&lt;/p&gt;

&lt;p&gt;If the information you’re learning is not immediately valuable or applied regularly, you end up forgetting the bulk of it. You’ll maintain some level of familiarity over time, but any detailed expertise will be lost.&lt;/p&gt;

&lt;p&gt;This method of learning is comparable to the way we regularly consume daily tech news, deep-dive blog posts and lengthy Twitter rants. While the information may be valuable, internalizing it now before you’re presented the opportunity to make use of it is wasteful. At some point, you begin to experience diminishing returns on your investment of time and cognition.&lt;/p&gt;

&lt;p&gt;I’d like to explore an alternative approach to learning by drawing analogies with a software program that embodies similar core principles — &lt;a href="https://hacks.mozilla.org/2017/02/a-crash-course-in-just-in-time-jit-compilers/"&gt;the JIT compiler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Compilers translate the code you write to something a machine can understand. Traditional compilers work ahead of time to create an optimized translation of what we write. Modern JIT compilers, on the other hand, translate individual parts of your code as they become &lt;em&gt;warm&lt;/em&gt; (ie. as they are used).&lt;/p&gt;

&lt;p&gt;These segments of code are translated into &lt;em&gt;stubs&lt;/em&gt;, which are then further optimized and re-translated in a more performant manner as their usage increases. If your code’s execution changes and the compiler notices something is amiss, it throws out the stub and starts again. In this manner, the compiler is self-correcting and only commits to working on a translation if the value returned is deemed positive (ie. usage vs effort to optimize).&lt;/p&gt;

&lt;p&gt;At its core, &lt;strong&gt;just-in-time learning&lt;/strong&gt; can be explained using the principles that are baked into JIT compilers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Effectiveness &amp;gt; Efficiency
&lt;/h3&gt;

&lt;p&gt;Traditional compilers are very efficient. They take their time, reading over the entirety of your code before translating in the most efficient way possible. You can become very efficient at reading and processing information this way by committing vast amounts of your time to consume as much knowledge as possible.&lt;/p&gt;

&lt;p&gt;This isn’t the best way to learn.&lt;/p&gt;

&lt;p&gt;Instead of focusing on &lt;em&gt;efficiency&lt;/em&gt;, stop and ask yourself if you’re learning the right thing?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Too often, we focus our time on “getting things done” instead of “getting the &lt;strong&gt;right&lt;/strong&gt; things done”.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whether it’s &lt;a href="https://hackernoon.com/productivity-by-sam-altman-5d10d72f14d1"&gt;personal&lt;/a&gt; or &lt;a href="https://www.amazon.ca/Rework-Jason-Fried/dp/0307463745"&gt;team productivity&lt;/a&gt;, take your time and make sure you’re heading in the right direction. Only apply effort when it maximizes value.&lt;/p&gt;

&lt;p&gt;Delivery teams put a high emphasis on reaching peak velocity. Understand that &lt;a href="https://fs.blog/2018/03/speed-velocity/"&gt;velocity is the combination of speed &lt;em&gt;and&lt;/em&gt; direction&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct Yourself
&lt;/h3&gt;

&lt;p&gt;While translating, JIT compilers will immediately throw away existing optimizations if newly interpreted logic disproves previous assumptions.&lt;/p&gt;

&lt;p&gt;As you learn “on the fly”, you will come across information that falsifies your previous knowledge. Heed these discoveries, as they could be an indication of questionable sources. Don’t let confirmation bias take hold and consider where you’re getting your information.&lt;/p&gt;

&lt;p&gt;When you’re learning something new for work, you’ll likely be pressed for time. With a deadline looming, you’ll be tempted to rush your learning to get the job done.&lt;/p&gt;

&lt;p&gt;Once again, direction matters. Validate against your network, filter out dogmatic opinions and do your best to ensure your information is credible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Organize Information
&lt;/h3&gt;

&lt;p&gt;As a JIT compiler parses your code, it segments logic and creates &lt;em&gt;stubs&lt;/em&gt; that are indexed by line number and variable type. This indexing makes sorting, filtering and searching for relevant parts of your code a breeze during optimizations.&lt;/p&gt;

&lt;p&gt;As you go about your day, communicating with co-workers, skimming newsletters and scrolling through your news feeds, you’ll come across some potentially interesting and useful information.&lt;/p&gt;

&lt;p&gt;If you were to sit down, collect all that information and fully digest it on a daily basis, you’d be swamped. There is only so much time in a day. That being said, you wouldn’t want to discard what you found, potentially missing out on some key learnings.&lt;/p&gt;

&lt;p&gt;Find a service, like &lt;a href="https://getpocket.com/"&gt;Pocket&lt;/a&gt; or &lt;a href="https://www.instapaper.com/u"&gt;Instapaper&lt;/a&gt;, that lets you collect useful links for later. Like a compiler’s stubs, you’ll want your service to support search, categorization, tagging, sorting and filtering for easy access. Determine what groupings work best for your learning style and ensure they’re readily available when you need it.&lt;/p&gt;

&lt;p&gt;Determining the value of an article often doesn’t require its full consumption. Most bloggers include the gist of what they’ve written in their conclusions. Skimming that will often give you enough context to decide whether or not the post should be saved for later.&lt;/p&gt;

&lt;h3&gt;
  
  
  There’s a Caveat
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The more basic knowledge you have … the less new knowledge you have to get.” — Charlie Munger&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While the benefits are enticing, &lt;strong&gt;just-in-time learning does not replace knowing the basics&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Schools teach you fundamentals for good reason. They’re the building blocks used to develop a deeper, more specialized understanding of the subject matter at hand. Without that &lt;a href="https://fs.blog/2013/08/choose-your-next-book/"&gt;foundation&lt;/a&gt;, you’ll have a hard time ramping up on new material. Starting from something is easier than starting from scratch.&lt;/p&gt;

&lt;p&gt;In addition to knowing the basics, you should also &lt;strong&gt;know the landscape&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Broad knowledge and surface-level understanding of the many edges and specialties of your field will help optimize your just-in-time learning. Otherwise, how will you know &lt;em&gt;what&lt;/em&gt; to learn when you’re faced with an unfamiliar problem? You need to be aware of your options before you can decide where to invest your learning.&lt;/p&gt;

&lt;p&gt;The more you know, the better primed you will be to tackle new challenges. Continuous learning is the key to personal development and success. &lt;a href="https://fs.blog/2013/05/the-buffett-formula-how-to-get-smarter/"&gt;Growing smarter every day&lt;/a&gt; will compound and propel you ahead.&lt;/p&gt;

&lt;h3&gt;
  
  
  What To Do When You Don’t Know
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Education is knowing what to do when you don’t know.” — Michael Lewis, The Undoing Project&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the end of the day, a good mix is key. Invest time in learning the fundamentals of your craft, while building a framework of resources and techniques to prepare you for when you &lt;em&gt;don’t&lt;/em&gt; know.&lt;/p&gt;

&lt;p&gt;Remember the core principles of just-in-time-learning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Focus on effectiveness&lt;/strong&gt; by regularly asking yourself whether you’re learning the &lt;em&gt;right&lt;/em&gt; thing?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correct yourself&lt;/strong&gt; when you come across conflicting data. Validate your sources and avoid dogmatic opinions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organize your information&lt;/strong&gt; in such a way that is painless to access just as you need it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Don’t invest the time and effort into learning something in case you’ll need it. Learn &lt;em&gt;when&lt;/em&gt; you need it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks for taking the time to read this post!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please ❤️ and follow if you liked what you read and&lt;/strong&gt; &lt;a href="https://www.igorbarsi.com/newsletter"&gt;&lt;strong&gt;subscribe&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to stay in the loop 😁&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://www.igorbarsi.com/blog/just-in-time-learning/"&gt;&lt;em&gt;www.igorbarsi.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>software</category>
      <category>programming</category>
      <category>learning</category>
      <category>life</category>
    </item>
    <item>
      <title>Groom User Stories Your Delivery Team Won’t Hate</title>
      <dc:creator>Igor Barsi</dc:creator>
      <pubDate>Thu, 31 May 2018 01:01:00 +0000</pubDate>
      <link>https://forem.com/igorbarsi/groom-user-stories-your-delivery-team-wont-hate-456e</link>
      <guid>https://forem.com/igorbarsi/groom-user-stories-your-delivery-team-wont-hate-456e</guid>
      <description>&lt;p&gt;When you think of a good user story, you might imagine clear, succinct definitions of features that address real user needs and provide solid business value. They are the PO’s breakdown and representation of where the business needs to grow to keep customers happy and ensure future success.&lt;/p&gt;

&lt;p&gt;While this is very meaningful from a business perspective, I find that writing user stories in this way ensures that they are &lt;em&gt;only&lt;/em&gt; meaningful to the business. The focus, terminology and scope is directed at a single audience — those that wrote the stories in the first place.&lt;/p&gt;

&lt;p&gt;This often causes issues for members of the delivery team that don’t share that same mental model. Implementation details and blockers are not clear. Developers are fumbling over conflicting technical requirements and duplicated work. QA is never certain that the story is entirely finished, unsure that listed acceptance criteria cover all expected test cases. Ultimately, these issues make it impossible for the PO to accurately track progress.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is the kind of wasted velocity we want to &lt;strong&gt;avoid&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In order to overcome these issues and groom effective stories, changes will need to be made to the team’s grooming process. User stories should bring value to the entire team, unifying and guiding all those involved through the delivery process.&lt;/p&gt;

&lt;p&gt;In the following sections, I’ll shed light on some of the more glaring issues I’ve experienced and offer a few suggestions on how to make grooming less painful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write User Stories That People Will Actually Read
&lt;/h3&gt;

&lt;p&gt;We live in a world of short attention spans and limited &lt;em&gt;focused&lt;/em&gt; mental bandwidth. Wether you believe the &lt;a href="https://www.nytimes.com/2016/01/22/opinion/the-eight-second-attention-span.html?_r=3" rel="noopener noreferrer"&gt;click-bait posts&lt;/a&gt; perpetuated by news giants or prefer to remain &lt;a href="http://www.bbc.com/news/health-38896790" rel="noopener noreferrer"&gt;skeptical of the findings&lt;/a&gt;, the impact modern technology has had on the way we consume (and ignore) information is undeniable.&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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A7C0ggaovo5jfo8nk.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A7C0ggaovo5jfo8nk.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When discussing leadership, speaking, writing and really any activity that requires the attention of others, you’re often advised to grasp that attention as quickly as possible and hold onto it as long as you can. As a result, the content we create is formatted and organized in a way that caters to the impulsive needs of our target audiences.&lt;/p&gt;

&lt;p&gt;Why don’t we apply these same principles to writing user stories?&lt;/p&gt;

&lt;p&gt;When it comes down to it, our teams are full of regular people. We’re all busy, with mounting emails, endless meetings and constant Slack notifications. If our stories aren’t written in a consumable way, they simply won’t be consumed &lt;em&gt;at all&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When you sit down to write your next user story, keep the following characteristics in mind.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear acceptance criteria&lt;/strong&gt; that outlines expectations and user needs. These should be comprehensible, succinct points that are narrow and focused on &lt;em&gt;individual&lt;/em&gt; requirements. This will ensure developers and QA can digest, implement and test every aspect of the story. In theory, someone should be able to walk off the street into your office, read a user story and get a descent sense of what is being asked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vertically sliced&lt;/strong&gt; segments of functionality that cut through all architectural layers of the application. Stories should add complete, functioning value to the product. To achieve this, a user story must capture all work required to be completed through the data, business and presentational layers of the application. Technical sub tasks can be broken out to tackle each layer separately, if sensible, but the story itself should capture the final state of a functioning feature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focused&lt;/strong&gt; on a single workflow or unit of value as part of a greater initiative. A user story shouldn’t cover too much ground, but just enough to deliver value. Bloated stories will come off as daunting and lead to avoidance, while slim stories will seem tedious and pointless, influencing the team to rush implementation and “move on to the next thing”. Striking that balance is key to maintain engagement while still delivering something meaningful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritized&lt;/strong&gt; &lt;a href="https://blackboxofpm.com/ruthless-prioritization-e4256e3520a9" rel="noopener noreferrer"&gt;ruthlessly&lt;/a&gt;. User stories should be constantly re-prioritized and re-ordered in a way that represents current needs, adjusting for ROI, effort required and blocking dependencies accordingly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember, we’re all regular people at the end of the day. Through the myriad of distractions and depletion of focus we endure, let’s put some effort into making our delivery process as painless as possible.&lt;/p&gt;

&lt;p&gt;Don’t rely on willpower alone to prevail. Reduce the friction and get your team focused in a unified direction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Include The Whole Team
&lt;/h3&gt;

&lt;p&gt;Traditionally, stories are written by someone with a mental model of where the product needs to grow. They proceed to formalize these thoughts and break them up in a way that makes sense to them and the business. Finally, the result of this exercise is shared with the rest of the team for implementation.&lt;/p&gt;

&lt;p&gt;The entire delivery team is responsible for shipping value to your customers. Every member of the team will have difference needs and styles of work that have to be taken into consideration. To be truly agile, every member of the team needs to function as an inter-disciplinary cohesion of diverse talents. As such, members of these diverse roles should not be expected to bend to the style of writing, organization and planning that’s optimized for the business. The chance of this shared context translating well across roles are slim.&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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A5c_eD3PTDqBj3_DR.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A5c_eD3PTDqBj3_DR.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While grooming, take your team’s dynamics into consideration. &lt;strong&gt;Include every role in the process&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Through shared understanding, you reduce the risk of miscommunication and divergence during delivery. Every role on your delivery team has different skills and needs. By defining work in a diverse way that speaks to all talents, you can unlock your team’s full potential and reach peak velocity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separate Concerns Between Task Categories
&lt;/h3&gt;

&lt;p&gt;Project management software, like JIRA or Asana, provide you with the tools you need to successfully guide and track your software project from start to finish. These tools are considered standard practice for modern software initiatives.&lt;/p&gt;

&lt;p&gt;The breadth of features provided by these tools equip your team with great flexibility through configuration, but with that comes the potential for complexity. Your team could end up drowning in countless workflows, views and reports, ultimately causing the very issues these tools set out to solve.&lt;/p&gt;

&lt;p&gt;Clean coding teaches us separation of concerns between classes and modules through what is called the &lt;em&gt;Single Responsibility Principle&lt;/em&gt;. As originally described by Robert C. Martin in &lt;a href="https://amzn.to/2H3c257" rel="noopener noreferrer"&gt;Agile Software Development, Principles, Patterns, and Practices&lt;/a&gt;, a class should only have &lt;strong&gt;one reason to change&lt;/strong&gt;. This segmentation ensures that a collection of logic is encapsulated and focused on a single purpose.&lt;/p&gt;

&lt;p&gt;This same philosophy should be applied to the tasks we create in our project management software. Too often, information is duplicated across epics, stories, sub-tasks, defects, etc. This confuses anyone who tries to pick up the pieces through the delivery process. Developers are scrambling between tickets to ensure they capture all requirements, often bothering the PO if clarity isn’t achieved. QA doesn’t know where to look to find the “true” acceptance criteria that needs to be tested. POs have to remember to update every ticket affected by a change in requirements, falling prey to human error.&lt;/p&gt;

&lt;p&gt;These tools and processes are in place to help us achieve velocity. If instead they’re crippling our progress, &lt;strong&gt;something is broken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;From my experience, I’ve had good results sticking to the following classifications and separations of concerns between ticket categories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Epics&lt;/strong&gt; should be written by the PO to capture entire initiatives. These are high level tasks that are written in an executive level language that speaks to business owners. Epics should state clear goals that the team can rally behind and stay focused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stories&lt;/strong&gt; should be written by the PO, breaking epics down into sizeable chunks of functionality. I already went into user story writing in the previous section, but I want to re-iterate how critical it is that stories stay relevant to the business. This is the PO’s value-centric breakdown of a larger initiative that can be used to track the overall progress of the delivery of said initiative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sub-Tasks&lt;/strong&gt; should be written by developers to outline the technical implementation details for a given story. These tasks are for developers only to be completed during the sprint. A single story could have one matching task, many tasks or share tasks between other stories. The goal is to create tasks that logically break down the work required of developers, across stories, to be utilized in a way that’s most efficient for them to deliver. Once all tasks linked to a story are completed, it should be ready for test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defects&lt;/strong&gt; should be written by QA to capture errors or missed criteria in stories. Defects should be described in detail, with clear steps to reproduce and screenshots or videos If possible. Stories should be linked so that missed acceptance criteria is clear.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The distinctions defined above should be clear and their language consistent. Product should be able to define what they need in a language they understand. Development and QA should be no different. With this clean separation, each member of the team can work as efficiently and comfortably as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Groom User Stories Your Delivery Team Will Love
&lt;/h3&gt;

&lt;p&gt;These days, high quality software doesn’t get delivered by a single person. There are groups of talented and diverse individuals in different fields of practice with varying disciplines and perspectives. To truly get the most out of your delivery team, the stories that ultimately drive the product’s development should be groomed in a way that compliments these dynamics.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Readability&lt;/strong&gt; is critical in ensuring that your stories get consumed efficiently, with minimal errors and confusion. Remember, anyone should be able to walk off the street, read a story and grasp the ask.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inclusion&lt;/strong&gt; among varying disciplines in the team before and during grooming could proactively prevent lost time and churn during implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separation of concerns&lt;/strong&gt; between task categories improves clarity as to where information can be found and reduces duplication across tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Grooming doesn’t have to be painful.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We take pride in the work that we do and strive to ship successful products. There should be a willingness in us all to pivot and adjust process to reach that shared goal. Well crafted user stories should unify the team’s joint vision and ultimately drive the product to success.&lt;/p&gt;

&lt;p&gt;Groom user stories that empower your team and they will deliver.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for taking the time to read this post!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please ❤️ and follow if you liked what you read and join&lt;/strong&gt; &lt;a href="https://www.igorbarsi.com/newsletter" rel="noopener noreferrer"&gt;&lt;strong&gt;my newsletter&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;to stay in the loop 😁&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://www.igorbarsi.com/blog/groom-user-stories-your-delivery-team-wont-hate" rel="noopener noreferrer"&gt;&lt;em&gt;www.igorbarsi.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>agile</category>
      <category>productmanagement</category>
      <category>softwaredevelopment</category>
      <category>scrum</category>
    </item>
    <item>
      <title>Habitual Testing: Transform Negative Software Testing Culture By Leveraging Your Subconscious</title>
      <dc:creator>Igor Barsi</dc:creator>
      <pubDate>Sun, 01 Apr 2018 16:32:58 +0000</pubDate>
      <link>https://forem.com/igorbarsi/habitual-testing-transform-negative-software-testing-culture-by-leveraging-your-subconscious-29b3</link>
      <guid>https://forem.com/igorbarsi/habitual-testing-transform-negative-software-testing-culture-by-leveraging-your-subconscious-29b3</guid>
      <description>&lt;p&gt;I think we can all agree that testing code is valuable.&lt;/p&gt;

&lt;p&gt;Well tested code assures the completion of acceptance criteria, guiding implementation by outlined requirements. It empowers you to extend and refactor with a sense of safety, knowing that existing functionality won’t break as a result of your changes. Over time, your team gains increasing returns as the growing number of tests reduce the likelihood of surprising, hard-to-diagnose bugs appearing and derailing production software, often coming at a cost of significantly more time than it took to write the tests in the first place. Not to mention, this increased quality lowers the chance of production bugs being exposed to your customers, potentially driving them away from your product as a result. These tests even act as a form of living documentation for your code, clearly describing intent…&lt;/p&gt;

&lt;p&gt;The list goes on.&lt;/p&gt;

&lt;p&gt;Ultimately, testing leads to increased software quality, reliability and customer retention, while at the same time reducing overall cost. Most developers are well aware of these benefits. Yet, many of the production software we write is severely under-tested.&lt;/p&gt;

&lt;p&gt;Why do we seem to resist following a practice that is ultimately designed for the collective benefit of &lt;em&gt;all&lt;/em&gt; stakeholders?&lt;/p&gt;

&lt;p&gt;I believe it comes down to &lt;strong&gt;culture&lt;/strong&gt;. A shared mindset across organizations to turn a blind eye to the undisputed value that well tested software brings. Perhaps it was pressure from management, instilled in the company from early contributors or developed slowly over time due to overall lack of diligence. No matter what the cause(s) may be, it’s ingrained in your company’s culture now and you’re stuck. This quote from Tom DeMarco and Tim Lister’s &lt;a href="https://amzn.to/2Gr0aKM" rel="noopener noreferrer"&gt;Peopleware&lt;/a&gt; captures the issue perfectly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“People hate change… and that’s because people hate change… I want to be sure that you get my point. People really hate change. They really, really do.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;– Steve McMenamin, The Atlantic Systems Guild, 1996&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;People don’t like being pushed out of their comfort zones. Even if a change is clearly positive, it is in our nature to resist any irregularity that challenges our norm. It’s easy to sit back and coast along, but if you want to reap the benefits outlined above for your team, organization and ultimately the customer, change will have to be faced.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Breaking culture is hard, but it’s not impossible.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the rest of this post, I’m going to dive into what I call &lt;strong&gt;habitual testing&lt;/strong&gt;. A collection of techniques and patterns I’ve adopted across the organizations I’ve worked at that have helped slowly build testing awareness and intuition. This process aims to instil small bits of change over time, while gradually forming good testing practices as the team adjusts and observes the benefits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Think Before You Test
&lt;/h3&gt;

&lt;p&gt;I came across this tweet a while back from &lt;a href="https://twitter.com/rauchg" rel="noopener noreferrer"&gt;Guillermo Rauch&lt;/a&gt;‏ that really spoke to me:&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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Af28JWk8cGmCHavh-.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Af28JWk8cGmCHavh-.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In only a few words, he was able to sum up much of my own philosophy of how to approach testing. Especially in teams that don’t support testing as a core part of their development process.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We only have so much time to test, so test smart.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some teams get turned off of testing large legacy projects due to the sheer amount of code that needs to be covered. Others might question the value of spending time writing thousands of lines of detailed test code to cover disproportionately less lines of production code.&lt;/p&gt;

&lt;p&gt;I’m not advocating that you drop what you’re doing to test every line of code in your project. The point being conveyed here is that you should write tests that are &lt;strong&gt;valuable&lt;/strong&gt;. 100% code coverage does not necessarily mean that your code is well tested. Not all code paths need to be unit tested with precision. Not all APIs need integration tests. Not every UI component/workflow needs end-to-end tests. It’s our responsibility as engineers to determine what tests will bring us the most return on the time invested in writing &lt;em&gt;and&lt;/em&gt; maintaining them.&lt;/p&gt;

&lt;p&gt;An often shared model illustrating different forms of testing is what’s known as the &lt;strong&gt;Test Pyramid&lt;/strong&gt; :&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%2Fcdn-images-1.medium.com%2Fmax%2F381%2F0%2AO7xfeXrY9Y-Rlswn.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%2Fcdn-images-1.medium.com%2Fmax%2F381%2F0%2AO7xfeXrY9Y-Rlswn.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This diagram is often used to emphasize the importance of having a wide base of small, fast unit tests that cover the whole codebase, with some integration tests to “fill the gaps” and a few E2E tests to tie everything together. Alternatively, if we were to break down the diagram by &lt;em&gt;customer value&lt;/em&gt; (in terms of certainty in the product’s complete functionality) and &lt;em&gt;cost&lt;/em&gt; (effort expended to write), we would get the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unit&lt;/strong&gt; = low value, low cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt; = medium value, medium cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E2E&lt;/strong&gt; = high value, high cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more surface area a test covers, the more expensive (ie. time consuming) it is to implement, but the most value that it brings. Larger tests are less &lt;em&gt;precise&lt;/em&gt; but more &lt;em&gt;accurate&lt;/em&gt; at validating correctness by user story acceptance criteria. To put it another way, your tiny units of work can function absolutely perfectly but provide no certainty that the API your customers hit will respond in a way that is acceptable.&lt;/p&gt;

&lt;p&gt;If we were to re-draw this diagram in a way that better represents this new mental model, we might get something like the following (as shared by &lt;a href="https://twitter.com/kentcdodds" rel="noopener noreferrer"&gt;Kent C. Dodds&lt;/a&gt;):&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%2Fcdn-images-1.medium.com%2Fmax%2F679%2F0%2An1x0fMUFBvNqUgpu.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%2Fcdn-images-1.medium.com%2Fmax%2F679%2F0%2An1x0fMUFBvNqUgpu.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s how this new diagram can be interpreted:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write mostly integration tests&lt;/strong&gt; to ensure the program is running correctly. Testing your units interacting with one another allows you to create scenarios that match real customer use cases. Does your payment API react as expected when an expired credit card is provided? Does your authentication layer correctly handle password resets? These could all be potential customer requirements that you’re able to validate directly, providing highly valuable assurances to your customers. Make sure you test optimal cases to confirm functionality and plenty of fail cases to ensure errors are being handled correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write unit tests for complex components&lt;/strong&gt; with high variability and many split code paths. These are typically the oldest, most convoluted parts of your application. Unit testing these heavily will help alleviate the fear of “breaking things” when you are forced to modify them. Unit tests should be short and concise, acting as a form of detailed usage documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write E2E tests for critical workflows&lt;/strong&gt; that don’t change frequently. The latter is critical, as these are often very time consuming and brittle tests to write. Any time your UI or API’s interface needs to be changed, these tests need to be updated. While they provide high value, as they test exact workflows, use them sparingly and only when most beneficial.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apply these insights to your testing strategy to ensure you get the most return on your investment. Remember to take a step back before writing a test, reference the points above and ask yourself if your current approach is appropriate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Be a Good Boy Scout
&lt;/h3&gt;

&lt;p&gt;Another deterring aspects of fully testing a completely untested codebase is the potential need for heavy refactoring to support sane testability. Most code written &lt;em&gt;without&lt;/em&gt; testing in mind is often untestable as a result (ie. giant functions, several dependencies, global state, etc). The older and larger the codebase is, the more daunting this task becomes. Combine this with an ever growing backlog of new feature work and looming deadlines and you’re left with a recipe for disaster.&lt;/p&gt;

&lt;p&gt;I don’t blame you.&lt;/p&gt;

&lt;p&gt;Tackling a large, untested codebase head first, much like jumping into an aggressive diet or workout routine, is simply too much to take on at once. The &lt;em&gt;goal&lt;/em&gt; of having a fully tested codebase doesn’t seem feasible. What you want to do is to foster a &lt;em&gt;habit&lt;/em&gt; of piecemeal testing, attacking the monolith one step at a time.&lt;/p&gt;

&lt;p&gt;In her book &lt;a href="https://amzn.to/2EbRGVQ" rel="noopener noreferrer"&gt;Succeed&lt;/a&gt;, &lt;a href="https://twitter.com/heidgrantphd" rel="noopener noreferrer"&gt;Heidi Grant Halvorson&lt;/a&gt; lays out a simple practice to overcome procrastination that she calls an &lt;strong&gt;if-then plan&lt;/strong&gt;, in which we identify a scenario that we would like to respond to by completing a certain task.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Planning creates a link between the situation or cue (the if) and the behaviour that you should follow (the then).”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the cue is encountered, the desired behaviour is triggered &lt;em&gt;automatically&lt;/em&gt;. This is the key to the success of this plan, the sub-conscious response that we teach ourselves won’t tax our self-control and ensuring that the desired task gets completed.&lt;/p&gt;

&lt;p&gt;By adhering to a few simple guidelines, you can teach yourself (and your team) the required if-then plans to leave every nook and cranny of your codebase with better coverage than when you first touched it, as if it were second nature.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test every new bug&lt;/strong&gt;  — When a production bug is reported, your instinct is to immediately sift through logs and attempt to replicate the error locally before proceeding to tinker and develop a solution. Before committing that code, stop and write a test. Not only does this increase code coverage, but it guarantees that if this bug is ever re-introduced it will be caught by your test runner, not your customers. If there’s no test, it didn’t happen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test every new feature&lt;/strong&gt;  — New code is easy to test. You have full control over how to encapsulate your logic, split and limit dependencies and ultimately make the feature as painless to test as possible. Challenge yourself to sensibly test any new code that you write until you’ve achieved a comfortable level of certainty in what you’re about to ship.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test before you refactor&lt;/strong&gt;  — Refactoring runs the risk of introducing regressions by incorrectly re-implementing old code based on misinterpreted intentions. Before you refactor, write some tests to define how the code is functioning correctly today. This way, you can assert and rest assured that your refactored code is functioning exactly as intended.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Integrating these if-then plans into your development process introduces light testing sprinkled throughout your day-to-day tasks. Before you know it, you’ll be thinking about ways to test your code before you write it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make it Simple
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/cduhigg" rel="noopener noreferrer"&gt;Charles Duhigg&lt;/a&gt; compares our willpower to a muscle in his book &lt;a href="https://amzn.to/2H1iRWD" rel="noopener noreferrer"&gt;The Power of Habit&lt;/a&gt;, suggesting that there is only so much willpower we can exert before we run out of steam. Over-exerting ourselves early during trivial tasks results in depleted self-control and lack of discipline when the time comes to apply ourselves for the work that really matters.&lt;/p&gt;

&lt;p&gt;Our work lives are full of tasks that require willpower. Checking emails, keeping JIRA tickets up to date and responding to Slack notifications gradually deplete your willpower reserves throughout the day. Eventually, you can become so drained that you start to slip and lack diligence when it comes time to work on more meaningful tasks (like testing your code).&lt;/p&gt;

&lt;p&gt;While you can take measures to reduce the negative impact and frequency of these menial tasks, the reality for most of us is that we’re not in a position to block them out entirely. What we &lt;em&gt;are&lt;/em&gt; in a position to do is make sure that testing doesn’t get negatively affected by our drained reserves. By making testing as straightforward and painless as possible, we reduce the effort required to write them and in turn minimize the risk of writing rushed, careless tests when we hit our lowest point of determination.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write utility functions&lt;/strong&gt; to reduce duplication of commonly repeated tasks. This is common practice in feature, DRYing out repetition and code duplication. Make sure the same philosophy is applied to test code. Do you find yourself creating a new user, generating a login token and applying to to requests for all API integration tests? Are you always stubbing out Stripe APIs when you test anything payment related? Write a utility that takes care of that for you in one line. The more you extract, centralize and simplify the prep work, the more streamlined and approachable testing becomes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage code snippets/generators&lt;/strong&gt; to bootstrap new tests quickly. As you write more and more tests you’ll establish certain patterns. Your tests will start looking the same. At this stage, taking some time to separate unique test code from the scaffolding will enable the use of code generators. These snippets can be mapped to key combinations in most modern editors and inserted at will, removing the need to hand write (or likely copy/paste) the same code from previous tests over and over again. This is the lowest form of yak shaving that really sucks the enjoyment out of writing software. These templates can act as boilerplates for new tests, removing the busy work and make writing tests feel like less of a chore.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create fixtures for your data models&lt;/strong&gt; that can be used to seed fresh test databases. There’s nothing more frustrating than having to mock and “stage” the right data for your tests, especially if an integration test touches several entities with their own dependencies. Detailed, randomized test fixtures with robust extensibility make data generation a breeze. They even provide the added benefit of painless seeding for local environments and one-off staging servers for demos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make debugging easy&lt;/strong&gt; for everyone. No one likes debugging with print statements. While it’s standard these days to work in an engaging debugging environment for application development, don’t leave your test build hanging. Make sure the effort required to debug and step through test runs is minimal, preferably just as intuitive and supportive as your main application. The last thing you want is to have everyone on the team start skipping broken tests or re-running intermittently failing tests because the effort required to find and fix the root cause is too great.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the right tools at your team’s disposal, testing can become less of a chore and at times even enjoyable. We go to great lengths to make our development environment as pleasant to work with as possible. It’s time to apply the same mindset to our test tooling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Have Rules
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/sandimetz" rel="noopener noreferrer"&gt;Sandi Metz&lt;/a&gt; gave a talk called &lt;a href="https://www.youtube.com/watch?v=npOGOmkxuio" rel="noopener noreferrer"&gt;Rules&lt;/a&gt;, which outlines 5 rules for writing object oriented code. Furthermore, she digs into how social scientists define rules and the impact they have on willingness and self-discipline. The results are illuminating, and the benefits can be applied across domains.&lt;/p&gt;

&lt;p&gt;Ultimately, the rules you set are arbitrary and it’s perfectly okay to break them if reasonable. It’s the very &lt;em&gt;existence&lt;/em&gt; of these rules that bias towards co-operation and collaboration, towards maintaining the “state of things”. By setting hard rules that govern how testing should be done, you are effectively influencing followers to uphold standards and push non-followers towards adhering to your norms.&lt;/p&gt;

&lt;p&gt;When you start thinking about the kinds of rules you want to set for your own team, keep the following two metrics in mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Code Coverage&lt;/strong&gt;  — Add code coverage analysis to your test suite and set some rules dictating how much coverage you intend to maintain. Integrate tooling into your version control provider of choice and automatically block pull requests that don’t meet your standards. Perhaps there are certain limits you want to set per metric or maybe you just want to ensure overall coverage doesn’t decrease. Once again, the rule itself isn’t entirely important. Code coverage metrics are not a silver bullet, but adding limitations will be a constant reminder to the team that testing is a key indicator of quality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Coverage&lt;/strong&gt;  — Writing tests is a good thing, but writing the &lt;em&gt;right&lt;/em&gt; tests is where you get the biggest gains. Just because your code is covered doesn’t mean it is tested sufficiently. New or modified tests should be compared against requirements to ensure all identified use cases have been covered. While this manual process can be tedious at times, these spot-checks instil an understanding of the importance of asserting all required use cases. You may begin to notice that these spot-checks become mute, that use cases are always being covered and these manual checks are only slowing you down. That’s when you know the rules have done their job.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rules can have a profound effect on your team, wether they realize it or not. The metrics detailed above may not be perfect, but they serve the purpose of nudging team members toward the norm of constant, habitual testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Develop Habits That Work For You
&lt;/h3&gt;

&lt;p&gt;Embracing effective software testing patterns can be a daunting, uncomfortable and downright painful experience. It doesn’t have to be. Take advantage of the mechanics hardwired in your brain. Create a framework that fosters the formation of habits that encourage a strong testing culture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Think&lt;/strong&gt; before you write your tests. Make sure you’re getting the maximum return on your investment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If-Then&lt;/strong&gt; plans trigger an automatic response to certain coding scenarios. Take advantage of them to elicit a positive response (via tests).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tooling&lt;/strong&gt; that supports painless testing will ease the barrier of entry for writing future tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules&lt;/strong&gt; will have an impact on the willingness and self-discipline of your team when it comes to diligently testing their code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The final takeaway to making habitual testing a success is &lt;em&gt;believing&lt;/em&gt; that it’s possible. Forming habits can be a challenge. It takes significant time and effort to realize the fruits of your labour, but the result is truly satisfying. To quote &lt;a href="https://twitter.com/cduhigg" rel="noopener noreferrer"&gt;Charles Duhigg&lt;/a&gt; once again in &lt;a href="https://amzn.to/2H1iRWD" rel="noopener noreferrer"&gt;The Power of Habit&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you believe you can change — if you make it a habit — the change becomes real.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Develop positive testing habits that work for you. Don’t trust willpower alone to prevail. Leave conscious choice and debate out of the equation.&lt;/p&gt;

&lt;p&gt;Make it automatic.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for taking the time to read this post!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please ❤️ and follow if you liked what you read and join &lt;a href="https://www.igorbarsi.com/newsletter" rel="noopener noreferrer"&gt;my newsletter&lt;/a&gt; to stay in the loop 😁&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://www.igorbarsi.com/blog/habitual-testing" rel="noopener noreferrer"&gt;&lt;em&gt;www.igorbarsi.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>habits</category>
      <category>testdrivendevelopm</category>
      <category>softwaretesting</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Sprinting Our Way To Missed Deadlines</title>
      <dc:creator>Igor Barsi</dc:creator>
      <pubDate>Sat, 13 Jan 2018 21:17:16 +0000</pubDate>
      <link>https://forem.com/igorbarsi/make-sprints-great-again-2j0a</link>
      <guid>https://forem.com/igorbarsi/make-sprints-great-again-2j0a</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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AU8RD8lCnkkhqf2rUZOC1vg.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AU8RD8lCnkkhqf2rUZOC1vg.jpeg"&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/photos/cckf4TsHAuw?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Andrew Neel&lt;/a&gt; on &lt;a href="https://unsplash.com/?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I was first exposed to Scrum, I fell in love.&lt;/p&gt;

&lt;p&gt;The process was straight forward. The team agrees on a prioritized list of tasks to complete in a consistent block of time. A &lt;strong&gt;sprint&lt;/strong&gt;. You meet daily to touch base, ensuring everything is on track. By the time the sprint is complete, some product functionality has been shipped. The client is happy. Finally, you regroup for a retrospective, discussing what went well and what went poorly. Then you start all over again. It just &lt;em&gt;made sense&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I’ve been fortunate enough to come across some great opportunities throughout my career, exposing myself to diverse development environments and teams across disparate industries. I’ve built in-house line of business applications, campaign/content sites for a variety of clients and currently (at the time of writing) the core platform at a mid-sized startup. Though my experiences in these roles have had many differences, one sobering fact seems to hold true across teams and organizations:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deadlines are missed. Often.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes, estimation is hard. Yes, software project planning is hard. But why, as an industry, do we seem unable to achieve &lt;em&gt;any&lt;/em&gt; level of certainty in our project plans? Agile methodologies have brought us leagues ahead of “waterfall” development, and we have a plethora of industry-vetted estimation techniques (ie. poker points, t-shirt sizing, relative mass, etc) at our disposal, yet dependable roadmaps continue to elude us. I can’t seem to shake the feeling that this &lt;em&gt;should&lt;/em&gt; be working. What have we been doing wrong? What am I missing here?&lt;/p&gt;

&lt;p&gt;After much reflection (and frustration), I’ve come to a realization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time-Boxed Sprints are Problematic
&lt;/h3&gt;

&lt;p&gt;During one of my team’s feature planning sessions, a colleague expressed his dislike of Scrum. He called it “artificial hustle”. His reasoning, and I’m paraphrasing here (my memory is not as sharp as some), was that it's needless “process” inhibiting our work. We have a prioritized backlog. We know how to group and tackle the tasks best. We know that our estimates will inevitably change and tasks will evolve as we work. Why time-box us into uniform segments of work? We can keep daily stand-ups, but run our own retros after a milestone has been reached (ie. a critical feature has been shipped), not after some arbitrary amount of time has passed. It feels &lt;em&gt;forced&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I have to say, I didn’t agree with this sentiment at first, but the focus on &lt;strong&gt;value&lt;/strong&gt; got me thinking…&lt;/p&gt;

&lt;p&gt;Looking back at our recent sprints (and most sprints I’ve been a part of, really), I can’t help but feel as though there was never enough time to ship &lt;em&gt;real value&lt;/em&gt; in the course of a single sprint. By value, I don’t mean stable code or singular components. I mean business value (ie. user stories), a working piece of end-to-end product that can immediately be operationalized and put to use.&lt;/p&gt;

&lt;p&gt;I figured this was a problem with the way our tasks were defined, and perhaps there is some blame to be placed there. However, some stories are simply too large to reasonably break down any further, lest you sacrifice that end-to-end completeness. Even so, a story that is estimated to be around 3 days worth of effort can &lt;em&gt;still&lt;/em&gt; be missed in a weekly sprint, and (at least from my experience) often is. Something’s got to give.&lt;/p&gt;

&lt;p&gt;I forced myself to take a step back and remove my rose-coloured Scrum glasses to objectively scrutinize this process, attempting to pinpoint potential reasons for our lack of efficiency.&lt;/p&gt;

&lt;p&gt;Here’s what I came up with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Too Much Churn
&lt;/h3&gt;

&lt;p&gt;I narrowed down what I believe to be Scrum’s biggest “time-sinks” to the following, un-ordered list. Keep in mind, this is all from personal experience. While I’m sure the processes followed by my previous organizations weren’t perfect (what process truly is?), I feel that these issues are not unique to me and that many of you have had similar gripes with your team’s software planning process.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tasks are too vague &lt;/strong&gt; — Insufficient information is provided in the ticket to guide the implementer down the right path. This is not uncommon, as most clients don’t really know what they want during the first pass of product development. Often times, they need something tangible to have that “ah ha“ moment. However, time-boxing these tasks could lead to squabble and back-and-forth on implementation details that ultimately loses far more time than it would have taken to iron out these details in the first place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tasks aren’t familiar&lt;/strong&gt; — When a task involves unfamiliar tech, new or undocumented APIs or if the domain is inherently complex, original estimates might not hold true throughout the sprint. Letting these tasks slide until your scheduled retrospective before re-estimating and planning could cause needless “trashing” and future rework.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task dependencies within the sprint&lt;/strong&gt;  — Team members become immediately blocked when tasks have dependencies or require further input. There is an illusion that all tasks are “up for grabs” at any time. In reality, what you end up with is contributors tripping over each other trying to glue coupled tasks together between their branches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tasks aren’t related&lt;/strong&gt; — The sprint is full of disparate tasks that require constant context switching. Some teams insist on planning sprint tasks by type (ie. feature, bug, enhancement, tech debt, etc), only allocating a certain percentage of each task type per sprint. This seemingly “even” distribution of work might sound nice to the client/board, but its a constant cognitive juggle for the team. This fragmentation causes a compounding loss of efficiency that is often untracked and poorly reflects on the team’s ability to deliver.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research tasks create additional work&lt;/strong&gt;  — Investigation, if fruitful, leads to the creation of implementation tasks. Deferring said implementation work till a later sprint to avoid “scope creep” costs the team that immediate knowledge they’ve built up during their investigation, only to be ramped up again when approaching the problem a second time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research tasks continue forever&lt;/strong&gt;  — When investigative work is not contained in some way, it becomes very easy for the assignee to get stuck down a rabbit hole. &lt;a href="https://en.wikipedia.org/wiki/Parkinson%27s_law" rel="noopener noreferrer"&gt;Parkinson’s law&lt;/a&gt; might drag them on until the sprint retrospective.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementing another person’s estimate&lt;/strong&gt;  — Regardless of your estimation method of choice, there will always be some discrepancy between contributors. The larger the gap, the further your sprint commitment is from reality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unable to truly maximize effectiveness&lt;/strong&gt;  — When you know you only have a limited time to complete your work, you’ll always shy away from grabbing large tasks near the end of the sprint. This holds especially true if the remaining larger tasks are unfamiliar. What you end up with is most team members grabbing one or two larger tasks, followed by a few small ones near the end, leaving the rest.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Cost of Time-Boxed Sprints
&lt;/h3&gt;

&lt;p&gt;While these issues clearly cause a loss of time and efficiency, there are other potentially more damaging costs that are not immediately apparent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Planning&lt;/strong&gt;  — When contributors are forced to “guesstimate” complex issues in unknown domains for the sake of plugging numbers into a spreadsheet, no real value or certainty is provided to anyone. Not the board, the clients, the Product Manager and definitely not the development team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality&lt;/strong&gt;  — When the team is scrambling to get tasks done before their “time is up”, especially if there is a minimum quota enforced, quality is inevitably sacrificed. Focus is placed on shipping tasks, not valuable working software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credibility&lt;/strong&gt;  — Continually missing release dates and shipping faulty software will degrade your credibility with your clients and ultimately your team.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burnout&lt;/strong&gt; — The stress from rushed work and constant jumping between contexts is unnecessary load that taxes your team’s psychological wellbeing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Morale&lt;/strong&gt; — At some point the consistent lack of quality, missed deadlines and never-ending burnout will ultimately crush the team’s morale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking at the list above, you should be wondering… Aren’t efficiency, quality and timely delivery the very qualities that Scrum (and more generally Agile, for that matter) claims to facilitate? Is this really the best we can do?&lt;/p&gt;

&lt;p&gt;I think we can do better.&lt;/p&gt;

&lt;h3&gt;
  
  
  Value-Based Sprints
&lt;/h3&gt;

&lt;p&gt;In my search to improve my team’s process, I read through Ken Schwaber and Mike Beedle’s &lt;a href="https://amzn.to/2GaQ7JW" rel="noopener noreferrer"&gt;Agile Software Development with Scrum&lt;/a&gt;. The book conveys an understanding of why thinking of software development as “new product” development is necessary, filled with detailed descriptions of the Scrum process backed by plenty of real world success stories. While the book is a bit dated (published 2001), we still follow many of its steps today. However, the following 2 characteristics stood out from what I’ve been used to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Sprints should have a clear goal that the team agrees on.&amp;gt; 2. Sprints should run for a month.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;These points may seem small, but they can have a significant impact. First, setting a goal for your sprints immediately shifts the focus from closing tickets to reaching some milestone, to achieving &lt;strong&gt;value&lt;/strong&gt;. Second, extending sprint time to a month gives your team a lot more breathing room to see entire features through till the end. While I’m not advocating we all extend our sprints (time-boxing in a bigger box doesn’t solve the real issue), you wouldn’t feel encouraged to “shrink” your stories when time isn’t such a constraint.&lt;/p&gt;

&lt;p&gt;The point I’m trying to make is that our focus should be on delivering valuable, working software to our customers and our processes should encourage and facilitate the attainment of that goal.&lt;/p&gt;

&lt;p&gt;I propose we make the following additions/modifications to our sprints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clear sprint goal&lt;/strong&gt;  — A sprint should have a purpose. Hone in on critical features/stories and identify what should be delivered first. A good starting point might be 3 critical deliverables. Everyone on the team should be briefed and understand and agree on what you’re all trying to accomplish at the start of every sprint. Listen to your team and adjust if needed. The sole focus of the group should be to deliver on that goal as efficiently as possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don’t time-box&lt;/strong&gt;  — As we shift our focus from time to value, we lose the constraint to fit as much work as possible into a set amount of time (see &lt;a href="https://blog.bryanbibat.net/2009/08/31/spanish-theory-of-value/" rel="noopener noreferrer"&gt;The Spanish Theory of Value&lt;/a&gt;). That being said, you should still aim for short cycles. A fast feedback loop is key and should be considered when planning each sprint, without constricting it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group related tasks&lt;/strong&gt;  — Fragmentation is a huge productivity killer and so often overlooked. Its understandable, as a product manager, that you want to move your initiatives along while addressing any critical bugs or enhancements that inevitably pop up. The reality is that a sprint full of small tasks that cover a large application footprint kill efficiency. Every time you bounce from task to task you have to wind down and ramp up on the relevant context, dig into a brand new area of code and zone in. It may seem small, but understanding the psychological dynamics of &lt;a href="https://medium.com/@stackenterprise/getting-into-the-developer-flow-state-7b0e5c98eb8a" rel="noopener noreferrer"&gt;flow&lt;/a&gt; will make it clear that it adds up. This doesn’t need to be hard. If you are trying to deliver a feature that affects a view in the application, try to get some high-value bugs in the sprint that touch that same view. If an urgent bug pops up with your login flow, maybe its a good time to tackle some pesky long-lived tech debt to optimize that flow. When your contributors are in a flow state, they can fly through these auxiliary tasks much more efficiently then when they’re scattered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size stories, don’t estimate&lt;/strong&gt; — Attaching time based estimates to stories gives off a false sense of certainty that a task will be completed in that time from the moment it is started. Anyone who has been an engineer or managed them long enough will know this is never the case. Concentration will always be broken to some extent. Use an effort based estimation technique, such as t-shirt sizing or points (if measurements equate to time, you’re cheating), to provide a sense of scale for the deliverable. This is what should be used when planning sprints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Break stories down in detail&lt;/strong&gt; — Granularity is your friend. The more vague a task’s description, the greater the possibility for error during implementation. There is a balance though, as you don’t want your contributors to feel like code monkeys. Your tasks should be clear, with enough information and supporting links to documentation to guide contributors down the right path. No more, and definitely no less.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop if needed&lt;/strong&gt;  — If blockers (ie. design errors, vague requirements, implementation discrepancies, etc) emerge that cannot be resolved quickly then don’t be afraid to stop the sprint. I find this is harder to do when sprints are time-boxed, likely because the team is focused on reaching that deadline. The reality is, these disagreements and surprises end up costing more if ignored, rushed, resolved ad hoc or overlapped with concurrent implementations that end up getting re-written or tossed. Take time to regroup and align, then continue or plan an altered sprint if necessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;At the end of the day, this is all speculative. I’ve never worked at an organization that adopted all or even most of these concepts. There might be some Kanban influence in my thinking, although I’m not knowledgeable enough in the practice to say for sure. What I’m trying to create is a way of thinking that moves focus away from “precise” estimates and process for the sake of (ultimately inaccurate) project planning over to efficiency. To quote &lt;a href="http://agilemanifesto.org/principles.html" rel="noopener noreferrer"&gt;The Agile Manifesto&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Working software is the primary measure of progress.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don’t track time, track progress. The question you must continue to ask yourself is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Are we delivering value to the best of our abilities?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer isn’t a confident “Yes”, perhaps its time to approach your process more critically.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Thanks for taking the time to read this post!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please ❤️ and follow if you liked what you read and join &lt;a href="https://www.igorbarsi.com/newsletter" rel="noopener noreferrer"&gt;my newsletter&lt;/a&gt; to stay in the loop 😁&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://www.igorbarsi.com/blog/make-sprints-great-again" rel="noopener noreferrer"&gt;&lt;em&gt;www.igorbarsi.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>softwareestimation</category>
      <category>projectplanning</category>
      <category>softwareengineering</category>
      <category>efficiency</category>
    </item>
  </channel>
</rss>
