<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ivan Krnic</title>
    <description>The latest articles on DEV Community by Ivan Krnic (@ikrnic).</description>
    <link>https://dev.to/ikrnic</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F218084%2F6aef788e-5829-437d-9c3b-88ede3d8d878.png</url>
      <title>DEV Community: Ivan Krnic</title>
      <link>https://dev.to/ikrnic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ikrnic"/>
    <language>en</language>
    <item>
      <title>Microfrontend, what is it good for, absolutely everything!</title>
      <dc:creator>Ivan Krnic</dc:creator>
      <pubDate>Tue, 14 Apr 2020 16:07:22 +0000</pubDate>
      <link>https://dev.to/ikrnic/microfrontend-what-is-it-good-for-absolutely-everything-j9i</link>
      <guid>https://dev.to/ikrnic/microfrontend-what-is-it-good-for-absolutely-everything-j9i</guid>
      <description>&lt;p&gt;Organizations providing complex user experience should start considering the microfrontend approach as their default frontend implementation strategy.&lt;/p&gt;

&lt;p&gt;Traditional monolithic and tightly coupled architectures proved &lt;strong&gt;cumbersome and clumsy.&lt;/strong&gt; The main issues with such architectures come from the size and interdependencies of source code. Such systems are difficult to fully understand. It is hard to identify all dependencies. It is hard to implement new features with confidence that new defects haven’t been introduced. It is hard to efficiently scale such a system. All these issues have a &lt;strong&gt;negative influence on lead time and quality of service.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At the same time, all these issues can be remediated with different architectural principles, i.e. introducing &lt;strong&gt;modularity and loosely coupled components.&lt;/strong&gt; Microservice architecture relies on these principles and we as an industry have been fairly successful at recognizing the need and implementing these principles when developing backend systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;However, we still equally suck in recognizing the need and applying these principles in the frontend!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As modular and independent our backend services are, we still tend to build large monolithic frontends.&lt;/p&gt;

&lt;p&gt;Typical problems that we encounter are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large and messy codebase, large deployments, big batches, low speed of delivery, more difficult regression testing hence more errors reaching the customers&lt;/li&gt;
&lt;li&gt;when upgrading the underlying frontend framework, we are reduced to the Big-bang approach: we cannot iteratively upgrade parts of our frontend thus we cannot deliver value to the customer sooner and reduce implementation risk by shrinking the blast radius.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T_-bHuRL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/60iusdsof84xj6prrovn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T_-bHuRL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/60iusdsof84xj6prrovn.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution is for organizations to start applying proven principles of modularity and decoupling also to the frontend development.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nowadays, modern frontend solutions are built as Single Page Applications (SPA) using popular frameworks such as Angular, React, Vue, ExtJS or similar. Recognizing the need for modularity and decoupling, modern frontend architectures leverage the concept of &lt;strong&gt;modules (or components).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just as the backend system is built using independent services that tied together provide full system functionality, the frontend system is built using independent components that combined provide a full user experience. This approach is called &lt;strong&gt;microfrontend.&lt;/strong&gt; Components are designed, developed, tested and deployed independently. Moreover, since these components are independent, each one can be implemented using different frontend framework that best suits a particular need. That is not to say that a great variety of different frameworks is preferred or even suggested. But it is a nice feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Much bigger benefit&lt;/strong&gt; stems from the fact that these &lt;strong&gt;components are independent and have their own lifecycle.&lt;/strong&gt; Therefore, each component can be modified and upgraded independently. This is particularly convenient when dealing with complex frontend systems. To upgrade such a system to a newer version of say Angular, an organization should upgrade the whole system before releasing everything to production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With microfrontend approach, an organization can upgrade each component at its own pace, releasing upgrades iteratively, continuously providing customer value and controlling blast radius in case of errors.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Infrastructure as Code vs. GitOps</title>
      <dc:creator>Ivan Krnic</dc:creator>
      <pubDate>Wed, 19 Feb 2020 18:59:25 +0000</pubDate>
      <link>https://dev.to/ikrnic/infrastructure-as-code-vs-gitops-1cp9</link>
      <guid>https://dev.to/ikrnic/infrastructure-as-code-vs-gitops-1cp9</guid>
      <description>&lt;p&gt;A couple of years ago we were in the middle of a huge project that required hefty processing capacity. We were relying on Red Hat OpenShift as a container platform (we still do :), and as capacity demand grew, we had to periodically add new worker nodes.&lt;/p&gt;

&lt;p&gt;Adding new worker nodes was a breeze but more often than not our applications failed miserably on these new nodes for various reasons which all boiled down to something stupid like missing some configuration properties. Very soon it became clear to us that we needed a mechanism for establishing &lt;strong&gt;the Desired state.&lt;/strong&gt; And that’s where the concept of Infrastructure as Code fits perfectly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure as Code is a mechanism for creating and maintaining runtime infrastructure based on a definition usually stored in a version control system.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The main idea here is that runtime infrastructure can be defined via machine-readable files that can be stored and versioned, much like regular source code. If you can build a specific application version based on the source code in a version control system, why wouldn’t you be able to do the same with your infrastructure – provision specific infrastructure based on the definition files in your version control system.&lt;/p&gt;

&lt;h1&gt;
  
  
  How we hit rock bottom...
&lt;/h1&gt;

&lt;p&gt;Before Infrastructure as Code, our nodes (although meant to be identical) were rather unique because configuring nodes was a human task. With configuration documentation scattered over several Wikis and Word files, and humans not being shell scripts (therefore forgetting things), every now and then somebody dropped the ball and forgot to set some properties. In effect, our nodes ended up being &lt;strong&gt;snowflakes&lt;/strong&gt; – each one very unique and with subtle configuration differences that were not visible to the naked eye, but nevertheless were causing our applications to fail on specific nodes… for no particular reason at all… at least it seemed so.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z8B2Q8cX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9weolatsyqfx0e4b1lpj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z8B2Q8cX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9weolatsyqfx0e4b1lpj.jpg" alt="Manual server provisioning. Completely hypothetical situation. Never happened."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Infrastructure as Code takes care that infrastructure configuration is clearly defined in the version control system and consistently applied to infrastructure. Changes to infrastructure are done exclusively through pull requests in the version control system. Need additional CPU for your application? No worries, just make that change in the configuration file and make a pull request. When somebody approves a pull request, the change will be merged to trunk and the process will be initiated to provision new infrastructure configuration – new Desired state.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cool IaC features
&lt;/h1&gt;

&lt;p&gt;In order for Infrastructure as Code to work there has to be a way to &lt;strong&gt;fully automate tasks.&lt;/strong&gt; This is where various tools come handy. Every public cloud has its own flavor: AWS CloudFormation, Azure Resource Manager and Google Cloud Deployment Manager, to name some. Other popular tools include Terraform, Ansible, and so on.&lt;/p&gt;

&lt;p&gt;Additionally, automated tasks need to be &lt;strong&gt;idempotent&lt;/strong&gt; which means that they can be executed multiple times with the same effect as they were executed only once. This ensures that complete configuration can be applied over and over again without fear of breaking something. Idempotent operations dramatically simplify implementation since we don’t need to take care of state (i.e. recording which changes/scripts were already executed and should be omitted from future execution).&lt;/p&gt;

&lt;p&gt;Infrastructure as Code is such a powerful concept that enables us to add new cluster nodes that are identical to others as well as to create whole new environments that are the spitting image of the production. And when something goes terribly wrong, clusters can be automatically recreated with identical configuration as the old ones. Remember that analogy with pets and cattle? A proper restore-from-backup operation takes a lot of time. It’s usually easier and much faster to just drop the whole cluster and rebuild it from scratch. This is, to be honest, what we would do with full-fledged application servers and other heavy-weight runtime environments if we had a fast and reliable rebuild process.&lt;/p&gt;

&lt;h1&gt;
  
  
  And then GitOps came along...
&lt;/h1&gt;

&lt;p&gt;Historically, Infrastructure as Code pattern dealt only with managing infrastructure in data centers, like servers and network parameters. But, two things happened in the meanwhile: Git became prevailing version control system, and second, with the rise of the cloud, an additional level of abstraction surfaced in the form of container orchestrator, most notably Kubernetes.&lt;/p&gt;

&lt;p&gt;Since IaC was such a useful pattern, wouldn’t it be cool to extend it in a way that it uses Git as a version control system and manages not only underlying servers but also Kubernetes instance? And, voila, GitOps emerged.&lt;/p&gt;

&lt;p&gt;Much like IaC is a pattern that manages infrastructure, &lt;strong&gt;GitOps is a pattern that manages Kubernetes instance&lt;/strong&gt; and handles tasks such as setting namespaces, limits, and quotas, controlling the number of container instances and so on. As the name says, &lt;strong&gt;GitOps uses Git as a single source of truth&lt;/strong&gt; for Kubernetes instance management. Being container- and cloud-native-aware, GitOps is ideal for modern architectures and modern technology stack. Using GitOps you can recreate your Kubernetes cluster, set up all namespaces, limits, and quotas, and redeploy all containers. On a push of the button, you can tear everything down and recreate an identical state as before.&lt;/p&gt;

&lt;h1&gt;
  
  
  IaC vs GitOps mess... #”$%$
&lt;/h1&gt;

&lt;p&gt;People often ask &lt;strong&gt;what is the difference between IaC and GitOps.&lt;/strong&gt; It’s not an easy question. IaC is version control system agnostic. GitOps, on the other hand, uses only Git. IaC deals only with the underlying infrastructure. GitOps focuses on managing Kubernetes instance above. Does that mean that GitOps shouldn’t also manage infrastructure? No, why wouldn’t GitOps also manage infrastructure?&lt;/p&gt;

&lt;p&gt;We can look at GitOps as “doing Ops” while using Git for storing configurations. Notice here how “doing Ops” is not limited only to managing servers or only to managing Kubernetes instance. We can look at it holistically as managing whatever it takes. In that sense, we can look at GitOps as a more specific implementation of IaC pattern.&lt;/p&gt;




&lt;p&gt;Lately, we’ve been using Argo CD for implementing GitOps and are thrilled with how smoothly it works. &lt;a href="https://croz.net/news/argo-cd-the-gitops-tool/?utm_source=dev-to&amp;amp;utm_medium=web&amp;amp;utm_campaign=argo-cd"&gt;Denis wrote a nice article about Argo CD&lt;/a&gt; and I warmly suggest you read it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why you should seriously consider IaC and GitOps?
&lt;/h1&gt;

&lt;p&gt;Infrastructure as Code and GitOps work best together! Benefits are huge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speed,&lt;/strong&gt; since installing and configuring Kubernetes instance can be automated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency,&lt;/strong&gt; since all instances are always built and configured using the same procedure and same input parameters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit,&lt;/strong&gt; since all changes are done through configuration stored in a version control system it is easy to find out who did particular change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traceability,&lt;/strong&gt; again since all changes are done through configuration stored in a version control system it is easy to figure out how the system ended up in the current state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-service and developer-centric,&lt;/strong&gt; since changes to infrastructure can be done even by developers… as opposed to only by Operations. On the other hand, we don’t want anarchy… that’s why we use pull requests that somebody needs to approve.&lt;/li&gt;
&lt;li&gt;Developers can develop (and later troubleshoot) in an environment identical to production. Developers love this.&lt;/li&gt;
&lt;li&gt;Feedback loops are shorter since QA can be done in an environment identical to production. Problems are caught before production.&lt;/li&gt;
&lt;li&gt;Performance and stress tests also make sense only when done in an environment identical to the production&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you’re interested in receiving interviews with thought leaders and a digest of exciting ideas from the world of DevOps straight to your inbox, &lt;a href="https://croz.us20.list-manage.com/subscribe?u=9888b32e3b270c3b29a15a76b&amp;amp;id=6b4f8bc54b"&gt;subscribe to our 0800-DEVOPS newsletter!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>gitops</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>Mind the Hump - how the market influences your delivery approach</title>
      <dc:creator>Ivan Krnic</dc:creator>
      <pubDate>Sat, 14 Dec 2019 16:27:30 +0000</pubDate>
      <link>https://dev.to/ikrnic/mind-the-hump-how-the-market-influences-your-delivery-approach-231k</link>
      <guid>https://dev.to/ikrnic/mind-the-hump-how-the-market-influences-your-delivery-approach-231k</guid>
      <description>&lt;p&gt;&lt;strong&gt;If you’re interested in receiving interviews with thought leaders and a digest of interesting ideas from the world of DevOps straight to your inbox &lt;a href="https://croz.us20.list-manage.com/subscribe?u=9888b32e3b270c3b29a15a76b&amp;amp;id=6b4f8bc54b"&gt;subscribe to our 0800-DEVOPS newsletter!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Last week we had an opportunity to host our friend &lt;strong&gt;Andrea Tomasini&lt;/strong&gt; and discuss &lt;a href="https://www.organic-agility.com/"&gt;ORGANIC agility.&lt;/a&gt; One of the key things Andrea mentioned was that an organization should behave differently depending on the maturity of the market in which it operates. He explained this using the famous curve introduced by Geoffrey Moore in &lt;a href="https://www.amazon.com/Crossing-Chasm-3rd-Disruptive-Mainstream-ebook/dp/B00DB3D81G"&gt;Crossing the Chasm.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0Cu4dlOE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/g3s1dcx38u7l3aoxmb9m.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Cu4dlOE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/g3s1dcx38u7l3aoxmb9m.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the organization is still &lt;strong&gt;on the left-hand side of the hump&lt;/strong&gt; and building a product targeted for Innovators and Early adopters, it needs to be nimble. The organization is still looking for the right product, so it needs to move fast in order to learn fast. At this point, &lt;strong&gt;effectiveness is more important than efficiency.&lt;/strong&gt; Speed is crucial. If having more people working on a solution will yield the solution earlier than that is what an organization needs to do. The organization is in the &lt;strong&gt;“sell-to-make”&lt;/strong&gt; mode – it first has to sell the product (the idea!) to the customers in order to come in the position to actually produce it! Occasional slips are perfectly fine – it is far more important to ship something quickly and solicit feedback than to analyze every single edge case before shipping it out. Remember what Mark Zuckerberg used to say when Facebook was in this phase… &lt;strong&gt;“Move fast and break things”.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Organizations must move quickly in this period because this is when the market share is acquired. Once the market becomes saturated and the Late majority kicks in, it is hard to increase market share.&lt;/p&gt;

&lt;p&gt;Once the organization moves &lt;strong&gt;over the hump,&lt;/strong&gt; different mechanics apply. It is now clear what is the product that customers are looking for. The market is in a saturated state. The only way to compete with others is through small tweaks and price optimizations. Hence, the focus is now on &lt;strong&gt;efficiency over effectiveness.&lt;/strong&gt; Speed is no longer crucial. Efficiency is. So is the quality. Slips are no longer tolerated because that is not how products in saturated/mature markets operate. It is expected that the product works flawlessly, and each error is scrutinized. On the right-hand side of the hump, the organization is in the &lt;strong&gt;“make-to-sell”&lt;/strong&gt; mode – the product is known, there is nothing new to discover, all it needs to do is build the product as efficiently as possible and sell it with the best margin it can get.&lt;/p&gt;

&lt;p&gt;Every organization will sooner or later end up on either side of the curve. The important thing is to recognize in which mode it should operate and adjust its behavior accordingly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RAey11Pt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/36sq57d5sm12h3l9prb9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RAey11Pt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/36sq57d5sm12h3l9prb9.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently we had an opportunity &lt;strong&gt;to participate in one Proof of Concept&lt;/strong&gt; with the goal of designing and piloting a new solution for a widely used consumer-facing web application. The PoC was timeboxed and defined only with a handful of enabling constraints set by the Customer. It was our job to build the best possible solution with these constraints in mind. &lt;strong&gt;We were obviously in a sell-to-make mode, so we acted accordingly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Creativity and speed were crucial. We have put some smart heads together and gave them full autonomy to self-organize and generate ideas. By iterating rapidly over a large number of possible ideas we were able to distil those worth pursuing further. During this process, nobody ever asked for any estimates or whether all these people were truly necessary during all the discussions. All that mattered was moving fast. Even if that meant not implementing every single edge case but documenting it for later.&lt;/p&gt;

&lt;p&gt;Team engagement was spectacular. Working in this industry for almost 15 years now, rarely have I seen projects that were so &lt;strong&gt;owned&lt;/strong&gt; by the team. It was clearly their product, their masterpiece. Again, connecting to the work of &lt;a href="https://www.amazon.com/Drive-Surprising-Truth-About-Motivates/dp/1594484805"&gt;Daniel Pink,&lt;/a&gt; we have given them &lt;strong&gt;autonomy&lt;/strong&gt; to self-organize, an opportunity to stretch their &lt;strong&gt;mastery&lt;/strong&gt; and a compelling &lt;strong&gt;vision&lt;/strong&gt; of changing how consumers use Customer’s services.&lt;/p&gt;

&lt;p&gt;Recognizing on which side of the hump you are and acting accordingly plays a major role in the success of your efforts. In our example, understanding that we were addressing Innovators in this PoC helped us adjust our approach and deliver precisely what the Customer needed. This might seem intuitive, but I have personally seen a number of cases where this was not the case.&lt;/p&gt;

&lt;p&gt;So, keep your eyes open and &lt;strong&gt;mind the Hump.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you’re interested in all things DevOps &lt;a href="https://croz.us20.list-manage.com/subscribe?u=9888b32e3b270c3b29a15a76b&amp;amp;id=6b4f8bc54b"&gt;subscribe to our 0800-DEVOPS newsletter!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will receive in your inbox interviews with thought leaders and a digest of interesting ideas from the world of DevOps, technical practices and increased productivity!&lt;/p&gt;

&lt;p&gt;We will never spam you, just share things we discuss internally in our CROZ DevOps Community of Practice. Join us!&lt;/p&gt;

</description>
      <category>devops</category>
    </item>
    <item>
      <title>Making systems more resilient (1) - Circuit Breaker</title>
      <dc:creator>Ivan Krnic</dc:creator>
      <pubDate>Sat, 07 Sep 2019 17:47:00 +0000</pubDate>
      <link>https://dev.to/ikrnic/making-systems-more-resilient-1-circuit-breaker-477e</link>
      <guid>https://dev.to/ikrnic/making-systems-more-resilient-1-circuit-breaker-477e</guid>
      <description>&lt;p&gt;&lt;em&gt;Things break. Usually in production. In this article series we will present various mechanisms for making your systems more resilient so your users will never experience real outage in spite of possible problems under your hood.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circuit Breaker&lt;/strong&gt; has an interesting name that comes from the analogy found in the physical electrical world. Every decent electrician recognizes that playing with electricity is dangerous and that she must install security mechanisms to protect the rest of the electrical network if one device breaks down. What do electricians do? They install &lt;strong&gt;fuses&lt;/strong&gt;. If a device (say toaster!) breaks down and produces short circuit, strong electric current will flow through the network resulting in damage, overheating and possibly fire. &lt;strong&gt;Unless there is a fuse in the network!&lt;/strong&gt; If there is strong electric current flowing, the fuse will melt down or otherwise break the electrical circuit, stop the current and save the rest of the network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circuit Breaker mechanisms in software are very much like electrical fuses in the real world.&lt;/strong&gt; Suppose one of your services is calling another:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fba5cn9q5peopmi8efh02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fba5cn9q5peopmi8efh02.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If Service B stops responding, Service A will patiently wait until timeout happens and then will either throw an exception or return questionable results. None of this is acceptable. We need a better solution that would prevent the whole system from going down. That’s where the Circuit Breakers come into play.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffgv0i009to2waxys4d0p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffgv0i009to2waxys4d0p.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Circuit Breaker is positioned between two services and service call passes through it. If everything is fine, Circuit Breaker just passes calls through. What happens when Service B doesn’t respond?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5dsgvz6k4dt5v0fo09n6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5dsgvz6k4dt5v0fo09n6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Circuit Breaker will detect that and return an error or alternative response. In electrical terms, Circuit Breaker will &lt;strong&gt;"open the circuit"&lt;/strong&gt;. What’s more, Circuit Breaker will remember that Service B is down and whoever calls Service B will immediately get an error without Circuit Breaker even passing the request to Service B. Circuit Breaker will periodically pass one of the requests through to Service B, just to check if Service B is still down. If that is so, Circuit Breaker will continue to return an error without even passing requests to Service B.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fox32uu6mm491rdedqmbm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fox32uu6mm491rdedqmbm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If, on the other hand, Service B recovers and returns a valid result, Circuit Breaker will detect that, return the result to the caller (Service A) and &lt;strong&gt;"close the circuit"&lt;/strong&gt; again, i.e. continue passing all requests through to Service B.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2ze3clqx482nobcjfe7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2ze3clqx482nobcjfe7c.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When Circuit Breaker detects that called service is down, it can do various things. It could return a meaningful error to the caller but it could also return a “good enough” result that would provide some value for the user.&lt;/p&gt;

&lt;p&gt;Let’s take &lt;strong&gt;an example of a banking application&lt;/strong&gt; that shows account balance fetched via separate service. If that service goes down, Circuit Breaker could return the last known balance from the cache. Yesterday’s balance might not be valid today but accompanied by a proper message it’s better than nothing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Dear customer, we’re experiencing some trouble getting your balance at the moment, but your balance 3 hours ago was €234.55"&lt;/em&gt; beats &lt;em&gt;"Your balance is €null"&lt;/em&gt; anytime. Of course, what Circuit Breaker returns needs to be carefully thought through from a business perspective.&lt;/p&gt;

&lt;p&gt;Circuit Breakers are really cool. In &lt;strong&gt;Part 2&lt;/strong&gt; of this series, we will lift the hood and show concrete Circuit Breaker implementation.&lt;/p&gt;

&lt;p&gt;— Photo by rawpixel.com from Pexels.&lt;/p&gt;

</description>
      <category>devops</category>
    </item>
    <item>
      <title>Accelerate State of DevOps Report 2019: Communities of Practices are so dope!</title>
      <dc:creator>Ivan Krnic</dc:creator>
      <pubDate>Sun, 25 Aug 2019 14:54:00 +0000</pubDate>
      <link>https://dev.to/ikrnic/accelerate-state-of-devops-report-2019-communities-of-practices-are-so-dope-4bp7</link>
      <guid>https://dev.to/ikrnic/accelerate-state-of-devops-report-2019-communities-of-practices-are-so-dope-4bp7</guid>
      <description>&lt;p&gt;New &lt;a href="https://cloud.google.com/devops/state-of-devops/" rel="noopener noreferrer"&gt;Accelerate State of DevOps Report 2019&lt;/a&gt; has been published!&lt;/p&gt;

&lt;p&gt;In case you’re wondering what’s all the fuss about, it’s the largest and longest-running research of its kind revealing &lt;strong&gt;what truly successful software delivery companies do differently than their less successful counterparts&lt;/strong&gt;. Wow, who wouldn’t want to take a look at that?! The research is led by &lt;strong&gt;Dr. Nicole Forsgren&lt;/strong&gt; and here is her take on the Report.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/8M3WibXvC84"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;There is a deeply rooted belief that &lt;strong&gt;the speed&lt;/strong&gt; of software delivery process comes at the expense of &lt;strong&gt;the stability&lt;/strong&gt; and vice versa. If you’re delivering something fast, you’re bound to break things in production. Therefore, if you want a reliable system, you cannot go fast. And if you need to go fast, rest assured your system will not be reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What data say?
&lt;/h2&gt;

&lt;p&gt;Year after year, this report, backed by data and scientific methods, proves that speed and stability are not working against each other. Rather, &lt;strong&gt;speed and stability enable each other.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Elite performers massively outperform low performers. &lt;strong&gt;Numbers are staggering: 208 times more frequent code deployments and 106 times faster lead time from commit to deploy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Is this possible? It sure is, when using proper organizational and technical practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to move the needle?
&lt;/h2&gt;

&lt;p&gt;One of the recognized organizational practices is establishing &lt;strong&gt;Communities of Practices (CoP)&lt;/strong&gt; as opposed to Training Centers or Centers of Excellence (CoE). As confirmed by the Report, CoE represents a bottleneck for the relevant expertise in the organization. CoE also scales badly across the organization. Furthermore, the Report recognizes that CoE &lt;em&gt;"establishes an exclusive group of "experts" in the organization, in contrast to an inclusive group of peers who can continue to learn and grow together."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Community of Practice is precisely the latter, an informal group of peers gathered around a common topic that is of interest to everyone.&lt;/strong&gt; Group members share knowledge, experiences, and skills, and work together toward common goal. Do you feel like your organization could benefit from a better testing process? Find your like-minded peers and recruit them into Community of Practice for Testing. Work together on improving testing process. Define your working agreement. Everything is acceptable: you can come together every morning over coffee, or later during the day, or after work over beer. The only thing that is important is that participation is voluntary and members are genuinely interested and motivated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our experiences with Communities of Practices
&lt;/h2&gt;

&lt;p&gt;Time and again, this approach proved its value at CROZ. Striving to build a healthy and inclusive organizational culture, we have zero tolerance to Ivory Towers where experience and knowledge are hidden from the rest of the organization. Some of our most active communities are &lt;strong&gt;CoP for Agile, CoP for DevOps, and CoP for Product Management.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F85lcs17f57n4icekvmms.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F85lcs17f57n4icekvmms.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each community is &lt;strong&gt;fully open&lt;/strong&gt; and &lt;strong&gt;everyone can participate and contribute&lt;/strong&gt;. Members meet regularly and share their experiences as well as useful books, blogs, tools, insights, and ideas. &lt;strong&gt;Equally important: all communities have full autonomy in defining their goals.&lt;/strong&gt; Members work together to define steps and experiments which will get each community closer to its goal. No management is involved here. Community members autonomously collaborate around tasks and navigate toward defined goal.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;social aspects&lt;/strong&gt; of CoPs are spectacular! People are getting together. I’ve seen new friendships hit off. I’ve seen numerous old hatchets buried. I myself got really close to some people. Today I would do whatever it takes for them and I’m sure they would do the same for me. That’s what CoPs do to your organizations. Try them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fgagghc20c3v0xdn7nxr3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fgagghc20c3v0xdn7nxr3.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>agile</category>
    </item>
  </channel>
</rss>
