<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: StackPulse</title>
    <description>The latest articles on Forem by StackPulse (@stackpulse).</description>
    <link>https://forem.com/stackpulse</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%2Forganization%2Fprofile_image%2F2053%2Fe8cb7371-c6e0-43d3-98d0-3e617b1326c0.png</url>
      <title>Forem: StackPulse</title>
      <link>https://forem.com/stackpulse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/stackpulse"/>
    <language>en</language>
    <item>
      <title>Reliability as an Inseparable Part of Software Engineering</title>
      <dc:creator>Leonid Belkind</dc:creator>
      <pubDate>Tue, 19 Jan 2021 13:25:38 +0000</pubDate>
      <link>https://forem.com/stackpulse/reliability-as-an-inseparable-part-of-software-engineering-2061</link>
      <guid>https://forem.com/stackpulse/reliability-as-an-inseparable-part-of-software-engineering-2061</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The world is changing: &lt;br&gt;
  I feel it in the water, &lt;br&gt;
  I feel it in the earth, &lt;br&gt;
  and I smell it in the air.&lt;br&gt;
         J.R.R. Tolkien, The Fellowship of the Ring&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For someone who has been a Software Engineer, building enterprise software, during the past 20+ years, the changes our world is undergoing are as clear and evident as they were for Lady Galadriel of Lothlórien in the epic by J.R.R Tolkien. The meaning of “developing and delivering a software product” as we saw it in the 1990s, when I began my professional career as a Software Engineer, and the meaning of the same thing today are very different.&lt;/p&gt;

&lt;p&gt;The differences start with the definition of a &lt;strong&gt;“software product”&lt;/strong&gt;. Traditionally, software vendors would be responsible for developing software and packaging it in a form that allows their customers (businesses or consumers) to deploy it on their own IT infrastructure and use it. This paradigm, also known as “on premises” software products is now being ousted in many B2B and B2C scenarios in favor of delivering &lt;strong&gt;“software services”&lt;/strong&gt;. The distinction between delivering an on-premises product and delivering (potentially the same software as) a service is not just about the form of delivery or consumption, it changes the core set of expectations between the customer and the provider / vendor.&lt;/p&gt;

&lt;p&gt;When a customer is acquiring a &lt;strong&gt;“service”&lt;/strong&gt;, the expectations are stretching far beyond its functional capabilities into the domain of availability. The customer rightfully expects that the service is available for use with a defined level of user experience at all times (according to the &lt;strong&gt;Service Level Agreement&lt;/strong&gt; with the provider). The shared responsibility model that was in place for on-premises products, where the vendors had to provide working software products, but the customers had to deploy and operate them according to vendors’ specifications has shifted heavily into the vendors’ side. &lt;/p&gt;

&lt;p&gt;As per normal industrial evolution, both the customers and the vendors are supposed to benefit from this new state. Both of them, however, have new challenges to resolve (or new realities to adapt to) in order to be able to reap the benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Software Vendors&lt;/strong&gt; (turning into Providers of Software Services) need to adopt a new set of responsibilities related to operationalizing the services and delivering guarantees on the service availability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Customers&lt;/strong&gt; of Software Services need to be able to verify (to the extent possible) that the service providers are operating within the expectations in terms of service quality (availability, responsiveness, etc…)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For providers of software services, &lt;strong&gt;Site Reliability Engineering&lt;/strong&gt; is the discipline that allows adopting this new set of responsibilities, guaranteeing their execution and proving that their services are delivered reliably. Delivering a reliable service and proving its reliability are two very different notions.&lt;/p&gt;

&lt;p&gt;In the past, traditional IT operations have ensured reliability of their assets and infrastructure by introducing and following strict operational procedures. Those procedures were applied to “complete products” that were delivered to the IT organizations for operation. The operators could influence the infrastructure, the configuration and the procedures related to the product, but not the product itself. This limitation has clearly introduced a cap on the effectiveness of operations that could be delivered by such organizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Site Reliability Engineering&lt;/strong&gt; is changing the rules of the game by removing this “glass ceiling” and allowing the reliability considerations to influence the product all the way from its architecture and design, through various stages of implementation and testing all the way to its deployment in production. As this approach is being adopted by a growing number of of organizations, it is becoming increasingly clear that this is not just a dedicated “profession” (carried out by dedicated engineers called SREs - Site Reliability Engineers), but a pillar in Software Engineering in general, similar to aspects such as, but not limited to Software Architecture, User Experience, Automated Testing, etc…&lt;/p&gt;

&lt;p&gt;Just as the DevOps philosophy has merged the domains of Software Development and Software (Service) Operations, Site Reliability Engineering is relying on this approach to define reliability challenges not as operational ones (where regulations, processes and escalation procedures would be way of delivering results), but as engineering ones - where a set of &lt;strong&gt;mechanisms&lt;/strong&gt; &lt;em&gt;engineered into the product&lt;/em&gt; would guarantee the desired results.&lt;/p&gt;

&lt;p&gt;Reliability engineering, therefore, is a notion that should affect every stage of software development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Architecture and Design&lt;/strong&gt; with reliability metrics and goals in mind&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementation&lt;/strong&gt; that ensures reliable operations when deployed to production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt; that introduces verifications and gates focusing on reliability and not just functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt; that ensure reliable roll-out
Monitoring surfacing potential reliability issues ahead of time (or, at least, when they, unfortunately, take place)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operationalization&lt;/strong&gt; that allows both ensuring reliable functioning of the service and provides continuous feedback loop back to Design and Implementation stages to improve the reliability of future product iterations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building a &lt;strong&gt;Reliability Platform&lt;/strong&gt; the way we do it in StackPulse means, first and foremost, that we have to adopt the above principles as the foundation for our Software Development Lifecycle. We firmly believe that this is the only way to ensure that the users of our services are guaranteed to have the best and the most reliable product at their disposal.&lt;/p&gt;

&lt;p&gt;This also means that the platform we are delivering to our customers allows them to adopt a similar state of mind and to build mechanisms that will drive the reliability aspects in their respective software architectures and development processes. Becoming an integral part of the SDLC means being able to operate within the main principles upon which the lifecycle is based, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single “Source of Truth” is based on the software version control repositories&lt;/li&gt;
&lt;li&gt;“Fail fast” verification of all changes prior to release to production&lt;/li&gt;
&lt;li&gt;GitOps flow initiating and managing the progressive deployment of changes released to production&lt;/li&gt;
&lt;li&gt;Full transparency and metrics are built in to each process for detailed telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Additionally, we believe that the best ideas are not coming from a single source, but are a result of a collaborative effort. That is why our platform allows developers to &lt;a href="https://github.com/stackpulse/playbooks"&gt;share the mechanisms they build&lt;/a&gt; for reliability, to open them to community feedback and contributions and to make the world a more reliable place as a result of a joint effort. We firmly believe that together we can make a real difference in the reliability of different software services in the world, by sharing our challenges and our practices. We see ourselves as an enabler of such discussions and as a facilitator of knowledge sharing in the field.&lt;/p&gt;

&lt;p&gt;The platform that we are about to launch consists of the following components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackpulse.com/alerts/"&gt;&lt;em&gt;Alert Enrichment &amp;amp; Analysis&lt;/em&gt;&lt;/a&gt; - To reduce alert noise and fatigue with real-time enrichment, triage, and analysis &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackpulse.com/incident-response/"&gt;&lt;em&gt;Automated Incident Response&lt;/em&gt;&lt;/a&gt; -  Automated, code-based playbooks to investigate and remediate production incidents; reducing toil, reducing MTTR and meeting SLOs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackpulse.com/incident-management/"&gt;&lt;em&gt;Incident Lifecycle Management&lt;/em&gt;&lt;/a&gt; -  To streamline communications, speed remediation, and automate data collection during incidents&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This is just the beginning. Our mission is clear: we are delivering a holistic platform that allows engineering organizations to interleave reliability into all stages of their software development and operations. Doing so has to be a continuous agile process, constantly evolving and relying on data-driven insights. This is the way we are doing it ourselves, and this is the way we would like to do this together with our users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are StackPulse!&lt;/strong&gt; Join us in making the world a more reliable place, one software service at a time!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloudnative</category>
      <category>sre</category>
      <category>saas</category>
    </item>
    <item>
      <title>⁉ Why I started developing 💡 my new software project  by building a 🚀 Continuous Deployment 🔃 pipeline </title>
      <dc:creator>Leonid Belkind</dc:creator>
      <pubDate>Sun, 01 Mar 2020 15:41:15 +0000</pubDate>
      <link>https://forem.com/stackpulse/why-i-started-developing-my-new-software-project-by-building-a-continuous-deployment-pipeline-3c0f</link>
      <guid>https://forem.com/stackpulse/why-i-started-developing-my-new-software-project-by-building-a-continuous-deployment-pipeline-3c0f</guid>
      <description>&lt;p&gt;Somehow, in recent years, when discussing software delivery pipelines in modern companies, people would casually drop the term &lt;strong&gt;CI / CD&lt;/strong&gt; (which means &lt;em&gt;Continuous Integration&lt;/em&gt; and &lt;em&gt;Continuous Delivery / Deployment&lt;/em&gt;) always combining both practices. In many cases it is implied that the two practices always go together, or, maybe &lt;em&gt;Continuous Delivery&lt;/em&gt; follows &lt;em&gt;Continuous Integration&lt;/em&gt; as an optional step.&lt;/p&gt;

&lt;p&gt;During recent years I had an opportunity to oversee the establishment of a software delivery pipeline twice, implementing only &lt;em&gt;Continuous Integration&lt;/em&gt; first time, and starting with &lt;em&gt;Continuous Delivery&lt;/em&gt; in my latest project. &lt;/p&gt;

&lt;h2&gt;
  
  
  🙈 TL;DR / Conclusion
&lt;/h2&gt;

&lt;p&gt;There are &lt;strong&gt;HUGE&lt;/strong&gt; differences between the two practices. Differences that don't just have impact on the technology used, but also on the culture of the engineering team. Implementing &lt;em&gt;Continuous Integration&lt;/em&gt; only and hoping that it is a sufficient foundation to switch to &lt;em&gt;Continuous Delivery&lt;/em&gt; in the future is a myth. &lt;/p&gt;

&lt;h2&gt;
  
  
  👊 Which is which and why do you need them?
&lt;/h2&gt;

&lt;p&gt;To explain the choices that we made, one needs to understand the difference between &lt;strong&gt;CI&lt;/strong&gt; and &lt;strong&gt;CD&lt;/strong&gt;. For those who feel confident that they understand it, skipping the below paragraph is recommended. For those who are suddenly not so sure - read on...&lt;/p&gt;

&lt;h3&gt;
  
  
  ☝ Continuous Integration
&lt;/h3&gt;

&lt;p&gt;Continuous Integration is a practice targeted at maintaining a working "integrated" system consisting of multiple components being worked on in parallel by multiple engineers / engineering teams.&lt;/p&gt;

&lt;p&gt;The following diagram demonstrates a &lt;em&gt;simplified&lt;/em&gt; Continuous Integration process:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fofs62oem62m3sosz4ahy.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fofs62oem62m3sosz4ahy.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each of the developers involved is delivering a change in one of the components. The CI constructs an environment consisting of the latest components with the new addition and performs a cycle of automated tests.&lt;/p&gt;

&lt;p&gt;The need to implement a Continuous Integration in businesses that depend on their ability to deliver software efficiently and reliably is very obvious. The alternative is straight out &lt;strong&gt;painful&lt;/strong&gt;. Doing periodic "big bang" integrations, bringing together development projects that were run separately and hoping that they would magically run together - it's a huge challenge. &lt;/p&gt;

&lt;p&gt;I remember the old days where building a multi-component software server in a large R&amp;amp;D organization would result in a very painful iterative integration time period, during which tons of builds would be delivered to QA and would be pronounced "dead on arrival". &lt;/p&gt;

&lt;p&gt;Quite frankly, I cannot think of any good reason why anyone in this day an age would prefer &lt;strong&gt;not&lt;/strong&gt; to use &lt;em&gt;Continuous Integration&lt;/em&gt;. Sure, building it effectively would require investing in &lt;em&gt;automated testing&lt;/em&gt;, which is yet another thing that just should be done without any reservations. &lt;/p&gt;

&lt;p&gt;The only reasonable situation in which &lt;em&gt;CI&lt;/em&gt; shouldn't be used, is the case where the organization maintains a significant amount of legacy software components that cannot be validated with automated testing. If this is the case, then, unfortunately, pretty much everything in this article won't apply. Trying to do Continuous Integration without sufficiently reliable automated testing for components is going to generate something of a very little practical value.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✌ Continuous Delivery / Deployment
&lt;/h3&gt;

&lt;p&gt;Continuous &lt;strong&gt;Delivery&lt;/strong&gt; and Continuous &lt;strong&gt;Deployment&lt;/strong&gt; are terms that quite often get used interchangeably. There is a difference between the &lt;em&gt;canonical&lt;/em&gt; definitions of the two which is important to note, in order to user the correct term:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery" rel="noopener noreferrer"&gt;&lt;strong&gt;Continuous Delivery&lt;/strong&gt;&lt;/a&gt; is a software engineering approach in which teams produce software in short cycles, ensuring that the software can be reliably released at any time and, when releasing the software, doing so manually. It aims at building, testing, and releasing software with greater speed and frequency. &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Continuous_deployment" rel="noopener noreferrer"&gt;&lt;strong&gt;Continuous Deployment&lt;/strong&gt;&lt;/a&gt; is an approach, where the software, after undergoing a set of automated reliability gates, actually gets deployed in the production environment in a fully automated (and controlled) manner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While Continuous &lt;strong&gt;Delivery&lt;/strong&gt; may, indeed, be a natural extension to a well-implemented Continuous &lt;strong&gt;Integration&lt;/strong&gt;, &lt;strong&gt;Continuous Deployment&lt;/strong&gt; requires a significant amount of investment, both technological and methodological, in order to implement successfully. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxk6c4awxgvpvjcno7xf8.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxk6c4awxgvpvjcno7xf8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The above diagram depicts the full flow of a &lt;em&gt;Continuous Delivery&lt;/em&gt; cycle implemented with &lt;em&gt;Canary &lt;a href="https://thenewstack.io/the-rise-of-progressive-delivery-for-systems-resilience/" rel="noopener noreferrer"&gt;Progressive Delivery&lt;/a&gt;&lt;/em&gt; (one of the possible strategies for a responsible automated update of software components in production environments).&lt;/p&gt;

&lt;h2&gt;
  
  
  👟 Implementing &lt;strong&gt;just CI&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In order to implement &lt;em&gt;Continuous Integration&lt;/em&gt; successfully, an organization would need to invest in a number of technical infrastructural components, as well as to encourage (or even enforce) certain rules on the "Definition of Done" for Software Developers.&lt;/p&gt;

&lt;p&gt;Three main components listed below allowed us to enable efficient &lt;em&gt;CI&lt;/em&gt; and gain a consensus (among the members of our engineering team) that it is a valuable asset for the organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Automated Tests
&lt;/h3&gt;

&lt;p&gt;An absolute must for any &lt;strong&gt;CI&lt;/strong&gt; environment, automated testing of your code provides the foundation for an ability to &lt;em&gt;claim&lt;/em&gt; that a code change has been successfully integrated.&lt;/p&gt;

&lt;p&gt;A lot has been said about automated testing methodologies. At this point, it is enough to state that testing automation should be introduced on multiple levels (and not just either &lt;em&gt;Unit Testing&lt;/em&gt; or &lt;em&gt;End-to-End Testing&lt;/em&gt;). Layers, such as &lt;em&gt;Module Testing&lt;/em&gt;, &lt;em&gt;Contract Testing&lt;/em&gt;, &lt;em&gt;Performance Testing&lt;/em&gt; and even &lt;em&gt;Automated Security Tests&lt;/em&gt; should be considered, depending on the requirements of your project.&lt;/p&gt;

&lt;p&gt;It was our experience, that introducing all relevant tests incrementally for every code change and treating these as an inseparable part of the development cycle (rather than separate tasks) ensured that our ability to successfully gate software changes in a dynamic environment keeps the overall system stable.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌀 CI Pipeline
&lt;/h3&gt;

&lt;p&gt;During the early days of &lt;em&gt;Continuous Integration&lt;/em&gt;, when it was still called &lt;em&gt;Software Configuration Management Automation&lt;/em&gt;, organizations used to automate software building, testing and packaging tasks writing custom scripts / code. &lt;a href="https://jenkins.io" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt; was, probably, the first &lt;strong&gt;CI&lt;/strong&gt; and later also &lt;strong&gt;CD&lt;/strong&gt; pipeline tool that has emerged as the main-stream-adopted (almost de-facto standard) for building &lt;em&gt;Automated CI Pipelines&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Additional products, both self-hosted open source ones, as well as SaaS-delivered (&lt;a href="https://travis-ci.com/" rel="noopener noreferrer"&gt;Travis CI&lt;/a&gt;, &lt;a href="https://https://circleci.com/" rel="noopener noreferrer"&gt;Circle CI&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/ee/ci/pipelines.html" rel="noopener noreferrer"&gt;Gitlab Pipelines&lt;/a&gt;, &lt;a href="https://https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;, &lt;a href="https://cloud.google.com/cloud-build" rel="noopener noreferrer"&gt;Google Cloud Build&lt;/a&gt; and more) have since taken the architecture and the instrumentation of &lt;em&gt;CI&lt;/em&gt; lightyears ahead.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Artifacts Repository
&lt;/h3&gt;

&lt;p&gt;A very important component in the pipeline, repository for storing the tested / verified "deliverables". &lt;em&gt;Artifacts Repositories&lt;/em&gt; have evolved from a file-system with a predefined structure to a more sophisticated software solutions, capable of delivering the "artifacts" using various Software Package Management / Distribution systems. &lt;/p&gt;

&lt;h2&gt;
  
  
  👞 Implementing &lt;strong&gt;CD&lt;/strong&gt; on top of &lt;strong&gt;CI&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Do we need to implement &lt;em&gt;Continuous Integration&lt;/em&gt; first, and then consider working on &lt;em&gt;Continuous Delivery&lt;/em&gt;? A &lt;a href="https://jhall.io/posts/cd-without-ci/" rel="noopener noreferrer"&gt;great article&lt;/a&gt; on the subject suggests, that, while this is a conventional approach, it can, actually be done in a different order (with some unorthodox thinking). While this is a valid opinion, &lt;strong&gt;all&lt;/strong&gt; of the &lt;em&gt;Continuous Delivery&lt;/em&gt; environments familiar to the author of this article are, actually, built on top of &lt;em&gt;Continuous Integration&lt;/em&gt; pipelines.&lt;/p&gt;

&lt;p&gt;On top of the components listed above, following ones will need to be added in order to implement &lt;strong&gt;Continuous Deployment&lt;/strong&gt;. Above all, the understanding that every delivery will impact real users of your service is something that needs to be generally acceptable by your engineering team. Engineers should feel confident in delivering changes, knowing that the deployment is done in a responsible manner and that the system can be &lt;em&gt;observed&lt;/em&gt; properly to make sure that it functions according to expectations. &lt;/p&gt;

&lt;h3&gt;
  
  
  👏 Operator / Trigger for Deployments
&lt;/h3&gt;

&lt;p&gt;This is, in fact, the only &lt;em&gt;100% mandatory&lt;/em&gt; component for implementing &lt;em&gt;Continuous Deployment&lt;/em&gt;. This is what ensures its continuousness. The goal of this component is to trigger deployment process automatically upon either a completion of a &lt;em&gt;Continuous Integration&lt;/em&gt; for a certain change, or upon any other automated trigger.&lt;/p&gt;

&lt;p&gt;There are multiple ways to implement such a trigger, both including custom-developed code and open-source projects, such as &lt;a href="https://fluxcd.io/" rel="noopener noreferrer"&gt;Flux CD&lt;/a&gt; or &lt;a href="https://www.spinnaker.io/" rel="noopener noreferrer"&gt;Spinnaker&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🙌 Progressive Delivery Controller
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Progressive Delivery&lt;/em&gt; is a methodology that ensures gradual adoption of newly delivered components by some users of the overall system (but not by everyone at once). Coupled with &lt;em&gt;Health Metrics Monitoring&lt;/em&gt;, it can be used for a fully automated responsible roll-out.&lt;/p&gt;

&lt;p&gt;Depending on the nature of your service, using &lt;em&gt;Progressive Delivery&lt;/em&gt; is not a must. If you can replace versions of various components of your software in the production environments without worrying about its impact on the end-users, you don't need to do anything special.&lt;/p&gt;

&lt;p&gt;If causing interruptions to current users of your service is a concern, then some sort of a progressive delivery controller is required. Open Source projects, such as &lt;a href="https://github.com/argoproj/argo-rollouts" rel="noopener noreferrer"&gt;Argo Rollouts&lt;/a&gt; and &lt;a href="https://github.com/weaveworks/flagger" rel="noopener noreferrer"&gt;Weaveworks Flagger&lt;/a&gt; deliver this functionality for Kubernetes environments.&lt;/p&gt;

&lt;p&gt;There are various methods for performing &lt;em&gt;Progressive Delivery&lt;/em&gt;, such as, but not limited to &lt;em&gt;Blue-Green&lt;/em&gt; or &lt;em&gt;Canary&lt;/em&gt; upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  👈👉 Traffic Split Manager / Load Balancer
&lt;/h3&gt;

&lt;p&gt;Since at various stages of a &lt;em&gt;Progressive Delivery&lt;/em&gt; process both the "Stable" and the "New" versions of the same component will exist simultaneously, something needs to be able to balance traffic between these two. Most &lt;em&gt;Progressive Delivery Controllers&lt;/em&gt; are capable of controlling the traffic split management by interacting with notions, such as Load Balancers, Service Mesh controllers, ingress controllers and other components capable of directing North-South, as well as East-West traffic to various instances of destinations.&lt;/p&gt;

&lt;h3&gt;
  
  
  👍👎 Health Metrics Monitoring
&lt;/h3&gt;

&lt;p&gt;The ability to establish whether your component is "healthy", or whether it is functioning according to expectations, is a mandatory part being able to do automated deployment. Without this ability, your developers are "blind", not knowing whether the system is functioning or not.&lt;/p&gt;

&lt;p&gt;The monitoring can be done either using &lt;em&gt;passive&lt;/em&gt; methodology (i.e., your component emits various metrics or logs and something monitors whether their data is reflecting a properly functioning system) or using &lt;em&gt;active&lt;/em&gt; methodology (periodic probes/sensors are executed against the system, verifying that its response is according to what is expected).&lt;/p&gt;

&lt;p&gt;When considering systems for collecting metrics, &lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt; rules supremely as the most widely used open source tool, easily integrated with all the leading &lt;em&gt;Progressive Delivery Controllers&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  💫 Tying it all together
&lt;/h2&gt;

&lt;p&gt;Having established what &lt;em&gt;Continuous Integration&lt;/em&gt; and &lt;em&gt;Continuous Deployment&lt;/em&gt; are, you can now judge the requirements for your specific case. The article above has focused on the technical components that are required to achieve either of these capabilities, mentioning that the engineering teams and their culture are also an important factor.&lt;/p&gt;

&lt;p&gt;Deciding on the proper strategy for your software service is up to you. One important piece of advice is not to underestimate the challenge of changing the direction in the middle and its impact not just on the technical debt, but on the engineering team.&lt;/p&gt;

&lt;p&gt;Choose wisely...&lt;/p&gt;

&lt;p&gt;P.S., if you are interested in how we implemented an end-to-end Canary Continuous Deployment, refer to &lt;a href="https://dev.to/orelimelech_/kubernetes-native-cd-with-fluxcd-flagger-and-linkerd-o69"&gt;this excellent blog&lt;/a&gt; by &lt;a href="https://dev.to/orelimelech_"&gt;Or Elimelech&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>sre</category>
      <category>architecture</category>
      <category>pipeline</category>
    </item>
    <item>
      <title>👀 Building Developer-First Products with Developer Experience 📒 (DX) 101 🙇 </title>
      <dc:creator>Leonid Belkind</dc:creator>
      <pubDate>Sun, 23 Feb 2020 12:14:07 +0000</pubDate>
      <link>https://forem.com/stackpulse/building-developer-first-products-with-developer-experience-dx-101-2f56</link>
      <guid>https://forem.com/stackpulse/building-developer-first-products-with-developer-experience-dx-101-2f56</guid>
      <description>&lt;p&gt;With multiple trends pointing at the growth of the &lt;a href="https://developermedia.com/developers-influence-tool-purchase/" rel="noopener noreferrer"&gt;developers buying power&lt;/a&gt; in organizations, the market for &lt;strong&gt;developer-first&lt;/strong&gt; products and services is under a constant growth. Companies like &lt;a href="https://newrelic.com" rel="noopener noreferrer"&gt;NewRelic&lt;/a&gt; (IPO in December 2014), &lt;a href="https://atlassian.com" rel="noopener noreferrer"&gt;Atlassian&lt;/a&gt; (IPO in December 2015), &lt;a href="https://twilio.com" rel="noopener noreferrer"&gt;Twilio&lt;/a&gt; (IPO in June 2016) and other more recent successes are demonstrating that delivering a product for developers can grow to a significant business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Product design&lt;/strong&gt; and its &lt;strong&gt;value/benefits for the end-users&lt;/strong&gt; are becoming a much bigger part in the product (and, therefore, business) success (💰💰), since it's the end-users (i.e. developers) that get to decide what to buy. In fact, a modern goto-market approach based on the &lt;a href="https://www.productled.org/foundations/what-is-product-led-growth" rel="noopener noreferrer"&gt;Product-Led Growth&lt;/a&gt; principles is focusing on the importance of &lt;strong&gt;User Experience&lt;/strong&gt; in the buying decision. &lt;/p&gt;

&lt;p&gt;In this article you will find:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;General approach based on involvement phase of a user with the product&lt;/li&gt;
&lt;li&gt;Aspects to consider when &lt;strong&gt;attracting&lt;/strong&gt; prospects' attention&lt;/li&gt;
&lt;li&gt;Aspects to consider when offering a product &lt;strong&gt;trial&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Aspects to consider for daily &lt;strong&gt;use&lt;/strong&gt; of a product&lt;/li&gt;
&lt;li&gt;Aspects to consider allowing users to &lt;strong&gt;amplify&lt;/strong&gt; the product impact&lt;/li&gt;
&lt;li&gt;Summary and recommendations&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  💡 Approach based on Interaction Phases &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Based on the above, the goal of Developer Experience &lt;strong&gt;design&lt;/strong&gt; is to match the needs of developers (users in our context) in the best possible way. Do these needs remain the same throughout the lifecycle of the interaction of a prospect developer with the solution or do they change? According to observations made by a number of vendors in the past, the needs / expectations of the users are very closely related to the phase of their interaction with the product.&lt;/p&gt;

&lt;p&gt;Lets consider breaking the product interaction lifecycle into four basic stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Notice / Attract&lt;/strong&gt; - How does a prospect notice the product and gets attracted to the value it may introduce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try&lt;/strong&gt; - How convenient is it to try the product and start getting the value &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use&lt;/strong&gt; - What is the experience provided by the product in the regular ramped-up day-to-day use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amplify / Grow&lt;/strong&gt; - What amplifications does the product offer for those who want to leverage it beyond the typical use-cases&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, functionality related to &lt;em&gt;ease of onboarding&lt;/em&gt; and &lt;em&gt;out-of-the-box settings&lt;/em&gt; would be attributed to the &lt;strong&gt;try&lt;/strong&gt; stage, whereas &lt;em&gt;advanced integrations with additional products&lt;/em&gt; or &lt;em&gt;analytic reports&lt;/em&gt; would fall somewhere between &lt;strong&gt;use&lt;/strong&gt; and &lt;strong&gt;amplify/grow&lt;/strong&gt;. This phase-based approach is also applicable to the more traditional UX, but, when dealing with DX, it can help prioritize and delivery systematic impact on the &lt;em&gt;journey&lt;/em&gt; that developers have with the product.&lt;/p&gt;

&lt;p&gt;The guide below provides suggestions on particular topics to take into consideration when designing a &lt;strong&gt;developer-first product&lt;/strong&gt; targeting each of the &lt;em&gt;interaction stages&lt;/em&gt; mentioned above.&lt;/p&gt;

&lt;h3&gt;
  
  
  🕛 Notice / Attract &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;How will the developers (that are potential users of your product) learn about its existence? Where will they generally look for solutions for the kind of problem you are aiming to solve? Will your product be somehow represented there and will it stand out from the "noise"?&lt;/p&gt;

&lt;h4&gt;
  
  
  Web site
&lt;/h4&gt;

&lt;p&gt;A web site representing a product/service targeting developers should contain fundamentally different information, when comparing it to a typical B2B product site. &lt;a href="https://hackernoon.com/the-best-practices-for-a-great-developer-experience-dx-9036834382b0" rel="noopener noreferrer"&gt;A lot&lt;/a&gt; &lt;a href="https://medium.com/@albertcavalcante/what-is-dx-developer-experience-401a0e44a9d9" rel="noopener noreferrer"&gt;has been&lt;/a&gt; said about the content and the language that developers appreciate. &lt;strong&gt;Clarity&lt;/strong&gt;, &lt;strong&gt;brevity&lt;/strong&gt;, &lt;strong&gt;being to the point&lt;/strong&gt;, using the proper terminology - all these are among the leading factors appreciated by the target audience.&lt;/p&gt;

&lt;p&gt;When developers are your target audience, you need to consider the state of mind involved. People who don't appreciate being sold to. People with limited time and attention span, who'd like to understand the value proposition and the "how to" as soon as possible.&lt;/p&gt;

&lt;p&gt;Here is an example of a homepage targeted at such an audience:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftoqm2rgnsqemciwrc0b1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftoqm2rgnsqemciwrc0b1.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Notice the very sharp difference between this and the following homepage, that is targeting an enterprise decision-makers audience:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgfe6qkuh6sb5wknih0qd.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgfe6qkuh6sb5wknih0qd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both the substance and the language (not to mention the look-n-feel) are very much affected by the audience being targeted.&lt;/p&gt;

&lt;h4&gt;
  
  
  Community presence
&lt;/h4&gt;

&lt;p&gt;Developers make intensive use of various communities to look for solutions for common challenges. Depending on the domain of the problem, &lt;a href="https://stackoverflow.com/" rel="noopener noreferrer"&gt;Stack Overflow&lt;/a&gt;, &lt;a href="https://dev.to"&gt;Dev.to&lt;/a&gt;, &lt;a href="https://reddit.com" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt; or other community information exchange platforms are often serving as the first place where one would expect to find some sort of information about potential solutions to use. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Farewj02efdnthwafyag0.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Farewj02efdnthwafyag0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a sample search result for finding an API to send SMS on StackOverflow. Naturally, developers facing this problem will be inclined to try solutions / approaches suggested by their colleagues.&lt;/p&gt;

&lt;h4&gt;
  
  
  Open Source presence
&lt;/h4&gt;

&lt;p&gt;Releasing useful open source projects is always a huge contributor to building the developer-facing presence. Even when your product is not an open source, having open source repositories for your SDK, samples and additional resources can be considered a huge plus.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkcku7umoikqld14mpefj.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkcku7umoikqld14mpefj.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's an example of an open source module representing an SDK for a proprietary service. Note the amount of stars on the Github repository.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integrations / marketplace
&lt;/h4&gt;

&lt;p&gt;Will your solution be used by its target users (developers) in integration with another developer solution that is already in their stack? Is that other solution extensible? If so, one of the ways to improve the overall experience is to publish a plugin.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzec9sl0f6e6lb14h6x9r.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzec9sl0f6e6lb14h6x9r.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An example of Service Providers publishing HashiCorp Terraform Plugins.&lt;/p&gt;

&lt;h4&gt;
  
  
  Documentation
&lt;/h4&gt;

&lt;p&gt;While nobody is reading the documentation thoroughly during this stage, checking that it exists and that it conforms with expectations / best practices can definitely overcome certain concerns.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmf150ed9hn7pghyw4wwz.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%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmf150ed9hn7pghyw4wwz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stripe API documentation, is an example of a very professionally built developer-facing documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  🕑 Try &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Let's say that we 'aced' the first step and managed to attract the attention of a potential user. What does it take to try our product (remember: developers like to get their hands 'dirty' and try things)? &lt;/p&gt;

&lt;p&gt;Trial of the product can be done in a number of phases. Some people would be so convinced by the product value (from the previous stage),that they'd be looking for trying out the product in their environment. Others - would like to take a more conservative approach and would be looking for some playground not linked to their environment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Online playgrounds
&lt;/h4&gt;

&lt;p&gt;Online playgrounds, gaining traction recently, are solutions, integrated in the product/service website, that allow trying it out (getting a hands-on experience) without deploying anything on one's laptop/cloud.&lt;/p&gt;

&lt;p&gt;One of possible implementations of the online playground is via integration into a tutorial / documentation, similarly to how it is done in the &lt;a href="https://tour.golang.org/welcome/1" rel="noopener noreferrer"&gt;Golang Tutorial&lt;/a&gt;. Another great example is a &lt;a href="https://play.kotlinlang.org/" rel="noopener noreferrer"&gt;Kotlin Playground&lt;/a&gt; by JetBrains.&lt;/p&gt;

&lt;p&gt;Playgrounds can cover either a single process/tool, or represent a whole virtualized environment, such as ones created with &lt;a href="https://www.katacoda.com/embed" rel="noopener noreferrer"&gt;Katakoda&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Delivering an effective online playground may reduces the upfront costs required for trying out your solution, and, if the solution itself provides the relevant/expected benefits, heavily increases the chances of progressing ahead from the trial stage.&lt;/p&gt;

&lt;h4&gt;
  
  
  Containerized trial
&lt;/h4&gt;

&lt;p&gt;If your product requires deploying any agents or servers in the customers' environments, providing a containerized trial (even if it is not a fully production-grade supported deployment) will ease on the initial deployment and will reduce the friction. Using &lt;a href="https://hub.docker.com/" rel="noopener noreferrer"&gt;Dockerhub&lt;/a&gt; for publishing such container images with easy documentation on how to deploy them makes the trial deployment much more user-friendly.&lt;/p&gt;

&lt;p&gt;For some of the examples (that may also be used for production-grade containerized deployment), reference the &lt;a href="https://hub.docker.com/r/mysql/mysql-server/" rel="noopener noreferrer"&gt;MySQL Server&lt;/a&gt;, &lt;a href="https://hub.docker.com/r/jetbrains/teamcity-server" rel="noopener noreferrer"&gt;TeamCity Server&lt;/a&gt; or &lt;a href="https://hub.docker.com/r/netdata/netdata" rel="noopener noreferrer"&gt;NetData&lt;/a&gt; &lt;a href="https://hub.docker.com/" rel="noopener noreferrer"&gt;Dockerhub&lt;/a&gt; postings.&lt;/p&gt;

&lt;h4&gt;
  
  
  Free / Trial Service Account
&lt;/h4&gt;

&lt;p&gt;When your product/service contains a service (either SaaS Management or a full service) offering, it is 100% imperative to offer either free or trial service accounts.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Time-limited&lt;/em&gt; trials used to be more acceptable option in the past for both consumer and enterprise services. In modern developer-first products, this approach is a bit more problematic, and &lt;em&gt;functionality/scale-restricted&lt;/em&gt; or even &lt;em&gt;freemium&lt;/em&gt; offerings seem to gain more traction.&lt;/p&gt;

&lt;p&gt;Almost every time developers will prefer the free/freemium offers, due to the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is no immediate "sales" motion behind them. Free/freemium versions are there to be used as real tools, as long as your demands fit the constraints.&lt;/li&gt;
&lt;li&gt;Using (and benefitting from) the free version increases the "stickiness" of the solution, as it can be used in production. This, in turn, increases the chances of converting the account to a paid one, as it is &lt;strong&gt;difficult to do a meaningful trial with strict time limits&lt;/strong&gt;. (Even psychologically, investing in such a trial, knowing that it might be a complete throw-away is something that is less optimal)&lt;/li&gt;
&lt;li&gt;Depending on the value your solution provides, it can be used for personal/open source projects in its free mode, increasing the loyalty and the possibility that it will become adopted in work environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Defining the conversion point for freemium accounts to become paid is a science (or, some will say 'art') by its own and deserves a dedicated discussion / guide. Some of the most prominent approaches are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consumption based (size of storage, amount of events)&lt;/li&gt;
&lt;li&gt;Users based (limited amount of users in free/freemium accounts)&lt;/li&gt;
&lt;li&gt;Functionality based (collaboration features, enterprise features, etc... are only available on paid accounts).&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  CLI / API Samples
&lt;/h4&gt;

&lt;p&gt;When developers interact with products/services, some of the user flows rely on Command-Line Interfaces (CLIs) and Application Programming Interfaces (APIs) rather than User Interfaces. This dictates that both CLIs and APIs should be treated as &lt;strong&gt;the face of your product&lt;/strong&gt; and should be designed, tested and documented with the same attention to details as UI.&lt;br&gt;
This approach can be extended to things, such as, but not limited to, &lt;a href="https://en.wikipedia.org/wiki/Chatbot" rel="noopener noreferrer"&gt;Chatbot interface&lt;/a&gt;, if your product is offering one.&lt;/p&gt;

&lt;p&gt;Providing a documentation in a developer-friendly format, or even providing open-source samples of usage of your CLI/API on Github can go a long way in terms of encouraging the adoption of your technology and making its frictionless.&lt;/p&gt;

&lt;h4&gt;
  
  
  Out of the box settings
&lt;/h4&gt;

&lt;p&gt;Last, but definitely not least, on the trial stage is the ability of the product to function and to &lt;strong&gt;provide actual value&lt;/strong&gt; without someone needing to spend time and other resources to configure it. In fact, as mundane as this point may sound, it is a real difference maker when it comes to the trial stage. &lt;br&gt;
The faster the product starts showing real value, the more likely the probability that its prospect (the person trying it out) will consider adopting it. &lt;/p&gt;

&lt;p&gt;In recent years, the industry has even come up with the measurement of this, adopting a term of &lt;a href="https://en.wikipedia.org/wiki/Time_to_value" rel="noopener noreferrer"&gt;Time to Value&lt;/a&gt;. The investment, in the trial stage, is that of our prospects' time and the value the product shows is the expected return on that investment. &lt;/p&gt;

&lt;h3&gt;
  
  
  🕒 Use &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This is a critical stage: our potential users arrive with the maximal 'inflated expectations' to this point, based on their successful trial, and are starting to use the product in their environment. The ability to be as good in 'real life' as in demonstration/trial is crucial in successful product adoption and in achieving customer loyalty.&lt;/p&gt;

&lt;h4&gt;
  
  
  User Interface
&lt;/h4&gt;

&lt;p&gt;If the User Interface plays a significant role in the interaction of various users with the product, its design is a very important aspect of the overall product work.&lt;/p&gt;

&lt;p&gt;There are various approaches to designing user interfaces and a lot has been said and written about this.&lt;/p&gt;

&lt;p&gt;When dealing with developer audiences, it is important to remember that the UI will serve as a tool for completing tasks (more than in any other enterprise product). Special emphasis should be made on what is the role of the user interacting with the system, which tasks the user is looking to accomplish and which data/information exists in the system to help them accomplish the tasks.&lt;/p&gt;

&lt;h4&gt;
  
  
  CLI / Scripting
&lt;/h4&gt;

&lt;p&gt;Automating interactions with developer-first solutions is a significant portion of &lt;a href="https://careerfoundry.com/en/blog/ux-design/what-are-user-flows/" rel="noopener noreferrer"&gt;user-flows&lt;/a&gt; for developers.&lt;/p&gt;

&lt;p&gt;Similarly to the importance of CLI in trying out the product, its importance in adopting the product for everyday use is also very significant. &lt;/p&gt;

&lt;p&gt;When designing the CLI syntax, it is always recommended to stick to standards (such as &lt;a href="https://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html" rel="noopener noreferrer"&gt;POSIX CLI Syntax&lt;/a&gt; or &lt;a href="https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-powershell-1.0/ee156811(v=technet.10)?redirectedfrom=MSDN" rel="noopener noreferrer"&gt;Microsoft's&lt;/a&gt;), reducing the adoption friction.&lt;/p&gt;

&lt;p&gt;Documenting how to do this, providing samples and knowledge base article around automation via CLI will be of a great value to the user audiences.  &lt;/p&gt;

&lt;h4&gt;
  
  
  API
&lt;/h4&gt;

&lt;p&gt;Just as with CLI automation, providing integration and automation capabilities via APIs increases the value your users will extract from the product. Even more so, it can have a positive effect on the stickiness of the solution - once it is integrated into automation processes, the extent of its usage grows without a dependency on human users and their availability.&lt;/p&gt;

&lt;p&gt;Designing an API, much like designing a User Interface, has its own methodologies and &lt;a href="https://swagger.io/blog/api-design/api-design-best-practices/" rel="noopener noreferrer"&gt;best practices&lt;/a&gt; that should be studied closely and applied, in order to increase the chances of success.&lt;/p&gt;

&lt;h4&gt;
  
  
  Customization of Settings
&lt;/h4&gt;

&lt;p&gt;It is very likely that during the usage stage of your product its users will want to customize its behavior. Out-of-the-box settings are only useful for a handful of common scenarios, and the ability of the product to provide a flexible configuration is a big plus.&lt;/p&gt;

&lt;p&gt;In fact, the experience learnt from years of designing &lt;em&gt;Enterprise Security Products&lt;/em&gt; have delivered a methodology of &lt;strong&gt;Policy Model&lt;/strong&gt;. In these products (the methodology can be extended to other products as well), the main value is the ability to enforce an organizational security policy using the capabilities of the product. The policy, in turn, can be customized either for different networks, different users, different hosts, etc...&lt;/p&gt;

&lt;p&gt;The level of customization (on a scale of flexibility=complexity and lack of flexibility=constrains) should differ per product. It is very difficult to come up with rules of thumb in this department, except for a very clear need to do a meticulous &lt;a href="https://www.tutorialspoint.com/system_analysis_and_design/system_analysis_and_design_overview.htm" rel="noopener noreferrer"&gt;system analysis&lt;/a&gt; in this case.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configuration Management
&lt;/h4&gt;

&lt;p&gt;Regardless to complexity vs simplicity of the chosen configuration/policy model, the question of a management lifecycle for configuration (&lt;a href="https://en.wikipedia.org/wiki/Configuration_management" rel="noopener noreferrer"&gt;Configuration Management&lt;/a&gt;) is always important, especially to developers. Every change in the product configuration that can affect production environment could/should undergo stages of review, delivery and monitoring. &lt;/p&gt;

&lt;p&gt;Once upon a time, many mature/advanced products offered some sort of a configuration management lifecycle built-in. Some products had a two-phase commit of changes, others added versioning and approval flow. &lt;/p&gt;

&lt;p&gt;Developers don't need any of it. They already have configuration management flows centered around software versions repositories (such as, for example, &lt;a href="https://www.cloudbees.com/gitops/what-is-gitops" rel="noopener noreferrer"&gt;GitOps&lt;/a&gt;. &lt;br&gt;
Automating configuration management in your product via CLI or API, as mentioned above, allows developers to use their existing configuration management lifecycle and just to a the configuration of your product to it.&lt;/p&gt;

&lt;p&gt;Providing integration with configuration automation tools (CAPS - &lt;a href="https://www.chef.io/" rel="noopener noreferrer"&gt;Chef&lt;/a&gt;, &lt;a href="https://www.ansible.com/" rel="noopener noreferrer"&gt;Ansible&lt;/a&gt;, &lt;a href="https://puppet.com/" rel="noopener noreferrer"&gt;Puppet&lt;/a&gt;, &lt;a href="https://www.saltstack.com/" rel="noopener noreferrer"&gt;SaltStack&lt;/a&gt;), or, for more cloud-native-adopting users - &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;HashiCorp Terraform&lt;/a&gt; Infrastructure-as-Code could make your product fit very seamlessly into existing configuration lifecycle. (There are significant differences between &lt;em&gt;mostly imperative&lt;/em&gt; configuration management offered by CAPS tools vs &lt;em&gt;declarative&lt;/em&gt; one by Terraform, but this is a subject for another article.&lt;/p&gt;

&lt;h4&gt;
  
  
  Documentation
&lt;/h4&gt;

&lt;p&gt;Developers expect the product they are using to be documented in a form that looks familiar, provides answers to expected questions, and doesn't overburden with unnecessary &lt;em&gt;formalities&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Certain types of documentation have &lt;strong&gt;best practices&lt;/strong&gt; or even a &lt;strong&gt;golden standard&lt;/strong&gt; (sometimes, even tools that help creating it). For example, when documenting REST APIs / Swagger files, consider using &lt;a href="https://github.com/Redocly/redoc" rel="noopener noreferrer"&gt;ReDoc&lt;/a&gt;. As the industry providing the APIs has undergone a significant maturity growth in recent years, &lt;a href="https://swagger.io/resources/articles/best-practices-in-api-documentation/" rel="noopener noreferrer"&gt;best practices&lt;/a&gt; have been developed and should be adopted.&lt;/p&gt;

&lt;p&gt;Similarly, when considering documenting CLIs, &lt;a href="https://developers.google.com/style/code-syntax" rel="noopener noreferrer"&gt;best practices by Google&lt;/a&gt; or &lt;a href="https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-powershell-1.0/ee156811(v=technet.10)?redirectedfrom=MSDN" rel="noopener noreferrer"&gt;Microsoft&lt;/a&gt;, as well as open source standards, like &lt;a href="http://docopt.org/" rel="noopener noreferrer"&gt;docopt&lt;/a&gt;, can provide a good direction. &lt;/p&gt;

&lt;p&gt;Being standard, looking familiar - will eventually contribute to reducing the friction of adoption.&lt;/p&gt;

&lt;h3&gt;
  
  
  🕔 Amplify / Grow &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;While every product / solution is targeting solving a specific set of problem(s), exceptional solutions can deliver a longer-lasting (and, therefore, much more "sticky") value to their users. &lt;/p&gt;

&lt;p&gt;Developers will benefit from long-lasting value, allowing deeper integration into their stack, ability to handle a more diverse set of use-cases, providing insights and data beyond what was previously available, etc...&lt;/p&gt;

&lt;h4&gt;
  
  
  SDKs
&lt;/h4&gt;

&lt;p&gt;SDKs are the next step of ensuring that your users "stick" to your solution for a longer term, after automation via CLIs and APIs. SDKs usually allow a richer experience of interacting with your product and ensure closer ties between the developers and the "platform".&lt;/p&gt;

&lt;p&gt;When providing SDKs, it is important to ensure that they are available for all the relevant programming languages (depending on the type of the audience), have a great developer-friendly documentation and come with usage samples. &lt;/p&gt;

&lt;p&gt;One critical thing is to have them always up-to-date. This is among the things that ensure the trust of the developer using the SDK in the platform. If the SDK is not up-to-date and there is a &lt;em&gt;functionality drift&lt;/em&gt; between the product capabilities and what is available / accessible through the SDK, the willingness to trust it and to use it will inevitably go down.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integration with additional solutions
&lt;/h4&gt;

&lt;p&gt;In the environment that desires to automate everything that can be automated and gain maximal possible value from collected information, the most important &lt;em&gt;currency&lt;/em&gt; is the ability to integrate with other elements of existing pipelines/workflows. &lt;/p&gt;

&lt;p&gt;While having an &lt;strong&gt;open and well-documented API&lt;/strong&gt; &lt;em&gt;allows&lt;/em&gt; integration with practically anything, it also requires effort to implement. Providing &lt;em&gt;out-of-the-box integrations&lt;/em&gt; (sometimes also called &lt;em&gt;"single-click integrations"&lt;/em&gt;) with products/solutions that are frequently used by the same people that use your product, is a clear win. Contributes to user satisfaction, provides value beyond the core values of your product and increases its stickiness.&lt;/p&gt;

&lt;h3&gt;
  
  
  ☑ Summary &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;The above guide was built in an effort to drive the attention of individuals building developer-first products to various product aspects and to try and map the importance of each, as the user progresses in product adoption. &lt;/p&gt;

&lt;p&gt;As developers are becoming a more significant force in choosing the organization's technological stack, the amount of possible options will continue growing. Feel free to add your experiences in designing developer-first products as comments.&lt;/p&gt;

</description>
      <category>ux</category>
      <category>devrel</category>
      <category>design</category>
    </item>
    <item>
      <title>♨ Strategies for investment in 🔩 Tech Debt vs 💸 Product Debt when building new 📦 software products</title>
      <dc:creator>Leonid Belkind</dc:creator>
      <pubDate>Tue, 11 Feb 2020 12:57:21 +0000</pubDate>
      <link>https://forem.com/stackpulse/strategies-for-investment-in-tech-debt-vs-product-debt-when-building-new-software-products-4nd5</link>
      <guid>https://forem.com/stackpulse/strategies-for-investment-in-tech-debt-vs-product-debt-when-building-new-software-products-4nd5</guid>
      <description>&lt;p&gt;&lt;em&gt;Spaghetti code&lt;/em&gt;, &lt;em&gt;architecture&lt;/em&gt; that isn't well-thought-out, &lt;em&gt;growth&lt;/em&gt; and &lt;em&gt;supportability&lt;/em&gt; challenges - being a software engineer, you get plenty of opportunities to experience these and similar effects throughout your career. As much as we love to criticize others for choices they made (and that we have to live with), let's be serious for a moment: Very few engineers are actually making a &lt;em&gt;conscious choice&lt;/em&gt; to write a &lt;strong&gt;bad code&lt;/strong&gt;. &lt;/p&gt;

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

&lt;h6&gt;
  
  
  &lt;em&gt;"I have an idea! Lets write a fundamentally bad code and make the life of everyone who ends up using it and maintaining it really miserable!"&lt;/em&gt;
&lt;/h6&gt;

&lt;p&gt;This is not how it works. Behind every "bad" software module that someone has to maintain or use, there is always someone who either really didn't know any better or thought that implementing it the way they chose seemed to be a &lt;em&gt;good idea at the time&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;As the field of software engineering evolves and becomes more modern, knowledge gaps reduce, and, while not everyone has to be the &lt;strong&gt;mean lean coding machine&lt;/strong&gt;, there is a lot of available knowledge and support that would explain proper ways to implement certain software solutions. Even if you are inexperienced in what you're doing - "not knowing any better" becomes harder and harder in our &lt;em&gt;always connected, Google this/Google that&lt;/em&gt; world.&lt;/p&gt;

&lt;p&gt;So, in a nutshell, it all boils down to choosing the right strategy of managing investments (and, therefore, progress) in the proper infrastructure / architecture vs implementing new product functionality. Choosing the right strategy is akin to implementing a &lt;em&gt;design pattern&lt;/em&gt;. Upon reaching this conclusion, one can start considering various strategies based on the needs and the constraints of the business requirements. Below we are listing a number of prominent &lt;em&gt;strategies&lt;/em&gt;, talking about the &lt;strong&gt;pros&lt;/strong&gt; and the &lt;strong&gt;cons&lt;/strong&gt; of each.&lt;/p&gt;

&lt;h2&gt;
  
  
  1⃣ Build Product, Deal with Infrastructure / Architecture Later
&lt;/h2&gt;

&lt;p&gt;This approach is rumored to have originated in the start-up world. Some people will blame &lt;a href="http://theleanstartup.com/principles"&gt;The Lean Startup principles&lt;/a&gt; for promoting the idea (not necessarily accurate), while others will cite the general challenge younger generations have with &lt;a href="https://en.wikipedia.org/wiki/Delayed_gratification"&gt;Delayed Gratification&lt;/a&gt;. In real life, one can find many cases of this approach taking place in established enterprises, that are interested in innovating, while being reluctant to make significant investments prior to seeing any "justification" for a future ROI. &lt;/p&gt;

&lt;p&gt;In many cases, the first product that is being developed is sometimes nothing more than a trial balloon, designed to prove or to disprove a certain thesis. The underlying logic is: &lt;em&gt;why do we need to invest in the proper architecture / infrastructure if we don't know whether this product has any future at all?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While the logic of the above assumption is correct, and, one doesn't really progress with validating her/his product-market-fit assumptions by investing in the infrastructure for the product - the problems arise when the code actually sticks around.&lt;/p&gt;

&lt;p&gt;After all, unless explicitly designated, code that someone developed rarely gets thrown away completely. The solution may undergo a &lt;em&gt;pivot&lt;/em&gt;, the company may change &lt;em&gt;positioning&lt;/em&gt; or &lt;em&gt;messaging&lt;/em&gt; for the product, but the technological investments may actually remain. Not to mention the case where the original thesis, or a certain part of it, gets actually proven and the company continues developing the idea.&lt;/p&gt;

&lt;p&gt;What happens then? Your team (hopefully, a collection of capable individuals) has been running amok developing the product functionality, they have actually created something that looks and acts like the real deal, but its foundation is flaky.&lt;/p&gt;

&lt;p&gt;It is very difficult to pause and make a re-factoring effort at the time when your product is starting to gain traction. After all - everyone expects the opposite to happen - you should floor the pedal in developing the features and conquer the world.&lt;/p&gt;

&lt;p&gt;Below diagram explains (schematically) what can happen in this case:&lt;/p&gt;

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

&lt;p&gt;The X Axis represents the timeline (with major project/product milestones, such as POC, Beta, MVP, First Full Release and Second Full Release) whereas the Y Axis represents the effort (and, implicitly, the progress) on either the product debt or the technical debt (Infrastructure / Architecture) fronts.&lt;/p&gt;

&lt;p&gt;As described above, we start by investing most of our efforts and resources (that keep growing as our organization grows) on the product front, while &lt;strong&gt;convincing ourselves&lt;/strong&gt; that we will gradually increase the infra investment as the product matures. By the time the product reaches its second significant release, we are expecting to be able to make a significant leap in proper technological foundation.&lt;/p&gt;

&lt;p&gt;Sounds nice in theory, right? Let's layer the accumulating technical debt and the acceptable technical debt/quality on this graph to see:&lt;/p&gt;

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

&lt;p&gt;We can clearly see the red line of the Accumulated Technical Debt climbing (why wouldn't it, when there is no sufficient investment) and crossing the dotted red line of the Acceptable Technical Debt (that, surely, doesn't have to be zero) at a certain point. &lt;/p&gt;

&lt;p&gt;In this specific graph, this point is between Beta and MVP milestones. It is an example, of course, and, depending on the complexity of your technology and/or the technical acumen of your team, this point can shift to the right. Still, more often than not, this takes place and starts &lt;strong&gt;hurting your business&lt;/strong&gt; at the stage where the business cannot afford this. &lt;/p&gt;

&lt;p&gt;Even the optimistic part of this graph, showing that the technical debt starts decreasing after an effort was invested, is very questionable. Who knows if the organization will be able to support the cost of the investment, and who can estimate the impact of providing a product with a technical debt above the acceptable level?&lt;/p&gt;

&lt;p&gt;In a nutshell, while all the &lt;strong&gt;proponents&lt;/strong&gt; of this approach will claim that &lt;em&gt;the beast is not as scary as it looks&lt;/em&gt;, the author of this article saw (by far) more companies/product teams that either failed, or got crippled by it, than those who actually managed the reap its illusive benefits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt; Beware of Greeks bearing gifts. If choosing to go down this route, be very tight with your hand on the pulse of your technical debt.&lt;/p&gt;

&lt;h2&gt;
  
  
  2⃣ Throwaway POC, then Build the Real Product with Infrastructure
&lt;/h2&gt;

&lt;p&gt;This approach sounds very sensible and easy to implement: all you do is define that your original code is going to have one purpose only - proving that the idea works - and then throw it away and write &lt;em&gt;the real thing&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;In theory, the approach works, if you have enough discipline to stick to it. Your investment in the lifelike POC will, hopefully, allow you to prove the product-market-fit, and then, armed with it, you can go and build the real product.&lt;/p&gt;

&lt;p&gt;The investment / progress graph of such an approach may look like this:&lt;/p&gt;

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

&lt;p&gt;The investment in the product features during the POC stage, hopefully, gives us the required confidence in the product-market fit. Then, we start developing the real product (this time investing first in the proper infrastructure and architecture, and then piling up the product features). We are further assuming that this work can be split between the Beta and the MVP milestones, delivering a properly-implemented MVP.&lt;/p&gt;

&lt;p&gt;Lets layer the Technical Debt accumulation on top of this graph and we will receive the following:&lt;/p&gt;

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

&lt;p&gt;The technical debt reaches unacceptable level quite quickly during the POC, which is fine by us as the POC gets discarded anyway. What happens after that (and the graph shows quite extreme assumptions) is that it is pushed down by the infra/architecture efforts during Beta and MVP stages and stays at the acceptable level all the way until the product evolves far enough from its original purpose - somewhere in the future. Again, depending on the complexity vs flexibility and volatility, the time axis could look quite different.&lt;/p&gt;

&lt;p&gt;In theory - this approach makes everyone happy. In practice, in order to succeed, it requires a very adamant engineering team that will &lt;strong&gt;really throw away&lt;/strong&gt; the prototype code and the business team that will understand the delay in Beta/MVP stages because of that. What is the alternative? Getting the same as our #1 approach, but with a higher technical debt (because the initial stages of the POC were developed under the assumption that it'd be thrown away, and here it is - sticking around).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt; Not all that glitters is gold. If this works, it is a solid strategy, but it is enough that one of the parties involved &lt;em&gt;blinks&lt;/em&gt; and it can turn into a disaster.&lt;/p&gt;

&lt;h2&gt;
  
  
  3⃣ Infrastructure First, then Product, Continuous Refactoring
&lt;/h2&gt;

&lt;p&gt;In recent years, over-simplified interpretation of &lt;a href="https://agilemanifesto.org/principles.html"&gt;The Agile Manifesto&lt;/a&gt; has motivated people to shun from making large up-front investments in software infrastructure prior to developing a working product. After all, if we should all embrace &lt;em&gt;changing requirements&lt;/em&gt; (even late in the development), as well as &lt;em&gt;having our highest priority to satisfy the customer&lt;/em&gt;, then investing in health and stability of our own infrastructure isn't necessarily the best thing to do. Delivering more customer-facing features is. &lt;strong&gt;Right?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Actually - &lt;strong&gt;wrong&lt;/strong&gt;. Our customers, first and foremost, care about getting a stable, scalable and well-built product, and the fact that we expect requirement changes and will demand (from ourselves) to deliver response to these quickly, mandates that investing in a solid infrastructure and architecture is, actually, on a critical path to the main principles of the manifesto.&lt;/p&gt;

&lt;p&gt;While, in theory, this delays the delivery of the first end-to-end POC to the potential customers, with a slightly larger (or more professional team) this could be mitigated. The graph of such an approach may look like the below:&lt;/p&gt;

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

&lt;p&gt;While this graph also hides some assumptions, it shows the biggest desired benefit of the approach: the fact that the technical debt is constantly managed and, hopefully, doesn't cross the line of an acceptable debt in the foreseeable future.&lt;/p&gt;

&lt;p&gt;Sure, skeptics can claim that this graphical representation is biased and that the approach hides potential of over-investing in the infrastructure and under-delivering on the product front. This isn't entirely incorrect. This approach is not a silver bullet and requires close management, just like anything else. &lt;/p&gt;

&lt;p&gt;One important benefit that it introduces is that the technical debt is being managed (and kept at bay) from the very beginning of the product lifecycle. After all, keeping something at bay continuously vs allowing it to spike and then trying to calm it down is (arguably) going to be more cheap in the long run. &lt;/p&gt;

&lt;p&gt;Introducing such an approach as a part of the organizational culture also cultivates pride in one's work and its deliveries. It doesn't exclude the possibility of a pragmatic decision to postpone certain infrastructure investments to future product milestones.&lt;/p&gt;

&lt;p&gt;As previously, depending on the complexity of the solution, initial investment in the infrastructure (and the anticipated delay in functional delivery) can be higher or lower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendation:&lt;/strong&gt; There's only one chance to start things the right way. Each situation may have its own &lt;em&gt;right&lt;/em&gt; or &lt;em&gt;wrong&lt;/em&gt;, but combining the &lt;em&gt;desire&lt;/em&gt; to build a solid product with strong business connection and guidance, will, probably, provide the best results. There is no shame in admitting that not everything can always be done properly under all possible constraints and in choosing one's battles.&lt;/p&gt;

</description>
      <category>agile</category>
      <category>startup</category>
      <category>productivity</category>
      <category>management</category>
    </item>
  </channel>
</rss>
