<?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[Blog of Sebastian Häni]]></title><description><![CDATA[A personal blog about things I am interested in.]]></description><link>https://sebastianhaeni.github.com</link><generator>GatsbyJS</generator><lastBuildDate>Sun, 14 Apr 2024 19:33:17 GMT</lastBuildDate><item><title><![CDATA[What do Architects do?]]></title><description><![CDATA[This blog post reflects my thoughts on what is architecture, what does an architect do and what they should focus on. I copied in some…]]></description><link>https://sebastianhaeni.github.com/0016-what-do-architects-do/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0016-what-do-architects-do/</guid><pubDate>Sun, 07 Apr 2024 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This blog post reflects my thoughts on what is architecture, what does an architect do and what they should focus on. I copied in some quotes which I found enlightening. The sources can be found in the references. It is also extending the thoughts from this older post: &lt;a href=&quot;../0014-decentralized-architecture&quot;&gt;Decentralized Architecture&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;what-is-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-architecture&quot; aria-label=&quot;what is architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is Architecture?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Is architecture the taking of Important Decisions?&lt;br&gt;→ Important is what an expert developer declared as important.&lt;br&gt;Therefore, importance is actually not a useful criteria for architecture.&lt;/li&gt;
&lt;li&gt;Is architecture the Decisions to be made early?&lt;br&gt;→ Decisions to be made early can be eliminated.&lt;br&gt;Therefore, it is not decisions to be made early.&lt;/li&gt;
&lt;li&gt;Is architecture the Decisions hard to reverse?&lt;br&gt;→ Yes.&lt;br&gt;Therefore, try to make decisions easy to reverse; reduce the number of hard to reverse decisions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Therefore, get rid of architecture itself.&lt;/p&gt;
&lt;h2 id=&quot;getting-rid-of-software-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#getting-rid-of-software-architecture&quot; aria-label=&quot;getting rid of software architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Getting rid of Software Architecture&lt;/h2&gt;
&lt;p&gt;The following three quotes are from &lt;a href=&quot;https://www.martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf&quot;&gt;Who Needs Architects — Martin Fowler&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s commonly believed that if you are building an enterprise application, you must get the database schema right early on because it’s hard to change the database schema—particularly once you have gone live. On one of our projects, the database administrator, Pramod Sadalage, devised a system that let us change the database schema (and migrate the data) easily.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;→ We have to find abstractions to make changes easy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Complexity is what makes software hard to change. That, and duplication.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;→ We have to simplify.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Software is not limited by physics, like buildings are. It is limited by imagination, by design, by organization. In short, it is limited by properties of people, not by properties of the world.&lt;br&gt;“We have met the enemy, and he is us.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;→ Hard to reverse decisions can be converted into easy reversible ones.&lt;/p&gt;
&lt;h2 id=&quot;what-do-architects-do&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-do-architects-do&quot; aria-label=&quot;what do architects do permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What do Architects do?&lt;/h2&gt;
&lt;p&gt;Improving the development team’s ability gives an architect much greater leverage than being the sole decision maker and thus running the risk of being an architectural bottleneck.&lt;/p&gt;
&lt;p&gt;→ An architect’s value is inversely proportional to the number of decisions they make.
→ An architect best acts like a guide (as in mountaineering guide) and not as decision maker.&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/d524b9f25e19e074e43b1ce8994d050f/e405b/architects-value.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: 61.48648648648649%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAy0lEQVR42q2T627DIAyFef8XXaQ2VZMQwDZwZntbFUXpj20c6QiB4AN8CbiQiGBdV2zb5o4x+viztiwLeu9XRxFEKlh9lG026NnM/BrfKaRcsGfCKIVChDgSyAq0F7Y3Mfk18DHPyCSobRBwmiZkrgpsY4BWCkWBdMr0v2JYa8Wu38aAXwdSYO8NUhuSx7J5HfY/JsmB9kKTwbIWbaIvZ7d4OEgvtNDY/MqpiDdIaAox6NH87ZQy4p5wu8/40OQ9teW8EXT9bNtHzPgEGru1gHZ54BoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Architect&amp;#39;s Value&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/d524b9f25e19e074e43b1ce8994d050f/fcda8/architects-value.png&quot;
        srcset=&quot;/blog/static/d524b9f25e19e074e43b1ce8994d050f/12f09/architects-value.png 148w,
/blog/static/d524b9f25e19e074e43b1ce8994d050f/e4a3f/architects-value.png 295w,
/blog/static/d524b9f25e19e074e43b1ce8994d050f/fcda8/architects-value.png 590w,
/blog/static/d524b9f25e19e074e43b1ce8994d050f/efc66/architects-value.png 885w,
/blog/static/d524b9f25e19e074e43b1ce8994d050f/c83ae/architects-value.png 1180w,
/blog/static/d524b9f25e19e074e43b1ce8994d050f/e405b/architects-value.png 1566w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;h2 id=&quot;implications&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#implications&quot; aria-label=&quot;implications permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Implications&lt;/h2&gt;
&lt;h3 id=&quot;principles&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#principles&quot; aria-label=&quot;principles permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Principles&lt;/h3&gt;
&lt;p&gt;These principles directly relate to the discussed topic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://engineering-principles.jlp.engineering/principles/design/small-and-simple/&quot;&gt;Small and Simple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://engineering-principles.jlp.engineering/principles/design/evolutionary-systems/&quot;&gt;Evolutionary Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://engineering-principles.jlp.engineering/principles/design/design-for-emergent-reuse/&quot;&gt;Design for Emergent Reuse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;architects-activities&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#architects-activities&quot; aria-label=&quot;architects activities permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architect’s Activities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ensuring that conversations that are needed to be happening are happening&lt;/li&gt;
&lt;li&gt;Ensuring decisions are of high quality&lt;/li&gt;
&lt;li&gt;Guiding when needed&lt;/li&gt;
&lt;li&gt;Reducing irreversible decisions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;how-can-an-architect-do-that&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-can-an-architect-do-that&quot; aria-label=&quot;how can an architect do that permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How can an architect do that?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Conversations happen &amp;#x26; decisions are of high quality (see &lt;a href=&quot;../0013-decentralized-architecture&quot;&gt;Decentralized Architecture&lt;/a&gt;):
&lt;ul&gt;
&lt;li&gt;A thinking and recording tool: Architectural Decision Records (ADRs)&lt;/li&gt;
&lt;li&gt;A time and place for conversations: Architecture Advice Forum&lt;/li&gt;
&lt;li&gt;A light to illuminate a unified goal: Engineering Principles&lt;/li&gt;
&lt;li&gt;A tech landscape and current climate sensing tool: Tech Radar&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Guiding when needed:
&lt;ul&gt;
&lt;li&gt;Show presence&lt;/li&gt;
&lt;li&gt;Connect people&lt;/li&gt;
&lt;li&gt;Be available&lt;/li&gt;
&lt;li&gt;Be useful&lt;/li&gt;
&lt;li&gt;Act timely on guidance requests&lt;/li&gt;
&lt;li&gt;Be cautious about decisions made in the dark&lt;/li&gt;
&lt;li&gt;Reflect and and distill principles with teams&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reducing irreversible decisions
&lt;ul&gt;
&lt;li&gt;Promote principles&lt;/li&gt;
&lt;li&gt;Be cautious of irreversible decisions and guide towards reversible ones&lt;/li&gt;
&lt;li&gt;Spend time thinking about abstractions to create systems with “reversability” built-in.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;approach&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#approach&quot; aria-label=&quot;approach permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Approach&lt;/h3&gt;
&lt;p&gt;Let’s use a city analogy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We can design the blueprint for a single building in a city.&lt;/li&gt;
&lt;li&gt;Or we can plan the layout of the entire city, including roads, buildings, and utilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If buildings are small and simple and can be extended easily, i.e. are built with evolution in mind, we maximize reversible decisions whenever we want to change the building or even demolish it.&lt;/p&gt;
&lt;p&gt;So, how can we foster buildings being built this way that satisfies these properties? We can guide each building builder to design their building to satisfy these properties, but that takes time and leads to bottlenecks.&lt;/p&gt;
&lt;p&gt;What if we instead build the best infrastructure for buildings? The provided infrastructure acts as a virtual restraint for the buildings. If there is a water pipe provided, the building builder is unlikely to pump water out of the ground and build their own water treatment plant, they’ll just use what’s already provided. This requires that the infrastructure is flexible, extensible and reliable.&lt;/p&gt;
&lt;p&gt;Fostering an environment where systems are built with evolution in mind and where reversible decisions are maximized is crucial for adaptability and scalability.&lt;/p&gt;
&lt;p&gt;To achieve this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Every component must be simple.&lt;/strong&gt; Software and system components should be modular and loosely coupled, allowing for easy replacement or modification without disrupting the entire system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Off-the-shelve solutions and standards are so good, they do not need enforcement to be adopted.&lt;/strong&gt; Frameworks, protocols, and interfaces promote interoperability and reduce the need for custom solutions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allowing focus on what matters for the business.&lt;/strong&gt; Automation tools and processes streamline development, testing, and deployment, enabling rapid iteration and evolution of software systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Have shared understanding.&lt;/strong&gt; Clear documentation and effective communication channels ensure that design decisions are well-documented and understood, facilitating future modifications and enhancements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;minimal-viable-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#minimal-viable-architecture&quot; aria-label=&quot;minimal viable architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Minimal Viable Architecture&lt;/h3&gt;
&lt;p&gt;In his talk &lt;a href=&quot;https://www.youtube.com/watch?v=9Q7GANXn02k&quot;&gt;Minimal Viable Architecture&lt;/a&gt;, Randy Shoup explains that there are roughly three phases when building a system:&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/8f8aaae9bdf1937925dfff2bc81aae1d/966ce/minimal-viable-architecture.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: 50%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC0UlEQVR42h2R3U9TdxjH+z/4B3jhggsxXKgxcKEI+IZYdBduccl2wcKFGhVBTXAMNhhzmYkIJAsahYFRWlOlVKsWMAWF8tb2nJZSWnpazjm1PVjeLFET5+SzX8iTT57nm+/N93keU9H5Bg5U/07Jxd8oqmqgpKqJgzXXKK1twfzrLY43dWJu6ODwlescuvwnxVWN7D9XJ6jn2/obVP7VwY9N7VQ0t3OsphGTW55Fjqt4owp+ZQF/LMFUJMbUXGxzluKa8OJMC1+K60gJnaD6hrFQhFt2F43dNm7anmEbmeB0SxemVGaJ9fUs2WyWzKLBysoSn//7wsbGF96trbIq9L+fPrEhajljYOgqacHHD++52vkYc30bP7V0890ftylv+BuTmk6jJ3XUdJJEKsFCSiOzukr2wzqaoaEK0qqCocSYk/2CKWYEy2vL1N6xUlx9jeO/tFJ2tYWy2lZMgyMjaJrGjBrGq3oJaWFUPUl6OY1P9TM+7SI6L7NoLBJSIwRTIeRkAH3pDVdqayjcl0fZsb0cPVpAqXk/prv3elDicZEkydDcEPNJhQVVZ+X9GgPjfTwZs6KtJHm7mOH1jIfB8AAvZ18STSnU/VzNwcJcvjHnsyN3Gzm5uZge2GwkEgnCepQxxUNwIYSeMkiq87hH7YwrE+hvxdqGQSAWEnocd9hNXJyiuVl8unwv5y/8QE7eTr7aLRJK4VmCwSAuj4tHo1ZejDqZGB5B9gzzQnLh9D1DiviJRKO88o3h9DpxTDrwzUlcvnSOE2X53Gyro+BAKTkFRzD5AjKTo6/wDA4wPexmwj2Ed9KDz+/FYunF5XpOKBTE6/NtIksSAVlGDgY4e6aCgj1fU1l5kkOHC9lXIhK23fmHzl4rPbY+evufYHE4sfQ/5f4jOx3d9+gSnsXuEN3O3ft9dFkd9Dzs58Hjfk58f4ode3aJdEVs37mLLVtz+B/+ml5Y/ZRLIwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Minimal Viable Architecture&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/8f8aaae9bdf1937925dfff2bc81aae1d/fcda8/minimal-viable-architecture.png&quot;
        srcset=&quot;/blog/static/8f8aaae9bdf1937925dfff2bc81aae1d/12f09/minimal-viable-architecture.png 148w,
/blog/static/8f8aaae9bdf1937925dfff2bc81aae1d/e4a3f/minimal-viable-architecture.png 295w,
/blog/static/8f8aaae9bdf1937925dfff2bc81aae1d/fcda8/minimal-viable-architecture.png 590w,
/blog/static/8f8aaae9bdf1937925dfff2bc81aae1d/efc66/minimal-viable-architecture.png 885w,
/blog/static/8f8aaae9bdf1937925dfff2bc81aae1d/c83ae/minimal-viable-architecture.png 1180w,
/blog/static/8f8aaae9bdf1937925dfff2bc81aae1d/966ce/minimal-viable-architecture.png 2050w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;The city analogy is generic, and one has to understand in which phase the system is in.&lt;/p&gt;
&lt;p&gt;The city analogy is more fitting for the scaling phase, where the focus is on building the best infrastructure for buildings.
In the starting phase, the focus is on building the best building. In the optimizing phase, the focus is on consolidating the buildings.&lt;/p&gt;
&lt;p&gt;In other words:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;in the starting phase, focus on software architecture is more important.&lt;/li&gt;
&lt;li&gt;In the scaling phase, focus on system architecture is more important.&lt;/li&gt;
&lt;li&gt;In the optimizing phase, focus on software architecture is more important again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;During the scaling phase, a greater focus on system architecture as in platforms, infrastructure, automation, tooling, conventions, nudging, processes, and facilitation all with the goal to make decisions more reversible is likely to provide greater positive impact in a world where time is limited.&lt;/p&gt;
&lt;p&gt;Striking the balance is still necessary though, it’s just the that there is more weight on system architecture.&lt;/p&gt;
&lt;p&gt;To find the right balance follow this in this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Align with Business Goals&lt;/li&gt;
&lt;li&gt;Manage Risks&lt;/li&gt;
&lt;li&gt;Consider Reliability and Quality Aspects&lt;/li&gt;
&lt;li&gt;Use Feedback-driven Iteration&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’s a strategy. The implementation of the strategy will have it’s pitfalls and learnings.&lt;/p&gt;
&lt;h2 id=&quot;references&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#references&quot; aria-label=&quot;references permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf&quot;&gt;https://www.martinfowler.com/ieeeSoftware/whoNeedsArchitect.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20201222143814/https://www.ruthmalan.com/Journal/2016/2016JournalFebruary.htm#Still_Need_Architects&quot;&gt;https://web.archive.org/web/20201222143814/https://www.ruthmalan.com/Journal/2016/2016JournalFebruary.htm#Still_Need_Architects&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Architectural Significance]]></title><description><![CDATA[The following describes what can be an architecturally significant decision interpreted from Architectural Significance Test written by Olaf…]]></description><link>https://sebastianhaeni.github.com/0014-architectural-significance/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0014-architectural-significance/</guid><pubDate>Wed, 02 Aug 2023 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The following describes what can be an architecturally significant decision interpreted from &lt;a href=&quot;https://ozimmer.ch/practices/2020/09/24/ASRTestECSADecisions.html&quot;&gt;Architectural Significance Test&lt;/a&gt; written by Olaf Zimmermann.&lt;/p&gt;
&lt;h2 id=&quot;short-form&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#short-form&quot; aria-label=&quot;short form permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Short Form:&lt;/h2&gt;
&lt;p&gt;One of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High Business Value or Risk&lt;/li&gt;
&lt;li&gt;Important Stakeholder&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;… and at least one of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;QoS Deviation&lt;/li&gt;
&lt;li&gt;External Dependencies&lt;/li&gt;
&lt;li&gt;Cross-cutting Impact&lt;/li&gt;
&lt;li&gt;First-of-a-Kind (FOAK)&lt;/li&gt;
&lt;li&gt;Historical Troubles&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;long-form&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#long-form&quot; aria-label=&quot;long form permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Long Form&lt;/h2&gt;
&lt;p&gt;If the decision you want to take meets these criteria, writing an ADR is most appropriate.&lt;/p&gt;
&lt;p&gt;One of these criteria apply:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The requirement is directly associated with high &lt;strong&gt;business value&lt;/strong&gt; (benefit vs. cost) or &lt;strong&gt;business risk&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The requirement is a &lt;strong&gt;concern&lt;/strong&gt; of a particularly important &lt;strong&gt;stakeholder&lt;/strong&gt; such as the project sponsor or an external compliance auditor.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;… and at least one of these criteria also apply:&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;
&lt;p&gt;The requirement includes runtime Quality-of-Service (QoS) characteristics (such as performance needs) that deviate from those already satisfied by the evolving architecture substantially.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The requirement causes new or deals with one or more existing external dependencies that might have unpredictable, unreliable and/or uncontrollable behavior.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The requirement has a cross-cutting nature and therefore affects multiple parts of the system and their interactions; it may even have &lt;em&gt;system-wide impact&lt;/em&gt; short term and/or long term (examples: security, monitoring).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The requirement has a First-of-a-Kind (FOAK) character: for instance, this team has never built a component or subsystem that satisfies this particular requirement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The requirement has been troublesome and caused critical situations, budget overruns or client dissatisfaction on a previous project in a similar context.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Decentralized Architecture]]></title><description><![CDATA[Central Architecture as executed by a single architect or a group of architects has three main problems: Bottlenecks — Having a central…]]></description><link>https://sebastianhaeni.github.com/0013-decentralized-architecture/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0013-decentralized-architecture/</guid><pubDate>Mon, 24 Jul 2023 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Central Architecture as executed by a single architect or a group of architects has three main problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bottlenecks&lt;/strong&gt; — Having a central authority which designs architectures or even if it only has to approve it, slows down delivery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ivory Tower&lt;/strong&gt; — The central authority does not have to live with the consequences. Neither does a birds eye view suffice to solve problems adequately, because the devil is usually in the details.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conway’s Law&lt;/strong&gt; — The organization structure defines the architecture. Designing without being inside the organization is not possible. The result will be different.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This post discusses how to decentralize architecture to address these problems.&lt;/p&gt;
&lt;p&gt;The content is a summary of the excellent blog post by Andrew Harmel-Law &lt;a href=&quot;https://martinfowler.com/articles/scaling-architecture-conversationally.html&quot;&gt;Scaling the Practice of Architecture, Conversationally&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;decision-making-via-the-advice-process&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#decision-making-via-the-advice-process&quot; aria-label=&quot;decision making via the advice process permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Decision-making via the “Advice Process”&lt;/h2&gt;
&lt;p&gt;This is the most fundamental change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Rule:&lt;/strong&gt; anyone can make an architecturally significant decision [1].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Qualifier:&lt;/strong&gt; before making the decision, the decision-taker must consult two groups: The first is everyone who will be meaningfully affected by the decision. The second is people with expertise in the area the decision is being taken.&lt;/p&gt;
&lt;p&gt;[1] An architecturally significant decision is one that is hard to change later, has a significant impact on the system, and is not obvious. See &lt;a href=&quot;../0014-architectural-significance&quot;&gt;Architectural Significance&lt;/a&gt; for more.&lt;/p&gt;
&lt;p&gt;We are not looking for consensus here, but we are looking for a broad range of inputs and voices. Decision-takers are encouraged to specifically seek out those who will disagree with them.&lt;/p&gt;
&lt;p&gt;When deployed, decisions are better, faster, more accountable, and most importantly decisions which are understood and owned by those who implement them, precisely because the decision-taker is the one with the need as well as the one who is accountable.&lt;/p&gt;
&lt;p&gt;The traditional architect now plays the role of a Guide, drawing on their experience in the field.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[In order for an architecture to be successful] it is very much about ensuring that conversations that are needed to be happening are happening - not always initiating them, nor always helping to focus or navigate them, but ensuring they do happen […] and guiding when needed&lt;/p&gt;
&lt;p&gt;— &lt;a href=&quot;https://web.archive.org/web/20201222143814/https://www.ruthmalan.com/Journal/2016/2016JournalFebruary.htm#Still_Need_Architects&quot;&gt;Ruth Malan&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Also check out this excellent talk: &lt;a href=&quot;https://www.youtube.com/watch?v=qVyt3qQ_7TA&quot;&gt;Architecture without Architects - Erik Dörnenburg&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-four-supporting-elements&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-four-supporting-elements&quot; aria-label=&quot;the four supporting elements permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The Four Supporting Elements&lt;/h2&gt;
&lt;p&gt;The Advice Process requires four elements to be implemented successfully:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a thinking and recording tool&lt;br&gt;→ Architectural Decision Records&lt;/li&gt;
&lt;li&gt;a time and place for conversations&lt;br&gt;→ Architecture Advisory Forum&lt;/li&gt;
&lt;li&gt;a light to illuminate and guide towards a unified direction&lt;br&gt;→ Team-sourced Architecture Principles&lt;/li&gt;
&lt;li&gt;a means to sense the current technical landscape and climate&lt;br&gt;→ Tech Radar&lt;/li&gt;
&lt;/ul&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: 541px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/f41073979e57cf3d341ba2b903d43027/9d576/decentralized-architecture-elements.drawio.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: 33.78378378378378%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABcklEQVR42o2Sy0rDQBSG04tXXLgRt+LCjeArCII7V4qohIJoQUQXfQfxBXyCrgKWrltclTak3fSyaCiFhtIW0vSaGGIbsZmM/8gUim488HFO5vznMkyETqczMwzjfTAY0Eajkcxms4+9Xs/rdrvOaDT6Gg6HNJVKifjWEBNd183JZEJLpdJzu91OEkIoenyOx2O/Xq8bgm3bFHgUhqLXcrn8xGIIZo7jUEAURbmaTqf6/Jx5TdNeMPiNxZZleb7vUyzmCq1WK5rP52OYFlNV9Sgej+9j0kU6nY4Ui0WxUqmIsizvIidWq9V7aG9rtdqpJEkH2PwQmmvc6qHZbN4hFxW4rYEw9xsgCLbAJlgG22CFa1l+ift1EAKrIPCTxcZhEOIEQYCdsVwul9vDNS6x4Q22i5qmGclkMju8LsiZ14bndX+MCZjHdc49z6NoRFzXJewBCoXC2aLmX5ZIJELcH6MZ7ff7H/gLDDyahQ1PFjW/7Ruh0C0cnQ1nsQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;The Four Supporting Elements&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/f41073979e57cf3d341ba2b903d43027/9d576/decentralized-architecture-elements.drawio.png&quot;
        srcset=&quot;/blog/static/f41073979e57cf3d341ba2b903d43027/12f09/decentralized-architecture-elements.drawio.png 148w,
/blog/static/f41073979e57cf3d341ba2b903d43027/e4a3f/decentralized-architecture-elements.drawio.png 295w,
/blog/static/f41073979e57cf3d341ba2b903d43027/9d576/decentralized-architecture-elements.drawio.png 541w&quot;
        sizes=&quot;(max-width: 541px) 100vw, 541px&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 style=&quot;text-align: center&quot;&gt;The Core and Supporting Elements of Decentralized Architecture&lt;/p&gt;
&lt;h2 id=&quot;architectural-decision-records-adrs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#architectural-decision-records-adrs&quot; aria-label=&quot;architectural decision records adrs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architectural Decision Records (ADRs)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A thinking and recording tool&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ADRs are lightweight documents per decision taken that was architecturally significant.&lt;/p&gt;
&lt;p&gt;Elements of an ADR when used in an advice process context:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Which includes a unique identifier, and the decision itself (e.g. “ADR001 - Use AKS for Kubernetes Pods”)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Typically “Draft”, “Proposed”, “Adopted”, “Superseded” and “Retired”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision&lt;/td&gt;
&lt;td&gt;The decision that has been taken in a few sentences (frequently bold or italicized so it stands out)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;The forces and current contextual circumstances which have necessitated this decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Options Considered&lt;/td&gt;
&lt;td&gt;Each option considered, described briefly, with pros and cons. (Typically the option proposed / adopted comes first in this list)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consequences&lt;/td&gt;
&lt;td&gt;The ramifications of this decision, both positive and negative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advice&lt;/td&gt;
&lt;td&gt;This reflects the raw outputs from following the Advice Process. It is here that all advice given is recorded. This ought to include the name of the advice giver, and the date the advice was given. This can frequently take the forms of comments, and if these are provided directly by the advice-giver, then recording the meta-data is automatic.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;architecture-advisory-forum&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#architecture-advisory-forum&quot; aria-label=&quot;architecture advisory forum permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architecture Advisory Forum&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A time and place for conversations&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Architecture Advisory Forum is a regular and recurring place and time for conversations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goals:&lt;/strong&gt; High quality architecture conversations take place in a timely fashion. Equally important is the breadth and diversity of views shared, and the same goes for the contributors. The goal is to “do” architecture and share and learn lessons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attendees:&lt;/strong&gt; Ideal attendees are delegates from each team as well as key representatives from the Advice Process. However, the invite should remain completely open to encourage transparency and openness.&lt;/p&gt;
&lt;h2 id=&quot;team-sourced-architectural-principles&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#team-sourced-architectural-principles&quot; aria-label=&quot;team sourced architectural principles permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Team-sourced Architectural Principles&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A light to illuminate and guide towards a unified direction&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What are good principles?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clear Direction — You should be able to make a decision based on the principles, almost like an algorithm.&lt;/li&gt;
&lt;li&gt;Timeless — They should not change often.&lt;/li&gt;
&lt;li&gt;Universal — They should apply to a variety of situations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The set of principles should cover the key needs, and should not be too many that the teams cannot remember them all — and crucially the teams need to feel a sense of ownership.&lt;/p&gt;
&lt;p&gt;Important:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Principles are not Practices (such as TDD, Trunk Based, Pair Programming).&lt;/li&gt;
&lt;li&gt;Principles should not be too general (such as Write Good Code)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example: &lt;a href=&quot;https://web.archive.org/web/20220630013441/http://engineering-principles.onejl.uk/&quot;&gt;John Lewis IT Software Engineering Principles&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;tech-radar&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tech-radar&quot; aria-label=&quot;tech radar permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tech Radar&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A means to sense the current technical landscape and climate&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Tech Radar is a tool to help teams understand the current technical landscape and climate.&lt;/p&gt;
&lt;p&gt;To build your radar there are a few tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thoughtworks.com/radar/byor&quot;&gt;Thoughtworks - Build your own Radar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/backstage/backstage/tree/master/plugins/tech-radar&quot;&gt;Backstage Tech Radar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or just use Miro or any other collaborative diagramming tools.&lt;/p&gt;
&lt;p&gt;In a context with a wide variety of technologies, it can be useful to have a radar per technology area.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Decentralized Architecture is a powerful way to scale architecture in an organization. It is not a silver bullet, but it is a way to ensure that the right conversations are happening, and that the right decisions are being made.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Maven Dependency Tree]]></title><description><![CDATA[Ever wanted to understand the dependency graph in a Maven project with sub-modules? Add the following to the parent pom.xml: Run  The graph…]]></description><link>https://sebastianhaeni.github.com/0015-maven-dependency-tree/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0015-maven-dependency-tree/</guid><pubDate>Tue, 21 Mar 2023 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ever wanted to understand the dependency graph in a Maven project with sub-modules?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add the following to the parent pom.xml:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;xml&quot;&gt;&lt;pre class=&quot;language-xml&quot;&gt;&lt;code class=&quot;language-xml&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;project&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;plugins&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;plugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;groupId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;com.github.ferstl&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;groupId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;artifactId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;depgraph-maven-plugin&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;artifactId&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;4.0.3&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;plugin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;plugins&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;project&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Run &lt;code class=&quot;language-text&quot;&gt;mvn depgraph:aggregate -DcreateImage=true [-Dincludes=groupId:artifactId]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The graph can be found at &lt;code class=&quot;language-text&quot;&gt;target/dependency-graph.png&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Documentation: &lt;a href=&quot;https://github.com/ferstl/depgraph-maven-plugin&quot;&gt;https://github.com/ferstl/depgraph-maven-plugin&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;example&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#example&quot; aria-label=&quot;example permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Example&lt;/h2&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/3484331eb37e78da1ef793ddee0c676b/0f9b7/example.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.162162162162163%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAWElEQVR42k1OiwoAMQi6///bvVdjdhocXCCZZvSYGVprqLVC/JwDd0fvHWOM1NZa2HujlJL6nDMhrpx07gZ37KERNDTEvTdkCDyUmvoHzQyHMn8u8JFg+QsVt5tLjrJbegAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Example&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/3484331eb37e78da1ef793ddee0c676b/fcda8/example.png&quot;
        srcset=&quot;/blog/static/3484331eb37e78da1ef793ddee0c676b/12f09/example.png 148w,
/blog/static/3484331eb37e78da1ef793ddee0c676b/e4a3f/example.png 295w,
/blog/static/3484331eb37e78da1ef793ddee0c676b/fcda8/example.png 590w,
/blog/static/3484331eb37e78da1ef793ddee0c676b/efc66/example.png 885w,
/blog/static/3484331eb37e78da1ef793ddee0c676b/c83ae/example.png 1180w,
/blog/static/3484331eb37e78da1ef793ddee0c676b/0f9b7/example.png 7781w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;(Click to enlarge)&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introduction to Distributed Tracing]]></title><description><![CDATA[Distributed Tracing Distributed Tracing enables us to follow invocations across services and monitor them. We can observe a single service…]]></description><link>https://sebastianhaeni.github.com/0012-distributed-tracing/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0012-distributed-tracing/</guid><pubDate>Sun, 10 Jul 2022 18:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;distributed-tracing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#distributed-tracing&quot; aria-label=&quot;distributed tracing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Distributed Tracing&lt;/h2&gt;
&lt;p&gt;Distributed Tracing enables us to follow invocations across services and monitor them. We can observe a single service using logs and metrics. But what if we have a chain of services that fulfill a single purpose for an end user? For example if we have a user that clicks on an order button in a web frontend, we call the frontend’s backend BFF (I personally favour the &lt;strong&gt;B&lt;/strong&gt;ackend-&lt;strong&gt;f&lt;/strong&gt;or-&lt;strong&gt;F&lt;/strong&gt;rontend pattern) which internally calls an inventory microservice to see if the product is available, and also calls a billing microservice to get the user’s bill they will need to approve. If the billing service returns an error, the BFF returns an error to the user. However the inventory microservice returned a successful response. If we only have logs and metrics, we do not know what we just described, we simply know there were some errors, but their correlation is not given. With tracing we know that an error in a service very likely lead to another error in the consumer service if they are in the same recorded trace.&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: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 64.1891891891892%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACbklEQVR42l1Sy24SURieh/MxjBsXvoFJ040rdy66Mi5aNW00lgSrJUGwkCalhSkCw9yAYbgMZ+5XLnM69zkesG3Ub/Fvznf7/xwCPSDPczx5nqf6VI/qkSRJ0zTLsoIgDIfDdrtNURSE8JGJQaB/kadZDsNwA0c7DfbiOG40Gk2nU8dx/iMTf5zWO2w2a8ddGcZKN1aqqs5ms/k9JF3Xcazv+3c7ZFm2FWNlFEWYugCytABzCWiabppGmqb3XbIsTRNZVgAAkiSpioLJYRhuxdjNMIw4SR7LZFt2mu8aZWkCZMu03L/bJg9kYmma7lh0BW66iJ/t589foT7tbWw9C0KcGQd3QFRAl4qWLorjPIrxNABIIMzjmEC2bd+0kCWdFODBW+flnvNiH+8DE83EYhSFOkmZrBgZTqTb0WyWQ5gFQe55aLMhMtOMFwul10fatF26fvJ02bk0kDxZdbqBrqMoyqS5xgkOP5ZJnjsro4mYAgAZZs3zRK6qkON0foBmfOHD/OCNhFR+fXmlkSS+OC4ZMcxyPHZ51qdZ75bx+sO007EaDYOmiUiSzNtbb75A/K9K0Xi91/QuSsvyD7VcDmQZJzutljMW/dEopHrLy3r/FL9W1FLJI0nCl2X15kapVuelEn1yPPv8aXB4uKxU+KMjXxBQmqrtNqjVtGp1+OWU+fi+8+5Y//pNKhTk83Mis+3YcTbNpsswWr0uFYvy9bXd62m1midJCMLE8wK8IU1breakeMZ8rzs0bTQa8tUVIbIsEMVg9/XyIPRNy9b1brPZrdVcy3JUdcAwK0XZXj5LfWetKrYw4Ns/L0bd7m/ZZbP2tLcuAAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Tracing&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/823be77aa194870b0ca3596b17d0b293/fcda8/tracing.png&quot;
        srcset=&quot;/blog/static/823be77aa194870b0ca3596b17d0b293/12f09/tracing.png 148w,
/blog/static/823be77aa194870b0ca3596b17d0b293/e4a3f/tracing.png 295w,
/blog/static/823be77aa194870b0ca3596b17d0b293/fcda8/tracing.png 590w,
/blog/static/823be77aa194870b0ca3596b17d0b293/efc66/tracing.png 885w,
/blog/static/823be77aa194870b0ca3596b17d0b293/59000/tracing.png 917w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;/span&gt;
Source: &lt;a href=&quot;https://medium.com/nikeengineering/hit-the-ground-running-with-distributed-tracing-core-concepts-ff5ad47c7058&quot;&gt;https://medium.com/nikeengineering/hit-the-ground-running-with-distributed-tracing-core-concepts-ff5ad47c7058&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A trace has an ID and consists of one or more spans. A span has an ID, timestamp, duration, a local and a remote endpoint as well as a name. For REST calls we traditionally use the HTTP method and path as the span name, e.g. &lt;code class=&quot;language-text&quot;&gt;GET /info&lt;/code&gt;. So, how can we collect spans that form a trace from different services running in different containers? The service that starts a trace is generating a trace ID and with every request it creates in the trace context, it not only creates a span, but it also sends the generated trace ID as an HTTP header. Zipkin specified the span propagation headers first and termed them &lt;code class=&quot;language-text&quot;&gt;B3&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;   Client Tracer                                                  Server Tracer
┌───────────────────────┐                                       ┌───────────────────────┐
│                       │                                       │                       │
│   TraceContext        │          Http Request Headers         │   TraceContext        │
│ ┌───────────────────┐ │         ┌───────────────────┐         │ ┌───────────────────┐ │
│ │ TraceId           │ │         │ X-B3-TraceId      │         │ │ TraceId           │ │
│ │                   │ │         │                   │         │ │                   │ │
│ │ ParentSpanId      │ │ Inject  │ X-B3-ParentSpanId │ Extract │ │ ParentSpanId      │ │
│ │                   ├─┼────────&gt;│                   ├─────────┼&gt;│                   │ │
│ │ SpanId            │ │         │ X-B3-SpanId       │         │ │ SpanId            │ │
│ │                   │ │         │                   │         │ │                   │ │
│ │ Sampling decision │ │         │ X-B3-Sampled      │         │ │ Sampling decision │ │
│ └───────────────────┘ │         └───────────────────┘         │ └───────────────────┘ │
│                       │                                       │                       │
└───────────────────────┘                                       └───────────────────────┘&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;See &lt;a href=&quot;https://github.com/openzipkin/b3-propagation&quot;&gt;B3-Propagation&lt;/a&gt; to learn more about B3 headers. Other vendors followed suit with their propagation format, which meant there were suddenly multiple out there. Nowadays, it’s best practice to follow the &lt;a href=&quot;https://www.w3.org/TR/trace-context/&quot;&gt;Trace Context W3C Recommendation&lt;/a&gt;. If unsure, or during migrations, you can include different propagation headers in your requests, as they don’t bite each other.&lt;/p&gt;
&lt;p&gt;The service answering this request picks up the headers and does not generate a new trace ID, but instead uses the provided trace ID. If this service calls yet another service, it simply passes on the trace ID it received. This is handled by instrumentation libraries and a developer usually does not have to care about this, except configuring the tracer library. OpenTelemetry provides state of the art implementation libraries that we can use. They provide compatibility to OpenTelemetry Collector, Prometheus, Jaeger and many others and support different transports (TCP, gRPC, UDP) and different deployment models (in-application, agent, …).&lt;/p&gt;
&lt;p&gt;So, each service now knows to which trace its spans belong to, but how do we collect this information? This is where the Collector comes in. We could tell our services to send the spans to an OpenTelemetry Collector or to a Jaeger collector or any other collector that we’d like. Given the common trace ID, the tracing backend can then correlate the spans together and display them in a single timeline. Sending spans in batches to a collector can impact your service’s performance, so there are options to also do this using a sidecar / agent approach, which involves running another process on the same host next to the service container or even a process running in the same container using process daemons.&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/fdf486d007afca44e1ebe7c8504a8860/29114/trace.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: 55.4054054054054%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAABS0lEQVR42p2SXWvCMBSG+//vvZhX64f+D2+EjcHuBVEZ2qapNmlqTdqm704zFTdx0x14OOGEPLwJ8YbDJzuZTOx0OrWDwcBGUWR9/9kGgX8kcPi+b0PqjjCwURjaERG6uW/Ho5Ed01mvbmpU+z2qqkLXdeirw1f/rWpCH7shGqKl895iucRmvUZZliiVgpASb6sVXo+8LBaOfj1POZJcIBESiSwQU//ItljTbCOIXQ6vFzDGXEJjDIzWKERKsDNKppB5glzuoIyG0geigm7rq+SezHdISahJpknWc7r61TVVjkpwNI1GbfZoG+Me5xKvICFPmUv3l9BJqxKW0t0qT4kcGU/vFjrpgdLdkLqE2yx7SNjvtpS0F+vOfhcyzsESdpbdK+xrlUnMePFDSF8hjuN/C98324sJCTn9I07SR4SnahuLWSIw36mz8BPh+0cdgRRY/wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Jaeger Trace&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/fdf486d007afca44e1ebe7c8504a8860/fcda8/trace.png&quot;
        srcset=&quot;/blog/static/fdf486d007afca44e1ebe7c8504a8860/12f09/trace.png 148w,
/blog/static/fdf486d007afca44e1ebe7c8504a8860/e4a3f/trace.png 295w,
/blog/static/fdf486d007afca44e1ebe7c8504a8860/fcda8/trace.png 590w,
/blog/static/fdf486d007afca44e1ebe7c8504a8860/efc66/trace.png 885w,
/blog/static/fdf486d007afca44e1ebe7c8504a8860/c83ae/trace.png 1180w,
/blog/static/fdf486d007afca44e1ebe7c8504a8860/29114/trace.png 1920w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;Tracing data is complementary to logs and metrics and does not replace them.&lt;/p&gt;
&lt;p&gt;Using tracing data, we can also visualize system architectures based on actual data in realtime. Especially with microservices and with chaos engineering, your system architecture diagrams will quickly be outdated. We can analyze the local and remote endpoints of each span and determine the direction of communication between two services. Aggregated over all spans we get a dependency map. If we index this data we can even query for the map during a time frame and even visualize throughput and error rates on edges between services.&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/4836c3812a19deefa75c7129c113d2a9/d9ed5/jaeger-dag-graph.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: 48.64864864864865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABNklEQVR42pWSTW6DMBCFuWuMRNWyaJa5CBfIOVjkBs0F2l1KEASM+TF/r28QQSyCREeyMIznm3nPOJ7nIQgCfF2vCMMQn8cj3vnt43SCf7ng7XyGOhzguu6ylOJTKe7V/K7g+/60nGEY0DQNamthuw4YRyzR9wDz/wlnz6GRTYZVo7SqUNQ1Bmm4B2g4bZRlaFgo048zrCfAMte0LTrux7WaTSAPVewuBR0LK0IN18/9Dq01OtryCrQJLDmRQAQm0/QE6DxHRphlTiaWXF5WyHlO8v1KurP2SSLSBZI0RVEUKI1BTNgtSQixE0yiZaOEDUxjJx/XE29eikgTgMjVBMuUURzj+zdCVWhkZYlyVrAJfH6+5Rrp47FIfsoSX6WB2NLL77TrUkQSC6Vgy/yE/hnx8sUF/QFBzvXXTAd1AQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Jaeger Directed Acyclic Graph&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/4836c3812a19deefa75c7129c113d2a9/fcda8/jaeger-dag-graph.png&quot;
        srcset=&quot;/blog/static/4836c3812a19deefa75c7129c113d2a9/12f09/jaeger-dag-graph.png 148w,
/blog/static/4836c3812a19deefa75c7129c113d2a9/e4a3f/jaeger-dag-graph.png 295w,
/blog/static/4836c3812a19deefa75c7129c113d2a9/fcda8/jaeger-dag-graph.png 590w,
/blog/static/4836c3812a19deefa75c7129c113d2a9/efc66/jaeger-dag-graph.png 885w,
/blog/static/4836c3812a19deefa75c7129c113d2a9/c83ae/jaeger-dag-graph.png 1180w,
/blog/static/4836c3812a19deefa75c7129c113d2a9/d9ed5/jaeger-dag-graph.png 2880w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;h2 id=&quot;tools&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tools&quot; aria-label=&quot;tools permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tools&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Instrumentation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://opentelemetry.io/registry/?component=instrumentation&quot;&gt;OpenTelemetry Instrumentation&lt;/a&gt; &lt;strong&gt;*recommended&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jaegertracing.io/docs/1.36/client-libraries/&quot;&gt;Jaeger&lt;/a&gt; - deprecated&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zipkin.io/pages/tracers_instrumentation.html&quot;&gt;Zipkin&lt;/a&gt; - deprecated&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/xray/latest/devguide/xray-api.html&quot;&gt;AWS X-Ray&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Collecting:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://opentelemetry.io/docs/collector/&quot;&gt;OpenTelemetry Collector&lt;/a&gt; &lt;strong&gt;*recommended&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jaegertracing.io/&quot;&gt;Jaeger&lt;/a&gt; - preferred over Zipkin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zipkin.io/&quot;&gt;Zipkin&lt;/a&gt; - first one to be widely adopted&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/xray/&quot;&gt;AWS X-Ray&lt;/a&gt; - if you’re running services on AWS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Analysis / Post-Processing:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jaegertracing.io/&quot;&gt;Jaeger&lt;/a&gt; - supports wide range of storage backends, decent UI &lt;strong&gt;*recommended&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zipkin.io/&quot;&gt;Zipkin&lt;/a&gt; - first one to be widely adopted, scaling issues, UI bugs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/xray/&quot;&gt;AWS X-Ray&lt;/a&gt; - if you’re running services on AWS, automatic integration into lots of AWS services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Others: &lt;a href=&quot;https://tanzu.vmware.com/observability&quot;&gt;Tanzu Observability&lt;/a&gt;, &lt;a href=&quot;https://www.dynatrace.com/&quot;&gt;Dynatrace&lt;/a&gt;, &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview&quot;&gt;Azure Application Insights&lt;/a&gt;, &lt;a href=&quot;https://docs.microsoft.com/en-us/azure/azure-monitor/overview&quot;&gt;Azure Monitor&lt;/a&gt;, &lt;a href=&quot;https://graphiteapp.org/&quot;&gt;Graphite&lt;/a&gt;, &lt;a href=&quot;https://www.datadoghq.com/&quot;&gt;Datadog&lt;/a&gt;, &lt;a href=&quot;https://cloud.google.com/monitoring&quot;&gt;Google Cloud Monitoring&lt;/a&gt;, &lt;a href=&quot;https://lightstep.com/&quot;&gt;Lightstep&lt;/a&gt;, &lt;a href=&quot;https://logz.io/&quot;&gt;Logz.io&lt;/a&gt;, &lt;a href=&quot;https://sentry.io/&quot;&gt;Sentry&lt;/a&gt;, &lt;a href=&quot;https://www.splunk.com/en_us/products/apm-application-performance-monitoring.html&quot;&gt;Splunk APM&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;system-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#system-architecture&quot; aria-label=&quot;system architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;System Architecture&lt;/h2&gt;
&lt;p&gt;My personally recommended architecture looks like this:&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/571735106220a0a56f3c49713cc1083f/460fa/architecture.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: 29.72972972972973%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABK0lEQVR42oVRzUrDQBDOQ/kUnn0KryLePXjsRQ+CD1FQsA+gECy2xbQUNJaCrW1aTdNkk+xmf/I5uzXirQMfM7M7O/PNtx5qAxi9Q12jsfpfzDlHkiQQQkBKCaUklSvyyuVVVTnY3MMes43jOMZ0OnUPmjOtjfMNrNmmnnh9RNy5RHrfgp6PQHyJCXdN/qaLCmmaIlqt6dag489x3Orjuh1CqwrLKHL1dhMva59jfHqAwcURvp7uYDlEywV6vT4+Zx/IthtkjCEIAnS7zzCqxM1tiMMzHydXAwhe0t0Q72FIgwW8WnKokuGbcWxZ7qhbZpwLlEXu9NrlHHlR0L4ab7OMmk7w8EKM6Q+UVFjEEfzJeL+G1qx2WmsHGxtjfrU0kFZX0nCTM4xWa/wAPRDGO93VjwsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Tracing Architecture&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/571735106220a0a56f3c49713cc1083f/fcda8/architecture.png&quot;
        srcset=&quot;/blog/static/571735106220a0a56f3c49713cc1083f/12f09/architecture.png 148w,
/blog/static/571735106220a0a56f3c49713cc1083f/e4a3f/architecture.png 295w,
/blog/static/571735106220a0a56f3c49713cc1083f/fcda8/architecture.png 590w,
/blog/static/571735106220a0a56f3c49713cc1083f/efc66/architecture.png 885w,
/blog/static/571735106220a0a56f3c49713cc1083f/c83ae/architecture.png 1180w,
/blog/static/571735106220a0a56f3c49713cc1083f/460fa/architecture.png 1910w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;The service, of which there can be many, is deployed using an agent (if available for the language and framework). This is then sending the tracing data (and metrics) to the OpenTelemetry collector, which has a configured pipeline to receive spans and forward them to the Jaeger collector, which stores it in a storage backend such as an Elasticsearch database. The Jaeger Query service allows an engineer to query the traces and visualize them.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[OpenTelemetry Introduction]]></title><description><![CDATA[What is OpenTelemetry OpenTelemetry has been formed as a merge by the teams of OpenTracing and OpenCensus while providing full compatibility…]]></description><link>https://sebastianhaeni.github.com/0011-opentelemetry-intro/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0011-opentelemetry-intro/</guid><pubDate>Sun, 10 Jul 2022 09:30:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-is-opentelemetry&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-opentelemetry&quot; aria-label=&quot;what is opentelemetry permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is OpenTelemetry&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://opentelemetry.io/&quot;&gt;OpenTelemetry&lt;/a&gt; has been formed as a merge by the teams of &lt;a href=&quot;https://opentracing.io/&quot;&gt;OpenTracing&lt;/a&gt; and &lt;a href=&quot;https://opencensus.io/&quot;&gt;OpenCensus&lt;/a&gt; while providing full compatibility to existing technologies in the field.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/blog/f6223368c23b452d95af0ef477cfd31b/opentelemetry.svg&quot; alt=&quot;OpenTelemetry&quot;&gt;&lt;/p&gt;
&lt;p&gt;OpenTracing has created a set of vendor-agnostic APIs to collect tracing data in applications running primarily as Cloud Native. This means that a developer who wants to collect tracing data in their application does not have to implement a vendor’s API in their code, but instead uses an open API that is then implemented by the respective vendors. Similar to Slf4J as a logging API that allows Log4J, Logback etc. to be used as a logging backend. OpenCensus is a project by Google to collect observability data through standard formats that are also vendor agnostic. Thus, OpenTelemetry is a project that creates vendor agnostic APIs for instrumenting applications and at the same time collecting that data from multiple sources and only then passing it to a vendor’s tool.&lt;/p&gt;
&lt;p&gt;So, if you are using Prometheus and Jaeger today, you might want to switch over to using OpenTelemetry APIs and the OpenTelemetry collector as an intermediary, and only then send the tracing and metrics data to your observability tools. With this abstraction, you can use multiple observability tools in place at the same time, route data to different places, sample data, etc. All of this is independent of the specifics of vendors. However, you are then dependent on OpenTelemetry.&lt;/p&gt;
&lt;p&gt;The observability signals for OpenTelemetry are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Logs&lt;/strong&gt;: Traditional logs printed to console, file, or in case of a cloud native application, to a log-collector which indexes them and provides a search interface. If logs are written in the context of a trace, the trace and logs can be linked and made discoverable together.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traces&lt;/strong&gt;: A trace consisting of spans, which are basic function calls, follows the path of invocations no matter in which service they are invoked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metrics&lt;/strong&gt;: Timeseries based data. For example traffic count, error count, response times, etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, OpenTelemetry specifies &lt;strong&gt;Baggage&lt;/strong&gt; which are basically tags for events.&lt;/p&gt;
&lt;p&gt;As of July, 2022, only Traces and Metrics have been fully specified. They both have well tested instrumentation libraries in the most common languages and frameworks. The OpenTelemetry collector is also able to export these to common observability tools such as Prometheus, OpenCensus, Zipkin and Jaeger as well as Kafka. Logs are not fully specified nor implemented, but it’s being worked on right now. Check out the &lt;a href=&quot;https://opentelemetry.io/status/&quot;&gt;OpenTelemetry Status Page&lt;/a&gt; to see an up-to-date status.&lt;/p&gt;
&lt;h2 id=&quot;the-need-for-standards&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-need-for-standards&quot; aria-label=&quot;the need for standards permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The need for standards&lt;/h2&gt;
&lt;p&gt;In 2010 Google has published a paper about &lt;a href=&quot;https://research.google/pubs/pub36356/&quot;&gt;Dapper, a Large-Scale Distributed Systems Tracing Infrastructure&lt;/a&gt;.
Some called it the secret weapon Google has to understand their architectures and debug complex request traces.&lt;/p&gt;
&lt;p&gt;Dapper later evolved into the open sourced project &lt;a href=&quot;https://zipkin.io/&quot;&gt;Zipkin&lt;/a&gt;.
AWS jumped onto the distributed tracing bandwagon and introduced &lt;a href=&quot;https://aws.amazon.com/xray/&quot;&gt;AWS X-Ray&lt;/a&gt;. Uber liked distributed tracing as well, but didn’t like some decisions taken in Zipkin, so they created &lt;a href=&quot;https://www.jaegertracing.io/&quot;&gt;Jaeger&lt;/a&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: 500px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.75675675675676%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAAxOAAAMTgF/d4wjAAABiElEQVR42m2R246CQBBE5///xkclImIi3nVRg6Lg3bioG+UiaiJ4nHnZbLYTSE9PV3VVj8iyLM/zbxmu61ar1fF4bJpmsVisVCrtdlvXdcuySqUS+Y+M5/OZyxCLxeJyuQCbTCbkrVbrS0az2aS70+nA5XnefD6HpVAoGIax2WzCMKQujscjHJkMkvV6PRwOuajX67ZtNxoNKGC/3+/wUl+tVo/Hg07HccThcEiS5Hq9ns/nNE232y0zGajGjkYjjhAxHBgUt9sN5eA/4OVyyQTVhLbdbgdmMBgAxipXWGAFJPv9Hmvo6na7/Pv9vqCbzJaBGY74pwIeFrQwkwrKccQkxDNzOp0yT/i+D0zTNDbBEIazDCygHy84AqmszWYz9RzlchldtVpN8EKY4QIk3eRxHPMYvV7v9XqhEzusB0YmQ8pM1obGj+cgCH5vG2GAgWFMHeFVYB5SdXJLAu/fp1JgEuxQ4RbNHKMo+gfMx+oDGahSawNAK3+kkpxOJ4pskQQ6nCLEsqw3R9hDXgpF3DAAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;How Standards Proliferate&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/f6730132df8eba09ebb81aff33e5ae11/0b533/standards.png&quot;
        srcset=&quot;/blog/static/f6730132df8eba09ebb81aff33e5ae11/12f09/standards.png 148w,
/blog/static/f6730132df8eba09ebb81aff33e5ae11/e4a3f/standards.png 295w,
/blog/static/f6730132df8eba09ebb81aff33e5ae11/0b533/standards.png 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&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;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;a href=&quot;https://xkcd.com/927&quot;&gt;https://xkcd.com/927&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Each of these tools introduced span propagation methods to be able to follow a trace as it makes it’s way through an architecture consisting of many services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openzipkin/b3-propagation&quot;&gt;Zipkin B3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;x-b3-sampled: 1
x-b3-spanid:  9090044efa29991f
x-b3-traceid: de5a14e8f69781b31299211599430ed2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html&quot;&gt;AWS X-Ray&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;x-amzn-trace-id: Root=1-de5a14e8-f69781b31299211599430ed2;Parent=9090044efa29991f;Sampled=1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jaegertracing.io/docs/1.35/client-libraries/&quot;&gt;Jaeger&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;uber-trace-id: de5a14e8f69781b31299211599430ed2:9090044efa29991f:0:01&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;br/&gt;
Zipkin later introduced a single header standard as well:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openzipkin/b3-propagation#single-header&quot;&gt;Zipkin B3 single-header&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;b3: …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, some people were annoyed by the variety of propagation formats, so they created a W3C recommendation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/trace-context/&quot;&gt;Trace Context W3C Recommendation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;traceparent: 00-de5a14e8f69781b31299211599430ed2-9090044efa29991f-01&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;However, the software APIs to instrument your code and to collect those signals was still wild west. So, OpenTelemetry was formed to come to the rescue.&lt;/p&gt;
&lt;h2 id=&quot;instrumentation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#instrumentation&quot; aria-label=&quot;instrumentation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Instrumentation&lt;/h2&gt;
&lt;p&gt;Before OpenTelemetry, you could choose to use a library to instrument your code to gather tracing and metrics data and collect it with your vendor’s tool.
For example, for tracing you could use the &lt;a href=&quot;https://zipkin.io/pages/tracers_instrumentation.html&quot;&gt;Zipkin libraries&lt;/a&gt;, &lt;a href=&quot;https://www.jaegertracing.io/docs/1.36/client-libraries/&quot;&gt;Jaeger libraries&lt;/a&gt;,
&lt;a href=&quot;https://docs.aws.amazon.com/xray/latest/devguide/xray-api.html&quot;&gt;AWS X-Ray libraries&lt;/a&gt; or possibly others.&lt;/p&gt;
&lt;p&gt;Now, these often provided compatibility to other tools, however you still needed to depend on a single vendor. And to be fair, libraries such as &lt;a href=&quot;https://spring.io/projects/spring-cloud-sleuth&quot;&gt;Spring Cloud Sleuth&lt;/a&gt;
abstracted the vendor library for you, but you still needed to include it in your application.&lt;/p&gt;
&lt;p&gt;Nowadays, Zipkin and Jaeger have deprecated their instrumentation libraries and recommend the usage of OpenTelemetry instrumentation.&lt;/p&gt;
&lt;h2 id=&quot;collection&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#collection&quot; aria-label=&quot;collection permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Collection&lt;/h2&gt;
&lt;p&gt;Before OpenTelemetry, you had to send your metrics, traces and logs to separate vendor specific tools.&lt;/p&gt;
&lt;p&gt;For tracing data collection vendors introduced these formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zipkin Format&lt;/li&gt;
&lt;li&gt;Protobuf&lt;/li&gt;
&lt;li&gt;Thrift&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And transport it over these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP(S)&lt;/li&gt;
&lt;li&gt;gRPC&lt;/li&gt;
&lt;li&gt;UDP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While the transports probably all have a justified use case, the formats should be unified. So, OpenTelemetry introduced the OpenTelemetry Protocol &lt;a href=&quot;https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/otlp.md&quot;&gt;OTLP&lt;/a&gt;. It not only allows to send tracing data, but logs, metrics and tracing.&lt;/p&gt;
&lt;p&gt;Once they were collected by a vendor’s tool, it was hard to get them out of there to use it for other interesting purposes. In a large organization, it might be useful to send traces to a team specific tool, but also collect all traces produced by all teams to generate so called RED metrics.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;R&lt;/strong&gt; - Requests: Traffic, Throughput, Rate&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E&lt;/strong&gt; – Errors: Error Counts, Error Rate, Failed Calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; – Durations: Latency, Elapsed Time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With the OpenTelemetry Collector in-between, this becomes a breeze, as you can define pipelines in the collector which sends your data to different channels downstream. If you ever want to evaluate a new monitoring tool, you simply forward your data there, but continue using your existing monitoring tools until you switch over. Or maybe the tools are complementary and you decide to use multiple tools generating insights based on the same source data.&lt;/p&gt;
&lt;h2 id=&quot;upcoming&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#upcoming&quot; aria-label=&quot;upcoming permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Upcoming&lt;/h2&gt;
&lt;p&gt;This post was a first introduction into OpenTelemetry. I am planning to release a series of posts around this topic.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Introduction to OpenTelemetry (&lt;strong&gt;this article&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../0012-distributed-tracing/&quot;&gt;Introduction to Distributed Tracing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenTelemetry Collector Components (upcoming)&lt;/li&gt;
&lt;li&gt;OpenTelemetry Instrumentation (upcoming)&lt;/li&gt;
&lt;li&gt;Instrumenting React.js applications (upcoming)&lt;/li&gt;
&lt;li&gt;Instrumenting Angular applications (upcoming)&lt;/li&gt;
&lt;li&gt;Full Stack OpenTelemetry Example (upcoming)&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Setting up Apache Spark and Zeppelin]]></title><description><![CDATA[This article describes how to setup Spark and Zeppelin either on your own machine or on a server or cloud. Spark and Zeppelin are big…]]></description><link>https://sebastianhaeni.github.com/0010-spark-zeppelin-setup/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0010-spark-zeppelin-setup/</guid><pubDate>Sun, 16 May 2021 18:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article describes how to setup Spark and Zeppelin either on your own machine or on a server or cloud. Spark and Zeppelin are big software products with a wide variety of plugins, interpreters, etc. Finding the compatible versions, Dockerfiles, configs, etc. for a simple setup can be daunting. This here might help you to deploy and play around with Spark on your local machine or create a server setup as a ground to do some demos or proof of concepts. In this setup we will use the local file system and not a distributed one. When you use Spark in a production grade setup, you want to scale your filesystem and workers. But, our goal here is to create a playground environment.&lt;/p&gt;
&lt;p&gt;This blog post refers to this accompanying GitHub repository:&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://github.com/sebastianhaeni/spark-zeppelin-docker&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;sebastianhaeni/spark-zeppelin-docker&lt;/a&gt;
&lt;/p&gt;
&lt;h2 id=&quot;what-is-spark-and-zeppelin&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-spark-and-zeppelin&quot; aria-label=&quot;what is spark and zeppelin permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is Spark and Zeppelin&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://spark.apache.org/&quot;&gt;Apache Spark&lt;/a&gt;&lt;/strong&gt; is an engine to process your data in a highly parallel and fault tolerant way. You can submit programs as Spark jobs which will be run on Spark cluster consisting of at least one worker node connecting to a distributed storage. The programs can be written most famously in Python (&lt;a href=&quot;https://spark.apache.org/docs/latest/api/python/&quot;&gt;PySpark&lt;/a&gt;) or &lt;a href=&quot;https://www.scala-lang.org/&quot;&gt;Scala&lt;/a&gt; using the &lt;a href=&quot;https://en.wikipedia.org/wiki/MapReduce&quot;&gt;MapReduce&lt;/a&gt; paradigm. Alternatively, you can use &lt;a href=&quot;https://spark.apache.org/sql/&quot;&gt;Spark SQL&lt;/a&gt; to submit SQL queries and retrieve the query result. However, the user interface of the Spark master and worker nodes merely display running jobs and logs. There is no user interface to submit jobs. This calls for a Notebook solution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://zeppelin.apache.org/&quot;&gt;Apache Zeppelin&lt;/a&gt;&lt;/strong&gt; is a notebook web application like &lt;a href=&quot;https://jupyterlab.readthedocs.io/en/stable/&quot;&gt;JupyterLab&lt;/a&gt; focusing on notebook collaboration. Both tools cover a similar feature set. There are many opinions out there on which tool is better. Please make your own opinion about it. This article just covers how to install it. Zeppelin fits quite nicely into the Spark world, but you can achieve the same results using JupyterLab.&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: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.75675675675676%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABcSAAAXEgFnn9JSAAACMklEQVR42j1SaWsUQRCdn+iP8G9oiEYUP4ioaBQixC+auImKGjxAoiwacTfZBE1Cjj0Q9nJnd6bn6OlrnlW9u2mmmO6uV6/reMGjrX2sfD7E44+/cbNSx+1XDVxbr+P6y10sbezhxkZjuq/sYmGtjq1aGwfNIWqnfey3Rjhoh3i2fYSF5z+wRHFBOAoh8wxWF9BKwhmF0hqUpfN3bEBJnyOzcM5CKQVjCOMcnckIn6cChuIDkSTIswzGOg9QSqMwDrIo0O32kKYpeDlXoiCfIUxCMWxaK1hr6V5BGev9QZIVGPSHiEcDD4onEwiReaAQAlEU+fs8zyGVhSVC9mWUBD8mpSRigzhT9CfCXGoCS+TxBP9GPSSjPpWufEYMYLI0zShFg+NejEZn7DOO4xgZPaAtt6L0pGwBv8gl7x2e4PvbZbRW31HJ8H3jXjEpL8Zdef0H97+c+zNnPIglJJEwYcmk1NeAnb92fuLB3Xuorb3B5mIFf0+6PkhzP2eEnTDD5dU6Vqptf45iAUHVzQl9RUxICSMdhIjWa2gtfsD7W1cxaJ/5oIIGw9MU0uDOp1NceriD5a9N7xtHggioOkWl0kAwz9DwgZZpTjB+cYSk02OR0MRLDxwKie3jIZ58a+JptYXqWejxSZrDEYnhKRNxJhVyWfBQpB+7Jn1p0pnh/0xn7GMQy6MkX+mm+mS8LKTv77zPXm4sG9abpUwsEVwYvcqmZ3sz20/N+scubKZD5uEE/gMd+TwAWHobegAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Apache Zeppelin Notebook&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/6c98a066d067a1daace2fc3c41b7b310/fcda8/zeppelin.png&quot;
        srcset=&quot;/blog/static/6c98a066d067a1daace2fc3c41b7b310/12f09/zeppelin.png 148w,
/blog/static/6c98a066d067a1daace2fc3c41b7b310/e4a3f/zeppelin.png 295w,
/blog/static/6c98a066d067a1daace2fc3c41b7b310/fcda8/zeppelin.png 590w,
/blog/static/6c98a066d067a1daace2fc3c41b7b310/efc66/zeppelin.png 885w,
/blog/static/6c98a066d067a1daace2fc3c41b7b310/c83ae/zeppelin.png 1180w,
/blog/static/6c98a066d067a1daace2fc3c41b7b310/0e904/zeppelin.png 1384w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;Image Source: &lt;a href=&quot;https://zeppelin.apache.org/&quot;&gt;zeppelin.apache.org&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;setup&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#setup&quot; aria-label=&quot;setup permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Setup&lt;/h2&gt;
&lt;p&gt;This diagram shows all the Docker containers we will setup:
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.621621621621614%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAABYUlEQVR42n1SWU7DUAxMKAJV4kKcASROwmXgj8uEH9YjpB9t1SV7k3RL8rKYGTdIEUi1NLLr+o3Hdizrj4mI3Yf2er3+wG9pTtYNUVVVdzweFWVZdqzbbreVdY4Qjz5ZCN/ChKjrWj1yEoahxHFMIpbJfr835whH6P5VFIUA7XQ6ldVqJcYYQZ6qBcoUbNJ1nQRBYEhw6TiOAvFowD0mITvDt1SSZZkqgxIlYsyGNKqez+f/FfZ2QUKoeJeTtVT2S7Lb7RR5npNE0jSVw+Egy+XSWIvF4tl13SeM9OJ53iN3B1wDVyDUo+BBG0WREHxIApKRdDKZaMxmyBuLkrl0PkTBK4hueoxR8M3/QdJyf77v6w45OomplqsgMWMcx1iz2eweHe42m80Dut0OxraxbL0yuuuVeQgegIRUlSSJYDr1zCN39so2Or+RECorKGoIxA2O1GD8BhM0+Fbpa64FxMUPV+0AKFg0Ik4AAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;System Components&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/c9bf1aca3bdedff69cea15257a9b2655/fcda8/system-components.drawio.png&quot;
        srcset=&quot;/blog/static/c9bf1aca3bdedff69cea15257a9b2655/12f09/system-components.drawio.png 148w,
/blog/static/c9bf1aca3bdedff69cea15257a9b2655/e4a3f/system-components.drawio.png 295w,
/blog/static/c9bf1aca3bdedff69cea15257a9b2655/fcda8/system-components.drawio.png 590w,
/blog/static/c9bf1aca3bdedff69cea15257a9b2655/c7dcc/system-components.drawio.png 641w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;instructions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#instructions&quot; aria-label=&quot;instructions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Instructions&lt;/h2&gt;
&lt;p&gt;Note: You need to configure Docker to have at least 4 GB of memory.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone this repo &lt;code class=&quot;language-text&quot;&gt;git clone https://github.com/sebastianhaeni/spark-zeppelin-docker.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build the base image &lt;code class=&quot;language-text&quot;&gt;docker build -f Dockerfile_base -t registry.local:5000/spark-zeppelin-demo/spark_base:latest .&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Build the remaining images &lt;code class=&quot;language-text&quot;&gt;docker compose build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Append the following to your &lt;code class=&quot;language-text&quot;&gt;/etc/hosts&lt;/code&gt; (Linux &amp;#x26; MacOS) / &lt;code class=&quot;language-text&quot;&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&gt; (Windows) file
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;127.0.0.1 zeppelin.local
127.0.0.1 spark-ui-proxy.local&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Run with &lt;code class=&quot;language-text&quot;&gt;docker compose up&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Open &lt;a href=&quot;http://zeppelin.local/&quot;&gt;http://zeppelin.local/&lt;/a&gt; in your browser to access Zeppelin&lt;/li&gt;
&lt;li&gt;Open &lt;a href=&quot;http://spark-ui-proxy.local/&quot;&gt;http://spark-ui-proxy.local/&lt;/a&gt; in your browser to access Spark&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And there you go. An example notebook is included as well to get you going.&lt;/p&gt;
&lt;h2 id=&quot;reverse-proxy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#reverse-proxy&quot; aria-label=&quot;reverse proxy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Reverse Proxy&lt;/h2&gt;
&lt;p&gt;The reverse proxy allows us to proxy to an internal container by server name.
So, we don’t have to map ports from the internal Docker network and we don’t have
to remember names.&lt;/p&gt;
&lt;p&gt;To make this possible, we also need a custom Python web server that transforms the responses from Spark-Master and Spark-Worker.
They do not support reverse proxies out of the box (no support for X-Forwarded-For etc.), thus we rewrite the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;a&gt;&lt;/code&gt; links to
the correct URLs.&lt;/p&gt;
&lt;h2 id=&quot;spark-and-zeppelin&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#spark-and-zeppelin&quot; aria-label=&quot;spark and zeppelin permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Spark and Zeppelin&lt;/h2&gt;
&lt;h3 id=&quot;base-image&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#base-image&quot; aria-label=&quot;base image permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Base Image&lt;/h3&gt;
&lt;p&gt;The Spark and Zeppelin images both depend on a base image, that we have to build beforehand.&lt;/p&gt;
&lt;p&gt;This image contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JDK&lt;/li&gt;
&lt;li&gt;Scala&lt;/li&gt;
&lt;li&gt;Anaconda &amp;#x26; Python&lt;/li&gt;
&lt;li&gt;Apache Spark&lt;/li&gt;
&lt;li&gt;Apache Zeppelin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reason why we create a single image with both Spark and Zeppelin, is that Spark needs
some JARs from Zeppelin (namely the spark interpreter jar) and Zeppelin needs some Spark JARs
to connect to it. Also, Spark needs Anaconda (Python) to run PySpark. Zeppelin has a pure Python
interpreter that also needs Anaconda (to be able to achieve something meaningful).&lt;/p&gt;
&lt;p&gt;If you need to add another Python package to the image, you can do so either with &lt;code class=&quot;language-text&quot;&gt;conda install&lt;/code&gt;
or &lt;code class=&quot;language-text&quot;&gt;pip install&lt;/code&gt; at the end of &lt;code class=&quot;language-text&quot;&gt;Dockerfile_base&lt;/code&gt;. Please be sure to rebuild the images
after doing so.&lt;/p&gt;
&lt;h3 id=&quot;apache-spark&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#apache-spark&quot; aria-label=&quot;apache spark permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Apache Spark&lt;/h3&gt;
&lt;p&gt;The current configuration will create the following 3 containers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;spark-master: Spark Master Node where workers connect&lt;/li&gt;
&lt;li&gt;spark-worker-1: A worker node, connecting to the master. Could be scaled.
&lt;ul&gt;
&lt;li&gt;Please note that the amount of CPU cores and memory to be reserved by the worker are defined in &lt;code class=&quot;language-text&quot;&gt;Dockerfile_worker&lt;/code&gt;
and can be optionally overwritten by environment variables.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;spark-ui-proxy: To access the nodes’ web UI, we need to transform the content with correct URLs (they don’t properly support reverse proxies)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please note that the Spark nodes have a volume mapping to &lt;code class=&quot;language-text&quot;&gt;./data&lt;/code&gt; . This is where you can place files to read in your Zeppelin notebook.
An example file is already provided.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt;pyspark
df &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; spark&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/srv/data/example/people.json&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;apache-zeppelin&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#apache-zeppelin&quot; aria-label=&quot;apache zeppelin permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Apache Zeppelin&lt;/h3&gt;
&lt;p&gt;Zeppelin will be connected to the Spark Master (Spark Interpreter) once you run the first Spark cell in a notebook.&lt;/p&gt;
&lt;h3 id=&quot;compatibility-issues&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#compatibility-issues&quot; aria-label=&quot;compatibility issues permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Compatibility Issues&lt;/h3&gt;
&lt;p&gt;Please note that Spark, Zeppelin, Python, JDK, Scala have to be compatible to each other.
In the current setup, these have been tested and matched to each other. For example, this would
not work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upgrade from JDK 1.8 to e.g. 11. You will run into some class not found issues when running Zeppelin.&lt;/li&gt;
&lt;li&gt;Upgrade from Python 3.7 to Python 3.8. You will notice weird errors when running a PySpark script.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So if there’s a need to upgrade, please reserve enough time to test the compatibility between those
systems well enough.&lt;/p&gt;
&lt;p&gt;A good approach can be a test notebook in Zeppelin containing blocks with Scala, Python, PySpark and
SQL interpreters. Run them all successfully, and you basically proved that the system works.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Orgazining optimized code reviews in your team]]></title><description><![CDATA[In the teams I worked so far, we always opted for full reviews of each engineer’s code.
But how do you organize these reviews in a fashion…]]></description><link>https://sebastianhaeni.github.com/0009-orgazining-code-reviews/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0009-orgazining-code-reviews/</guid><pubDate>Mon, 28 Sep 2020 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the teams I worked so far, we always opted for full reviews of each engineer’s code.
But how do you organize these reviews in a fashion so that they:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;are efficient - do not take more time than necessary&lt;/li&gt;
&lt;li&gt;improve code correctness and quality&lt;/li&gt;
&lt;li&gt;improve code readability&lt;/li&gt;
&lt;li&gt;find bugs&lt;/li&gt;
&lt;li&gt;allow for knowledge spread&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We discussed in our team that we would like to create a consensus on what Change Reviews mean for
us and how we apply them. The following is the documentation that I created for our team.&lt;/p&gt;
&lt;p&gt;This has been influenced by the &lt;a href=&quot;https://google.github.io/eng-practices/review/reviewer/&quot;&gt;Google’s Engineering Practices documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And further, how do you contribute to a code base in an aligned way? I have added some contribution
guidelines as well. The contribution guidelines are inspired by &lt;a href=&quot;https://github.com/angular/angular/blob/master/CONTRIBUTING.md&quot;&gt;Angular’s guidelines&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And how do you finally map your status into a project management tool like JIRA?&lt;/p&gt;
&lt;p&gt;Additionally, we also are holding regular know how exchange sessions or discussions related to tech
and engineering to ensure we have a common vision and understanding of recent or upcoming topics.&lt;/p&gt;
&lt;h2 id=&quot;contents&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#contents&quot; aria-label=&quot;contents permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#change-reviews&quot;&gt;Change Reviews&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#contribution-guidelines&quot;&gt;Contribution Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#how-we-use-jira&quot;&gt;How we use JIRA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#tech-discussions&quot;&gt;Tech Discussions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;change-reviews&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#change-reviews&quot; aria-label=&quot;change reviews permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Change Reviews&lt;/h1&gt;
&lt;h2 id=&quot;review-planning&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#review-planning&quot; aria-label=&quot;review planning permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Review Planning&lt;/h2&gt;
&lt;h3 id=&quot;how-to-define-the-reviewer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-define-the-reviewer&quot; aria-label=&quot;how to define the reviewer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to define the reviewer?&lt;/h3&gt;
&lt;p&gt;In general, there should be two reviewers. The main reviewer does a thorough review, while the second reviewer is there
to catch any big mishaps and to ensure knowledge sharing throughout the team.
It might happen that there is only one reviewer in case of smaller tasks.&lt;/p&gt;
&lt;h3 id=&quot;code-review-is-always-required&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#code-review-is-always-required&quot; aria-label=&quot;code review is always required permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Code Review is always required&lt;/h3&gt;
&lt;p&gt;Each change has to be reviewed, even minor ones. The reason for reviews of big changes should be clear. Small changes
should be reviewed to ensure nothing has been accidentally introduced that could break things. E.g. there’s a faulty
merge in the change that the author was not aware of. These small reviews may be as short as 30 seconds, but they should
still occur.&lt;/p&gt;
&lt;h2 id=&quot;review-execution&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#review-execution&quot; aria-label=&quot;review execution permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Review Execution&lt;/h2&gt;
&lt;h3 id=&quot;review-handover&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#review-handover&quot; aria-label=&quot;review handover permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Review Handover&lt;/h3&gt;
&lt;p&gt;We regard the handover from the author to the main reviewer as one of the most important aspects of a successful review.
The author has to make clear what they expect from the reviewer.&lt;/p&gt;
&lt;p&gt;In general, there can be an “early look” review to guide the author in the right direction. For this, the build has to be
successful to make the reviewer’s effort worthwhile. The integration tests are ok to be still running or failing if they take longer.
In the end there always has to be a final review. For the final review, all builds and tests have to be successful and
all merge conflicts resolved.&lt;/p&gt;
&lt;p&gt;The author can optionally annotate their changes to explain complex factual relations.
This will enable the reviewer to be faster when trying to understand the changes.&lt;/p&gt;
&lt;p&gt;During the handover, it should be made clear if the reviewer is allowed to push changes onto the branch. This can make
sense if the reviewer wants to commit small changes, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cosmetic changes&lt;/li&gt;
&lt;li&gt;fixing comments&lt;/li&gt;
&lt;li&gt;fixing typos&lt;/li&gt;
&lt;li&gt;very small code fixes&lt;/li&gt;
&lt;li&gt;rebase / merge onto the current &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; branch if there are no conflicts or they are trivial&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To fasten up the review process, the author or the reviewer can also request a pair review. During the pair review,
they can push changes directly within the review. After this, no further ping pong is necessary. A change can then be
merged as long as the builds and tests are successful.&lt;/p&gt;
&lt;h3 id=&quot;review-feedback&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#review-feedback&quot; aria-label=&quot;review feedback permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Review Feedback&lt;/h3&gt;
&lt;p&gt;In case of an async review, the reviewer creates comments in the PR. If they want the author to change something, they
create a task below the comment indicating action is needed. The change cannot be merged if there are incomplete tasks.&lt;/p&gt;
&lt;p&gt;If the reviewer has not set any status on the PR yet, this means the review is in progress, and the author should
refrain from modifying the branch. Once the reviewer sets the status to “Needs work”, the ball is back at the author
to complete the tasks in the comments. Once the reviewer is happy, they set the status to “Approve”, and the author can
go ahead and merge the changes.&lt;/p&gt;
&lt;h3 id=&quot;review-contents&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#review-contents&quot; aria-label=&quot;review contents permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Review Contents&lt;/h3&gt;
&lt;p&gt;The most important content of the review should be discussed in the handover.
Besides, the reviewer must:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;understand the user story&lt;/li&gt;
&lt;li&gt;understand each and every line of code in the change&lt;/li&gt;
&lt;li&gt;understand the commit history&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reviewer can test the code by clicking through the staged environment. They can also check it out and tinker around
in the code and tests. If this makes sense or not can be different from case to case.&lt;/p&gt;
&lt;p&gt;What the reviewer is not doing, is to clarify story requirements with any other than the author such as the product
owner. They can or even should however discover if the story description diverges from the implementation such that
the business requirements are not met.&lt;/p&gt;
&lt;h2 id=&quot;review-completion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#review-completion&quot; aria-label=&quot;review completion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Review Completion&lt;/h2&gt;
&lt;h3 id=&quot;merge&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#merge&quot; aria-label=&quot;merge permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Merge&lt;/h3&gt;
&lt;p&gt;After the main reviewer gave their final “Approve”, the author can merge the changes.&lt;/p&gt;
&lt;h3 id=&quot;follow-ups&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#follow-ups&quot; aria-label=&quot;follow ups permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Follow-Ups&lt;/h3&gt;
&lt;p&gt;There always may be follow-ups after the change. This is something that should generally be avoided.
A follow up can be a TODO/FIXME in the code, a bug, a missing feature, technical debt, ignored tests and so on.&lt;/p&gt;
&lt;p&gt;If it happens, that it cannot be avoided, and the reviewers accept the follow-ups, these rules have to be observed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each follow up must exist as a JIRA issue&lt;/li&gt;
&lt;li&gt;Commits introducing the follow up have to mention the JIRA issue&lt;/li&gt;
&lt;li&gt;TODO and FIXME comments must contain the JIRA issue (e.g. &lt;code class=&quot;language-text&quot;&gt;// TODO fix label not being displayed (AAA-xxxx)&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;po-review&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#po-review&quot; aria-label=&quot;po review permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PO Review&lt;/h3&gt;
&lt;p&gt;The PO review for larger user stories is planned at latest during the daily stand up meeting. The author has the lead.&lt;/p&gt;
&lt;h3 id=&quot;ux-review&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ux-review&quot; aria-label=&quot;ux review permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;UX Review&lt;/h3&gt;
&lt;p&gt;In a UX intensive task, it is generally a good idea to consolidate the UX designer and get some feedback. This should
happen before any code review occurs.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&quot;contribution-guidelines&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#contribution-guidelines&quot; aria-label=&quot;contribution guidelines permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Contribution guidelines&lt;/h1&gt;
&lt;h2 id=&quot;commit-message-template&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#commit-message-template&quot; aria-label=&quot;commit message template permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Commit message template&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Template for commits related to a JIRA issue:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;AAA-&amp;lt;number&gt; (&amp;lt;type&gt;) &amp;lt;subject&gt;

Explain why this change is being made&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If there is no issue, use the following template:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;(&amp;lt;type&gt;) &amp;lt;subject&gt;

Explain why this change is being made&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Types:&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;feat&lt;/td&gt;
&lt;td&gt;new feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fix&lt;/td&gt;
&lt;td&gt;bug fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;refactor&lt;/td&gt;
&lt;td&gt;refactoring production code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;style&lt;/td&gt;
&lt;td&gt;formatting, missing semi colons etc; no code change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;docs&lt;/td&gt;
&lt;td&gt;changes to documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test&lt;/td&gt;
&lt;td&gt;adding or refactoring tests; no production code change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;build&lt;/td&gt;
&lt;td&gt;updating pipelines, *.gradle, package.json etc; no production code change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deps&lt;/td&gt;
&lt;td&gt;updating maven or npm dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;i18n&lt;/td&gt;
&lt;td&gt;updating translation files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;AAA-0000 (feat) implement X validation logic

This introduces 2 new components:

* X-tile
* X-edit-form

The service `XService` has been extended to support
updating and removing X entities via the backend.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Remember to&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;not capitalize the subject line&lt;/li&gt;
&lt;li&gt;Use the imperative mood in the subject line&lt;/li&gt;
&lt;li&gt;Do not end the subject line with a period&lt;/li&gt;
&lt;li&gt;Separate subject from body with a blank line&lt;/li&gt;
&lt;li&gt;Use the body to explain what and why vs. how&lt;/li&gt;
&lt;li&gt;Use multiple lines with ”-” for bullet points in body&lt;/li&gt;
&lt;li&gt;Squash commits that make it hard to read the history.&lt;/li&gt;
&lt;li&gt;Don’t squash commits if they contain different types as defined above.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;branching-model&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#branching-model&quot; aria-label=&quot;branching model permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Branching Model&lt;/h2&gt;
&lt;p&gt;We are using the Git Flow branching model.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://nvie.com/posts/a-successful-git-branching-model/&quot;&gt;https://nvie.com/posts/a-successful-git-branching-model/&lt;/a&gt; for a very nice
blog post explaining it very well.&lt;/p&gt;
&lt;h3 id=&quot;feature-branches&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#feature-branches&quot; aria-label=&quot;feature branches permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Feature Branches&lt;/h3&gt;
&lt;p&gt;Feature branches should be named with the prefix &lt;code class=&quot;language-text&quot;&gt;feature/&lt;/code&gt; as per recommendation of Git Flow.
Additionally we include the JIRA Issue number and a short description of the feature.&lt;/p&gt;
&lt;p&gt;E.g.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;feature/AAA-9999_Group-Easteregg-Tab&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This provides these benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bitbucket will automatically link the branch with the JIRA issue and vice versa.&lt;/li&gt;
&lt;li&gt;We can easily jump between requirements in JIRA and the branch.&lt;/li&gt;
&lt;li&gt;With the description, we know what’s on a feature branch even without looking up the issue description.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other prefixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;release/&lt;/code&gt; reserved for branches for a version (also for hotfixes, albeit we deviate from the guide)&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;bugfix/&lt;/code&gt; reserved for fixes only (refrain from doing any refactoring here)&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;hotfix/&lt;/code&gt; for hotfixes that will be merged into the hotfix-release branch&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;doc/&lt;/code&gt; reserved for docs-only changes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;docs-branches&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#docs-branches&quot; aria-label=&quot;docs branches permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Docs Branches&lt;/h3&gt;
&lt;p&gt;If you only update documentation you can prefix your branch with &lt;code class=&quot;language-text&quot;&gt;doc/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;E.g.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;doc/knowhow-transfer-update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So, only use it if you are certain you only committed docs changes.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&quot;how-we-use-jira&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-we-use-jira&quot; aria-label=&quot;how we use jira permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How we use JIRA&lt;/h1&gt;
&lt;h2 id=&quot;before-a-sprint&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#before-a-sprint&quot; aria-label=&quot;before a sprint permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Before a sprint&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;We split stories into multiple stories and create an epic for it if the story has an estimate
of over 40 hours before or during PI planning.&lt;/li&gt;
&lt;li&gt;We create sub-tasks for each story which has an estimate of less than a work day.&lt;/li&gt;
&lt;li&gt;Sub-task descriptions can be filled with additional hints or implementation detail. They should however
not contain redundant information from the parent story.&lt;/li&gt;
&lt;li&gt;We do not create extra review sub-tasks unless they are really needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;during-a-sprint&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#during-a-sprint&quot; aria-label=&quot;during a sprint permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;During a sprint&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;We continuously move cards in the board so it is up to date all the time.&lt;/li&gt;
&lt;li&gt;We log hours worked on a task when we move a card to another column and reduce the remaining estimate in
accordance.&lt;/li&gt;
&lt;li&gt;An individual contributor can create new sub-tasks in their story as long as the total sum of remaining
estimates stays the same. The reshuffling has to be discussed with the main reviewer.&lt;/li&gt;
&lt;li&gt;If the estimate for a task changes (up or down), this has to be discussed with the PO or Scrum Master as
soon as it is detected.&lt;/li&gt;
&lt;li&gt;When a developer is done with implementing a sub-task, they move the task to the review column.&lt;/li&gt;
&lt;li&gt;If they reached a checkpoint which can be reviewed, they inform the reviewer personally and create a PR
and assign the reviewer(s) to it.&lt;/li&gt;
&lt;li&gt;The reviewer moves the task to the To Do column if the review is not OK or completes the task(s)
together with the author (someone merges the PR) and moves the task to the Done column.&lt;/li&gt;
&lt;li&gt;The reviewer also logs work hours on the task they reviewed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;po-review-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#po-review-1&quot; aria-label=&quot;po review 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PO Review&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A story can have a PO review or not. It is up to the PO and the team to decide if it makes sense or not.&lt;/li&gt;
&lt;li&gt;If a story should include a PO review, we create a sub-task in the story with an empty estimate.&lt;/li&gt;
&lt;li&gt;This sub-task is then moved along the columns on the board when it is ongoing or complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&quot;tech-discussions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#tech-discussions&quot; aria-label=&quot;tech discussions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Tech Discussions&lt;/h1&gt;
&lt;p&gt;To ensure we have a common vision and understanding in technical topics regarding our services
that we build, we regularly hold tech discussion meetings. Everybody is invited to add their topics
to a topic list. Every developer can then vote on topics. After the event is over, we clear all votes and it starts over.&lt;/p&gt;
&lt;p&gt;The Tech Discussions help us to improve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;common understanding of technical aspects&lt;/li&gt;
&lt;li&gt;know how sharing of new concepts&lt;/li&gt;
&lt;li&gt;discussion of technical directions we should take&lt;/li&gt;
&lt;li&gt;presentation of results of spike undertakings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Action items are tracked as JIRA issues. The documentation of discussed topics always has to be
up-to-date and ensures the discussed items are not forgotten over time or decisions can be looked up
again.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&quot;conclusion&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#conclusion&quot; aria-label=&quot;conclusion permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;Maybe you discovered some practice which could help you in your team?&lt;/p&gt;
&lt;p&gt;It certainly helped me a lot having this written down. Even we discussed everything in the entire
team and everbody agreed to it, it occurred sometimes that the discussed items were forgotten, and
having this document helped us to quickly resolve questions that we have already answered a year ago.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Seminar Assessment on Oneself]]></title><description><![CDATA[In my first blog post related to the AI seminar that I took, I laid out my
learning goals. Now the seminar is coming to an end, and I will…]]></description><link>https://sebastianhaeni.github.com/0008-seminar-self-assessment/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0008-seminar-self-assessment/</guid><pubDate>Tue, 07 Jul 2020 17:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In &lt;a href=&quot;../0002-ai-seminar-intro&quot;&gt;my first blog post related to the AI seminar&lt;/a&gt; that I took, I laid out my
learning goals. Now the seminar is coming to an end, and I will try to assess my own performance and review
if the goals have been met.&lt;/p&gt;
&lt;h2 id=&quot;goal-verification&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#goal-verification&quot; aria-label=&quot;goal verification permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Goal Verification&lt;/h2&gt;
&lt;p&gt;Here are the goals once again. So, let’s go through it.&lt;/p&gt;
&lt;h3 id=&quot;1-i-want-to-know-in-detail-how-the-process-of-writing-scientific-papers-is-like-and-hear-from-an-expert-that-has-experience-in-this&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-i-want-to-know-in-detail-how-the-process-of-writing-scientific-papers-is-like-and-hear-from-an-expert-that-has-experience-in-this&quot; aria-label=&quot;1 i want to know in detail how the process of writing scientific papers is like and hear from an expert that has experience in this permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. I want to &lt;em&gt;know&lt;/em&gt; in detail how the process of writing scientific papers is like and hear from an expert that has experience in this.&lt;/h3&gt;
&lt;p&gt;Thanks to our lecturer who is a journal editor himself, I learned a lot of the process that scientific papers go
through, and I’m grateful for those insights. And by practicing certain aspects of the process myself, such as reviewing
a paper, I got to understand the details of it as well.&lt;/p&gt;
&lt;p&gt;💯 goal fulfilled&lt;/p&gt;
&lt;h3 id=&quot;2-i-want-to-try-criticizing-a-paper-and-get-feedback&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-i-want-to-try-criticizing-a-paper-and-get-feedback&quot; aria-label=&quot;2 i want to try criticizing a paper and get feedback permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. I want to &lt;em&gt;try&lt;/em&gt; criticizing a paper and get feedback.&lt;/h3&gt;
&lt;p&gt;In my last blog post I &lt;a href=&quot;../0007-forecasting-at-scale-review&quot;&gt;reviewed&lt;/a&gt; the paper I was reading. During this activity
I had to research the actual structure of a review, and I think I captured it well. And I also learned about how others
approach this activity.&lt;/p&gt;
&lt;p&gt;During our session we talked about the reviews, and I got a bit convoluted with what I could actually improve. My note
taking was sub-par at that point which is why I’m now unsure how I faired.&lt;/p&gt;
&lt;p&gt;🔳 goal fulfillment unsure&lt;/p&gt;
&lt;h3 id=&quot;3-i-want-to-refine-my-writing-skills&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-i-want-to-refine-my-writing-skills&quot; aria-label=&quot;3 i want to refine my writing skills permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. I want to &lt;em&gt;refine&lt;/em&gt; my writing skills.&lt;/h3&gt;
&lt;p&gt;Writing blog posts for a broader audience definitely helped to refine my writing skills.
Each time I dedicated a lot of thinking time into the structure of the post. My process was as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lay out the structure of the post. The question I asked myself was, how should the reading journey be like? How do we
start and how do we end? What does the audience expect? I also did some research how similar posts are structured and
if I can improve on that.&lt;/li&gt;
&lt;li&gt;Fill in the created sections with bullet points of what I want to write about. This helped me to understand at an
early stage if the flow of the post will make sense in the end. So here I also reviewed the structure again and made
some readjustments.&lt;/li&gt;
&lt;li&gt;On a different day, the next step would be to fill in the sections with prose text, images and references. While
writing, I often did research and looked for interesting graphics or references.&lt;/li&gt;
&lt;li&gt;My last step is proof-reading and ensuring the post forms a whole and sentences or paragraphs are not dangling.&lt;/li&gt;
&lt;li&gt;Publish&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I learned that reading the sentence that I wrote again on a different day usually gives me ideas on how to improve it to
support the reading flow of the reader. I’m still having trouble to stay away from passive sentences though.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;../0004-dissecting-paper-style&quot;&gt;Looking at the writing style&lt;/a&gt; of the paper I read was also helpful, as I think
it’s style was quite good, and I identified the parts that were not so good.&lt;/p&gt;
&lt;p&gt;💯 goal fulfilled&lt;/p&gt;
&lt;h3 id=&quot;4-i-want-to-get-to-know-the-method-explained-in-my-chosen-paper-in-detail&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-i-want-to-get-to-know-the-method-explained-in-my-chosen-paper-in-detail&quot; aria-label=&quot;4 i want to get to know the method explained in my chosen paper in detail permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. I want to &lt;em&gt;get to know&lt;/em&gt; the method explained in my chosen paper in detail.&lt;/h3&gt;
&lt;p&gt;I think now I understand the contents of the paper “Forecasting at Scale”, because I not only did a skimming read, a
thorough read and reading of surrounding literature, I also summarized it in a &lt;a href=&quot;../0006-forecasting-at-scale-content&quot;&gt;blog post&lt;/a&gt;
and held a short presentation.&lt;/p&gt;
&lt;p&gt;One could look at this process of summarizing like an autoencoder. A summary should be shorter than what
you are trying to summarize, otherwise it’s not a summary. So somehow you have to make it shorter, and you do this by
compressing information down. The person reading the summary should still be able to grasp the content of the original
paper with some slight imprecision when filling in the gaps in their own mind. That’s exactly what an autoencoder
architecture would accomplish as well. So the summarizing process is figuring out what parts have to be encoded into the
summary for a possible decoding to be successful.&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: 590px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 74.32432432432432%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAIAAABr+ngCAAAACXBIWXMAAAsTAAALEwEAmpwYAAABsUlEQVR42qVTwU7CQBDlv/0GDyaeTSQh8WDiwWhiUIiKEpBusa1QtlJsu1AVailtSQUsPrpYELk52cPM23nzujPTzPwfllkPvhKDE8dxCsaJwYmiaDqdbiHza0VRRFHkIVK9xFLCfbnc6XT4LQcz67U1TVNkKQhGgiA8wzRKW6qu65VKNQw9QmqWZSENTMbYShkx+JRqslR3+rYsKwCzx7eneYLiTVV1Bz2hVjVNC+8aj8e8yoJs23YYhiAnyvX3brt0ewNcPtppX+xH8bxQyA96ukhqrNtFmuu6K2XDMIIggNOiVKoLA9t4e7URWge7byeHcNyPgdN7gbLFGJSHw+GKDG80GsGhUJbEd6bflUoIz3Zzpew5un99Xez3DLL4bBPKSIbekjyZTNBboFBWZBHP03UNnH57z2W5yWxumm3PsUXyYFmMD2L15rThqqo+KfXA7xeLV5+fGEaEVnqeXyhchoFHhKphmJvdTkfVaDRbLQmO7/scS85yqo+PD5wMZDabbS4JpZQQAma6XclZbJ7jONgfzGV9/36tJ+qByTu/YRzngtt3+18/Rvxjf/O24t+XF1FIb2gCSAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;autoencoder&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/3f3761c6fd7d8a8683b8d75b8c0610b8/fcda8/autoencoder.png&quot;
        srcset=&quot;/blog/static/3f3761c6fd7d8a8683b8d75b8c0610b8/12f09/autoencoder.png 148w,
/blog/static/3f3761c6fd7d8a8683b8d75b8c0610b8/e4a3f/autoencoder.png 295w,
/blog/static/3f3761c6fd7d8a8683b8d75b8c0610b8/fcda8/autoencoder.png 590w,
/blog/static/3f3761c6fd7d8a8683b8d75b8c0610b8/efc66/autoencoder.png 885w,
/blog/static/3f3761c6fd7d8a8683b8d75b8c0610b8/00d43/autoencoder.png 1000w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;/span&gt;
Image Source: &lt;a href=&quot;https://mc.ai/variational-autoencoders-an-intuitive-explanation-some-keras-code-2/&quot;&gt;mc.ai&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In turn I discovered the key points of the paper and internalized it for myself.&lt;/p&gt;
&lt;p&gt;💯 goal fulfilled&lt;/p&gt;
&lt;h3 id=&quot;5-i-want-to-establish-a-regular-blogging-habit-beyond-this-seminar&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#5-i-want-to-establish-a-regular-blogging-habit-beyond-this-seminar&quot; aria-label=&quot;5 i want to establish a regular blogging habit beyond this seminar permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. I want to &lt;em&gt;establish&lt;/em&gt; a regular blogging habit beyond this seminar.&lt;/h3&gt;
&lt;p&gt;I can’t judge this goal just yet. I have written one post that is not related to the seminar as yet and I have
more topics in my queue. I sure hope I will find the motivation to keep this going. I clearly see the benefit of doing
so.&lt;/p&gt;
&lt;p&gt;🔳 goal fulfillment not possible yet&lt;/p&gt;
&lt;h3 id=&quot;6-i-want-to-share-my-learning-process-and-gain-insights-how-others-do-the-same&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#6-i-want-to-share-my-learning-process-and-gain-insights-how-others-do-the-same&quot; aria-label=&quot;6 i want to share my learning process and gain insights how others do the same permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. I want to &lt;em&gt;share&lt;/em&gt; my learning process and gain insights how others do the same.&lt;/h3&gt;
&lt;p&gt;Through this blog and colloquial sessions with my peers and lecturer I was able to share my learning process. This blog
post itself is the culmination of it.&lt;/p&gt;
&lt;p&gt;💯 goal fulfilled&lt;/p&gt;
&lt;h2 id=&quot;comparing-myself-to-others&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#comparing-myself-to-others&quot; aria-label=&quot;comparing myself to others permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Comparing myself to others&lt;/h2&gt;
&lt;p&gt;I was not the only one participating in this seminar, and we were specifically asked to compare our performance to
others.&lt;/p&gt;
&lt;p&gt;Here I will split my comparison into the different parts that we participated in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blog Posts&lt;/strong&gt;: I tried to make my posts as enjoyable to read as possible with a reasonable time amount spent writing
them. As I plan to continue using this blog as my personal blog for the foreseeable future, I always had in mind
writing for a broader audience that is not exclusively limited to participants of the seminar. I was always impressed
by what the others created and tried to learn from their good efforts and tried to improve upon. Unfortunately I
almost never published my posts very early, which is why my colleagues had little to no time to read it before our
sessions. So I would give myself a negative rating for the timeliness, but an above-average rating for the content
itself compared to others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session Participation&lt;/strong&gt;: I came reasonably well prepared into the sessions, having read the emails and slides from
last time, the additional resources and the posts of the others. I enjoyed the sessions as they were focused and
required one to be “present” with their mind. I think all participants did well.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presentations&lt;/strong&gt;: The long-ish presentation is still ahead of me. The few things I presented were ok-ish. At one time
I was confused as what to present, because we were asked to prepare to present the findings of our writing style
analysis and then in the session we were asked to present the content (without having thought about how to present it).
I also think all participants did well in this regard.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;learnings-summary&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#learnings-summary&quot; aria-label=&quot;learnings summary permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Learnings Summary&lt;/h2&gt;
&lt;p&gt;So, I learned to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;read / understand a scientific paper&lt;/li&gt;
&lt;li&gt;obtain more information / do literature research&lt;/li&gt;
&lt;li&gt;put research in context (with respect to current state of the art in the field)&lt;/li&gt;
&lt;li&gt;form my own scientific opinion / judgement&lt;/li&gt;
&lt;li&gt;present scientific results in different ways (blog, orally, presentation, written document)&lt;/li&gt;
&lt;li&gt;engage in a scientific discussion, express my view, formulate criticism&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;I can highly recommend this seminar to any other fellow students that might be reading this blog, thinking about
enrolling. The university internal name of the course is “EVA Artificial Intelligence Seminar”.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A Review of Forecasting at Scale]]></title><description><![CDATA[This is my final review of the paper
 Sean J. Taylor & Benjamin Letham (2018) “Forecasting at Scale”, The American Statistician. I’m going…]]></description><link>https://sebastianhaeni.github.com/0007-forecasting-at-scale-review/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0007-forecasting-at-scale-review/</guid><pubDate>Tue, 02 Jun 2020 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is my final review of the paper
&lt;span style=&quot;font-size: 1.2em&quot;&gt; &lt;em&gt;&lt;a href=&quot;https://amstat.tandfonline.com/doi/full/10.1080/00031305.2017.1380080&quot;&gt;Sean J. Taylor &amp;#x26; Benjamin Letham (2018) “Forecasting at Scale”, The American Statistician&lt;/a&gt;&lt;/em&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I’m going to follow a common peer review template that is in place at some conferences such as
&lt;a href=&quot;https://www.ijcai.org/&quot;&gt;IJCAI&lt;/a&gt; while also explaining the score category further down this article, so you and future
me know what questions should be asked oneself when giving a review.&lt;/p&gt;
&lt;p&gt;A peer review always has to be in a context. This can for example be a certain conference or journal.
So, I’m going to pretend I’m reviewing this for an AI conference similar to IJCAI (which might not make sense to ever
submit this paper there, but I’m getting there 😄).&lt;/p&gt;
&lt;h3 id=&quot;my-scores&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-scores&quot; aria-label=&quot;my scores permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My Scores&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Relevance: 5 / 10 ⭐&lt;/li&gt;
&lt;li&gt;Significance: 5 / 10 ⭐&lt;/li&gt;
&lt;li&gt;Originality: 1 / 10 ⭐&lt;/li&gt;
&lt;li&gt;Technical Quality: 3 / 10 ⭐&lt;/li&gt;
&lt;li&gt;Clarity and quality of writing: 8 / 10 ⭐&lt;/li&gt;
&lt;li&gt;Scholarship, i.e. scientific context: 7 / 10 ⭐&lt;/li&gt;
&lt;li&gt;Overall Score: 4 / 10 ⭐&lt;/li&gt;
&lt;li&gt;Confidence on my assessment: 5 / 10 ⭐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;my-comments-about-the-paper&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-comments-about-the-paper&quot; aria-label=&quot;my comments about the paper permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My Comments About The Paper:&lt;/h3&gt;
&lt;h4 id=&quot;summary&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#summary&quot; aria-label=&quot;summary permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Summary&lt;/h4&gt;
&lt;p&gt;The paper “Forecasting at Scale” is a well laid out paper giving an insight into methods and techniques used to process
business time series at scale, do forecasts with the analyst in the loop and automatically select models. The trend
model incorporates dynamic growth rates and change points. The seasonality model is based on Fourier series. The
authors propose to use a method called Simulated Historical Forecasts (SHF) to automatically evaluate forecasts. The main
findings are a set of techniques to apply in a large corporation with analysts that might have their hands full of
work to optimize their workflow to produce accurate forecasts with only little intervention.&lt;/p&gt;
&lt;p&gt;The authors assembled their techniques from several previous work, and I think one that gives a great overview is
&lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S0169207006000021?casa_token=1C2peihwTC4AAAAA:PvXUJamS81Jwy2zOLvC8-EZROor8Um7yyRumc8OD4mxKPGGsMYvMHeVn6ghObfztwOFY93Uu&quot;&gt;“25 Years of Time Series Forecasting”&lt;/a&gt;
which is also referenced by the paper. I regard the significance and novelty as rather low and think the authors
produced a good confirmatory paper showcasing how these techniques work at scale.&lt;/p&gt;
&lt;p&gt;The authors explained their chosen methods well, they make sense and offer what is promised. A reader gains a good feel
to build a forecasting system that can work at scale.&lt;/p&gt;
&lt;p&gt;What I’m missing in the paper are verification results of the chosen methods and how they would fare against other or
even similar methods. Sometimes the authors also don’t explain their choices.&lt;/p&gt;
&lt;p&gt;I greatly appreciate the accompanying Python and R forecasting library &lt;a href=&quot;https://facebook.github.io/prophet/&quot;&gt;Prophet&lt;/a&gt;
that has all mentioned methods implemented and is super fun to use. The paper is a good introduction for users of the
library.&lt;/p&gt;
&lt;h4 id=&quot;major-issues&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#major-issues&quot; aria-label=&quot;major issues permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Major Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;As mentioned in the summary, comprehensible verification of the chosen trend and seasonality methods is largely missing.&lt;/li&gt;
&lt;li&gt;This paper is confirmatory of previous work and thus belongs into a journal rather than to a conference.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;minor-issues&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#minor-issues&quot; aria-label=&quot;minor issues permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Minor Issues&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Table 1 is superfluous. The description of holidays and their format is enough.&lt;/li&gt;
&lt;li&gt;The style of figures should be consistent throughout the paper.&lt;/li&gt;
&lt;li&gt;The remark that the authors are storing SHF in Hive or MySQL can be helpful but feels out of place. Either it should
just be more of a focus to describe implementation details or leave them away completely.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;confidential-notes-to-editor&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#confidential-notes-to-editor&quot; aria-label=&quot;confidential notes to editor permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Confidential Notes to Editor&lt;/h4&gt;
&lt;p&gt;Since this is not a real review and there’s no editor I will not write any notes here, but still include it so it’s
clear a review usually includes this section.&lt;/p&gt;
&lt;p&gt;One could mention that paper could be suspect to plagiarism or comments that the authors maybe didn’t know enough about
previous work. If you are making a borderline decision you can also add some comments to make the score distinguishable
to the editor. And, if you have confidential information that you would not like the authors to know, you can add it.
This can for example be collected data that only your or your organization have and so on.&lt;/p&gt;
&lt;p&gt;If you have a conflict of interest you should not even start the review and make it clear beforehand.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;review-template&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#review-template&quot; aria-label=&quot;review template permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Review Template&lt;/h2&gt;
&lt;p&gt;The score categories I used above are explained here. The explanations are taken from the slide deck we received at my
university ZHAW.&lt;/p&gt;
&lt;h3 id=&quot;relevance&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#relevance&quot; aria-label=&quot;relevance permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Relevance&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Is the paper fully within the scope of the conference?&lt;/li&gt;
&lt;li&gt;Will the questions and results of the paper be of interest to researchers in the field?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;significance&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#significance&quot; aria-label=&quot;significance permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Significance&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Is this a significant advance in the state of the art?&lt;/li&gt;
&lt;li&gt;Is this a paper that people are likely to read and cite?&lt;/li&gt;
&lt;li&gt;Does the paper address an important problem?&lt;/li&gt;
&lt;li&gt;Does it open new research directions?&lt;/li&gt;
&lt;li&gt;Is it a paper that is likely to have a lasting impact?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;originality&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#originality&quot; aria-label=&quot;originality permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Originality&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Reviewers should recognise and reward papers that propose genuinely new ideas.&lt;/li&gt;
&lt;li&gt;As a reviewer you should try to assess whether the ideas are truly new.&lt;/li&gt;
&lt;li&gt;Novel combinations, adaptations or extensions of existing ideas are also valuable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;technical-quality&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#technical-quality&quot; aria-label=&quot;technical quality permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Technical Quality&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Are the results technically sound?&lt;/li&gt;
&lt;li&gt;Are there obvious flaws in the conceptual approach?&lt;/li&gt;
&lt;li&gt;Are claims well-supported by theoretical analysis or experimental results?&lt;/li&gt;
&lt;li&gt;Are the experiments well thought out and convincing?&lt;/li&gt;
&lt;li&gt;Will it be possible for other researchers to replicate these results?&lt;/li&gt;
&lt;li&gt;Is the evaluation appropriate?&lt;/li&gt;
&lt;li&gt;Did the authors clearly assess both the strengths and weaknesses of their approach?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;clarity-and-quality-of-writing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#clarity-and-quality-of-writing&quot; aria-label=&quot;clarity and quality of writing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Clarity and quality of writing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Is the paper clearly written?&lt;/li&gt;
&lt;li&gt;Is there a good use of examples and figures?&lt;/li&gt;
&lt;li&gt;Is it well organized?&lt;/li&gt;
&lt;li&gt;Are there problems with style and grammar?&lt;/li&gt;
&lt;li&gt;Are there issues with typos, formatting, references, etc.?&lt;/li&gt;
&lt;li&gt;It may be better to advise the authors to revise a paper and submit to a later conference, than to accept and publish
a poorly-written version. However, if the paper is likely to be accepted, please make suggestions to improve the
clarity of the paper, and provide details of typos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;scholarship-ie-scientific-context&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#scholarship-ie-scientific-context&quot; aria-label=&quot;scholarship ie scientific context permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Scholarship, i.e. scientific context&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Does the paper situate the work with respect to the state of the art?&lt;/li&gt;
&lt;li&gt;Are relevant papers cited, discussed, and compared to the presented work?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;overall-score&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#overall-score&quot; aria-label=&quot;overall score permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Overall Score&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;(10) This is best-paper material&lt;/li&gt;
&lt;li&gt;(9) An excellent paper, a very strong accept&lt;/li&gt;
&lt;li&gt;(8) A very good paper, a strong accept&lt;/li&gt;
&lt;li&gt;(7) A good paper, accept.&lt;/li&gt;
&lt;li&gt;(6) A good paper overall. I vote for acceptance, although would not be upset if it were rejected because of the low acceptance rate&lt;/li&gt;
&lt;li&gt;(5) Decent paper, but may be below the IJCAI threshold. I tend to vote for rejecting it, although would not be upset if it were accepted&lt;/li&gt;
&lt;li&gt;(4) I vote for rejecting it, but could be persuaded otherwise–3-A weak paper, just not good enough.&lt;/li&gt;
&lt;li&gt;(3) A clear rejection. I vote and argue for rejection. Clearly below the standards of the conference&lt;/li&gt;
&lt;li&gt;(2) A very strong rejection. I will actively fight for rejection.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;confidence-on-your-assessment&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#confidence-on-your-assessment&quot; aria-label=&quot;confidence on your assessment permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Confidence on your assessment&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;(10) My own current research is on the topic of the paper&lt;/li&gt;
&lt;li&gt;(9) I have undertaken research on the topic of the paper&lt;/li&gt;
&lt;li&gt;(8) I am an expert in this area&lt;/li&gt;
&lt;li&gt;(7) I have up-to-date knowledge in the area&lt;/li&gt;
&lt;li&gt;(6) I don’t have complete knowledge of the area, but can assess the value of the work&lt;/li&gt;
&lt;li&gt;(5) I have a general understanding of the area&lt;/li&gt;
&lt;li&gt;(4) My assessment is an informed guess&lt;/li&gt;
&lt;li&gt;(3) My knowledge in the area is limited&lt;/li&gt;
&lt;li&gt;(2) My knowledge in the area is very limited&lt;/li&gt;
&lt;li&gt;(1) My assessment can be wrong&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;comments-to-authors-free-text&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#comments-to-authors-free-text&quot; aria-label=&quot;comments to authors free text permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Comments to Authors (free text):&lt;/h3&gt;
&lt;p&gt;General points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure you substantiate all the scores for the different criteria above.&lt;/li&gt;
&lt;li&gt;Give informative content.&lt;/li&gt;
&lt;li&gt;Be constructive.&lt;/li&gt;
&lt;li&gt;Write your comments in the same way you would like to receive comments on your own papers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The comment section can be laid out like this, taken from &lt;a href=&quot;https://authorservices.wiley.com/Reviewers/journal-reviewers/how-to-perform-a-peer-review/step-by-step-guide-to-reviewing-a-manuscript.html&quot;&gt;wiley.com - How to perform a peer review&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Summary&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give positive feedback first. Authors are more likely to read your review if you do so. But don’t overdo it if you will be recommending rejection&lt;/li&gt;
&lt;li&gt;Briefly summarize what the paper is about and what the findings are&lt;/li&gt;
&lt;li&gt;Try to put the findings of the paper into the context of the existing literature and current knowledge&lt;/li&gt;
&lt;li&gt;Indicate the significance of the work and if it is novel or mainly confirmatory&lt;/li&gt;
&lt;li&gt;Indicate the work’s strengths, its quality and completeness&lt;/li&gt;
&lt;li&gt;State any major flaws or weaknesses and note any special considerations. For example, if previously held theories are being overlooked&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Major Issues&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are there any major flaws? State what they are and what the severity of their impact is on the paper&lt;/li&gt;
&lt;li&gt;Has similar work already been published without the authors acknowledging this?&lt;/li&gt;
&lt;li&gt;Are the authors presenting findings that challenge current thinking? Is the evidence they present strong enough to prove their case? Have they cited all the relevant work that would contradict their thinking and addressed it appropriately?&lt;/li&gt;
&lt;li&gt;If major revisions are required, try to indicate clearly what they are&lt;/li&gt;
&lt;li&gt;Are there any major presentational problems? Are figures &amp;#x26; tables, language and manuscript structure all clear enough for you to accurately assess the work?&lt;/li&gt;
&lt;li&gt;Are there any ethical issues? If you are unsure it may be better to disclose these in the confidential comments section&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Minor Issues&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are there places where meaning is ambiguous? How can this be corrected?&lt;/li&gt;
&lt;li&gt;Are the correct references cited? If not, which should be cited instead/also? Are citations excessive, limited, or biased?&lt;/li&gt;
&lt;li&gt;Are there any factual, numerical or unit errors? If so, what are they?&lt;/li&gt;
&lt;li&gt;Are all tables and figures appropriate, sufficient, and correctly labelled? If not, say which are not&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title><![CDATA[How to Forecast at Scale]]></title><description><![CDATA[This is my third blog post about the paper
 Sean J. Taylor & Benjamin Letham (2018) “Forecasting at Scale”, The American Statistician. I’m…]]></description><link>https://sebastianhaeni.github.com/0006-forecasting-at-scale-content/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0006-forecasting-at-scale-content/</guid><pubDate>Tue, 12 May 2020 23:30:00 GMT</pubDate><content:encoded>&lt;p&gt;This is my third blog post about the paper
&lt;span style=&quot;font-size: 1.2em&quot;&gt; &lt;em&gt;&lt;a href=&quot;https://amstat.tandfonline.com/doi/full/10.1080/00031305.2017.1380080&quot;&gt;Sean J. Taylor &amp;#x26; Benjamin Letham (2018) “Forecasting at Scale”, The American Statistician&lt;/a&gt;&lt;/em&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I’m going to focus on its contents and try to place it in the field of forecasting and business time series.&lt;/p&gt;
&lt;h2 id=&quot;business-time-series&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#business-time-series&quot; aria-label=&quot;business time series permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Business Time Series&lt;/h2&gt;
&lt;p&gt;Most large corporations process a lot of interesting data in the form of Business Time Series. These can be customer
related such as purchases, interactions through consultations, support, incident reports, usage of the service and so
on. They can also be about internal processes that cannot be attributed to a single customer, such as infrastructure
providing services to multiple customers.&lt;/p&gt;
&lt;p&gt;These time series can provide insights on how the company performed in the past but also provide the foundation to
create forecasts. The paper “Forecasting at Scale” provides the reader with practices proofed in
the real world because they have been applied at Facebook. If the proposed methods work outside of Facebook and are
applicable to other organizations has to be found out.&lt;/p&gt;
&lt;h2 id=&quot;preliminary-reading&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#preliminary-reading&quot; aria-label=&quot;preliminary reading permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Preliminary reading&lt;/h2&gt;
&lt;p&gt;I’m going to list a few topics that you should be familiar with in case you decide to read the paper.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linear Regression, Advanced Regression Methods, Exponential Smoothing Methods, Bayesian Statistics, Fourier Series,
&lt;a href=&quot;http://bit.ly/stl1990&quot;&gt;STL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to reproduce the results of the paper, I recommend you are familiar with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jstatsoft.org/article/view/v076i01&quot;&gt;Stan&lt;/a&gt;, &lt;a href=&quot;https://www.r-project.org/&quot;&gt;R&lt;/a&gt;, &lt;a href=&quot;https://shiny.rstudio.com/&quot;&gt;Shiny&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;assembly-of-ideas&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#assembly-of-ideas&quot; aria-label=&quot;assembly of ideas permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Assembly of Ideas&lt;/h2&gt;
&lt;p&gt;The paper has the main idea to assemble several methods into a scalable forecasting system. So what are the ideas
that the authors have assembled to build this system of scale?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A forecasting model&lt;/li&gt;
&lt;li&gt;Automatic evaluation of forecasts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-prophet-forecasting-model&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-prophet-forecasting-model&quot; aria-label=&quot;the prophet forecasting model permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The &lt;a href=&quot;https://facebook.github.io/prophet/&quot;&gt;Prophet&lt;/a&gt; Forecasting Model&lt;/h2&gt;
&lt;p&gt;As we know from the STL paper (Seasonal and Trend Decomposition using Loess), one can try to decompose a time series
into trend and seasonality components using Loess regression.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trend&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The mathematical expression to compute the nonlinear, saturating growth trend in its most basic form is&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: 231px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/d029996fabeb08c81a77b61057e13934/6e622/standard-trend.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: 27.027027027027025%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAr0lEQVR42pVQywqEMBDz/z/Lmx48SA/eRbHWJ61vayQD7sld2ELamRKSzAT448zzjGVZfnICXuu6YpomHMeBbdu+kvM8xzAMUl/X9S5I1yiKkGUZ6rpGWZaw1qJtW4zjiK7rBE3TSE8OQWGCPGMMnHNiEuz7LkQ23ntxqaoKRVFAa400TRGGobx93yOOYyilxJRGSZJIT43PyG8jUJwrOM9TknAS/jEA8QRgzZU9YW6pYYKDaKKn8wAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;standard trend formula&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/d029996fabeb08c81a77b61057e13934/6e622/standard-trend.png&quot;
        srcset=&quot;/blog/static/d029996fabeb08c81a77b61057e13934/12f09/standard-trend.png 148w,
/blog/static/d029996fabeb08c81a77b61057e13934/6e622/standard-trend.png 231w&quot;
        sizes=&quot;(max-width: 231px) 100vw, 231px&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;with C the carrying capacity, k the growth rate, and m an offset parameter.&lt;/p&gt;
&lt;p&gt;This gives us a formula that supports a static carrying capacity and static growth rate. In the real world capacity and
growth rate are often not static and need to be dynamic. We can replace the carrying
capacity with an analyst-specified dynamic capacity function based on time. The growth rate can be replaced with a vector that contains the
manually specified change points with the respective growth rate of that time interval. This gives us the new formula&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: 394px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/641cd764309092ad650cba14986ab45d/cc097/prophet-trend.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: 14.864864864864865%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAfklEQVR42oWOSw7EIAxDuf8BWSIkWqCl5a9uoHiUHKATyYvIfk7EWgtzTvyb53lw3zfGGJ85cV0XjDForaGUghgjjuNg+DxPhBBYWmtIKUH5nDN7lPHes++c4w5BF9/35fbeO2qtUEpxmOCUEqy1DO77zhCJdireto3L6Snif0855dIijEOxAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;prophet trend formula&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/641cd764309092ad650cba14986ab45d/cc097/prophet-trend.png&quot;
        srcset=&quot;/blog/static/641cd764309092ad650cba14986ab45d/12f09/prophet-trend.png 148w,
/blog/static/641cd764309092ad650cba14986ab45d/e4a3f/prophet-trend.png 295w,
/blog/static/641cd764309092ad650cba14986ab45d/cc097/prophet-trend.png 394w&quot;
        sizes=&quot;(max-width: 394px) 100vw, 394px&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;Sometimes we only need a piecewise linear model. This formula can be reused when simplified. It will give us a linear trend
with change points by removing the carrying capacity, and a constant growth replaced by rate adjustments.&lt;/p&gt;
&lt;p&gt;The uncertainty of this model is computed by using it generatively, after having inferred the model parameters, to
forecast the future, while assuming the rate of change points is going to have a similar average cadence. We can repeat
the generation while sampling the model parameters from a Laplace distribution and create an uncertainty region.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Seasonality&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since seasonality in the real world is mostly a composition and does not have a fixed window in which it repeats, it
can be flexibly modeled using Fourier series. If we have different components for different periodic effects, such as
yearly, holiday or weekday components, we can create an additive model based on that.&lt;/p&gt;
&lt;p&gt;A standard Fourier series can approximate arbitrary smooth seasonal effects with:&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: 547px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/ac5c908c168ba5ef997f01b18523d9c3/977f7/fourier-series.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: 20.27027027027027%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAo0lEQVR42l1Pyw6EIAz0/z/Qixc1PBRBkQNBRWczbDTuNmkoM+10WuEV53liXVfknB+MdUoJ27b94Hc/cfL7vuO6LlQkjDEFtNai6zporRFCgPceUko0TYO+7wvOhcTZK4RA27ZPDsOAiqrTNCHGiHEcUdd1EXXOlSGKkGfNd1kWzPNchinImr1crJT6OrzjOI7igPbfZ/FUvsz/k8nRFGf5/wCytzOuWNu5hQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;fourier series&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/ac5c908c168ba5ef997f01b18523d9c3/977f7/fourier-series.png&quot;
        srcset=&quot;/blog/static/ac5c908c168ba5ef997f01b18523d9c3/12f09/fourier-series.png 148w,
/blog/static/ac5c908c168ba5ef997f01b18523d9c3/e4a3f/fourier-series.png 295w,
/blog/static/ac5c908c168ba5ef997f01b18523d9c3/977f7/fourier-series.png 547w&quot;
        sizes=&quot;(max-width: 547px) 100vw, 547px&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;strong&gt;Fitting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The complete model can be fitted in Stan:&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/9d3e6c354770300c8a2f03d1616d29d2/5d030/model-stan.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: 75.67567567567568%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsTAAALEwEAmpwYAAAByklEQVR42p1Tia6jMAzs/39jpba03FcCIYRznsddVlXfrt5BFVIcM54Zm5NpW9yiCFVbw4cR277J2vHb67RvO9w0oPItyqFFMQjwEvRw5++H4CfenHMYxxGtsI3jB9I0hTEGIQTdt237GaC1FsMgLMsSj/sdWZYpeN/3qOsay7Io03Vdv2SsgFVV4Xq9KhBBuOI41sVYURRagHkHc4J77zHP82fAUpgR0HZWk+/CUgvkuQLeohsulwtyeSbgAcoitOuVtQJ6kWslidIm+tYadLbD6EeEMWCQl+qqVlu+JXnaFtjZofAN6mBh5h5+DShHozGuRuLv17/An132DkPwyE2FuEiRlhkaK3Imj9YZNL38D4M2iBLJlN7RQ07HJ8Bt3bTTeZohTVKVTJmud2oDn/uu+ztO9JUeJ0miBZjDItM0CeAf2k4CNJ0N4WGWZ9pldpbM5mXWeaRMvkhmZHmMEneeP5siX0YbOiSuQGQz1N4iMikeXY6rSXDvsm8P9xNQvAiTdNc+5XCMOpFIOb3rdW+aRuMcFY4MVXA/vibKVsBDBgE40JR9Pp/VL0pjMgHpFxeLHx4yX3vwwv7ECq+Bo8AxEu/7kfO/z/ADFMeNFmWQdtoAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;model-stan&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/9d3e6c354770300c8a2f03d1616d29d2/fcda8/model-stan.png&quot;
        srcset=&quot;/blog/static/9d3e6c354770300c8a2f03d1616d29d2/12f09/model-stan.png 148w,
/blog/static/9d3e6c354770300c8a2f03d1616d29d2/e4a3f/model-stan.png 295w,
/blog/static/9d3e6c354770300c8a2f03d1616d29d2/fcda8/model-stan.png 590w,
/blog/static/9d3e6c354770300c8a2f03d1616d29d2/5d030/model-stan.png 771w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;The analyst creating a fit has to tweak the model parameters to reach the right compromise between loss and
overfitting. An analyst has settings to adjust capacities (C), change points (X), holidays and seasonality (A, gamma) and
smoothing parameters (tau, sigma). Often times this requires a broad experience in the business field to come up with
good model parameters. This can for example be because the analyst has to have a feeling for the impact of an upcoming
holiday in terms of trend or seasonality change.&lt;/p&gt;
&lt;p&gt;The analyst is supported by visualization that show the effects of the latest changes to their model:&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: 590px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/0f9620ade15b6088a67b4c8c8b251c6f/eb2af/fit-viz.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: 36.486486486486484%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABU0lEQVR42k1RSW7DMAz0/99ToJfeemh7y6FN0hRxFtQbJNuKZWuxZE9JZ0EJDESJFIccJvM8w3v/wDiOC+IYEEN43Kcp0knx25t3DsYaxBigtUZd12BLlFLo+355YOjugqwUeHpb4VwIOGthCZVoMBgL5xgOWVFBKb0Q2MGiqRvM84RECLEwtG2LpmnQqQvS8hfPq1fszimkkBBS4n2zxsf3Dzj/0iqsjwe87/bQRGKdR5YXCFQ8qaqKutJLl9xt1/UUTLH9fEGRpUSkliKn0wbbwxckTSFljaI84ljuaewePkSorrsWlMRujAFrOZKGjtic7TDFlk5N4zoiG8hvoeoTzDBQviUde1idkc6kfTBEVJEfkXChgZJYF2ZgMIH35I+RRI+LhmO4+rwQzg+3u/e0wOjo/0BN0VJ4M/ftsjEBC8+F2VjfPM8fsWmaHhPd8d/+ANNgGjfG0f+JAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;fit visualization&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/0f9620ade15b6088a67b4c8c8b251c6f/fcda8/fit-viz.png&quot;
        srcset=&quot;/blog/static/0f9620ade15b6088a67b4c8c8b251c6f/12f09/fit-viz.png 148w,
/blog/static/0f9620ade15b6088a67b4c8c8b251c6f/e4a3f/fit-viz.png 295w,
/blog/static/0f9620ade15b6088a67b4c8c8b251c6f/fcda8/fit-viz.png 590w,
/blog/static/0f9620ade15b6088a67b4c8c8b251c6f/efc66/fit-viz.png 885w,
/blog/static/0f9620ade15b6088a67b4c8c8b251c6f/eb2af/fit-viz.png 954w&quot;
        sizes=&quot;(max-width: 590px) 100vw, 590px&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;h2 id=&quot;automatic-evaluation-of-forecasts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#automatic-evaluation-of-forecasts&quot; aria-label=&quot;automatic evaluation of forecasts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Automatic Evaluation of Forecasts&lt;/h2&gt;
&lt;p&gt;The analyst can optimize a model given time. If there are too many forecasts that have to be produced that can be
handled by humans, the automatic evaluation of forecasts comes into play.&lt;/p&gt;
&lt;p&gt;The metric used to compare models is the mean absolute percentage error (MAPE) over a number of forecasts produced with
different prediction horizons.&lt;/p&gt;
&lt;p&gt;Time series data points are inherently dependent on previous points. This is making it hard to use traditional methods
such as cross-validation. The method proposed is Simulated Historical Forecasts (SHFs), that produce K forecasts at
various cutoff points in the history. The generally used amount of points is a forecast every H/2 periods. This allows
the model to produce an error term using MAPE which can be compared to baseline models.&lt;/p&gt;
&lt;p&gt;Time series data usually encompasses a lot of data points and running SHFs with the maximum amount of periods would not
be feasible as the model needs to be retrained each time. With SHFs, the simulation count is significantly reduced and
the computation can be run independent on separate machines.&lt;/p&gt;
&lt;h2 id=&quot;paper-context&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#paper-context&quot; aria-label=&quot;paper context permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Paper Context&lt;/h2&gt;
&lt;p&gt;The paper “Forecasting at Scale”, picks up common knowledge that the field of business time series has been using for
quite some time but mix it with other techniques to solve new challenges while making it scalable and allowing the
analyst to be in the loop.&lt;/p&gt;
&lt;p&gt;In my opinion the value the paper creates in the field is not the paper, but the companioning library &lt;a href=&quot;https://facebook.github.io/prophet/&quot;&gt;Prophet&lt;/a&gt; which
makes all those techniques readily usable for a broader audience. The paper is worth a read if you’re going to use the
library. If you’re not planning that have a go with it, I can still recommend it as there might be some smallish novel
ideas introduced that you might find interesting. If you are already well versed in the time series field, I would say
that this paper is not going to contain much new for you.&lt;/p&gt;
&lt;h2 id=&quot;paper-follow-ups&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#paper-follow-ups&quot; aria-label=&quot;paper follow ups permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Paper Follow ups&lt;/h2&gt;
&lt;p&gt;The library &lt;a href=&quot;https://facebook.github.io/prophet/&quot;&gt;Prophet&lt;/a&gt; is under active development for over a year now. The open source community contributes to future
improvements to the code. The basic methods mentioned in the paper implemented haven’t been changed though. So I’m
guessing that they are a good fit for the real world.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Automatically keep your dependencies up to date in closed source projects for free]]></title><description><![CDATA[We tackle the question of why it’s important to keep your dependencies up to date, compare a few proprietary
solutions and then talk about…]]></description><link>https://sebastianhaeni.github.com/0005-keep-your-dependencies-up-to-date/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0005-keep-your-dependencies-up-to-date/</guid><pubDate>Sun, 26 Apr 2020 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We tackle the question of why it’s important to keep your dependencies up to date, compare a few proprietary
solutions and then talk about how to do it with NPM, Gradle and Jenkins yourself.&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: 487px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.21621621621621%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAADrklEQVR42g2SW0ybBQCF/8RHE02MD7745CXxwRgzjVNRGWwum4w4dbIxFlkLZYgIAk3HpZTCuLSltBQK7epfLuVWLgNKGUhhA+YYMNgy2TIYIGOMwTYQAWWMi5//w3k4L9/JOTmCPlPOby0lzM8MMjHWh6/NycKjGba219ncXGFr8y+ebSyws7PC6swwza4MUtUyPA4Dz69fYKFTxFGkI0ubykfvv4NQmq+g73Ida3/fZ2y0i6H+VqanbrGzuyEBl3kuaWPtAYNd1bS5jNRU6NCcjaQ0V0lFfhIuSaJJQ25aHPGKrxGyM2S0NtqYHh+QgD1c6bmAT/KLs6PMz93in5X79LdXYosJpjgulBaXhcTo45xTyaSAHAmmxKqLR5cageJUEEJWZgxqdSw241nujA3SZElhst5MWVo4M3d7WF++R6sEaUmLYCD7DPV2HXmqk3jripi90YrTlI7FrKHIoiHw8z0I2owoIs+E4C4v4MZQN87440w487BHBeOVKm5Kdbs9DXhFM+ez0nG1XUe0FzLQ7eZBby16eTDf+L1Nd5udkGNHEHRZPxMWFoyzVI9bNGEIDWTcqsYWcRiLSkF3lUiTWEKt3YreUo3W4kFrbmD05gjNhgTqVSEoDr3H+egAvvsqEKFd1JKplDNUX0ieMpyAt15hIP0k4Xvf5MiHbzDe5mJi6BpFRisOZy1dPf0olFaaPZ0knjqARdp28rKLwvxYGuryEQY66uirtzE17KMmNgLNl+9yxaDAo40k54s9PLk5zMrSPO0dPkJlSopFL5lGNyZTCV5nFmWGZHy1Doqv1jEyUoHQWZSMWJrHWLmVbb+DPN13jGlZLEtRsWzv3c+aKRvYxNPxO/5BctTyEzQZskhIyqarpYamKieuygq8voto1FqEsb4mfjWl0J4czmO/AIZVGXiq3PTbRab3BTFuSmJrbYGy6ot8dvg05cofKE5PI+6nFNxlNny6GPQmI1dHblNeVovw77M17Pp4ijOU+Ew22jRS8jkDPc4KrokuLjVUMjd1l/ScEk7IUylXRRDzYzK5BRVM9tTTkp+IrtbLvakJxscnEOYe/klXdyuNqTJ6X/uUqRcPMPvSfmZfPcTt1w/yhyGG0T4fkYkmNJmlWJOikSVIF3I0csmixFxeg/fOQxYfP2J99QnC7n9brC7N0W+OZ9T/W+aEj1l8wZ8Z4RMGX/6AaVFFTaWbo2HxyL8PxaGM5fQvBeTlWEhJSOJotBFzQy/zT5elrXf5HyMX2p9Coz6SAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Meme&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/e9ec0e7fdf0ca1bbf14ceb7abb387803/7b439/meme.png&quot;
        srcset=&quot;/blog/static/e9ec0e7fdf0ca1bbf14ceb7abb387803/12f09/meme.png 148w,
/blog/static/e9ec0e7fdf0ca1bbf14ceb7abb387803/e4a3f/meme.png 295w,
/blog/static/e9ec0e7fdf0ca1bbf14ceb7abb387803/7b439/meme.png 487w&quot;
        sizes=&quot;(max-width: 487px) 100vw, 487px&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;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-it-is-important-to-keep-your-dependencies-up-to-date&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-it-is-important-to-keep-your-dependencies-up-to-date&quot; aria-label=&quot;why it is important to keep your dependencies up to date permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why it is important to keep your dependencies up to date&lt;/h2&gt;
&lt;p&gt;There are several reasons why you should keep the dependencies you use in your project up to date:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep the burden of migrating small in case of incompatibilities:&lt;/strong&gt; If you do not regularly upgrade your dependencies
you will eventually have to and face a big list of breaking changes which do not take minutes to fix but hours, days or
weeks. By keeping your dependency versions close to the latest versions, you can upgrade in small steps, and the change
you need to do to your code base to make it compatible, is small each time. So, I prefer small incremental migrations that are easy
to be covered by a maintenance task in your backlog rather than big migrations that take up the whole Scrum sprint.
Because big migrations are harder to sell to your business owners than unnoticeable migrations.
If you wait too long with upgrades you might even stick with what you got. This is the first step to doom the code base,
as it’s eventually going to be rewritten by fresh developers not accepting to work on a legacy code base.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profit from the latest features and performance improvements:&lt;/strong&gt; Keeping up to date comes with the benefit that you
can always rely on using the latest features the dependency provides and generate customer value in a modern, possibly
easier or more reliable and faster way. It keeps the developers working on the project happy to work with the newest
versions and allows them to brag to colleagues from the field that they are up to date.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ease of updating in case vulnerabilities get found:&lt;/strong&gt; Imagine a vulnerability gets found in one of the dependencies
you rely on to run your application. And the good thing is, the library owners have fixed the dependencies in the
latest version. But then you find yourself to be back 3 major versions which did not receive a patch to fix this
vulnerability. So, what are your options? You can upgrade the library and spend all the migration effort right there and
then and put everything else on hold, or just accept the risk. Neither are easy to sell to your business owner. If
you are using the latest versions of your dependencies, the upgrades cost you almost zero time.&lt;/p&gt;
&lt;h3 id=&quot;how-recent-should-you-keep-dependencies&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-recent-should-you-keep-dependencies&quot; aria-label=&quot;how recent should you keep dependencies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How recent should you keep dependencies&lt;/h3&gt;
&lt;p&gt;Generally, I would say that keeping your dependencies at the absolute latest version, including major, minor and patch is
the preferred way. Don’t use betas, release candidates or other non stable versions.
Although using the absolute latest doesn’t always make sense depending on several factors. If you’re using libraries or
platforms that have a huge user base, it’s likely the authors have different release channels for different users.&lt;/p&gt;
&lt;p&gt;One release channel often is the Long-Term Support (LTS) channel offered. If the authors provide such a channel, it
generally is a good idea to stick to the LTS versions of the dependency you are using until the authors switch LTS to
a newer version. Examples for platforms or libraries offering LTS is: Java, Node.js, Angular, whereas for example Angular
has LTS for the two most recent major versions to allow you to upgrade within half a year to stay within LTS versions:&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: 574px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.189189189189186%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA5klEQVR42l2SiQrDMAxD8/+/2VJa6H3fHk+gMRYwthpNUpKldV1jHMfY9z3O84xpmoJv13XFsiza27ZNmM7+P3+eZ83P80Tq+z6yLAs6pKqqommaOI5DPc9zCYCHYdB+URQSMr8sS82YJlLgzOIDRJze95UzhSAYHhgOieAbcypWQvlXkB/TEYDkI4ExB/8Kktpp4STEABb0TEoEEEUQDNf4vm/xweZJkMFxcXVaBOzua3BCnwI+M+VTKCEXjijpfAV+RTr75lHmmIc4hnrluq7lwCv7gpmdrOu6bwpX27biUP5HeH0AG6xs5ojhgdUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Angular&amp;#39;s support policy and schedule&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/0c9f6d294937ee1f1cbb7340410c25ae/86389/angular-versions.png&quot;
        srcset=&quot;/blog/static/0c9f6d294937ee1f1cbb7340410c25ae/12f09/angular-versions.png 148w,
/blog/static/0c9f6d294937ee1f1cbb7340410c25ae/e4a3f/angular-versions.png 295w,
/blog/static/0c9f6d294937ee1f1cbb7340410c25ae/86389/angular-versions.png 574w&quot;
        sizes=&quot;(max-width: 574px) 100vw, 574px&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;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;https://angular.io/guide/releases#support-policy-and-schedule&quot;&gt;Angular&apos;s support policy and schedule&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Once you upgrade your versions you should always verify your system works as before, doesn’t have negative impacts and
maybe even measure if it profits from performance improvements mentioned in changelogs of the upgraded dependencies.
You should also have a look at what has been deprecated and will eventually be removed in a future version, which gives
you the benefit that you are aware of bigger migrations and lets you plan them ahead of time.&lt;/p&gt;
&lt;p&gt;To verify compatibility a good test suite, ideally including unit and integration tests, comes into play. If you don’t
have any or sufficient tests, you don’t have enough confidence to update dependencies regularly. That’s obviously a
problem, and you should look into increasing the coverage of your tests.&lt;/p&gt;
&lt;p&gt;In any case, automated tests probably won’t find 100% of problems, so I would say it’s a good idea to upgrade major
versions just after your latest major rollout to production. If you use a branching strategy like &lt;a href=&quot;https://nvie.com/posts/a-successful-git-branching-model/&quot;&gt;Git Flow&lt;/a&gt;
that would mean you update on the &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; branch. This allows for all testers and developers working on the
new version to experience the new major version of your dependencies during development. They can find incompatibilities
before you ship to customers.&lt;/p&gt;
&lt;h2 id=&quot;dependency-update-automation-bots&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#dependency-update-automation-bots&quot; aria-label=&quot;dependency update automation bots permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Dependency Update Automation Bots&lt;/h2&gt;
&lt;p&gt;There are several products offered on the Internet to automate dependency updates for you. Here’s a list of a few of
them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dependabot.com&quot;&gt;Dependabot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://renovate.whitesourcesoftware.com&quot;&gt;Renovate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://snyk.io&quot;&gt;Snyk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They work great, and work in the way, that they have a scheduled job to update your dependencies, create a pull request
and let you decide if you want the update or not. The problem with them is, that they are usually free for Open Source
projects on GitHub or other hosting platforms, but as soon as you want to automate updates for your closed source
project you have to pay, and sometimes these are considerable amounts. Sometimes they don’t even support your existing
CI systems.&lt;/p&gt;
&lt;p&gt;Luckily, there is no need to pay for these services, you can just build it yourself with all the control you want. The
following sections describe how I built dependency bots for our team.&lt;/p&gt;
&lt;h2 id=&quot;how-to-automate-updates-with-your-automation-system-such-as-jenkins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-automate-updates-with-your-automation-system-such-as-jenkins&quot; aria-label=&quot;how to automate updates with your automation system such as jenkins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to automate updates with your automation system such as Jenkins&lt;/h2&gt;
&lt;p&gt;The basic principle is that you have an automatically scheduled job run by your automation system, such as Jenkins,
that looks at your dependencies, does a diff with the package registry or repository and updates your files specifying
the new versions, then creates a commit on a new Git branch and pushes that to the Git repository. With the new branch
it will create a new pull request, at which point your CI system picks up the pull request and runs your tests against
it to see if they still pass. If you’re happy with the updates, you merge the pull request and there you go. You can
now update your dependencies with a single click while having confidence they didn’t break anything.&lt;/p&gt;
&lt;p&gt;So, the question is, do you want exactly one job updating all of your outdated dependencies at once, or do you want to
introduce update groups. In my project, I decided to introduce 4 update groups:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;NPM packages: scheduled nightly against &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; branch&lt;/li&gt;
&lt;li&gt;Major, Minor, Patch updates for Open Source Gradle dependencies: scheduled nightly against &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; branch&lt;/li&gt;
&lt;li&gt;Minor, Patch updates for Open Source Gradle dependencies: manually triggered if needed against &lt;code class=&quot;language-text&quot;&gt;master&lt;/code&gt; branch&lt;/li&gt;
&lt;li&gt;Internal Gradle dependencies: scheduled every 6 hours against &lt;code class=&quot;language-text&quot;&gt;develop&lt;/code&gt; branch
&lt;ul&gt;
&lt;li&gt;In our project, we use software libraries from other teams of the company in our code that are updated multiple
times per day, and we want to integrate with these changes just a few hours after they have been released.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The extreme choice would be to create update groups for every single dependency that you have. But I didn’t do that,
because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firstly, in NPM, several dependencies, such as Angular’s, must be updated in accordance to be compatible&lt;/li&gt;
&lt;li&gt;Secondly, to spare our build infrastructure and not overload it with tests to execute, I decided to update dependencies
that come from public sources every night and group those together in one group.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The drawback is, that if two dependencies are updated within one day and one of them breaks your build, you cannot
merge the pull request for the one dependency that works.&lt;/p&gt;
&lt;p&gt;A script automating this could look like this for NPM:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# create new branch and checkout&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; checkout &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; feature/npm-update

&lt;span class=&quot;token comment&quot;&gt;# do an install so we know what versions we have present&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;EXITCODE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$EXITCODE&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&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;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npm install failed!&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# list outdated packages&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; outdated

&lt;span class=&quot;token comment&quot;&gt;# do the update&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;EXITCODE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$EXITCODE&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&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;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npm install failed!&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# run npm install again to ensure package-lock.json is stable&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;EXITCODE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$?&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$EXITCODE&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&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;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;npm install failed!&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# stop if there are no changes&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; status &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-q&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;working tree clean&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;No updates available! That&apos;s good :)&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;(deps) update npm dependencies&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then add these two steps as post actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Either add a &lt;code class=&quot;language-text&quot;&gt;git push&lt;/code&gt; command, or in case of Jenkins run the &lt;a href=&quot;https://plugins.jenkins.io/git/#git-publisher&quot;&gt;Git Publisher plugin&lt;/a&gt; to publish the branch.&lt;/li&gt;
&lt;li&gt;Add code that automatically creates a Pull Request in your Git repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-to-automatically-update-npm-dependencies&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-automatically-update-npm-dependencies&quot; aria-label=&quot;how to automatically update npm dependencies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to automatically update NPM dependencies&lt;/h2&gt;
&lt;p&gt;If you want to automatically update your NPM dependencies, you already have the tools from NPM itself, no need for other
plugins. You can run &lt;code class=&quot;language-text&quot;&gt;npm update&lt;/code&gt; to update the versions in your &lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file according to the version selector
you have defined.&lt;/p&gt;
&lt;p&gt;If you don’t know about NPM’s version selectors syntax like &lt;code class=&quot;language-text&quot;&gt;^&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;~&lt;/code&gt; and others, I encourage you to try out the
&lt;a href=&quot;https://semver.npmjs.com&quot;&gt;playground&lt;/a&gt; to learn about it. If you want a default save prefix for new packages installed,
you can create a &lt;code class=&quot;language-text&quot;&gt;.npmrc&lt;/code&gt; file in your project directory with the line &lt;code class=&quot;language-text&quot;&gt;save-prefix=&quot;~&quot;&lt;/code&gt; added to it. This changes
the default &lt;code class=&quot;language-text&quot;&gt;^&lt;/code&gt;, that allows updates to new minor versions to &lt;code class=&quot;language-text&quot;&gt;~&lt;/code&gt;, which only allows updates to new patch versions.
That’s not something I would recommend doing, as that would restrict your updates more. If you use &lt;code class=&quot;language-text&quot;&gt;save-prefix=&quot;&gt;=&quot;&lt;/code&gt;,
every time &lt;code class=&quot;language-text&quot;&gt;npm update&lt;/code&gt; is run, you get the newest production ready version (don’t worry, you won’t get betas,
release-candidates and so on).&lt;/p&gt;
&lt;p&gt;Another thing to note is that NPM only updates direct dependencies that you specified in your
&lt;code class=&quot;language-text&quot;&gt;package.json&lt;/code&gt; file. Transitive dependencies (dependencies of your dependencies) will not be updated. You can include
transitive dependencies with &lt;code class=&quot;language-text&quot;&gt;npm update --depth 9999&lt;/code&gt;. I would actually not recommend doing this on a nightly basis,
because the amount of updates you will receive is going to be immense. So, I would resort to only let your direct
dependencies specify their minimal versions of transitive dependencies and not update them yourself. The exception might
be when one of the transitive dependencies have vulnerabilities, and you want to fix them in your application before the
direct dependency is updated.&lt;/p&gt;
&lt;p&gt;By the way, the recommended depth 9999 by the &lt;a href=&quot;https://docs.npmjs.com/cli-commands/update.html&quot;&gt;NPM documentation&lt;/a&gt; failed
in my project because NPM ran out of memory. So, you might want to scale it back to a safe depth like 10.&lt;/p&gt;
&lt;p&gt;So, all you need is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;npm outdated&lt;/code&gt; to print outdated versions&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;npm update&lt;/code&gt; to automatically update them&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-to-automatically-update-gradle-dependencies&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-automatically-update-gradle-dependencies&quot; aria-label=&quot;how to automatically update gradle dependencies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to automatically update Gradle dependencies&lt;/h2&gt;
&lt;p&gt;If you’re using Gradle to manage your dependencies for Java, Kotlin or Groovy projects (or others?), then there’s no
built-in way to update your dependencies, but there are great plugins to do so.&lt;/p&gt;
&lt;p&gt;I’m actually using two plugins; one depends on the other.&lt;/p&gt;
&lt;p&gt;The plugin &lt;a href=&quot;https://github.com/ben-manes/gradle-versions-plugin&quot;&gt;gradle-versions-plugin&lt;/a&gt; is able to compare your versions
to the versions available in the specified artifact repositories. It adds the task &lt;code class=&quot;language-text&quot;&gt;dependencyUpdates&lt;/code&gt; to your
configuration which outputs the versions that can be updated in various formats.&lt;/p&gt;
&lt;p&gt;The second plugin &lt;a href=&quot;gradle-use-latest-versions-plugin&quot;&gt;https://github.com/patrikerdes/gradle-use-latest-versions-plugin&lt;/a&gt;
is then able to take the output of gradle-versions-plugin and find these versions in your &lt;code class=&quot;language-text&quot;&gt;build.gradle&lt;/code&gt; file(s) and
replace it with the new version.&lt;/p&gt;
&lt;p&gt;Additionally, you can configure exactly what updates you want, and what you don’t want through configuration in the
Gradle files or through command line arguments.&lt;/p&gt;
&lt;p&gt;In our &lt;code class=&quot;language-text&quot;&gt;build.gradle&lt;/code&gt; file I added the following snippet to keep non stable versions and allow them to update to newer
non-stable versions but keep dependencies that are using stable versions today remain on stable versions.&lt;/p&gt;
&lt;p&gt;Also, I added in an optional property &lt;code class=&quot;language-text&quot;&gt;onlyMinorPatchUpdates&lt;/code&gt; for minor updates. I run the update job with this property
against branches that contain code already shipped to production, since I don’t want to introduce new major versions
there.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;groovy&quot;&gt;&lt;pre class=&quot;language-groovy&quot;&gt;&lt;code class=&quot;language-groovy&quot;&gt;tasks &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    dependencyUpdates &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;// consider BOM version definitions and do not complain about transitive constrained out-of-date versions&lt;/span&gt;
        checkConstraints &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 keyword&quot;&gt;def&lt;/span&gt; isNonStable &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; String version &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; stableKeyword &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 interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;RELEASE&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;FINAL&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;GA&quot;&lt;/span&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;any &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; word &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt; version&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toUpperCase&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 function&quot;&gt;contains&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word&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;def&lt;/span&gt; regex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;/^[0-9,.v-]+(-r)?$/&lt;/span&gt;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;stableKeyword &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&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;version &lt;span class=&quot;token operator&quot;&gt;==~&lt;/span&gt; regex&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;def&lt;/span&gt; getMajorVersion &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; String version &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; version&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; version&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;.&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;def&lt;/span&gt; isMajorUpdate &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; String versionA&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; String versionB &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getMajorVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;versionA&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 function&quot;&gt;getMajorVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;versionB&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

        rejectVersionIf &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; component &lt;span class=&quot;token operator&quot;&gt;-&gt;&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;project&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;properties&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;onlyMinorPatchUpdates&quot;&lt;/span&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; &lt;span class=&quot;token interpolation-string&quot;&gt;&lt;span class=&quot;token string&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;/span&gt;
                &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isMajorUpdate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;component&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;candidate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;version&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; component&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentVersion&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;return&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 keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;isNonStable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;component&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;candidate&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;version&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;isNonStable&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;component&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;currentVersion&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;I hope this article was useful to you. If you have any remarks, questions or recommendations, feel free to leave
a comment.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Dissecting a paper's writing style]]></title><description><![CDATA[In this post I want to dissect a paper’s style and try to criticize it irregardless of it’s content.
The paper is the one mentioned in the…]]></description><link>https://sebastianhaeni.github.com/0004-dissecting-paper-style/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0004-dissecting-paper-style/</guid><pubDate>Thu, 23 Apr 2020 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In this post I want to dissect a paper’s style and try to criticize it irregardless of it’s content.
The paper is the one mentioned in the previous post:&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 1.2em&quot;&gt; &lt;em&gt;&lt;a href=&quot;https://amstat.tandfonline.com/doi/full/10.1080/00031305.2017.1380080&quot;&gt;Sean J. Taylor &amp;#x26; Benjamin Letham (2018) “Forecasting at Scale”, The American Statistician&lt;/a&gt;&lt;/em&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;standard-structure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#standard-structure&quot; aria-label=&quot;standard structure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Standard Structure&lt;/h2&gt;
&lt;p&gt;Let’s go over the standard structure of a paper and describe what to look for, and then giving the verdict of how the
paper did.&lt;/p&gt;
&lt;h3 id=&quot;0-title&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#0-title&quot; aria-label=&quot;0 title permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;0. Title&lt;/h3&gt;
&lt;p&gt;A good title for a paper should honestly reflect the content, give the reader hints what topics it will touch,
and reveals the category of the paper (argumentative, analytical, definition, compare and contrast, cause and effect, report.
interpretive, etc.).&lt;/p&gt;
&lt;p&gt;Sometimes people working for big names put catchy titles on their papers such as “Attention Is
All You Need” or “One Model To Learn Them All”. This yields that if that paper really is groundbreaking, people will
remember it for the catchy name, and it’s easy to talk about it in colloquials. For the authors is a kind of branding
for them as they can afford to add a title like this. A researcher with their feet on the ground probably has to resort
to more bland titles that are humble and serve their purpose in the journal or conference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: The title of the paper “Forecasting at Scale” is pretty short and does not summarize the techniques or methods
described in the paper and rather focuses on the fact that the paper is practical experiences made since the word “Scale”
is mentioned. So in my opinion it’s a bit catchy but that’s maybe in the nature of the authors since they work for Facebook
and can afford to have a title like that. It’s clear the content will not be about biomedical topics or physics.
It could also be about weather forecasting if it weren’t published in a journal named “The American Statistician”.&lt;/p&gt;
&lt;h3 id=&quot;1-abstract&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-abstract&quot; aria-label=&quot;1 abstract permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1. Abstract&lt;/h3&gt;
&lt;p&gt;The abstract is the first thing a paper, and the part most often read. It should stand for itself and not require the
reader to read any other part of the paper to understand it.&lt;/p&gt;
&lt;p&gt;The structure of an abstract is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Problem: what is it and why it is interesting&lt;/li&gt;
&lt;li&gt;Method: what and how is it accomplished&lt;/li&gt;
&lt;li&gt;Result: what is the new achievement&lt;/li&gt;
&lt;li&gt;Importance: what follows after the result&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The abstract is for people that &lt;ins&gt;want&lt;/ins&gt; to read the paper. It is not to be confused by the conclusion which is for
people that &lt;ins&gt;have read&lt;/ins&gt; the paper.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: The abstract gives a nice introduction to the field of forecasting time series in the first sentence. It makes me
feel guided into the topic. The second sentence starts explaining the problem as it should mention according to our list
above. From then on the abstract still follows the structure but tends to say “we will describe in this paper” and not
actually giving the reader the result right there in the abstract. It’s nicely rounded off by explaining where these
methods are now productively in place.&lt;/p&gt;
&lt;h3 id=&quot;2-introduction-and-related-work&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-introduction-and-related-work&quot; aria-label=&quot;2 introduction and related work permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2. Introduction and Related Work&lt;/h3&gt;
&lt;p&gt;The introduction explains the problem in depth and why it’s interesting and important. It also explains why naive approaches
usually fail and why other people have not solved it before and thus makes the problem hard. It should also introduce
the proposed approach.&lt;/p&gt;
&lt;p&gt;This section should also include related work with a brief overview of the current state of the art with explanations
what is new with respect to previous work. It should be come clear what’s the improvement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: The introduction is in itself structured logically, and the reader can easily follow. It explains what they
mean by “scale”.&lt;/p&gt;
&lt;p&gt;In my opinion the paper’s introduction and the main body diverge a little as the introduction explains scaling problems,
and the main body describes solutions to forecasting problems for the good first part.&lt;/p&gt;
&lt;p&gt;They don’t talk about why these problems have been solved by others though. They also don’t mention
related work. I could imagine the reason being the other few companies that could encounter scales like Facebook don’t
publish their results as white papers. Though I could also imagine the authors didn’t care much about related research work,
since they were building a practical implementation that matches their company environment.&lt;/p&gt;
&lt;h3 id=&quot;3-main-body&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-main-body&quot; aria-label=&quot;3 main body permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;3. Main Body&lt;/h3&gt;
&lt;p&gt;This part should talk about formulation, implementation, results, experiments, etc.&lt;/p&gt;
&lt;p&gt;The main body is a longer piece of content which should be grouped into sections. Ideally the text doesn’t introduce
more than one idea per sentence or paragraph. A topic should be in its own section.&lt;/p&gt;
&lt;p&gt;General good practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;use short words&lt;/li&gt;
&lt;li&gt;use short sentences with simple structure&lt;/li&gt;
&lt;li&gt;keep paragraphs short&lt;/li&gt;
&lt;li&gt;avoid buzzwords, clichés and slang&lt;/li&gt;
&lt;li&gt;avoid excess, in length or style&lt;/li&gt;
&lt;li&gt;omit unnecessary material&lt;/li&gt;
&lt;li&gt;be specific, not vague or abstract&lt;/li&gt;
&lt;li&gt;break these rules if there is a good reason to do so&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: The main body is well-structured, sections are not too long, paragraphs have a reasonable length and contains
a good amount of visualizations. Details as to why they have chosen a certain method over another are often left out
as one can read the reasons in the respective paper, which I guess follows the principle of omitting unnecessary material.&lt;/p&gt;
&lt;h3 id=&quot;4-conclusions&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-conclusions&quot; aria-label=&quot;4 conclusions permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;4. Conclusions&lt;/h3&gt;
&lt;p&gt;The conclusion is a brief summary of the main findings and includes a discussion, perspective and future work etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: The conclusion doesn’t go into any details anymore, which is good as it should be brief. What I’m missing from it is
some sort of critical questioning of the results. What the authors describe is only positive and that they are happy.
That’s maybe what truly are. There’s no mention of future work of possible improvements.&lt;/p&gt;
&lt;h3 id=&quot;5-acknowledgements&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#5-acknowledgements&quot; aria-label=&quot;5 acknowledgements permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;5. Acknowledgements&lt;/h3&gt;
&lt;p&gt;As the name says, in this part the authors acknowledge people that helped the creation of the paper.&lt;/p&gt;
&lt;h3 id=&quot;6-references&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#6-references&quot; aria-label=&quot;6 references permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;6. References&lt;/h3&gt;
&lt;p&gt;References should be complete and relevant and correctly cited.&lt;/p&gt;
&lt;h3 id=&quot;7-appendices&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#7-appendices&quot; aria-label=&quot;7 appendices permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;7. Appendices&lt;/h3&gt;
&lt;p&gt;This part is optional and sometimes used to append large figures, tables or code.&lt;/p&gt;
&lt;h2 id=&quot;style-review&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#style-review&quot; aria-label=&quot;style review permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Style Review&lt;/h2&gt;
&lt;h3 id=&quot;graphs-figures-and-tables&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#graphs-figures-and-tables&quot; aria-label=&quot;graphs figures and tables permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Graphs, Figures and Tables&lt;/h3&gt;
&lt;p&gt;If you haven’t heard about Edward Tufte, go read about his work now. He has produced some great literature about
statistics visualizations. He talks about information design (e.g. data-ink ratio), criticizes PowerPoint, encourages
small multiples (produce many small visualizations instead of one superimposed graph) and other techniques.&lt;/p&gt;
&lt;p&gt;Other than that it should be clear that figures and tables should be easy to read and understand, show relevant data
and have a caption explaining them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verdict&lt;/strong&gt;: The paper has some very good graphs, and some which are not that good. It seems they have been produced
in different styles. Generally I would like the visualizations to have a common style.&lt;/p&gt;
&lt;p&gt;I take two examples:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; I like the color coding and the display of the seasonal effects of the weekdays. The main thing here to criticize
is the color choice for Saturday as it’s barely readable. They could also reduce the grey background lines and increase
the data to ink ratio.&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: 548px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/9367b79a1c98861d1c41451c843df5c1/a58fe/good-fig.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: 37.16216216216216%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABfUlEQVR42k2RWW8TMRSF8///COIBIR6QEEGUClA1k2aZiiQlJVRJaLOMZ19sz5KvdyYCcaTPvpKvj61zB+fzGa01piyxRlMJ3V5XlsoabI+cmwt1bcmSlCiMUUGMLjV5nlMUBZ0GWZaRpBnO3T3T+zXzhw2/twdhz/EU4auYMEiJk5xE2D0rvnsLfu7+sFEnMvlIkeZEUXwxDJTiGCqufoxwl3d8m894dXPNlTfm03jE+5HDO8fly9Tj43jC65uvOItbVLQnSA4UuiDNtTx+uhj6viKKfbYbl+2jx+P6lqH7hvUvj9VqwufJkOvJB5arKbOly9B5y/NuTm1ziSbG6Bxd16RZChLfIAhDySGX2kqWqTQkBMcZZaHI0yP7pzFRsCCJnojUGv8w7XOUu0IrdU1pM+I4uvzw31CMpW4aKmnQppTGhqY5U1WF1JXUTU/3eFVVPcYYShlK25h+YL1ht1hrezq1bSNNZb93CoIQJTl36gx7g7bl773O+H+9AIr8EJ5Bs9C4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Good figure showing time series&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/9367b79a1c98861d1c41451c843df5c1/a58fe/good-fig.png&quot;
        srcset=&quot;/blog/static/9367b79a1c98861d1c41451c843df5c1/12f09/good-fig.png 148w,
/blog/static/9367b79a1c98861d1c41451c843df5c1/e4a3f/good-fig.png 295w,
/blog/static/9367b79a1c98861d1c41451c843df5c1/a58fe/good-fig.png 548w&quot;
        sizes=&quot;(max-width: 548px) 100vw, 548px&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;strong&gt;Bad:&lt;/strong&gt; This figure looks less optimal. On the first chart I don’t know what the dotted line is or why the other one is blue.
It is also dangerous to put three charts together implying they could be compared even they have different timelines
and should not be compared. Also, isn’t weekly also a trend (referring to the y-axis descriptions).
&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 531px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/4985d3207d952e455d5da594f59ce9d3/d4713/bad-fig.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: 77.70270270270271%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAACMUlEQVR42m1UCW7bMBDU/7/oxEhTx7FhWRcPkRSp7cyKTJG0BMa8VnvMLN2t6yrLssg8zzJN0zeM46jnnIm/d+M/ts452fddur7vxRgj27ZJjPE/SBIwhxi+zkKdt5QkpQgkYWI5Z+kul4uEECSXXSP8hMiBfS/SRrsLKYuLm9iwaWB1qKWgrMWtMhovA9DPVibrAI8zJ8avYtYAG6/g2bBYmbF2uGO2Dmt1yFLJgfdeSikKCwp85aQAvz8+5f1y1Yw8MprAOW2EmcLeWCPWWs2+4w8903EmsDZrxIepllEgyCTP57M6yFKq/U+oKBSEaE5HlGl8EIsSJ7sqFpaLIBNoYfkx0QGDHY4oiurAkq/XqyrE0mYP9basmRzkl0MU7DUgsmXmZgWarRwCpXRU1w3DqHzQOOCQnPCiofHasNc5pqTULHC8wU7bCNl2eokN+5GO2eSPx0NL6DFTMO5vt5ve3e93KOu14a1ZZDFWPq6fKioLU1HUKRywUbXBKx8M9BwG+fX2Jq8vL+r0aOSj4Q/RNqWM36nKTN17Jy5EFYP9OLMnIQ5FIEaAdBQo7GHHXuU97bhO2xFcOWQ7cGNCkhlkr7ikQS7tZezKL1W2sCH0BdXX4mNWFFUcDie8FIeU15S/PasGFaLOsfZas2vBbKh9zAzJ1wCeSDiF0Gxrb3KdlBKv/yZsfNpQkGZPPm/PUXr4YMOrKHw2NGAEDn5McNDZ+XyW0+mkNhyciZZ9S4D7P2NF3hc0adNIAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Bad figure showing component of forecast&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/4985d3207d952e455d5da594f59ce9d3/d4713/bad-fig.png&quot;
        srcset=&quot;/blog/static/4985d3207d952e455d5da594f59ce9d3/12f09/bad-fig.png 148w,
/blog/static/4985d3207d952e455d5da594f59ce9d3/e4a3f/bad-fig.png 295w,
/blog/static/4985d3207d952e455d5da594f59ce9d3/d4713/bad-fig.png 531w&quot;
        sizes=&quot;(max-width: 531px) 100vw, 531px&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;h1 id=&quot;references&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#references&quot; aria-label=&quot;references permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Justin Zobel (2014) Writing for Computer Science, Third Edition, New York: Springer.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Facebook's Prophet and the paper]]></title><description><![CDATA[For the AI seminar, I am attending, I selected the following paper:  Sean J. Taylor & Benjamin Letham (2018) “Forecasting at Scale”, The…]]></description><link>https://sebastianhaeni.github.com/0003-facebook-prophet-paper/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0003-facebook-prophet-paper/</guid><pubDate>Fri, 20 Mar 2020 22:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For the AI seminar, I am attending, I selected the following paper:&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: 1.2em&quot;&gt; &lt;em&gt;&lt;a href=&quot;https://amstat.tandfonline.com/doi/full/10.1080/00031305.2017.1380080&quot;&gt;Sean J. Taylor &amp;#x26; Benjamin Letham (2018) “Forecasting at Scale”, The American Statistician&lt;/a&gt;&lt;/em&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;abstract&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#abstract&quot; aria-label=&quot;abstract permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Abstract&lt;/h2&gt;
&lt;p&gt;In the coming weeks, I want to evaluate the method described in the paper and see what can be accomplished with it in an
environment relevant to me. The relevant environment for me is time series, mostly business time series, but can be of
different sorts as well.&lt;/p&gt;
&lt;h2 id=&quot;content&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#content&quot; aria-label=&quot;content permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Content&lt;/h2&gt;
&lt;p&gt;The paper “Forecasting at scale” describes the method that Facebook uses to do forecasting on time series data based
on an additive model where non-linear trends are fit with yearly, weekly and daily seasonality, plus holiday effects.
The procedure is robust to missing data and shifts in the trend, and typically handles outliers well.&lt;/p&gt;
&lt;h2 id=&quot;motivation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#motivation&quot; aria-label=&quot;motivation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Motivation&lt;/h2&gt;
&lt;p&gt;I’m explaining my motivation behind selecting the paper:&lt;/p&gt;
&lt;h3 id=&quot;why-have-i-chosen-this-paper&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-have-i-chosen-this-paper&quot; aria-label=&quot;why have i chosen this paper permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why have I chosen this paper?&lt;/h3&gt;
&lt;p&gt;Last year I got a task when doing volunteering service for the country, to work on a time series data set. I built a
proof of concept system that could process the gigabytes of CSV files and aggregate the time series to different sample
durations. The time series were also transformed using different methods such as &lt;a href=&quot;https://en.wikipedia.org/wiki/CUSUM&quot;&gt;CUSUM&lt;/a&gt;
and &lt;a href=&quot;https://en.wikipedia.org/wiki/EWMA_chart&quot;&gt;EWMA&lt;/a&gt; to make them easier to interpret.
I visualized them with &lt;a href=&quot;https://grafana.com/&quot;&gt;Grafana&lt;/a&gt; that I connected to a self-written Python backend using &lt;a href=&quot;https://palletsprojects.com/p/flask/&quot;&gt;Flask&lt;/a&gt;.
The processing of the data was limited to my dev machine and I was restricted from using any other infrastructure. Because
it became clear that single-thread processing would not finish the processing within days, I had to parallelize it with
&lt;a href=&quot;https://dask.org/&quot;&gt;Dask&lt;/a&gt;, which shortened the processing time dramatically.&lt;/p&gt;
&lt;p&gt;After visualizing the immense amount of data it became clear that we will find some seasonality and trend in subsets
of the time series. Thus I had the idea to decompose the filtered subsets into seasonality and trend. This gave the
opportunity to then create a prediction interval that can be used to find anomalies in the data.&lt;/p&gt;
&lt;p&gt;After a quick and dirty implementation, it became clear that producing nice graphs could turn out to be tricky. A
colleague stumbled upon the &lt;a href=&quot;https://cran.r-project.org/web/packages/anomalize/index.html&quot;&gt;anomalize&lt;/a&gt; package in R.&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: 450px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/blog/static/7bad9e4efed277e9b67a873875c8eef7/fc2a6/anomalize.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: 53.37837837837838%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFklEQVR42mVSaVMaQRDd//8DPIhcclREOQK4yhVLxDVVloGCICYfwKC4FqfAwp6zLz0jazSZqpnp6eNNH09ijMFxHPDb2/ztOB/fnmxzm2WDmSaYCzh0uLaN1XwB3TAgGYYJ13Xf9v+L69nGzl41BGAMhzBfXgiQYayqaN3cQKdPpNVa/wDEZduysF5qsOjm2Xl2puuYT6e4+/UTlfJX1K+vcdtuo1SuICufwuSA3NemH2ezGVT1Cd1eF61mE1fKNzQaDdx1Ouj3+3h+VtFu3yInF5A4SuGAdjieQCaZxu7OHgrFIizCkfgxnkygKAqKpQoy2TxSmSziiSTCsQPEPh8hdyzj/LyKPN3BcAz+0D4SiUPsR+MIR6JIpdOo1xuivxIvpf/wiB1/CFu7AWx/CsC3FyTnGAVHKCCGLZ8f274AAuEokhRcLJVRU65QrV6gdHyK740mhqOxqFQAdnv3CIYilNkXyCcFlCtnqF0quKhdokj9yeVlJFMZnJCt2fqBx8FAtGg8nuDp/jfWKw0u9c80LUiMmjijRndaLcr0AQNyHo1GmFAbpqQf0jS5vtfrQaVKNE0T9PFYwenDwRj58iFKYqqU6nK5hEE88ib7l5eO0Ok0YW/ibxT7h25iyryRC6KIB8JptNoECxtlZBLga4CFOfkKcm98F9pKyDwpMWUhEPO9xYnOgT1OWhu79+l7X3NTzfv1B/v9KSPX361PAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;anomalize graph&quot;
        title=&quot;&quot;
        src=&quot;/blog/static/7bad9e4efed277e9b67a873875c8eef7/fc2a6/anomalize.png&quot;
        srcset=&quot;/blog/static/7bad9e4efed277e9b67a873875c8eef7/12f09/anomalize.png 148w,
/blog/static/7bad9e4efed277e9b67a873875c8eef7/e4a3f/anomalize.png 295w,
/blog/static/7bad9e4efed277e9b67a873875c8eef7/fc2a6/anomalize.png 450w&quot;
        sizes=&quot;(max-width: 450px) 100vw, 450px&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;We tried it out but concluded that special holidays, weekends and so on still were a problem for anomalize which uses
STL (Seasonality and Trend decomposition using LOESS, &lt;a href=&quot;https://www.scb.se/contentassets/ca21efb41fee47d293bbee5bf7be7fb3/stl-a-seasonal-trend-decomposition-procedure-based-on-loess.pdf&quot;&gt;Paper&lt;/a&gt;)
and methods from Twitter’s &lt;a href=&quot;https://github.com/twitter/AnomalyDetection&quot;&gt;AnomalyDetection&lt;/a&gt; library.&lt;/p&gt;
&lt;p&gt;So our research continues and we found the library &lt;a href=&quot;https://facebook.github.io/prophet/&quot;&gt;Prophet&lt;/a&gt; which looked promising,
as it’s method promises that it can not only cope with holiday effects but also work at scale, has automatic changepoint
detection and allows for Analyst-in-the-Loop Modeling.&lt;/p&gt;
&lt;p&gt;But unfortunately the time we had run out and I had no chance to look at this method in depth. This AI seminar now gives
me the chance to catch up.&lt;/p&gt;
&lt;h3 id=&quot;why-is-it-relevant-and-interesting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-is-it-relevant-and-interesting&quot; aria-label=&quot;why is it relevant and interesting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why is it relevant and interesting?&lt;/h3&gt;
&lt;p&gt;Facebook has developed the Prophet library in house and is sharing it as open source with the community. At my day job,
we’re operating applications at scale and thus are confronted with the same problems that Facebook has tried to solve.&lt;/p&gt;
&lt;p&gt;I think it can be interesting for larger companies trying to achieve application operating models that can do self-healing,
scale automatically using predictions, anticipate surges and find anomalies so an operator can have a closer look and
feed the result back into the model. Until 2025 we want to have AIOps established in the company. And we’re certainly
not the only company trying to do this.&lt;/p&gt;
&lt;h2 id=&quot;expectations--goals&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#expectations--goals&quot; aria-label=&quot;expectations  goals permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Expectations &amp;#x26; Goals&lt;/h2&gt;
&lt;p&gt;My goal of working through this paper and the accompanying library is to deepen my knowledge of how time series analysis
can be approached beside the methods I already know like STL. Also, I would like to be able to tell our business owners
and fellow coworkers if this method could be a useful tool.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[AI Seminar Intro]]></title><description><![CDATA[As mentioned in my first blog post New Beginnings, I’m inscribed to a course
named “AI Seminar”. In this course, each student is expected to…]]></description><link>https://sebastianhaeni.github.com/0002-ai-seminar-intro/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0002-ai-seminar-intro/</guid><pubDate>Sun, 08 Mar 2020 12:30:00 GMT</pubDate><content:encoded>&lt;p&gt;As mentioned in my first blog post &lt;a href=&quot;/blog/0001-new-beginnings&quot;&gt;New Beginnings&lt;/a&gt;, I’m inscribed to a course
named “AI Seminar”. In this course, each student is expected to read a paper of their choice.
We will go through understanding writing style, understanding content, reviewing and criticizing
a paper, evaluating yourself oneself and have a final presentation.&lt;/p&gt;
&lt;h2 id=&quot;why-i-have-chosen-this-seminar&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-i-have-chosen-this-seminar&quot; aria-label=&quot;why i have chosen this seminar permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why I have chosen this seminar&lt;/h2&gt;
&lt;p&gt;I have not touched on that many results of scientific work. This course is ideal to fix that for me.
We will discuss in person and work through a paper in depth. I feel like this is something that will
always be handy to have experienced regarding my future career, even if I would never write a paper.
But since I’m inscribed in this seminar, I may even would feel comfortable writing a paper.&lt;/p&gt;
&lt;p&gt;That the papers we read are supposed to be in the field of AI is also something adding to my
motivation to choose this seminar as my specialization is Data Science. Meaning I can learn about
some AI methods that I am interested in anyway. So, two flies with one clap.&lt;/p&gt;
&lt;h2 id=&quot;my-learning-goals&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#my-learning-goals&quot; aria-label=&quot;my learning goals permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;My learning goals&lt;/h2&gt;
&lt;p&gt;My learning goals pretty much align with the course description. So I want to learn about scientific
writing, what a good paper is about and get familiar with a topic of my interest.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I want to &lt;em&gt;know&lt;/em&gt; in detail how the process of writing scientific papers is like and hear from an
expert that has experience in this.&lt;/li&gt;
&lt;li&gt;I want to &lt;em&gt;try&lt;/em&gt; criticizing a paper and get feedback.&lt;/li&gt;
&lt;li&gt;I want to &lt;em&gt;refine&lt;/em&gt; my writing skills.&lt;/li&gt;
&lt;li&gt;I want to &lt;em&gt;get to know&lt;/em&gt; the method explained in my chosen paper in detail.&lt;/li&gt;
&lt;li&gt;I want to &lt;em&gt;establish&lt;/em&gt; a regular blogging habit beyond this seminar.&lt;/li&gt;
&lt;li&gt;I want to &lt;em&gt;share&lt;/em&gt; my learning process and gain insights how others do doing the same.&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[New Beginnings]]></title><description><![CDATA[Why am I starting my own blog? This post is the first ever post in a personal blog.
I try to explain why having a personal blog is a good…]]></description><link>https://sebastianhaeni.github.com/0001-new-beginnings/</link><guid isPermaLink="false">https://sebastianhaeni.github.com/0001-new-beginnings/</guid><pubDate>Sun, 01 Mar 2020 22:40:00 GMT</pubDate><content:encoded>&lt;p&gt;Why am I starting my own blog? This post is the first ever post in a personal blog.
I try to explain why having a personal blog is a good idea IMHO and what gives me the motivation to
start it now. If you don’t have your own place to write, this maybe gives you some motivation to do
so too.&lt;/p&gt;
&lt;h2 id=&quot;who-am-i&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#who-am-i&quot; aria-label=&quot;who am i permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Who am I&lt;/h2&gt;
&lt;p&gt;I’m a software engineer working at a large telecommunications company in Switzerland. Here I build
large scale full stack web applications with technologies such as Springboot and Angular. We pursue
a modern development pipeline with state of the art tooling and automation with autonomous releasing
and advanced monitoring techniques.&lt;/p&gt;
&lt;p&gt;Besides that, I’m doing my Master of Science with specialization in Data Science.&lt;/p&gt;
&lt;p&gt;So I have lots of things I learn daily. Some things are personal ideas, some things are
implementations of ideas of the industry, some things are just personal reflection.&lt;/p&gt;
&lt;h2 id=&quot;motivation-1-writing-down-what-i-learned&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#motivation-1-writing-down-what-i-learned&quot; aria-label=&quot;motivation 1 writing down what i learned permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Motivation #1: Writing down what I learned&lt;/h2&gt;
&lt;p&gt;If you learn new things on a daily basis, you will eventually have learned that many relevant things
you are not able to recall each and every learning correctly unless you write it down.&lt;/p&gt;
&lt;p&gt;Now if you write it down for your personal use only, you can write down pretty much anything. It
could be confidential, it could be targeting people. This may work very well for you. But if there
is a greater learning, and you stay on the detail level about the problem, you may not be able to
generalize the learning to new problems and you have not thought enough about it to abstract the
problem and solution.&lt;/p&gt;
&lt;p&gt;If you write a blog that can be accesses publicly, you need to remove any confidential information
from it. What is left at that point is an abstract description of problem and solution that in
theory should be applicable to you in the future in a new setting. Because you’ll not always be
in the same environment forever and your problem and solution space changes.&lt;/p&gt;
&lt;p&gt;Also while you have go through the abstraction process you start to get to the core of you learning.&lt;/p&gt;
&lt;h2 id=&quot;motivation-2-sharing-with-others&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#motivation-2-sharing-with-others&quot; aria-label=&quot;motivation 2 sharing with others permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Motivation #2: Sharing with others&lt;/h2&gt;
&lt;p&gt;You might learn useful things that you share verbally, by email or text message, but with a blog you
can share what you learned with people you don’t know. They would probably reach a single article of
the blog through a Google search, read it and apply it to their problem.&lt;/p&gt;
&lt;p&gt;This is different to Stackoverflow or GitHub issues that you write about a problem you had with
your own motivation. You’re not solving somebodies problem that they posted and want an answer for.&lt;/p&gt;
&lt;p&gt;I also think that the blog post would be more of a guide to a larger problem with an introduction
and conclusion, several sections and references. It often is not just a few sentences and a code
snippet.&lt;/p&gt;
&lt;p&gt;By sharing the blog post publicly and including a discussion or comment section, you are able to
get feedback. This may be that you explained something not clearly or that there are other people
that have thought about this problem before that you don’t know about.&lt;/p&gt;
&lt;h2 id=&quot;motivation-3-refine-my-writing-skills&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#motivation-3-refine-my-writing-skills&quot; aria-label=&quot;motivation 3 refine my writing skills permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Motivation #3: Refine my writing skills&lt;/h2&gt;
&lt;p&gt;Explaining something so everybody can understand is an essential skill for engineers working in
teams. If you want to introduce a new concept, raise awareness about architectural problems and so
on, not everybody will understand what you mean without investing time explaining it.&lt;/p&gt;
&lt;p&gt;By writing a blog, you are forced to explain complex settings in a clear way. I think the only real
way to get better at this, is to exercise it. So a blog can be an excellent tool to refine your
writing skills.&lt;/p&gt;
&lt;p&gt;Also my mother tongue is not English, so this blog allows me to refine my English writing.&lt;/p&gt;
&lt;h2 id=&quot;motivation-4-trying-gatsbyjs&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#motivation-4-trying-gatsbyjs&quot; aria-label=&quot;motivation 4 trying gatsbyjs permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Motivation #4: Trying Gatsby.js&lt;/h2&gt;
&lt;p&gt;I’m reading a lot of people are using &lt;a href=&quot;https://www.gatsbyjs.org/&quot;&gt;Gatsby.js&lt;/a&gt;. It sounds like a promising
technology and I am eager to get my hands on it. It has some cool concepts. So, I’m building this
blog with Gatsby.js.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://github.com/sebastianhaeni/blog&quot;&gt;https://github.com/sebastianhaeni/blog&lt;/a&gt;
if you want to read the source code.&lt;/p&gt;
&lt;h2 id=&quot;motivation-5-ai-seminar-course&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#motivation-5-ai-seminar-course&quot; aria-label=&quot;motivation 5 ai seminar course permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Motivation #5: AI Seminar course&lt;/h2&gt;
&lt;p&gt;Lastly, and where I finally got the motivation to start this blog is a seminar about AI that I’m
inscribed in for my Masters. In that course, we go through a scientific paper and are expected to
write blog posts about the process and what we learned when reading and asking questions about it.&lt;/p&gt;</content:encoded></item></channel></rss>