<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Gatsby Starter Blog RSS Feed]]></title><description><![CDATA[A blog from the engineers at OpenSesame.]]></description><link>https://opensesame-engineering-blog.netlify.app</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 03 Sep 2026 08:56:41 GMT</lastBuildDate><item><title><![CDATA[Shortening long feedback loops iteratively]]></title><description><![CDATA[TL;DR; Feedback loops, especially short ones, are extremely important for developing high quality software A rapid feedback loop of < 5-1…]]></description><link>https://opensesame-engineering-blog.netlify.app/shortening-long-feedback-loops-iteratively/</link><guid isPermaLink="false">https://opensesame-engineering-blog.netlify.app/shortening-long-feedback-loops-iteratively/</guid><pubDate>Tue, 10 Sep 2024 20:26:02 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/977138bcc68d81dc8808ab03d9380697/a9a89/feedback-loops.webp&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/webp;base64,UklGRtIAAABXRUJQVlA4IMYAAAAwBQCdASoUABQAPtFgqU+oJSOiKAgBABoJYwC91bAR9QX+gmu9jHxJe83V6zQarnywAAD+5ghjMxLg5in82GkyijVkucJyYdWi5MnCdsBkXaqUKF4cvwzG7N0XgfN0AzCxIHmvsj02OcWZc2h/AHs8Ibgn3YS9lZk3qlfKZRj7DyPDvaHm4OtKLo/M+Q5fNYrlD3dBB8S/hL7xymOKn+LWSWicojxbFpyqOu7lbfsOO1Zq3r2jhHhMvbllh3Q7vtejfCAS0AA=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A series of loops that feedback into each other and serve as a visual metaphor for a cycle that uses feedback to improve a design or feature&quot;
        title=&quot;Feedback loops are at the heart of any system&quot;
        src=&quot;/static/977138bcc68d81dc8808ab03d9380697/8aab1/feedback-loops.webp&quot;
        srcset=&quot;/static/977138bcc68d81dc8808ab03d9380697/81b7c/feedback-loops.webp 158w,
/static/977138bcc68d81dc8808ab03d9380697/6ea66/feedback-loops.webp 315w,
/static/977138bcc68d81dc8808ab03d9380697/8aab1/feedback-loops.webp 630w,
/static/977138bcc68d81dc8808ab03d9380697/a70f5/feedback-loops.webp 945w,
/static/977138bcc68d81dc8808ab03d9380697/a9a89/feedback-loops.webp 1024w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;TL;DR;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Feedback loops, especially short ones, are extremely important for developing high quality software&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A rapid feedback loop of &amp;#x3C; 5-10 minutes is not always possible. If people or manual steps are involved, days may not even be possible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Feedback loops can be shortened over time with iterative releases and small improvements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When fixing a bug or finding an issue, we can ask ourselves “What would have helped us find this sooner?” Several iterations of this sort can quickly add up to massive gains in shortening feedback loops.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We can apply this to the development of new features as well through the use of Vertical Slices and early demoing to product owners and stakeholders.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Feedback loops are a key aspect of any system. Software is no different.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lately, I’ve been thinking a lot about feedback loops and cycles. An important part of being able to move quickly is getting feedback quickly so any corrections can be made as close to the source as possible. As engineers, we excel when this feedback loop is very short indeed. This is a big benefit of certain practices like Test-Driven Development.&lt;/p&gt;
&lt;p&gt;But Enterprise software can be challenging. It’s not always possible for important feedback loops to happen in the span of seconds, or even minutes. Sometimes, feedback loops can even take weeks or months.&lt;/p&gt;
&lt;p&gt;How many times have you been fixing a bug and realized the code that causes the bug has been checked in for months without problems? The cycle from the point of the bug being introduced and it being fixed has been a very long one. The context from the work done when the bug introduced may be lost. It could even be that the engineer that wrote the original code is no longer with the company.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A simple first step for shortening future cycles is asking ourselves: “What information could have helped us get this feedback sooner?”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It doesn’t need to be a large architectural change, or massive sweeping code change to make our lives better. Iterative improvements add up over time. They take on similar elements as compounding interest.&lt;/p&gt;
&lt;p&gt;As we develop the practice of easing our pain one step at a time, future steps become easier to take. And by working on bringing the feedback loop back closer to the original context, we can also increase the options we have available to use for shortening the feedback loop. Perhaps you can start using runtime asserts, or improved logging, or compile-time feedback for code issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We can apply these thoughts to developing new features as well.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The sooner we get feedback on new features we develop, the cheaper it is to react to that feedback. We can use techniques like Vertical Slides combined with early and frequent demos to product owners and stakeholders to help guide our work through a new feature.&lt;/p&gt;
&lt;p&gt;The longer you wait to get feedback on a new feature, the more painful it can be to react to feedback. We start experiencing potential pains around excessive rework, or wasted time from building the wrong feature.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Rapid Prototyping]]></title><description><![CDATA[Rapid prototyping is using the scientific method to quickly (usually within a single day) prove an approach to solving a problem. For…]]></description><link>https://opensesame-engineering-blog.netlify.app/rapid-prototyping/</link><guid isPermaLink="false">https://opensesame-engineering-blog.netlify.app/rapid-prototyping/</guid><pubDate>Mon, 26 Sep 2022 17:31:04 GMT</pubDate><content:encoded>&lt;p&gt;Rapid prototyping is using the scientific method to quickly (usually within a single day) prove an approach to solving a problem.&lt;/p&gt;
&lt;p&gt;For software engineers, rapid prototyping is usually used to test a technological solution’s usability and functionality. Rapid prototyping can also be done to quickly create testable UI/UX experiments that can be presented to a group of users to identify the best design. Rapid prototyping does not always include writing code or building software.&lt;/p&gt;
&lt;h2&gt;Principles&lt;/h2&gt;
&lt;p&gt;These are the principles that should be followed during the rapid prototyping process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Always investigate the parts of the problem that is least understood first.&lt;/li&gt;
&lt;li&gt;Usually investigate the easiest parts of the problem that are least understood first.&lt;/li&gt;
&lt;li&gt;Always use the scientific process to investigate the solution.&lt;/li&gt;
&lt;li&gt;Always take the time to clearly demonstrate the results of the experiments used to investigate the solution.&lt;/li&gt;
&lt;li&gt;Always look for ways to demonstrate your prototypes and experiment outcomes on a daily cadence.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Process&lt;/h2&gt;
&lt;p&gt;For each problem:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1efe10fd2a9450ce15c24681dc3c4ead/58fee/rapid-prototyping.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.15189873417721%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACUUlEQVQ4y3WTzU8TURTF+1+4daNbN7pRNkpcaVwYE2FjIhsFQkKCJihBV35tkIViIlEUY5QQMQLhyxDrpkaJKV0UhGChUKF0Op122tKZ6cz8zLzpjC2Wk9zMnffePTn3nfsCtm3jhQfLttzEhlVDYkJbZjATYuz7HNm8KrZMy6yp8TgCVEHTNEzTFLlcLvJIDdK5M8bD7VnurHzgVNcljracZuTrpF9TKpWqKQgUCgXS6bSI9VgMpaAiW0W6lSn6Nz+ztbXFXkZlL5cnr+R4NTnCocvHeTM/hl42WIv9JplMoigKsiwTUFVVLEiSJMLUDQYK33iQmKGUVNxW3O6xKi2+m/3I4SsNrCZi5HMqu7u7otb51rTsoGDpdMkThDdXwLT3b2NhYxQ1ztxo4unE8H/7AUeBY4JpWULGip6ie2ecRHJb/Ou6TjgcJhgMks1mhRkO2vt7aHvSK/KyWRYcwhTPHa+dNV2iR55mR0o51rG0tEQkEiEajbKwsICckcW563236Bi4WyE0/7m8f2w0q0zzj8d8inwB0727/ZBTaU60nWdobtRXWJfQU9k6fp/GF9fISYpgdGyx3ATK0Dc1xJH2RlKZtHuvllWf0FPpzGLz6G0uDHcSWv6JmslSyhVZT8S5N/ucYwNNhDYWawa8fssVgxzohkHv/DNODl7l7MtWzr3uoGGwhYvvb7L455dPVv1KDlToPz0gmUszsxribWSaaHLNXxdkdi1ZXUJXqXuwXFHgwNB0X403YvVq6xJWq1XzKhvxDeLxOCkp5a8fVPMXzKQMMRF2SkEAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Rapid prototyping&quot;
        title=&quot;Rapid prototyping&quot;
        src=&quot;/static/1efe10fd2a9450ce15c24681dc3c4ead/f058b/rapid-prototyping.png&quot;
        srcset=&quot;/static/1efe10fd2a9450ce15c24681dc3c4ead/c26ae/rapid-prototyping.png 158w,
/static/1efe10fd2a9450ce15c24681dc3c4ead/6bdcf/rapid-prototyping.png 315w,
/static/1efe10fd2a9450ce15c24681dc3c4ead/f058b/rapid-prototyping.png 630w,
/static/1efe10fd2a9450ce15c24681dc3c4ead/40601/rapid-prototyping.png 945w,
/static/1efe10fd2a9450ce15c24681dc3c4ead/58fee/rapid-prototyping.png 1051w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Identify the Problem&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/138d7b12353a10266728d797627e8083/76a99/identify-the-problem.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.62025316455697%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACMElEQVQ4y5WUTWsTURSG81f8BV2I4KrQXyCC4FKt6EYXghvtTi24deOideVHoZWWFgVLSVohtEnzXZUYlVSC2pkkZpJMZqbzPY/MjZmOrUE8cODO3HOfYd7znpsIgoBRjsKP1gFyz+f9d9goq+Q+tqIaz/OjdZyRIBaWZeF5nlh3NY/XJZvFdJc3hS4PF6qcuvCMc3eTdPqHosa2HRzHiSNImKaJpmkiJUlC0w/pGQGLGZOtkkS7JaMN+hhanx8HB1ycecWZa2s0lUOa7Q7tdhtd11FVVWSiXq9TqVQol8vs7e0xUHukqj4beRlLVzgR7oCpG8vcflzAUH+SLxQpVyo0Gg06nQ6JuHZhGFbA0o5O45skNAy/ns/nKZVKOO5QjpXkO85eX4t0jBMScVHDrVbfY2lbRVE6Qp9UKkUmkxGZzWbFoUr1KxOXXiIrxrCJfqwpx7vc1z2WMwNazaZ4DmXY3NwknU5T398X797mPnF6egVVtyNXjAWCz+U5nfl1GTCxHJ9mq40kN3G8sMbiyoN1zs8kI/sE44Aj/y1lTSbvKex+OIBA+61SAG6P1R2ZiVs1ctWhJ73Y754ADnMo88K2weT9LneeS7zYknialLj5RGZqtsf2ZyeChbX/AAaMhuCLZDO7qjM9p3F1XuPRukGr7wjI32BjgUPokRks08Rz7aOxC/fGnBsLFB52PSzbRel2GQw0HNf/wyL/DQxnu1gsikna3c1Rq9VOXAbHgb8ALkAZUahN/FAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Identify the problem&quot;
        title=&quot;Identify the problem&quot;
        src=&quot;/static/138d7b12353a10266728d797627e8083/f058b/identify-the-problem.png&quot;
        srcset=&quot;/static/138d7b12353a10266728d797627e8083/c26ae/identify-the-problem.png 158w,
/static/138d7b12353a10266728d797627e8083/6bdcf/identify-the-problem.png 315w,
/static/138d7b12353a10266728d797627e8083/f058b/identify-the-problem.png 630w,
/static/138d7b12353a10266728d797627e8083/40601/identify-the-problem.png 945w,
/static/138d7b12353a10266728d797627e8083/76a99/identify-the-problem.png 1117w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;1. Define who the problem is being solved for&lt;/h4&gt;
&lt;p&gt;When attempting to solve a problem, identify the stakeholders who are experiencing the issue. Knowing the people allows you to better target the solution and understand the underlying problems. It is rare that a problem is simple.&lt;/p&gt;
&lt;p&gt;For example, you might be told that you need to figure out how to create an HLS stream from a set of files - video, captions and secondary audio. That seems like an easy problem, but the audience can matter greatly. Is the audience technically savvy enough to be able to get an OAuth token with the correct scopes and call an API endpoint that has dozens of required parameters? Or must the solution abstract all requirements in as simple a method as possible so that they do not have to understand the process before starting?&lt;/p&gt;
&lt;p&gt;The audience is an integral part of the problem to solve. And there may be multiple audiences! Identify the problem for EACH person that needs the solution!&lt;/p&gt;
&lt;h4&gt;2. Define what the person wants to be able to do&lt;/h4&gt;
&lt;p&gt;The next most important part of identifying the problem is describing what the person wants to do. Try to avoid placing a specific solution in this statement. Do not write: “Joe wants a button on the lower left of the page that processes the form through system X” - that isn’t really what Joe wants (though that might be what Joe insists on!). A better statement might be, “Joe wants to be able to send the invoice information to system X.” The new statement opens the door to finding the best possible solution for what Joe needs.&lt;/p&gt;
&lt;h4&gt;3. Define why the person wants to be able to do it&lt;/h4&gt;
&lt;p&gt;The final part of the problem statement is crucial when someone is trying to implement a solution. WHY someone wants to be able to do something allows the solver to change direction and pick a better solution if the original path ends up being a dead end. For example, suppose Joe wants to be able to send invoice information to system X because system X is the system of record for that information. In that case, the solver will need to ensure the information gets to system X. They will realize that it’s not an acceptable alternative to send that information to system B instead - unless system B ALSO sends the information needed to system X.&lt;/p&gt;
&lt;h3&gt;Investigate a Solution&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/286bcbced106881477b8d1810725b5f6/96220/investigate-solution.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.92405063291139%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACSklEQVQ4y42TzU8TURTF++e4Jv4DbliwcKEmxoWJYkhkw0oXJO40IXFhjAuE6AphY1AhUVBDbJVKm2krtGpSvtKWFqZTZNqhzHQ+3szPzIxTWth4k0nuu7nnvHvuOxPzPI8odF1H0zRqtRqW7WA5HpuyILUDr+KHzH7exjAF7RMDRVE4RYLP438x/2CaJpVKhUKhgCRlyG/kKNc7vJEsFr4rfNuoM/tpm8GxeS6OLLKS3iInrVEqVyiXyzQajS5pLEocxzmd1HSZT+lIP6scNxsI2wDXwjU1ns6tceHGHFul/aDXsmyEEKeEvZLD3GNspsPLjzJYraBuWjamaf3rMrnzaJnbE19DzFnJURIRn3QEgxNNvvyQAcGBLJNKpZAkiXpdCXo+rBYZGE1gWqKPrE+y64bT1VuCq0+O2N3zwS7J5Hfi8TiJRIJMJhvUiiWFm5PHWLYbYNxeQtd1u7e0Wk3Uts3QY43VjVpQr9b2SSaTpNNpqrWDoBbPVbn+TEPv2LRaLXojJssyxWKR9fV1Mtkcjt3h4TuD0RcNcMJmf/jups1D7k7LTK6YWKZONpsjn88HeN9uXduoqoqqNgNJhg2XHmxyZXyJel3GcwxwdHZK+4w8lxme1hC+Mk9wdKQGU/r+9Z3S98p+CBGeC9sNhu4tMXDrNdfG33P5/iIDw28ZnlJRtGh3nIu+V45sI3o6f+3+YWrhNzPLm+xUQwXBGoI99GPP2abXPj4gIvb3ihca369FF3v/S9hLfNxuB79XZa+KYXTO+e4s4V+qosYRF9HcZAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Investigate a solution&quot;
        title=&quot;Investigate a solution&quot;
        src=&quot;/static/286bcbced106881477b8d1810725b5f6/f058b/investigate-solution.png&quot;
        srcset=&quot;/static/286bcbced106881477b8d1810725b5f6/c26ae/investigate-solution.png 158w,
/static/286bcbced106881477b8d1810725b5f6/6bdcf/investigate-solution.png 315w,
/static/286bcbced106881477b8d1810725b5f6/f058b/investigate-solution.png 630w,
/static/286bcbced106881477b8d1810725b5f6/40601/investigate-solution.png 945w,
/static/286bcbced106881477b8d1810725b5f6/96220/investigate-solution.png 1165w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;1. Identify the unknown or assumption about the solution that will be tackled next&lt;/h4&gt;
&lt;p&gt;Given any problem and a potential solution, there will be proven hypotheses about the answer, unproven hypotheses that we believe to be true or false (assumptions) and unproven hypotheses that we don’t know to be true or false (unknowns).&lt;/p&gt;
&lt;p&gt;Categorizing each hypothesis in the buckets of &lt;em&gt;proven&lt;/em&gt;, &lt;em&gt;assumed&lt;/em&gt;, and &lt;em&gt;unknown&lt;/em&gt; can be a powerful way of prioritizing the work needed to establish a solution. Remember that a proven hypothesis must be able to be demonstrated, even if the team didn’t create the demonstration.&lt;/p&gt;
&lt;p&gt;When prioritizing, follow this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prefer investigating unknowns to assumptions&lt;/li&gt;
&lt;li&gt;Prefer investigating the most difficult items that can be proven the quickest first&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2. Advance a hypothesis about the unknown or assumption and identify the quickest way to test (prove or disprove) the hypothesis&lt;/h4&gt;
&lt;p&gt;A hypothesis proposes that, given specific inputs, a particular outcome will be achieved. For example, Terraform can be used to provision an AWS S3 bucket with publicly accessible contents for any source. The inputs are not necessarily explicit in this example. They may need to be investigated further, but the outcome is crystal clear, and the hypothesis can be proven or falsified through an experiment. The experiment, in this example, might be following the Terraform documentation to create an AWS S3 bucket and reviewing the resulting bucket in AWS to see if it has the expected properties - perhaps by downloading a file from the bucket from multiple browsers on different machines in different locations.&lt;/p&gt;
&lt;h4&gt;3. Execute the test&lt;/h4&gt;
&lt;p&gt;Once the best and quickest test approach has been identified - get it done! The idea is to get the data you need to prove or disprove the hypothesis as quickly as possible - be aware this may not involve any coding or even using an application.&lt;/p&gt;
&lt;p&gt;It is important to remember that executing a test usually involves more than a few unknowns - things go wrong! When they do go wrong, you will want to identify the following items quickly:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Do I need to resolve the issue, or can I go around it?&lt;/li&gt;
&lt;li&gt;Is there another way to execute the test that I can try out?&lt;/li&gt;
&lt;li&gt;Is there another test I can perform to get the data I need?&lt;/li&gt;
&lt;li&gt;If this is the only way forward, and I need to solve the problem, how long should I spend on it before reaching out for help? And what is the best source for help to use?&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;4. Record the results and use the results to build a demonstration.&lt;/h4&gt;
&lt;p&gt;When the test is complete, you should have some data that can be used to prove or disprove your hypothesis. Take the time to record the uncovered data, and ensure the results can be shared with the audience intended for your prototype.&lt;/p&gt;
&lt;p&gt;Recording everything can take more time than executing the test! That is okay; demonstrating your test results is at least as necessary as performing the test in the first place.&lt;/p&gt;
&lt;p&gt;Make sure the demonstration of the results is compelling, clear and appropriately presented for your audience - the information you provide should help your audience understand what the test results imply and build consensus about the next steps to proving the hypothesis.&lt;/p&gt;
&lt;h4&gt;5. Identify any additional unknowns or assumptions about the solution that have been uncovered&lt;/h4&gt;
&lt;p&gt;Tests usually do not provide data that proves or disproves anything conclusively without any possibility of disagreement. In most scientific studies, the conclusions section includes paragraphs of ideas about how to investigate the hypothesis further to clear up additional identified assumptions or unknowns discovered during the study. The conclusion almost ALWAYS recommends further tests and investigations.&lt;/p&gt;
&lt;p&gt;Don’t be discouraged if your tests turn up more unknowns than you had before running the test! Further understanding the hill that needs to be climbed to prove or disprove your hypothesis is an excellent outcome of your tests. Record your new unknowns and uncovered assumptions, and use that information to identify the next test that should be run.&lt;/p&gt;
&lt;h3&gt;Demonstrate Results&lt;/h3&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/adb428985274220b25d72e90b653814b/76a99/demonstrate-results.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.62025316455697%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACcklEQVQ4y32Sy2sTYRDA82d41oNn/wLBi4iHnhQv9YEexV4ERRDFHnxcRMWADxAqTaGIohZCIFGiNNU0JlqaNrRpEpNsXts8Npts0t399ie727RpjQ4MHzPzze+b+WY8AEII2u02qqrS7XaRJAm107VDyIrgV94itGwwFchQrKmOvyCVaTTqzv1Brs3x2EHDMCiXy+RyOaLRKLHYIqWKTDhlMfO1hf97mblvVc7dCXDw1DQPfEvkMussLsacvIGaponHsiyGxTUFX1Z13kdqFIsFNLVJX1Mx+20W4ikOn5nm6dsko8QB2mqXawoXPj2vc8PXoClL9hP7UizmYykOnfaxmms4HtMUCEs4nB2grS7Q4sLzDrdnJLC66IYgnU4TDoepVCoOoK8pHL38kcnXK45tmGKHsVvhoHVLcNar8GG+6JixH3H8fj+RSMQ5i1IJ6HF3tsBDf9+tULALHG6m2VIAnfPPOrwK2MA+5UqNYDBIKBQikUigqF3QFa5NSbz4bAM1Ol1t9w9lWWZjY4O1tXWSyRVn/PbL409qWH33j5S2Sr3eYEs3HTtfkDh5f5OFdYNNuUY2m6VUKjmT9lSrVWddCoUCv/N5+j0NbcvixL1NrnrjdFryUA8meanGRW+VW2/cfazWZFKpFDan1+vtbdldcvdMpJscGPNxfOIdj2cWmJpLcNMb5MiVn1x6qWEJ4/9rM6yDASlqj0ezS4xdD3BsYo7xyU8EoiXczt17+3NHAvdMfVvkurJnF934CCD/EPcCdLUe9UaTer1OS2mj64a76pY1umWxXc1fKoSTqHY6LCeTxONxMpksW7ru+O34qLw/1bsO+kfynykAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Demonstrate results&quot;
        title=&quot;Demonstrate results&quot;
        src=&quot;/static/adb428985274220b25d72e90b653814b/f058b/demonstrate-results.png&quot;
        srcset=&quot;/static/adb428985274220b25d72e90b653814b/c26ae/demonstrate-results.png 158w,
/static/adb428985274220b25d72e90b653814b/6bdcf/demonstrate-results.png 315w,
/static/adb428985274220b25d72e90b653814b/f058b/demonstrate-results.png 630w,
/static/adb428985274220b25d72e90b653814b/40601/demonstrate-results.png 945w,
/static/adb428985274220b25d72e90b653814b/76a99/demonstrate-results.png 1117w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;1. Gather discovered data and feedback&lt;/h4&gt;
&lt;p&gt;Data is the results of your tests and should not include any interpretation of what has been found. Here is an example of the difference between data and information:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;﻿Data&lt;/th&gt;
&lt;th&gt;Information&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;﻿Twelve percent of the requests to the endpoint returned a 404 error.&lt;/td&gt;
&lt;td&gt;The endpoint has a high enough failure rate that, in order to use it and provide consistent results, we will need to retry our requests up to five times.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;﻿There are three documented methods available to use the service and get the data required.&lt;/td&gt;
&lt;td&gt;There are three options to get the required data, and we will need to test each to determine which methods are the best option for our requirements.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Feedback is another significant output of your tests and the overall process. Feedback is information, requests or discoveries that come from what you’ve learned or from what has been gathered through the “demonstrate results” cycle. Feedback can come in the form of discovering additional unknowns, new existing assumptions, changes in the approach, problem statement or desired outcome.&lt;/p&gt;
&lt;h4&gt;2. Convert the data into information&lt;/h4&gt;
&lt;p&gt;The data is interesting - and should be recorded and accessible to your stakeholders and team - now and in the future. However, it’s not particularly useful on its own. Take a look at the data, and offer an interpretation - what does the data mean? How does it affect your hypothesis? What changes should be made to the thesis? Should there be changes to the next step or experiment? Does the data point strongly that proving or disproving the hypothesis is complete?&lt;/p&gt;
&lt;h4&gt;3. Tell the story with the information&lt;/h4&gt;
&lt;p&gt;Information is excellent - it is a great way to explore the data with the consumers of that information. It can guide and inform the process. However, it can also be boring, and a lot of information can be hard to synthesize, understand, and act on. The information gathered in your experiments is to indicate and decide upon action.&lt;/p&gt;
&lt;p&gt;How do you build consensus around a course of action? Through telling a story. Find a way to explore the information - to explain why it is what it is and how it leads you to the conclusions you have reached. Whether that conclusion is “more tests needed - and here’s the next one” or “we’ve proven the hypothesis - the prototyping is complete,” the story carries the consumer along. It puts together a clear and compelling picture of what should be next.&lt;/p&gt;
&lt;h4&gt;4. Show something that demonstrates the story&lt;/h4&gt;
&lt;p&gt;Stories are great. And sometimes, just reading a story is an inspiring experience. But these days, SHOWING your story is usually the most effective way of sharing what you have learned. Think about how you can show what you’ve learned in a way that your audience can easily understand and enjoy. Is it a quick demo of the click-through website that shows how to get the work done? A graphic with a couple of bullet points? A video that walks them through the problem, your data, and the interpreted results? Maybe it’s a course built in Simon?&lt;/p&gt;
&lt;p&gt;Spend some time creating a presentation. The experiments and the tests - these are important - but to finish a prototype, you need to build understanding as well as consensus about the next steps - and a good demonstration can’t be beaten to meet those goals.&lt;/p&gt;
&lt;h4&gt;5. Gather feedback from the demonstration&lt;/h4&gt;
&lt;p&gt;If you told a good story and demonstrated it well, your audience will be invested in the outcome and may have valuable feedback about what you’ve discovered. This feedback may help you decide what tests need to run next or give you a different direction - even a different hypothesis!&lt;/p&gt;
&lt;p&gt;Record the feedback, and identify your action items. Then, do whatever is next!&lt;/p&gt;
&lt;h2&gt;D﻿efinitions&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;﻿Word&lt;/th&gt;
&lt;th&gt;Definition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.google.com/search?q=hypothesis+definition&amp;#x26;oq=hypothesis+definition&amp;#x26;aqs=chrome..69i57j0i512l4j69i64l3.4408j1j7&amp;#x26;sourceid=chrome&amp;#x26;ie=UTF-8&quot;&gt;hypothesis&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A supposition or proposed explanation made on the basis of limited evidence as a starting point for further investigation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.google.com/search?q=scientific+method&amp;#x26;sxsrf=ALiCzsaUk_dHLjT6nxZEnzNQpZjuPpVS1g%3A1656436367434&amp;#x26;ei=jza7YqTQGdfDkPIP5-eb2AE&amp;#x26;ved=0ahUKEwjk05eq0tD4AhXXIUQIHefzBhsQ4dUDCA4&amp;#x26;uact=5&amp;#x26;oq=scientific+method&amp;#x26;gs_lcp=Cgdnd3Mtd2l6EAMyCAgAEIAEELEDMggIABCABBCxAzIICAAQgAQQsQMyBQgAEIAEMggIABCABBCxAzIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEOgQIIxAnOgQIABBDOgoIABCxAxCDARBDOgQILhBDOgcIABCxAxBDOgoIABCABBCHAhAUOgsIABCABBCxAxCDAToNCAAQgAQQhwIQsQMQFDoICAAQsQMQgwFKBAhBGABKBAhGGABQAFi7D2DNEWgAcAF4AIABVYgBxgeSAQIxN5gBAKABAcABAQ&amp;#x26;sclient=gws-wiz&quot;&gt;scientific method&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.google.com/search?q=scientific+method&amp;#x26;sxsrf=ALiCzsaUk_dHLjT6nxZEnzNQpZjuPpVS1g%3A1656436367434&amp;#x26;ei=jza7YqTQGdfDkPIP5-eb2AE&amp;#x26;ved=0ahUKEwjk05eq0tD4AhXXIUQIHefzBhsQ4dUDCA4&amp;#x26;uact=5&amp;#x26;oq=scientific+method&amp;#x26;gs_lcp=Cgdnd3Mtd2l6EAMyCAgAEIAEELEDMggIABCABBCxAzIICAAQgAQQsQMyBQgAEIAEMggIABCABBCxAzIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyBQgAEIAEOgQIIxAnOgQIABBDOgoIABCxAxCDARBDOgQILhBDOgcIABCxAxBDOgoIABCABBCHAhAUOgsIABCABBCxAxCDAToNCAAQgAQQhwIQsQMQFDoICAAQsQMQgwFKBAhBGABKBAhGGABQAFi7D2DNEWgAcAF4AIABVYgBxgeSAQIxN5gBAKABAcABAQ&amp;#x26;sclient=gws-wiz&quot;&gt;&lt;/a&gt;A method of procedure that has characterized natural science since the 17th century, consisting in systematic observation, measurement, and experiment, and the formulation, testing, and modification of hypotheses.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://www.techtarget.com/searchsoftwarequality/definition/user-story&quot;&gt;﻿user story&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.techtarget.com/searchsoftwarequality/definition/user-story&quot;&gt;&lt;/a&gt;A user story is a tool in Agile software development used to capture a description of a software feature from a user’s perspective. The user story describes the type of user, what they want and why. A user story helps to create a simplified description of a requirement.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://uxplanet.org/back-your-prototypes-with-science-8-methods-explained-cdd58d9a8f42&quot; title=&quot;https://uxplanet.org/back-your-prototypes-with-science-8-methods-explained-cdd58d9a8f42&quot;&gt;Back your prototypes with science — 8 methods explained&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.mountaingoatsoftware.com/agile/user-stories&quot; title=&quot;https://www.mountaingoatsoftware.com/agile/user-stories&quot;&gt;User Stories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.khanacademy.org/science/biology/intro-to-biology/science-of-biology/a/the-science-of-biology&quot; title=&quot;https://www.khanacademy.org/science/biology/intro-to-biology/science-of-biology/a/the-science-of-biology&quot;&gt;The scientific method&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[How to Easily Update Dependencies with Supporting Packages]]></title><description><![CDATA[Photo by Alfons Morales on Unsplash One of your dependencies needs to be upgraded, but it has several plugins or supporting packages. How…]]></description><link>https://opensesame-engineering-blog.netlify.app/using-npm-check-updates-to-update-dependencies-and-supporting-packages/</link><guid isPermaLink="false">https://opensesame-engineering-blog.netlify.app/using-npm-check-updates-to-update-dependencies-and-supporting-packages/</guid><pubDate>Mon, 12 Sep 2022 19:14:44 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4250f8bad3638c439441889685ef6193/10bb7/alfons-morales-ylswjsy7stw-unsplash.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.86075949367089%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIDBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAACA//aAAwDAQACEAMQAAABz3kebqDCP//EABoQAAICAwAAAAAAAAAAAAAAAAACAREDEjH/2gAIAQEAAQUCUkuDhkWm1P/EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAGhAAAgIDAAAAAAAAAAAAAAAAAAEQITFRcf/aAAgBAQAGPwKzEdYluP/EABwQAQACAwADAAAAAAAAAAAAAAEAESExQVFxof/aAAgBAQABPyEWYVHXD9nksnHogDWG2ZRW13P/2gAMAwEAAgADAAAAEN8v/8QAFhEBAQEAAAAAAAAAAAAAAAAAACEB/9oACAEDAQE/EJxX/8QAFhEBAQEAAAAAAAAAAAAAAAAAACEx/9oACAECAQE/ENI//8QAHRABAQACAQUAAAAAAAAAAAAAAREAITFBYXGRsf/aAAgBAQABPxDlGEoyvvDk4konxlVtjUDOib2LueO+JfQIRZl+lEc5/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A shelf with books&quot;
        title=&quot;A shelf with books&quot;
        src=&quot;/static/4250f8bad3638c439441889685ef6193/828fb/alfons-morales-ylswjsy7stw-unsplash.jpg&quot;
        srcset=&quot;/static/4250f8bad3638c439441889685ef6193/ff44c/alfons-morales-ylswjsy7stw-unsplash.jpg 158w,
/static/4250f8bad3638c439441889685ef6193/a6688/alfons-morales-ylswjsy7stw-unsplash.jpg 315w,
/static/4250f8bad3638c439441889685ef6193/828fb/alfons-morales-ylswjsy7stw-unsplash.jpg 630w,
/static/4250f8bad3638c439441889685ef6193/0ede0/alfons-morales-ylswjsy7stw-unsplash.jpg 945w,
/static/4250f8bad3638c439441889685ef6193/3ac88/alfons-morales-ylswjsy7stw-unsplash.jpg 1260w,
/static/4250f8bad3638c439441889685ef6193/10bb7/alfons-morales-ylswjsy7stw-unsplash.jpg 5957w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;https://unsplash.com/@alfonsmc10?utm_source=unsplash&amp;#x26;utm_medium=referral&amp;#x26;utm_content=creditCopyText&quot;&gt;Alfons Morales&lt;/a&gt; on &lt;a href=&quot;https://unsplash.com/s/photos/library?utm_source=unsplash&amp;#x26;utm_medium=referral&amp;#x26;utm_content=creditCopyText&quot;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of your dependencies needs to be upgraded, but it has several plugins or supporting packages. How can all of these packages be updated efficiently? Using &lt;a href=&quot;https://eslint.org/&quot;&gt;ESlint&lt;/a&gt; on a sample project, this post will show an easy way to check and update all of these packages.&lt;/p&gt;
&lt;h2&gt;n﻿pm-check-updates&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/raineorshine/npm-check-updates&quot;&gt;npm-check-updates&lt;/a&gt; library allows you to check what updates are available for your dependencies. We want to check for updates on any packages that have a common word in their name, so &lt;code class=&quot;language-text&quot;&gt;npm-check-updates&lt;/code&gt; accepts as an argument a package name or regex. Execute the following in the root directory of the project  with the name of your dependency.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;npx npm-check-updates &quot;/.*eslint.*$/&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The regex will match all packages that have that word in the name:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/29ab08046634d24ae4e289c8465cad33/5a791/screen-shot-2022-08-16-at-2.01.25-pm.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 32.911392405063296%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAABYlAAAWJQFJUiTwAAABAklEQVQoz31RXW+EMAzjG0ZbKNDSluM6EOz//0RPyR0TD9serFhR6jhuYrYD85eDeggYK7FtGt4rxDhgWTxi/MR5njiOA/u+MxdCoO97rOsKYwyjKApG4qyBsw7OejjnEcIDISxY14jnM/LjrusYbdsiz3MkSfI3qqpC0zSo65rri1do2w8WuA+nacqCVK9elmXIaMnVizFCKcUgF8MwMJ+mic+6C3rv+UxyfYlKIaDXJ7Jev+astfAhcA7ESYg4Ob5cXYLkOITAV9wdTvOMsn33dNfBzRZmmjCOIzvkcH/Jh+KhhVR/YqBFSiEty3dPKjCEZAeD1ix6gVxLKf//iBu+AQGVnTQ7GSWcAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;An image of the command line after checking for updates. A list of package names that match the regex are displayed with the current and latest versions. &quot;
        title=&quot;Result of running npm-check-updates&quot;
        src=&quot;/static/29ab08046634d24ae4e289c8465cad33/f058b/screen-shot-2022-08-16-at-2.01.25-pm.png&quot;
        srcset=&quot;/static/29ab08046634d24ae4e289c8465cad33/c26ae/screen-shot-2022-08-16-at-2.01.25-pm.png 158w,
/static/29ab08046634d24ae4e289c8465cad33/6bdcf/screen-shot-2022-08-16-at-2.01.25-pm.png 315w,
/static/29ab08046634d24ae4e289c8465cad33/f058b/screen-shot-2022-08-16-at-2.01.25-pm.png 630w,
/static/29ab08046634d24ae4e289c8465cad33/40601/screen-shot-2022-08-16-at-2.01.25-pm.png 945w,
/static/29ab08046634d24ae4e289c8465cad33/5a791/screen-shot-2022-08-16-at-2.01.25-pm.png 1248w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For each package matching the regex, you will see the current version and the latest version. Check that the list of packages includes all that you want to update. If not, adjust the regex. &lt;/p&gt;
&lt;p&gt;Notice the color-coding of the version numbers. Any versions that are colored red indicate a major version, cyan indicates a minor version, and green means a patch upgrade. To upgrade every package on the list to the latest version, run the same command, but with the &lt;code class=&quot;language-text&quot;&gt;-u&lt;/code&gt; flag. This will modify package.json to have the latest version numbers.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/956f9f318015acffd034e8bfbad43ad3/5a791/screen-shot-2022-08-16-at-2.39.06-pm.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 32.278481012658226%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA7ElEQVQY04VQ0Y6DIBBEpFZEYUGhasH+/1fOZfFq0iaXe5jAbmZndlasrxdSORBzwrwHpOSRc6woZcXzmbHvO47jQM4ZpRSM4wilFKZpgjEGWutat20LscwzyDmQJZAjEHlY6+B9wLJEeO8hhKgDjKZpav0nJmtB3sOMprqxOzuzawgBfd9fZBYkoo/eTSn0jiC6+9njCByHidZaOOfqy5uxgZTyGu667uK+N2XBpRS0Zjh5MUasjwdKzti3td4rpVTFvuOw+LZt1fAt2EqJECOamzp5ehjQdHfIXldwLI7L23A0/g/M+e92v/gB8JyGQIn6L8EAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;An image of the command line after checking for updates. A list of package names are displayed with the previous and current versions. &quot;
        title=&quot;Result of running npm-check-updates -u&quot;
        src=&quot;/static/956f9f318015acffd034e8bfbad43ad3/f058b/screen-shot-2022-08-16-at-2.39.06-pm.png&quot;
        srcset=&quot;/static/956f9f318015acffd034e8bfbad43ad3/c26ae/screen-shot-2022-08-16-at-2.39.06-pm.png 158w,
/static/956f9f318015acffd034e8bfbad43ad3/6bdcf/screen-shot-2022-08-16-at-2.39.06-pm.png 315w,
/static/956f9f318015acffd034e8bfbad43ad3/f058b/screen-shot-2022-08-16-at-2.39.06-pm.png 630w,
/static/956f9f318015acffd034e8bfbad43ad3/40601/screen-shot-2022-08-16-at-2.39.06-pm.png 945w,
/static/956f9f318015acffd034e8bfbad43ad3/5a791/screen-shot-2022-08-16-at-2.39.06-pm.png 1248w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Lastly, run &lt;code class=&quot;language-text&quot;&gt;npm install&lt;/code&gt; to install the new versions.&lt;/p&gt;
&lt;p&gt;Before finishing, run any tests and linting checks. Changes to code will likely be needed depending on the upgrades done.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[TypeScript Utility Types]]></title><description><![CDATA[Even if you’ve been writing TypeScript for a while, you might not have ran across the language’s built-in utility types. These come in handy…]]></description><link>https://opensesame-engineering-blog.netlify.app/typescript-utility-types/</link><guid isPermaLink="false">https://opensesame-engineering-blog.netlify.app/typescript-utility-types/</guid><pubDate>Tue, 16 Aug 2022 23:38:36 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f61ef10757a517dceab36e00510321ea/e5bc7/tools.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAECAwT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABw50iSiv/xAAZEAADAAMAAAAAAAAAAAAAAAAAAQIQETH/2gAIAQEAAQUCpyx42dZ//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAGhAAAwEBAQEAAAAAAAAAAAAAAAERITFBYf/aAAgBAQABPyFY5VONDZ103w3PmC0Gf//aAAwDAQACAAMAAAAQXA//xAAXEQEAAwAAAAAAAAAAAAAAAAAAASEx/9oACAEDAQE/ENlT/8QAFREBAQAAAAAAAAAAAAAAAAAAEDH/2gAIAQIBAT8Qh//EABwQAQACAgMBAAAAAAAAAAAAAAEAESFBMVFhgf/aAAgBAQABPxCtthbArr5HeYHNsW7kHkUil92yDKwcobiboUOif//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Tools on a workbench&quot;
        title=&quot;Tools on a workbench&quot;
        src=&quot;/static/f61ef10757a517dceab36e00510321ea/828fb/tools.jpg&quot;
        srcset=&quot;/static/f61ef10757a517dceab36e00510321ea/ff44c/tools.jpg 158w,
/static/f61ef10757a517dceab36e00510321ea/a6688/tools.jpg 315w,
/static/f61ef10757a517dceab36e00510321ea/828fb/tools.jpg 630w,
/static/f61ef10757a517dceab36e00510321ea/0ede0/tools.jpg 945w,
/static/f61ef10757a517dceab36e00510321ea/3ac88/tools.jpg 1260w,
/static/f61ef10757a517dceab36e00510321ea/e5bc7/tools.jpg 5184w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Even if you’ve been writing TypeScript for a while, you might not have ran across the language’s built-in &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/utility-types.html&quot;&gt;utility types&lt;/a&gt;. These come in handy and save you from having to manually implement some common type transformations. I’ll go over a few utility types we use often and how you can put them to work in your code.&lt;/p&gt;
&lt;h2&gt;Record&lt;/h2&gt;
&lt;p&gt;You can type an object with specific types for its keys and values using an &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/2/objects.html#index-signatures&quot;&gt;index signature&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Book&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;isbn&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;With the &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type&quot;&gt;Record&lt;/a&gt; type, you can represent the same object a bit more concisely:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Book&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If syntax were the only difference, I’d prefer the index signature since the &lt;code class=&quot;language-text&quot;&gt;isbn&lt;/code&gt; key gives more detail about the intent of the type; however, the &lt;code class=&quot;language-text&quot;&gt;Record&lt;/code&gt; type is a lot more powerful!&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;Record&lt;/code&gt; starts getting really useful when you want to lock down the properties of an object. In the above example, the object’s properties can be any string, but here’s an example of using a &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes-func.html#unions&quot;&gt;union type&lt;/a&gt; of strings for the keys:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Locale&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;en&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;fr&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;es&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;LanguageName&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Locale&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; languages&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; LanguageName &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&apos;en&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;English&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&apos;fr&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;French&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token string-property property&quot;&gt;&apos;es&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Spanish&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If I try to add German to this list, the compiler displays a nice error.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/265bbc590c94293f3531308afc732d10/9eaa0/screen-shot-2022-08-16-at-5.29.58-pm.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 12.025316455696203%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAYUlEQVQI11WKNw7AMAwD8/9fenSRLPc2MLCADBmIO5B8IhG890gimHNi761cayk/H2Podr33jtbab6u14pyD5+QMFkHJGc45EJEmhKC01iqZGSkliIj+bmKM2l83xqCUghfOQpkz5wSoRAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;TypeScript compilation error&quot;
        title=&quot;TypeScript compilation error&quot;
        src=&quot;/static/265bbc590c94293f3531308afc732d10/f058b/screen-shot-2022-08-16-at-5.29.58-pm.png&quot;
        srcset=&quot;/static/265bbc590c94293f3531308afc732d10/c26ae/screen-shot-2022-08-16-at-5.29.58-pm.png 158w,
/static/265bbc590c94293f3531308afc732d10/6bdcf/screen-shot-2022-08-16-at-5.29.58-pm.png 315w,
/static/265bbc590c94293f3531308afc732d10/f058b/screen-shot-2022-08-16-at-5.29.58-pm.png 630w,
/static/265bbc590c94293f3531308afc732d10/40601/screen-shot-2022-08-16-at-5.29.58-pm.png 945w,
/static/265bbc590c94293f3531308afc732d10/78612/screen-shot-2022-08-16-at-5.29.58-pm.png 1260w,
/static/265bbc590c94293f3531308afc732d10/9eaa0/screen-shot-2022-08-16-at-5.29.58-pm.png 1676w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Another common use case is transforming the values of an object to a different type. Instead of maintaining a type that’s just used for the keys of other types, we can use the &lt;code class=&quot;language-text&quot;&gt;keyof&lt;/code&gt; keyword:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; languages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  en&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;English&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  fr&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;French&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  es&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Spanish&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;SupportedLanguages&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Record&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;keyof&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;typeof&lt;/span&gt; languages&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; appLanguages&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; SupportedLocales &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  en&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  es&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Again, there’s a nice error if an unexpected property is used.&lt;/p&gt;
&lt;h2&gt;Partial&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype&quot;&gt;Partial&lt;/a&gt; type makes all properties of a type optional. This is particularly useful for creating mock objects for testing. You can create a &lt;a href=&quot;https://medium.com/javascript-scene/javascript-factory-functions-with-es6-4d224591a8b1&quot;&gt;factory function&lt;/a&gt; that uses the desired type without needing to provide every value:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Profile&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  avatar&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; createMockProfile &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Mock User&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; avatar&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;test.jpg&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Partial&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Profile&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; Profile &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  avatar&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; testProfile &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;createMockProfile&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; name&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Test User&apos;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; 

&lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;testProfile&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;// { name: &apos;Test User&apos;, avatar: &apos;test.jpg&apos; }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The opposite of &lt;code class=&quot;language-text&quot;&gt;Partial&lt;/code&gt; is &lt;code class=&quot;language-text&quot;&gt;Required&lt;/code&gt;—it makes all the properties of a type required.&lt;/p&gt;
&lt;h2&gt;Pick and Omit&lt;/h2&gt;
&lt;p&gt;Sometimes you just need a subset of properties from a given type. Instead of creating a new type with values that are duplicated elsewhere in the codebase, you can use &lt;code class=&quot;language-text&quot;&gt;Pick&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;Omit&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys&quot;&gt;P﻿ick&lt;/a&gt; takes the given properties from a type. For example, we use &lt;code class=&quot;language-text&quot;&gt;Pick&lt;/code&gt; to build custom React components that wrap other third-party components in order to simply the interface:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Button&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ButtonProps &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@mui/material/Button&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;type&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomButtonProps&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Pick&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ButtonProps&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;color&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;CustomButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; color &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; CustomButtonProps&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Button
      color&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;color&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      variant&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;contained&quot;&lt;/span&gt;
  &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;T﻿his pattern helps enforce consistency since it limits the customization possible with props, but it also provides a simpler dev experience.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys&quot;&gt;O﻿mit&lt;/a&gt; works the opposite way: it filters out properties of a given type. This is useful when you want to use an existing type but overwrite one or more of its properties.&lt;/p&gt;
&lt;p&gt;For example, maybe you have the concept of a “variant” in your design system and you need to expose it as a prop for a custom button, but the new component library you’re adopting already uses “variant.” You might try something like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Button&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ButtonProps &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@mui/material/Button&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomButtonProps&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ButtonProps&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  variant&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;success&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This won’t compile because the custom &lt;code class=&quot;language-text&quot;&gt;variant&lt;/code&gt; type doesn’t satisfy the constraints from &lt;code class=&quot;language-text&quot;&gt;ButtonProps:&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b4032fe283a33e0b1ed8fbd14dfcef4c/11d70/screen-shot-2022-09-26-at-12.12.20-pm.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 7.59493670886076%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAZ0lEQVQI1zWOWQoAIQxD5y4uuG+ggqL3v1WGFvwILWn70m/vjZwz5pwYYyCEgN47zjm49yKlBKUUrLXQWrOEEHDOsaSU7L3+izHCGMOgUgpqrQz23nMlYGuN5xT8PBI9QTfEWGvx3g9YzT3JwlhYdQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;TypeScript compilation error&quot;
        title=&quot;TypeScript compilation error&quot;
        src=&quot;/static/b4032fe283a33e0b1ed8fbd14dfcef4c/f058b/screen-shot-2022-09-26-at-12.12.20-pm.png&quot;
        srcset=&quot;/static/b4032fe283a33e0b1ed8fbd14dfcef4c/c26ae/screen-shot-2022-09-26-at-12.12.20-pm.png 158w,
/static/b4032fe283a33e0b1ed8fbd14dfcef4c/6bdcf/screen-shot-2022-09-26-at-12.12.20-pm.png 315w,
/static/b4032fe283a33e0b1ed8fbd14dfcef4c/f058b/screen-shot-2022-09-26-at-12.12.20-pm.png 630w,
/static/b4032fe283a33e0b1ed8fbd14dfcef4c/40601/screen-shot-2022-09-26-at-12.12.20-pm.png 945w,
/static/b4032fe283a33e0b1ed8fbd14dfcef4c/78612/screen-shot-2022-09-26-at-12.12.20-pm.png 1260w,
/static/b4032fe283a33e0b1ed8fbd14dfcef4c/11d70/screen-shot-2022-09-26-at-12.12.20-pm.png 1802w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It’s valid to narrow the type, i.e. &lt;code class=&quot;language-text&quot;&gt;variant: &apos;contained&apos;&lt;/code&gt;, but you can’t overwrite the properties of other interfaces this way.&lt;/p&gt;
&lt;p&gt;T﻿he way around this is to use &lt;code class=&quot;language-text&quot;&gt;Omit&lt;/code&gt; to first remove the property from the type and then extend that filtered interface:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Button&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; ButtonProps &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;@mui/material/Button&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomButtonProps&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Omit&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ButtonProps&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;variant&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  variant&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;success&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;B﻿oth utility types can, of course, be combined and use multiple keys to make them even more expressive:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CustomButtonProps&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Pick&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;Omit&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ButtonProps&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;variant&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;size&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;color&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;type&apos;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  variant&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;success&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  size&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;tiny&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;big&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;A﻿nd Many More&lt;/h2&gt;
&lt;p&gt;Utility types can save you a lot of time and reduce complexity in your codebase. There are a lot more than what’s covered here—you can try them all out in the official &lt;a href=&quot;https://www.typescriptlang.org/play?&amp;#x26;q=239&quot;&gt;TypeScript Playground&lt;/a&gt;. These examples just scratch the surface of what you can do with utility types and I hope they can help you improve your TypeScript.&lt;/p&gt;</content:encoded></item></channel></rss>