<?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: evozon</title>
    <description>The latest articles on DEV Community by evozon (@evozon).</description>
    <link>https://dev.to/evozon</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%2F1135289%2F6cd9a5d0-578a-4543-824b-d17c0be46e50.jpg</url>
      <title>DEV Community: evozon</title>
      <link>https://dev.to/evozon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/evozon"/>
    <language>en</language>
    <item>
      <title>State management with a little help from my friends</title>
      <dc:creator>evozon</dc:creator>
      <pubDate>Fri, 01 Sep 2023 07:03:22 +0000</pubDate>
      <link>https://dev.to/evozon/view-larger-imagestate-management-with-a-little-help-from-my-friends-240b</link>
      <guid>https://dev.to/evozon/view-larger-imagestate-management-with-a-little-help-from-my-friends-240b</guid>
      <description>&lt;p&gt;Starting from a well-known Beatles song title (I know… I am old school/deprecated), I will try to summarize my own experience around state management. I will share my way of “doing it” nowadays with a little help from a couple of very useful libraries. Also, I want to reveal in the following few chapters the experiences and ideas taken from daily work and my teammates over the years that brought me to this point.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is a beginning for everything…
&lt;/h2&gt;

&lt;p&gt;We can all agree that state management in general is one of the most discussed and applied ideas over the last 6-7 years. I am happy that it was part of my daily work during its evolution path. There are a lot of debates around the “perfect” library for state management, the “perfect” way of data modeling, and of course the strongest debate around the “perfect” paradigm where the battle between functional and object oriented will never end. For sure, these are all constructive and come with real options on the table for every taste. For me, personally, it is hard to say how thankful I am to all the people who worked to develop and promote this idea. I consider they offered more options for building our software design than most of us thought.&lt;/p&gt;

&lt;p&gt;First of all, the state management idea completely replaced the MVVM imposed on the market by Angular 1 in a period when some of us did not even imagine an aspect like this. Don’t judge me. I still appreciate a lot what MVVM and Angular 1 made for web development. For sure it was a real rocket for those ages, but the evolution to what we have today, became necessary and somehow inevitable. It’s just that everything has its time… React simply introduced the unidirectional data flow, the idea of state, the reactivity, and the observer pattern in components. So, the rules of the game got changed very fast. Also,  the controllers, views, and models started to be a little bit deprecated words in the JS ecosystem. I will try in the next few lines to show how full of intensity was my first interaction with the state management concept.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pain of the first attempt
&lt;/h2&gt;

&lt;p&gt;After years of jQuery and the magic of Angular 1, I started more than 6 years ago with React+Redux. That was one of the most painful moments in my career. It was hard in the first weeks to adapt my mindset and to accept the functional ideas and the new way of thinking, modeling, handling, and mapping the data.&lt;/p&gt;

&lt;p&gt;The first round ended up with a KO victory for React+Redux. This was the starting point for one of the most successful projects and moments in my whole career. I think I was lucky that I started with a library that offers a lot of control over the flow for both actions and data. It enforces immutability in such a way that even a fool can see the benefits after a while, and the tooling for it cannot be ignored. Although I now have various preferences and generally make other choices, my admiration for it is still at the same level.&lt;/p&gt;

&lt;p&gt;Another awesome part was that I was simply forced by the project and of course by the respect for clean code, to use it at its maximum level and to have after the whole period, some quite clear pros and cons regarding how a state management should “look like”. The bad part is that even though I implemented/applied most of the things that nowadays are on the market as Redux toolkit, I still had to write a huge amount of code to achieve the usual things.&lt;/p&gt;

&lt;p&gt;The design became very composable, making it easy to combine various bits and pieces to achieve the desired state or result. However, for every feature, there were too many subcomponents to be combined and too many files to be added. So, the whole ceremony became rather a treat for a generator and most of the time a real pain for every smart developer.&lt;/p&gt;

&lt;p&gt;After this period, every great thing should come to an end. So, a new project came into my professional life with new decisions regarding the tech stack I should use.&lt;/p&gt;

&lt;h2&gt;
  
  
  A little more wisdom
&lt;/h2&gt;

&lt;p&gt;I felt that going on with the same Redux approach, without getting out of my big comfortable zone, should be a mistake and I should not make the mistake of not being open enough to new things as I was when I picked Redux. The next try was around Mobx, another great popular idea in the last few years. I tried both the Mobx-State-Tree with its functional trends and of course, the well-known “vanilla” Mobx which better satisfies the eyes of OOP fans. Even more, I  wrote with typescript decorators a wrapper for Redux that is close in terms of sugar syntax to Mobx API. I think after these two experiences (even if Redux offered me the satisfaction of a great project and I felt I was able to handle everything) that Mobx is a better and more modern approach, a next step in evolution I would say.&lt;/p&gt;

&lt;p&gt;It does great things behind the scenes and removes a lot of boilerplate code. It also promotes the easy creation of multiple states, well separated (as a parallel, somehow is the same concept where React won a battle with Angular for creating fast and easy components). Redux has somehow the same possibility, even if it is a single object called state as “the only source of truth”. In the end, that object is separated into all the child nodes you consider as independent pieces necessary for storing things related to a clearly defined object.  Also, mapping of “state” in any of the components is not for the whole state, but rather for desired keys from it. In the end, if we judge impartially, almost all of them share similar ideas but are packaged and sold differently. &lt;/p&gt;

&lt;h2&gt;
  
  
  Enjoy the concept
&lt;/h2&gt;

&lt;p&gt;There are also several others that are very popular and worthy of mention  (Jotai, XState or Recoil). Honestly, I consider Redux and Mobx as main trend setters in this field. Every library has its own story. Some of them are very light. Some of them offer a complex API and soome of them promote functions and others promote objects. Each with their own arguments. The greatest thing is that it promotes and encourages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usage of the observer pattern&lt;/li&gt;
&lt;li&gt;reactivity&lt;/li&gt;
&lt;li&gt;a clear and unidirectional data flow&lt;/li&gt;
&lt;li&gt;components with almost no business logic&lt;/li&gt;
&lt;li&gt;a very good encapsulation of concepts and features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any of these are great in their own way and this paper is not about suggesting one of them. I would rather encourage people to be happy if the project uses any form of state management. Try to use it right. Use all its capabilities and build over main state management ideas in general (and of course, remove the mistakes and all kinds of strange combinations of writing logic everywhere that ends with a merge of “if” statements inside components).&lt;/p&gt;

&lt;p&gt;This concept of state management offered a lot, actually a new way of being to the software development world, but if we look behind the exposed API, these libraries are quite easy to understand, without areas with such a complexity that could scare any developer. I would say that is more a lot of sugar syntax over some modern and great practices/patterns. Based on these thoughts and experiences I decided to encourage building a state management mechanism on our own.&lt;/p&gt;

&lt;h2&gt;
  
  
  I did it my way
&lt;/h2&gt;

&lt;p&gt;To be honest I took part of the idea from the colleague who started the project and applied some reactive concepts quite before they became popular in the JS ecosystem (some people are simply very clever and visionary, and we should respect and be glad that they are around us).  I picked the initial idea. “With that little help” from RxJS subjects and Immer the result seems to support the cause for a nice evo-home-made state management.&lt;/p&gt;

&lt;p&gt;Below is a GitHub link. There you can see the generic structure of an observable state, the observer React hook, and a very small example of a concrete usage. What you see there is like what we use every day. However, there are several other features that are obviously not representative for this moment. Our states, for example, can broadcast data to other windows. Or they can  use the internal subject to create some custom streams with RxJS. Another aspect that may worry some people is the composability of the states. When the composition is about data modeling, the composite design pattern may satisfy the needs. Also, a state can very easily react/subscribe to other state changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/iliesalex89/evo-state/tree/master/src"&gt;Check out some code on my Github!&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Before I end this little post about such a great and big subject, I want to also share some personal ideas regarding the usage of a state management system. I think we should avoid using it for static data that is initialized at the beginning and remains the same for the whole app lifecycle. I’m using the same approach for any kind of data that is not observable and we shouldn’t monitor its value change.&lt;/p&gt;

&lt;p&gt;The authentication token sent for API requests is a good example here. The updates of its value, where this is the case, usually will not request an immediate reaction. Another very important thing is to not store ephemeral data, and this is a quite common mistake for state management. With or even without RxJS it is very easy to write your own messaging system or events bus to decouple areas and to not overuse your state that will then need a lot of cleanup.&lt;/p&gt;

&lt;p&gt;Article written by Alexandru Ilies&lt;/p&gt;

</description>
      <category>programming</category>
      <category>redux</category>
      <category>angular</category>
      <category>react</category>
    </item>
    <item>
      <title>A Proven Method to Easily Project Your Next Sprints Velocity in SCRUM [Spreadsheet Template Included]</title>
      <dc:creator>evozon</dc:creator>
      <pubDate>Mon, 28 Aug 2023 09:51:17 +0000</pubDate>
      <link>https://dev.to/evozon/a-proven-method-to-easily-project-your-next-sprints-velocity-in-scrum-spreadsheet-template-included-1f2i</link>
      <guid>https://dev.to/evozon/a-proven-method-to-easily-project-your-next-sprints-velocity-in-scrum-spreadsheet-template-included-1f2i</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;I am presenting a simple method to calculate a team’s sprint capacity and project the velocity for the next sprints provided the team’s project backlog of work items exists and it’s estimated in story points. A spreadsheet template is included for you to consult, use or get some inspiration from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I have been working with SCRUM for quite some years and have developed over time a simple method to keep track of the team’s capacity and to project the next sprint(s) velocity. It worked pretty well for me so I’m making it public hoping that it will enhance the way you run your sprint planning.&lt;/p&gt;

&lt;p&gt;Note: This article assumes that your team has a backlog of work items already in place and they are estimated in story points.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KdzXG0RE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nuokjyd3ejcjeh8yw6x5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KdzXG0RE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nuokjyd3ejcjeh8yw6x5.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
Scrum Framework&lt;/p&gt;

&lt;h2&gt;
  
  
  Your First Sprint
&lt;/h2&gt;

&lt;p&gt;Say you are a Scrum Master and you need to run your first sprint. What tools can you use to help you? Most probably the company you work for has such tools and you can reach your peers for help. If not, you can develop your tools. And since sprint planning involves a few calculations, the most used software for that is spreadsheets.&lt;/p&gt;

&lt;p&gt;What do you need to capture? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sprint start and end date&lt;/li&gt;
&lt;li&gt;List all team members&lt;/li&gt;
&lt;li&gt;List the working days in the sprint (0.5 for part-time, 0 for days off)&lt;/li&gt;
&lt;li&gt;Fill in the availability for each member on each working day. This will sum up to the total number of working days in the sprint = sprint capacity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s all! These are the bases for the simple math that will help you plan your sprint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uQ2tcMet--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dejjk4eut6jg8773o5wi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uQ2tcMet--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dejjk4eut6jg8773o5wi.png" alt="Image description" width="800" height="247"&gt;&lt;/a&gt;&lt;br&gt;
Your First Sprint&lt;/p&gt;

&lt;h2&gt;
  
  
  Roll up Your Sprints into an Overview Sheet
&lt;/h2&gt;

&lt;p&gt;To have a clear and simple view of all your sprints you need to roll up your sprints into a master sheet, the Overview. To accomplish that you must list your sprints in a column and each refers to the capacity calculated in each sprint sheet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7DQqxC_H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3qzebk2dh25m431ehfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7DQqxC_H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3qzebk2dh25m431ehfl.png" alt="Image description" width="458" height="533"&gt;&lt;/a&gt;&lt;br&gt;
Overview Sheet&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overview sheet.&lt;/strong&gt; Refer to each sprint capacity in the first sheet&lt;/p&gt;

&lt;p&gt;To project the velocity, you need historical data. But, in the first sprint, you don’t have historical data so you cannot use a formula. What you can do is put a reasonably realistic number there such as the number of sprint working days in the team: the capacity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n_zzOVLY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fa75qj2paobcxq1rp78t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n_zzOVLY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fa75qj2paobcxq1rp78t.png" alt="Image description" width="411" height="68"&gt;&lt;/a&gt;&lt;br&gt;
Sprint 1&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint 1.&lt;/strong&gt; Projected Velocity = Sprint Capacity (only for Sprint 1)&lt;/p&gt;

&lt;p&gt;At the end of sprint 1, you will have the real velocity (actually completed story points). You use that value to project the Sprint 2 velocity: &lt;/p&gt;

&lt;p&gt;Sprint 2 Projected Velocity = (Sprint 2 Capacity) * (Story Points per Day in Sprint 1) &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Story Points per Day = (Completed Velocity / Sprint Capacity)&lt;/p&gt;

&lt;p&gt;For the next sprints, the Projected Velocity will be Sprint Capacity multiplied by Average Story Points per day in Previous Sprints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CnhDuz0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ncefa4qjz8b1b89zz8q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CnhDuz0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ncefa4qjz8b1b89zz8q.png" alt="Image description" width="800" height="310"&gt;&lt;/a&gt;&lt;br&gt;
Sprint 4&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint 4.&lt;/strong&gt; (Projected Velocity) = Sprint Capacity * (Average Story Points per Day in Previous Sprints)&lt;/p&gt;

&lt;p&gt;After 5 sprints your projected velocity will be very realistic. Also, the average completion rate will be closer to 100%.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EnqQKGo---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x694wvovksrkeboa8hr8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EnqQKGo---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x694wvovksrkeboa8hr8.png" alt="Image description" width="374" height="208"&gt;&lt;/a&gt;&lt;br&gt;
Completion Rate&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Completion Rate&lt;/strong&gt;. As your sprints are progressing the average completion rate will converge towards 100%.&lt;/p&gt;

&lt;p&gt;That’s it! All you need is to (1) at Planning fill the team presence &amp;amp; days off, plus (2) fill the Committed Velocity if it is different from Projected Velocity, then (3) at Sprint End fill the Completed Velocity in the Overview sheet. Three manual steps and the rest are formulas! By the way, don’t worry, all the formulas are already in the Google Spreadsheet template provided at the end of this article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary Table&lt;/strong&gt; – Columns Explainer&lt;br&gt;
The Overview table above has a good number of columns and they need a brief description.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint #&lt;/strong&gt; is the Sprint Number or the Sprint Name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint Start&lt;/strong&gt; is the start date of the sprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sprint Capacity&lt;/strong&gt; is the sum of available working days for your members: developers or developers plus testers if you want to include testers in the Capacity calculation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Projected Velocity&lt;/strong&gt; is the estimated story points that the team will deliver at the end of the sprint. It is an ideal value, the actual one (completed velocity) will be smaller or higher.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Committed Velocity&lt;/strong&gt; is the number that your team commits to deliver at the end of the sprint. It may be the same as Projected Velocity, or different. Your team might decide to under-commit, to allow for some work to be injected into the sprint. For example, you can decide that your committed velocity to be 80% out of your projected velocity, to allow for 20% work variation – items that are added in the sprint during the sprint, due to the nature of your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Completed Velocity&lt;/strong&gt; is the number of story points your team delivered at the moment of sprint end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Completion Rate&lt;/strong&gt; is a percentage and represents how much your team has delivered compared to the ideal (projected) velocity. Completion rate = completed velocity / Projected velocity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Velocity / Capacity&lt;/strong&gt; is an output quotient that offers you an idea about how many story points are delivered per day, used only to project the next sprint’s velocity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Become pro: include availability and ramp-up
&lt;/h2&gt;

&lt;p&gt;Your team is not fixed. Some members might not be 100% dedicated to a single team. If a member is part-time, 4 hours out of 8, you can account for that very simply: your daily capacity is not 1 but (e.g.) ½., or they might be in the team Monday to Wednesday, and in the other week Thursday to Friday, etc. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XgrVnKOP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bwwj0fox5eg48zuzt6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XgrVnKOP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bwwj0fox5eg48zuzt6s.png" alt="Image description" width="433" height="155"&gt;&lt;/a&gt;&lt;br&gt;
Sprint with Ramp-Up&lt;/p&gt;

&lt;p&gt;When you have a new joiner, her first sprint will have a ramp-up factor of 0-10%. That is, her expected measurable output will be close to zero, as she is learning. Each sprint you will increase the ramp-up factor by 10%-20%, so after 5-10 sprints the recent joiner will be reasonably up to speed. This has to be monitored and adjusted for each person, as they adjust and learn at a different pace.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rMlhiGIx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sy85apxzeq52ilyryyvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rMlhiGIx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sy85apxzeq52ilyryyvz.png" alt="Image description" width="284" height="240"&gt;&lt;/a&gt;&lt;br&gt;
Sprint with Availability&lt;/p&gt;

&lt;p&gt;Member Capacity = (Days at Work * Ramp-Up Factor)&lt;/p&gt;

&lt;p&gt;And done. Your sprint planning will run smoothly on some simple input data and simple formulas. All your sprints data will be nicely stored and the business can use it in various ways. &lt;/p&gt;

&lt;p&gt;As promised, here’s the &lt;strong&gt;Sprint Planning Template:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bit.ly/SprintPlanTemplate"&gt;View the template.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://bit.ly/CopySprintPlanTemplate"&gt;Copy the template.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The Romanian translation was published in Today Software Magazine – Estimarea vitezei sprinturilor în SCRUM.&lt;/p&gt;

&lt;p&gt;Thanks to Stefania Isaila and Ovidiu Rus for reading drafts of this and providing valuable feedback.&lt;/p&gt;

&lt;p&gt;Written by Vasile Tomoiaga&lt;/p&gt;

</description>
      <category>scrum</category>
      <category>sprint</category>
    </item>
    <item>
      <title>Survey Creation Made Simple: Exploring React Flow's UI Features</title>
      <dc:creator>evozon</dc:creator>
      <pubDate>Thu, 17 Aug 2023 13:25:55 +0000</pubDate>
      <link>https://dev.to/evozon/creating-surveys-made-easy-using-react-flow-as-a-user-interface-2c3c</link>
      <guid>https://dev.to/evozon/creating-surveys-made-easy-using-react-flow-as-a-user-interface-2c3c</guid>
      <description>&lt;p&gt;&lt;strong&gt;A comprehensive guide on leveraging the power of React-Flow to create a dynamic survey creation UI.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Surveys have long been used to acquire vital data from a variety of audiences. However, developing and creating surveys is a complex undertaking that usually requires technical expertise as well as close attention to user experience. As a front-end developer, you understand the importance of providing users with an intuitive and enjoyable experience, and React Flow brings some of the smoothest and best-animated UI that you can get out of the box for that purpose. So, in this article, I’ll show you how you can simplify survey creation by using React Flow for an intuitive User Interface. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is React Flow?
&lt;/h2&gt;

&lt;p&gt;React Flow is a library for building node-based applications. These could vary from simple static diagrams to complex visual editors and data visualizations. It supports custom node types and edges, and it includes pre-installed components such as a minimap and viewport controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why would you use React Flow to create surveys?
&lt;/h2&gt;

&lt;p&gt;It looks great. With minimal effort, you receive an out-of-the-box responsive and animated UI that looks impressive.&lt;br&gt;
It’s easy to use. Its drag-and-drop functionality allows users to easily design and modify the survey layout, resulting in a dynamic and engaging user experience.&lt;br&gt;
If you’re already using React, which the majority of web apps are built with, it integrates really well.&lt;br&gt;
Is React Flow free for commercial use?&lt;br&gt;
It’s free for non-commercial use under the MIT License, and you might be able to access some of the paid features, if you plan to use it for educational purposes or in open-source projects but you would have to contact them for that.  Otherwise, for commercial use, there is a paid subscription involved, which adds additional support and benefits.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does React Flow work?
&lt;/h2&gt;

&lt;p&gt;We'll go over the key steps for creating an interactive User Interface that allows users to easily design surveys using React Flow as the interface of choice. So, let’s dive in!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Setting Up the Project&lt;/strong&gt; &lt;br&gt;
 To get started, let’s set up a new React project and install the React-Flow library. Open your command line interface and execute the following commands:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nw3lik10--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/itm7yaqvug9a4zk8hyaa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nw3lik10--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/itm7yaqvug9a4zk8hyaa.png" alt="Setting up the project" width="600" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Creating the Survey Canvas&lt;/strong&gt;&lt;br&gt;
The first step is to create a canvas where users can design their surveys. We’ll utilize React-Flow’s components to accomplish this task effectively.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FK_P-EkI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g77vd5u8drxqvg5g1jfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FK_P-EkI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g77vd5u8drxqvg5g1jfq.png" alt="Creating the Survey" width="600" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Adding Survey Elements&lt;/strong&gt;&lt;br&gt;
Now, let’s empower users to add survey elements such as questions, options, and more. We’ll utilize React-Flow’s actions to handle the addition of these elements.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TGxJvprC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0sbbdhvjh0y2ea7c0mhs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TGxJvprC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0sbbdhvjh0y2ea7c0mhs.png" alt="Adding Survey Elements" width="600" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Bringing It All Together&lt;/strong&gt;&lt;br&gt;
Now, let’s combine the survey canvas and element palette components to create a seamless and powerful survey creation UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3InWeAoC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/62u3c0uvihr0sqre9fwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3InWeAoC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/62u3c0uvihr0sqre9fwv.png" alt="Bringing it al together" width="600" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts:
&lt;/h2&gt;

&lt;p&gt;In conclusion, with its dynamic UI, customization choices, responsiveness, community support, connection with React, comprehensive feature set, and extensibility, React Flow is an excellent alternative for generating surveys. With React Flow as the user interface, creating surveys becomes a breeze. It’s super easy and efficient for users to design and launch their surveys without any hassle.&lt;/p&gt;

&lt;p&gt;It empowers you to create engaging and user-friendly survey experiences while leveraging the benefits of the React ecosystem.&lt;/p&gt;

&lt;p&gt;Article written by Mihai Moldovan, &lt;a href="https://www.evozon.com/creating-surveys-using-react-flow-as-a-user-interface/"&gt;originally published here.&lt;/a&gt; and edited by Cristina Strimbu.&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactflow</category>
      <category>survey</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Effortlessly Keep Your PHP Projects Up-to-Date</title>
      <dc:creator>evozon</dc:creator>
      <pubDate>Tue, 08 Aug 2023 11:10:21 +0000</pubDate>
      <link>https://dev.to/evozon/how-to-effortlessly-keep-your-php-projects-up-to-date-3ljn</link>
      <guid>https://dev.to/evozon/how-to-effortlessly-keep-your-php-projects-up-to-date-3ljn</guid>
      <description>&lt;p&gt;Are your dependencies old enough to go to school? Do you have that one big-ticket that haunts you in the backlog, which aims to upgrade PHP, a Composer package, or the framework’s version? Keep on reading – we’ve got you covered. We faced these challenges as well and, thanks to that, we managed to come up with a solution: developing a tool that makes the upgrade process automatic, continuous, and fun!&lt;/p&gt;

&lt;p&gt;As a developer, it’s essential to keep up with the latest tools and technologies and apply them to your projects. With software development constantly evolving (faster and faster lately), it’s natural to have new solutions emerging regularly. By staying up-to-date with these advancements, you can enhance your skills and knowledge, improve your workflow, and ultimately produce better-quality software. In today’s digital age, where cybersecurity threats are becoming increasingly sophisticated, it’s crucial to use the latest tools and technologies to ensure the security of your applications. As you most probably already know, outdated distributions may have vulnerabilities that hackers can exploit. This exposes the software and the users to various threats such as data breaches, malware, and ransomware attacks.&lt;/p&gt;

&lt;p&gt;By using up-to-date versions, you (and developers in general) can achieve the following:&lt;/p&gt;

&lt;p&gt;Take advantage of the latest security features and updates and ensure the software’s security against cyber threats, giving users peace of mind and preventing potential damage to an organization’s reputation;&lt;br&gt;
Work more efficiently, reduce development time, and deliver more features and functionality to the users;&lt;br&gt;
Prove a commitment to personal and professional growth, which can help you stand out in a competitive job market.&lt;br&gt;
Here at Evozon, we understand the need to constantly improve ourselves and our projects and to deliver high-quality software built on top of the most recent technologies. Consequently, we set a goal to automate the upgrade process, and we’ve created a tool that enables us to keep our projects up-to-date. &lt;/p&gt;
&lt;h2&gt;
  
  
  World, meet Future!
&lt;/h2&gt;

&lt;p&gt;What is Future? An open-source tool written in Go that streamlines the process of upgrading projects developed using PHP and Composer. &lt;/p&gt;

&lt;p&gt;Future offers an automatic, pipeline-based, and efficient way of upgrading projects, saving developers time and effort. How? By splitting the whole process into three distinct phases. Each one focuses on a specific aspect of the upgrade process: the platform, the dependencies, and the codebase. Now, it’s important to also note that each phase is optional and fully configurable. Moreover, all the changes Future applies are made in an isolated environment, without affecting your project. &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%2Fuploads%2Farticles%2Fo9by5kubv8f0mhnh68r7.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9by5kubv8f0mhnh68r7.jpg" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
GO Development Banner &lt;a href="https://servreality.com/wp-content/uploads/2020/07/GO-Development-Banner.jpg" rel="noopener noreferrer"&gt;(here)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Let’s Dive Deeper into The Process
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: Upgrading the platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first phase involves upgrading the platform that your project runs on. This is essential, as running your project on an outdated platform can result in compatibility issues and security vulnerabilities. Future automates this process by creating a fully configurable Docker container, built using the most recent versions of your platform-related dependencies (such as PHP, databases, etc.). Later, you will use it to run your project’s test suite. Thus, it eases the upgrade process, without worrying about compatibility issues or breaking your app’s functionality. If the upgrade fails, Future provides detailed information about the failure’s reason and proposes the next steps to overcome it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Upgrading existing Composer dependencies to the latest version&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you have upgraded the platform, the next step is to upgrade all Composer dependencies to their latest version. Future checks your composer.json file and updates each package to its latest version. If the process fails, you’ll receive detailed information about the not-updated package(s) and what you have to do next to address the situation. Thus, we offer a step-by-step approach that allows you to upgrade your project’s dependencies in small, non-scary iterations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: Upgrading the code to the latest standards automatically&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The final phase of the upgrade process involves upgrading your codebase to the latest standards. Future achieves this through the use of Rector, a powerful tool that automates the process of upgrading your codebase by applying a configurable set of refactoring rules. This includes using features added in the latest PHP versions, removing deprecated code, applying modern coding standards, or creating custom refactoring rules.&lt;/p&gt;

&lt;p&gt;If all the phases have been successfully executed, Future runs your project’s test suite inside the created Docker container, making sure that the upgrade has not broken your app’s functionality. Throughout each step of the way, Future provides useful feedback on what has been performed. Also, if necessary, detailed information about the error that occurred. This way, you can take the proper actions: apply the upgrade or address the reported issues.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to upgrade your PHP project using Future
&lt;/h2&gt;

&lt;p&gt;Getting started with Future is really easy. However, it requires two important prerequisites: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CI pipeline;&lt;/li&gt;
&lt;li&gt;Test suite.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We believe all projects should have these. Also, we strongly encourage you to add them to your project in case they are missing. Not only for using Future, but for the sake of developing high-quality and robust software.&lt;/p&gt;

&lt;p&gt;After managing to meet the prerequisites, all you need to do is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the package;&lt;/li&gt;
&lt;li&gt;Add Future as a new and independent step in your pipeline;&lt;/li&gt;
&lt;li&gt;Configure the step in order to meet the needs of your project;&lt;/li&gt;
&lt;li&gt;Run the pipeline;&lt;/li&gt;
&lt;li&gt;Go through the provided summary and apply the suggested changes;&lt;/li&gt;
&lt;li&gt;Go to 4.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Code Snippet&lt;/strong&gt;&lt;br&gt;
Future can be installed as a development-only package in any Composer-based PHP project. For more information, check our GitHub repository. Once installed, you need to create a new step in your CI flow that will create an up-to-date environment in the form of a Docker container. That’s where your project’s test suite will be run after updating all the Composer dependencies and applying the Rector-related refactoring rules. Future provides templates for the main web-based Git repositories, which you can use and configure to match your project’s needs (see the code snippet below).&lt;/p&gt;

&lt;p&gt;`future-proofing:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    stage: future

    allow_failure: true

    needs: []

    image: php:fpm-alpine #replace this with the platform you target for the upgrade

    #services:define the services required to run your test suite

    #variables: define the variables required to run your test suite

    before_script

            #performall the necessary steps required to run your project’s test suite

            –  composer install –no-interaction –no-scripts –prefer-dist

    script

            – vendor/bin/future bump-php

            – vendor/bin/future bump-deps

            – composer update -W –no-interaction –no-scripts

            – vendor/bin/rector init



            #register rector rule sets

            – vendor/bin/future add-ruleset \\Rector\\Set\\ValueObject\\SetList::CODE_QUALITY



             #register rector rules

              – vendor/bin/future add-rule \\Rector\\Restoration\\Rector\\Class_\\RemoveFinalFromEntityRector::class



               #exclude rector rules

                – vendor/bin/future skip \\Rector\\CodingStyle\\Rector\\ClassConst\\VarConstantCommentRector::class



                 – vendor/bin/rector process src –no-progress-bar –no-diffs



                  #run your project‘s test suite

                   – vendor/bin/phpunit –no-interaction –colors=never`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Continuous Integration Job Template for Implementing Future&lt;/p&gt;

&lt;p&gt;To avoid affecting the workflow of your team, you must allow this step to fail. If something went wrong, Future will collect and provide useful feedback as output which you can use to take action. To facilitate this, create a corresponding ticket that addresses each failure one by one. Once all the failures have been addressed and the Future-related step has passed, you can apply the upgrades Future has made in the isolated container to the main repository through the use of the binary provided by Future (see the section below). Then, you can remove the allow_failure: true option. At the same time, it’s essential to make the job a part of the definition of done of your project, ensuring that any future merge request will be future-proof. One important aspect to keep in mind: once you get to the latest versions, you stay there!&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%2Fuploads%2Farticles%2Fea1dqfcrcm3jctrmlaaa.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%2Fuploads%2Farticles%2Fea1dqfcrcm3jctrmlaaa.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Example of a Successful Pipeline that Uses Future&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo: Watch Future in action
&lt;/h2&gt;

&lt;p&gt;To better understand the process and highlight Future’s power and simplicity, we created a short demo where we upgrade an application using the binary. Join us as we enhance our app’s platform, Composer dependencies, and codebase and address the challenges we face! The process we present below is just a fraction of what Future can do. It reflects the steps that you should automate in your project’s pipeline when defining the CI step. We recommend using the binary locally only when committing the changes to the repository when the job passes.&lt;/p&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Future is an open-source tool that automates the upgrade process of Composer-based PHP projects and provides the resources to make upgrades a step in the workflow of your projects. Therefore, it allows you to stay up-to-date with greater ease. We welcome any contribution and feedback and look forward to your thoughts about Future.&lt;/p&gt;

&lt;p&gt;Article written by Ioan Ovidiu Enache, &lt;a href="https://www.evozon.com/how-to-effortlessly-keep-your-php-projects-up-to-date/" rel="noopener noreferrer"&gt;originally published here.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
