<?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: Sohei Chikama</title>
    <description>The latest articles on DEV Community by Sohei Chikama (@csohei).</description>
    <link>https://dev.to/csohei</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%2F214394%2Fda8f0bc1-7154-4574-84ce-cfeed53267b9.jpg</url>
      <title>DEV Community: Sohei Chikama</title>
      <link>https://dev.to/csohei</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/csohei"/>
    <language>en</language>
    <item>
      <title>The Concept of Designing Retrospective</title>
      <dc:creator>Sohei Chikama</dc:creator>
      <pubDate>Sun, 29 Sep 2024 10:31:39 +0000</pubDate>
      <link>https://dev.to/csohei/the-concept-of-designing-retrospective-5do8</link>
      <guid>https://dev.to/csohei/the-concept-of-designing-retrospective-5do8</guid>
      <description>&lt;p&gt;I wrote this article intending to for the &lt;strong&gt;proposal to RSGT 2025&lt;/strong&gt;, so if you don't mind, please consider giving a &lt;strong&gt;like to my proposal&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://confengine.com/conferences/regional-scrum-gathering-tokyo-2025/proposal/21078" rel="noopener noreferrer"&gt;RSGT 2025 Proposal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As it's been a long since the last post, I would like to describe some about the &lt;strong&gt;Retrospective&lt;/strong&gt; in Scrum, which I discussed deeply with my Agile Coach.&lt;/p&gt;

&lt;p&gt;I shared this content with my junior engineer friend and he said it's worth paying me some drinks, so I am expecting that you would enjoy a lot if you are interested in Agile or Scrum&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quality of Retrospectives Reflects the Quality of the Team and Ultimately the Product
&lt;/h2&gt;

&lt;p&gt;Are you conducting retrospectives in your team?&lt;/p&gt;

&lt;p&gt;When I ask this question to the developers in Scrum team, many respond, "We do it properly every sprint," or "We allocate time every other week."&lt;/p&gt;

&lt;p&gt;However, when I ask what actually they do, I often find that they are merely writing down KPT (Keep, Problem, Try) and just sharing it among the team.&lt;/p&gt;

&lt;p&gt;Retrospectives are activities that handle &lt;strong&gt;"Inspection"&lt;/strong&gt; among the three pillars of Scrum: &lt;strong&gt;"Transparency," "Inspection," and "Adaptation."&lt;/strong&gt; They also serve as activities to prepare for &lt;strong&gt;Adaptation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The quality of this "Inspection" directly impacts the quality of the team and ultimately the product.&lt;/p&gt;

&lt;p&gt;Therefore, simply writing down KPT and presenting it may be somewhat insufficient.&lt;/p&gt;

&lt;p&gt;Scrum also has &lt;strong&gt;Sprint Reviews&lt;/strong&gt; as a representative inspection event.&lt;/p&gt;

&lt;p&gt;The Sprint Review is an inspection of the product, responsible for &lt;strong&gt;how to improve the product&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On the other hand, the Retrospective is an inspection of team activities, responsible for &lt;strong&gt;how to improve the quality of team activities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I have summarized the representative inspection perspectives in a diagram based on what came to mind.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bwneqll9o07duuwmi0j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3bwneqll9o07duuwmi0j.png" alt="Diagram about Inpsection/Adaption of sprint review and retrospective." width="800" height="747"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking at it this way, you can see that each event has a very large number of topics, and it's clear that just discussing them briefly won't lead to improvement.&lt;br&gt;&lt;br&gt;
To efficiently discuss these topics and ac## Designing a Retrospective&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing the Retrospective
&lt;/h2&gt;

&lt;p&gt;What does it mean to design a Retrospective?&lt;br&gt;&lt;br&gt;
Including retrospectives, most meetings have a purpose.&lt;br&gt;&lt;br&gt;
Purposes vary, such as brainstorming, information sharing, or deciding on measures to address immediate issues.&lt;/p&gt;

&lt;p&gt;Whether the participants of the retrospective can smoothly reach that purpose depends greatly on the quality of the agenda and facilitation.  &lt;/p&gt;

&lt;p&gt;Elements like how to conduct the proceedings, what methods to use for discussions, whether to encourage divergence or convergence and how to draw conclusions are important.&lt;/p&gt;

&lt;p&gt;From that perspective, &lt;strong&gt;considering the agenda and discussion methods to guide participants efficiently and appropriately towards the purpose&lt;/strong&gt; is the idea of designing a retrospective.&lt;/p&gt;

&lt;p&gt;To surely run an improvement cycle that enhances team activities, it's necessary to &lt;strong&gt;properly design each event and guide the team into discussions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Although we won't touch on Sprint Reviews this time, the idea of designing events and meetings is useful in various situations, so please consider it if you're interested.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phases and Tools
&lt;/h3&gt;

&lt;p&gt;As we begin designing retrospectives, let's look at retrospectives from the perspectives of &lt;strong&gt;Phases&lt;/strong&gt; and &lt;strong&gt;Activities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phases&lt;/strong&gt; are, as the word suggests, &lt;strong&gt;stages of discussion&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
In the design stage, we consider what steps to take in the discussion to efficiently reach a conclusion.&lt;br&gt;&lt;br&gt;
For example, if there are four phases—Sharing, Divergence, Analysis, and Decision-making—we examine questions like &lt;strong&gt;Is it sufficient to have one round each of divergence and analysis? Is decision-making necessary? How much time should be allocated to each?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
While retrospectives have their own purposes, each phase also has a purpose, and the tools used to achieve the purpose of each phase are the &lt;strong&gt;activities&lt;/strong&gt; described next.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activities&lt;/strong&gt; refer to &lt;strong&gt;what methods of discussion&lt;/strong&gt; are used in each phase.&lt;br&gt;&lt;br&gt;
For example, KPT, which was mentioned at the beginning, is one of the activities used for conducting discussions.&lt;br&gt;&lt;br&gt;
Other activities that many of you may be familiar with include &lt;strong&gt;"Sailboat Retrospective,"&lt;/strong&gt; &lt;strong&gt;"5 Whys,"&lt;/strong&gt; &lt;strong&gt;"Brainstorming,"&lt;/strong&gt; and &lt;strong&gt;"Good/Bad/Ugly."&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Each activity has its &lt;strong&gt;strengths&lt;/strong&gt; and &lt;strong&gt;weaknesses&lt;/strong&gt;, and it's necessary to consider combinations based on the team's situation, the phase of discussion, and the required time.&lt;br&gt;&lt;br&gt;
By combining appropriate activities for each phase, you can proceed with discussions more efficiently.&lt;/p&gt;

&lt;p&gt;In this way, &lt;strong&gt;analyzing the timebox of the retrospective and the team's situation, and considering combinations of discussion stages (phases) and discussion methods (activities)&lt;/strong&gt; forms the basis for designing a retrospective.  &lt;/p&gt;

&lt;p&gt;Moreover, this way of thinking can be used in regular meetings as well, so please try using it not only for retrospectives but also in workshops, presentations, and various other situations as needed.&lt;/p&gt;

&lt;p&gt;Note that the quality of the design can vary greatly depending on the number and maturity of the activities you have at your disposal.&lt;br&gt;&lt;br&gt;
If you're not familiar with many activities or don't know how to conduct them, please consider reading 'Agile Retrospectives: Making Good Teams Great' listed in the References section.&lt;br&gt;&lt;br&gt;
It introduces a large number of tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five Phases of a Retrospective
&lt;/h2&gt;

&lt;p&gt;Now, you might be unsure where to start if you're suddenly told to design a retrospective.&lt;br&gt;&lt;br&gt;
Don't worry. In Scrum retrospectives, there is a commonly used framework called the "&lt;strong&gt;Five Phases&lt;/strong&gt;."&lt;/p&gt;

&lt;p&gt;This is the idea of dividing the retrospective time into five phases and combining activities in each to lead to conclusions.&lt;/p&gt;

&lt;p&gt;Below is a simple summary of these five phases. The time in parentheses is a guideline for time allocation when designing a one-hour retrospective.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set the Stage&lt;/strong&gt; - Get Ready for Discussion (within 5 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collect the Data&lt;/strong&gt; - Gathering data (about 10 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Insights&lt;/strong&gt; - Analyzing data (about 30 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make Decisions&lt;/strong&gt; - Deciding what to do (about 10 minutes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close the Retro&lt;/strong&gt; - Closing the retrospective (within 5 minutes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30z71g2p3w3jo7ama639.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30z71g2p3w3jo7ama639.png" alt="Image of Retrospective Progression" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this framework, you prepare for discussions, gather discussion topics, discuss the collected topics, decide what to do, and get ready to move forward.&lt;/p&gt;

&lt;p&gt;Now, let's explain each phase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set the Stage - Get Ready for Discussion
&lt;/h3&gt;

&lt;p&gt;In this phase, we have to get ready so that  &lt;strong&gt;all participants can discuss comfortably&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is important that &lt;strong&gt;all participants can participate in the discussion&lt;/strong&gt;. However, in unfortunate retrospectives, sometimes a few strong-willed individuals dominate the conversation, or those who miss the initial opportunity to speak remain silent until the end.&lt;/p&gt;

&lt;p&gt;This phase is intended to have all participants feel, "We are about to participate in a discussion," and "It's okay to speak up here," and it serves as a place to establish and confirm rules for that purpose.&lt;/p&gt;

&lt;p&gt;Having everyone participate in the discussion and express their opinions in the place where the team's direction is decided not only gathers multiple perspectives but also leads to a sense of ownership when implementing the &lt;strong&gt;improvement plans decided in the retrospective&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This phase tends to be overlooked, but unless time is severely constrained due to delays, please make sure to carry it out.&lt;/p&gt;

&lt;p&gt;What to do in this phase greatly depends on the team's maturity.&lt;br&gt;&lt;br&gt;
I will introduce two activities for different maturities.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check-In
&lt;/h3&gt;

&lt;p&gt;For example, if the team has high psychological safety and each member can actively express their opinions, it's fine to just have them say a few words.&lt;/p&gt;

&lt;p&gt;Originally, check-in is an activity to help participants focus on the retrospective, so the rule is to have them share what they expect from the retrospective or their current situation, but there's no need to stick strictly to that.  &lt;/p&gt;

&lt;p&gt;Questions like "Share your thoughts on this week's sprint in one word!", "Describe your current mood in 20 characters!", or "Tell us what you had for lunch today and your thoughts on it in one sentence!" are sufficient.  &lt;/p&gt;

&lt;p&gt;This isn't because we want to know the answers to these questions or to engage in team bonding; it's more like a warm-up to create an atmosphere of &lt;strong&gt;"I'm about to speak up" and "I'm going to express my opinion."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It may seem meaningless, but whether or not you do this activity can significantly affect the liveliness of the discussion.&lt;br&gt;&lt;br&gt;
Even if it feels silly, please make sure to do it.&lt;/p&gt;

&lt;p&gt;In my company, we often start by doing an activity where each person places their name on the &lt;strong&gt;"Wheel of Emotions"&lt;/strong&gt; and shares briefly why they chose that spot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxkof1ep8swjtzha6abgd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxkof1ep8swjtzha6abgd.png" alt="Wheel of Emotions from Wikipedia" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Team Agreements
&lt;/h3&gt;

&lt;p&gt;On the other hand, in teams where some strong-willed individuals tend to dominate the conversation, start by &lt;strong&gt;establishing and confirming discussion rules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Specific rules might include: "Be mindful so that everyone speaks an equal amount," "Do not interrupt and listen until someone finishes speaking," "If you feel it's hard to join the conversation, give a signal," "If you talk for more than one minute, check if other members have opinions or questions," and "Do not take away the speaking opportunity from someone the facilitator has designated."&lt;/p&gt;

&lt;p&gt;These rules can be decided by the facilitator or Scrum Master, but it might be good to take some time during the retrospective to discuss them.&lt;/p&gt;

&lt;p&gt;If they are &lt;strong&gt;agreements decided as a team&lt;/strong&gt;, both members who tend to talk too much and those who are not good at speaking can participate in discussions with mutual understanding.  &lt;/p&gt;

&lt;p&gt;Also, if there are members in higher positions, it can be effective to ask them in advance to moderate the frequency and intensity of their comments.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Collect the Data&lt;/strong&gt; - Gathering Data
&lt;/h3&gt;

&lt;p&gt;Once all participants are ready to speak, the next step is to gather seeds for discussion.&lt;/p&gt;

&lt;p&gt;When you think of data, you might imagine &lt;strong&gt;quantitative elements&lt;/strong&gt; like completed story points, man-days, or the number of PRs. However, the data referred to here also includes &lt;strong&gt;qualitative elements&lt;/strong&gt; such as emotions, opinions, and events.&lt;/p&gt;

&lt;p&gt;Posting KPTs (Keep, Problem, Try) is also one of the data collection activities. KPT is a tool that handles everything from data collection to decision-making in one go, but at this point, it's better to treat "Try" as something like "things we think we should do."&lt;/p&gt;

&lt;p&gt;Specific data examples include the following:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quantitative Data and Tools for Obtaining Them&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transition of completed story points&lt;/strong&gt;: Jira, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lead time of development activities&lt;/strong&gt; (※1): Findy Teams, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values of 4 Keys&lt;/strong&gt; (※2): Jira, Findy Teams, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actual working hours&lt;/strong&gt; (※3): Team calendars on Kanban boards, groupware, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;&lt;br&gt;
※1 From initiation to design creation, from design completion to development start, from development start to PR creation, from PR creation to merge, from merge to deployment, etc.&lt;br&gt;&lt;br&gt;
※2 Deployment frequency, change lead time, change failure rate, time to restore service&lt;br&gt;&lt;br&gt;
※3 Total working hours within the sprint, excluding vacations, meetings, Scrum events, etc.&lt;br&gt;&lt;br&gt;
&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qualitative Data and Representative Activities&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feedback on team activities&lt;/strong&gt;: Keep/Problem/Try, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback on team status&lt;/strong&gt;: Good/Bad/Ugly, Sailboat Retrospective, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events within the sprint&lt;/strong&gt;: Timeline, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emotional feedback from members&lt;/strong&gt;: Mad/Sad/Glad, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, it's not realistic to collect all of this data, and &lt;strong&gt;too much information becomes noise&lt;/strong&gt;. Please have the facilitator decide what data to collect and how, after confirming in advance what the Scrum Master and team members want to discuss.&lt;/p&gt;

&lt;p&gt;Also, one point to keep in mind is that &lt;strong&gt;the most important part of a retrospective is the discussion and analysis that follows&lt;/strong&gt;. Therefore, &lt;strong&gt;using tools that automatically collect data or gathering KPTs in daily activities&lt;/strong&gt; are very effective ways to reduce the time spent on data collection.&lt;/p&gt;

&lt;p&gt;Actually, it was repeatedly pointed out during mentoring meetings with a Scrum Trainer, and we created a board to regularly collect timelines and emotional/activity feedback.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9f8ug9fv4v19sleet7z1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9f8ug9fv4v19sleet7z1.png" alt="Original feedback board created during mentoring meeting" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, in the team I participated in, we prepared a space called &lt;strong&gt;Found and Resolved&lt;/strong&gt;, which was set up to put sticky whenever someone noticed something they wanted to discuss with the whole team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate Insight - Analyzing Data
&lt;/h3&gt;

&lt;p&gt;Next is the data analysis phase. As mentioned at the end of data collection, this phase is the core of the retrospective. &lt;strong&gt;We bring together the collective wisdom of all team members to analyze the collected issues and explore solutions.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Selecting Topics to Discuss
&lt;/h4&gt;

&lt;p&gt;Before starting the data analysis phase, the first thing to do is &lt;strong&gt;select the issues to discuss&lt;/strong&gt;. Each member has their own sense of issues, and various topics come up during data collection.&lt;/p&gt;

&lt;p&gt;However, since the time available for discussion and for implementing improvements is limited, it's necessary to &lt;strong&gt;narrow down the topics&lt;/strong&gt; to decide which problems to solve or which good points to further enhance.&lt;/p&gt;

&lt;p&gt;My recommended methods for narrowing down topics iare &lt;strong&gt;Dot Voting&lt;/strong&gt; and &lt;strong&gt;Heat Maps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dot Voting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dot voting is a commonly used method, so many of you may already know it, but I'll explain it for just in case.&lt;/p&gt;

&lt;p&gt;In Dot Voting, you decide on the number of votes per person (e.g., 3 votes) and vote on the topics collected during data collection that you want to discuss. &lt;strong&gt;Limiting the number of votes allows each member to prioritize topics.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The topics that receive the most votes become those with &lt;strong&gt;high team interest&lt;/strong&gt;, and &lt;strong&gt;the impact when improved&lt;/strong&gt; becomes greater. Dot voting can be done in a short time and has the advantage of simplicity and easiness of understanding.&lt;/p&gt;

&lt;p&gt;However, one caution is that when conducting dot voting, you need to &lt;strong&gt;ensure that it's not apparent who voted for what&lt;/strong&gt;, such as by color or name.&lt;/p&gt;

&lt;p&gt;If voters are identifiable, there's a possibility that votes may be skewed due to power balances within the team. To select topics that &lt;strong&gt;all team members can discuss on an equal footing&lt;/strong&gt;, use anonymous dots of the same color.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heat Maps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Personally, I recommend Heat Maps over Dot Voting. It's an extension of dot voting, where you vote with as many dots as you like, up to a set limit, on the topics collected during data collection that you want to discuss. &lt;/p&gt;

&lt;p&gt;The number of dots represents your level of interest in that topic. For example, if the maximum is 3 votes, it can be interpreted as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1 vote: Interested&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2 votes: Want to discuss&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3 votes: Really want to discuss&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After voting, tally the number of dots as in dot voting, and start discussing the topics with the most votes in order.&lt;/p&gt;

&lt;p&gt;The good thing about heat maps is that &lt;strong&gt;they reflect the strength of each member's will&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In dot voting, topics that aren't of much interest may still receive votes, but in heat maps, the level of interest affects the number of votes. &lt;/p&gt;

&lt;p&gt;By using heat maps, topics that may not have gained much consensus but are very important to certain members also get attention, allowing &lt;strong&gt;problems noticed only by some members&lt;/strong&gt; to be selected for discussion.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deepening the Discussion
&lt;/h4&gt;

&lt;p&gt;Once you've narrowed down the topics to discuss, move on to the discussion. Share opinions and ideas on the selected topics, and share what you'd like to try or do.&lt;/p&gt;

&lt;p&gt;You can conduct the discussion freely until a conclusion is reached, but by using tools like &lt;strong&gt;Fishbone Diagrams&lt;/strong&gt;, &lt;strong&gt;5 Whys&lt;/strong&gt;, or &lt;strong&gt;Lean Coffee&lt;/strong&gt;, you can proceed more efficiently.&lt;/p&gt;

&lt;p&gt;I myself often use Lean Coffee in 1-on-1s and regular meetings, so I'll explain Lean Coffee here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lean Coffee&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lean Coffee is a method used to &lt;strong&gt;discuss many topics&lt;/strong&gt; by setting timeboxes. By following the rules below, you can perform analysis and idea generation in a short time.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Divide 10 minutes into three segments of 5 minutes, 3 minutes, and 2 minutes.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;At the end of the first 5 minutes, pause the discussion.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you feel satisfied with the topic, show a 👍; if you still want to discuss, do nothing.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If the majority shows a 👍, move to the next topic; otherwise, continue the discussion.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do the same for the remaining 3 minutes, and after the final 2 minutes, move to the next topic unconditionally.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By proceeding with the discussion in this way, you can talk about up to 6 topics in 30 minutes, or at least 3 topics. Also, if you come up with 2 TRY ideas for each topic, you'll generate between 6 and 12 TRY seeds from the topics.&lt;/p&gt;

&lt;p&gt;As a side note, when conducting Lean Coffee, it's recommended to &lt;strong&gt;assign a scribe&lt;/strong&gt;. By &lt;strong&gt;visually tracking the flow of the discussion&lt;/strong&gt;, it's easier to generate constructive TRYs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35evk5xiedi690hvep5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35evk5xiedi690hvep5e.png" alt="Image of LeanCoffee" width="800" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Make Decisions - Deciding What to Do
&lt;/h3&gt;

&lt;p&gt;After deepening discussions and generating various TRYs (things we want to try), we finally decide what to implement to improve the team.&lt;/p&gt;

&lt;p&gt;Even though TRYs have been raised during the discussion, it doesn't mean that the subsequent improvements have been decided.&lt;/p&gt;

&lt;p&gt;We &lt;strong&gt;cannot implement all the TRYs&lt;/strong&gt; that were raised, and the TRYs that came up during the discussion are &lt;strong&gt;not necessarily executable as they are&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this phase, we primarily conduct the following discussions and decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Decide which TRYs are most important for the team&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refine TRYs to make them executable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assign TRYs to team members&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manage the TRYs&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By going through this phase, the TRYs become executable as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe14ii0dd82boork2hgwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe14ii0dd82boork2hgwv.png" alt="Refinement on Decision Making" width="662" height="1015"&gt;&lt;/a&gt;&lt;br&gt;
Let's explain each of these.&lt;/p&gt;

&lt;h4&gt;
  
  
  Decide Which TRYs are Most Important for the Team
&lt;/h4&gt;

&lt;p&gt;Selecting appropriate topics and engaging in active discussions can result in many TRYs. However, it's not realistic to execute all of them.&lt;/p&gt;

&lt;p&gt;Trying to implement many TRYs simultaneously can lead the team to face &lt;strong&gt;many changes in the next sprint, causing fatigue&lt;/strong&gt;. In the worst case, the motivation to execute TRYs may gradually decrease, turning the retrospective into just a place to propose improvements without action.&lt;/p&gt;

&lt;p&gt;To avoid such situation, I recommend you to utilize tools like dot voting or heat maps to decide which TRYs to implement in the next sprint at the beginning.&lt;/p&gt;

&lt;h4&gt;
  
  
  Refine TRYs to Make Them Executable
&lt;/h4&gt;

&lt;p&gt;As mentioned earlier, the TRYs generated during discussions may &lt;strong&gt;not be directly executable&lt;/strong&gt;. To make the selected TRYs executable, refine them by clarifying the wording, creating subtasks, and adjusting the scope.&lt;/p&gt;

&lt;p&gt;When refining TRYs, it is recommended to compare them with the criteria of &lt;strong&gt;SMART goals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A SMART goal is a commonly used criterion for goal setting, derived from the initials of the following five words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Specific&lt;/strong&gt;: Clear and specific&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measurable&lt;/strong&gt;: Progress and results can be measured&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attainable&lt;/strong&gt;: Realistically achievable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relevant&lt;/strong&gt;: Appropriate for solving the problem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bound&lt;/strong&gt;: Has a clear deadline or time frame&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, suppose the following problem and TRY have been raised:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem: Pull requests are piling up, causing many conflicts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TRY from the discussion: Schedule time for pair reviews&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This TRY is not necessarily executable as is. Let's refine it from the perspective of SMART.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Specific&lt;/strong&gt;: The action itself is clear, so no problem here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measurable&lt;/strong&gt;: Frequency and duration are not specified, making it hard to measure. For example, adding the words "1 hour daily" would be better.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attainable&lt;/strong&gt;: Scheduling between reviewers and reviewees is necessary. For instance, creating a subtask to block 1 hour on own calendar after the Daily Scrum (DS) can increase feasibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relevant&lt;/strong&gt;: Securing review time helps prevent PR backlog, so it is appropriate for solving the problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time-bound&lt;/strong&gt;: There's no set deadline. For example, "Continue for two weeks and evaluate the effect in the next retrospective" makes it clear.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By refining the TRY in this way, we get the following specific TRY and tasks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem: Pull requests are piling up, causing many conflicts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Improvement (TRY): For the next two weeks, schedule 1 hour after DS for pair reviews, then discuss whether to continue afterward&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tasks&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Register the schedule in the calendar&lt;/li&gt;
&lt;li&gt;Add a pair review request to the end of the DS agenda&lt;/li&gt;
&lt;li&gt;During each DS, ask if anyone needs a pair review&lt;/li&gt;
&lt;li&gt;Discuss whether to continue after two weeks&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Assign Responsibility
&lt;/h4&gt;

&lt;p&gt;To execute the refined TRYs, the next step is to assign responsibility. Clearly define &lt;strong&gt;who is responsible for completing the TRY&lt;/strong&gt; and &lt;strong&gt;who will carry out the created subtasks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A common issue in retrospectives is that &lt;strong&gt;improvement ideas are proposed but end up not being executed&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Deciding who is responsible at this stage is crucial to cultivate a habit of the whole team taking responsibility for improvements and preventing the retrospective from becoming a mere formality.&lt;/p&gt;

&lt;p&gt;In a team I previously participated in, we established temporary roles called &lt;strong&gt;"〇〇 Police"&lt;/strong&gt; (e.g., Review Police, Pair Programming Police) to check whether the team's decided improvement plans were being executed and to prompt action.&lt;/p&gt;

&lt;p&gt;Having &lt;strong&gt;fellow team members gently remind each other&lt;/strong&gt; made it &lt;strong&gt;easier to implement improvement plans without resistance&lt;/strong&gt;, which I found to be a very effective approach.&lt;/p&gt;

&lt;h4&gt;
  
  
  Manage the TRYs
&lt;/h4&gt;

&lt;p&gt;This step is not mandatory, but managing TRYs had a significant positive effect on improving team activities.&lt;/p&gt;

&lt;p&gt;Even after refining the selected TRYs and assigning responsibility, sometimes the improvement plans decided a week or a month ago get sidelined due to daily tasks.&lt;/p&gt;

&lt;p&gt;To avoid such situations and ensure that improvements are executed, I recommend &lt;strong&gt;managing TRYs on a Kanban board&lt;/strong&gt; and &lt;strong&gt;checking progress during the Daily Scrum (DS)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Regularly reviewing the progress of TRYs and tasks from the previous sprint to see if team activities are improving was very effective.&lt;/p&gt;

&lt;h3&gt;
  
  
  Close the Retro - Closing the Retrospective
&lt;/h3&gt;

&lt;p&gt;Once you've decided on the improvements to implement in the upcoming sprints, the final step is to close the retrospective.&lt;/p&gt;

&lt;p&gt;In this phase, you &lt;strong&gt;record what the team has learned, solidify the improvement plans, and express gratitude to the participants and facilitator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The main activities are as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reflecting on the content of the retrospective&lt;/li&gt;
&lt;li&gt;Moving TRYs and tasks to a visible place on the Kanban board (including transcribing them to the TRY Kanban if you're using one)&lt;/li&gt;
&lt;li&gt;(For offline meetings) Taking photos of whiteboards or sticky notes&lt;/li&gt;
&lt;li&gt;(For offline meetings) Tidying up the venue&lt;/li&gt;
&lt;li&gt;Expressing gratitude to the participants and facilitator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd like to introduce two activities that I personally enjoy.&lt;/p&gt;

&lt;h4&gt;
  
  
  Retrospective of the Retrospective
&lt;/h4&gt;

&lt;p&gt;While a retrospective is an activity to improve team practices, &lt;strong&gt;the retrospective itself is also subject to improvement&lt;/strong&gt;. By reflecting on the retrospective at the end, you can conduct future retrospectives even more efficiently and effectively.&lt;/p&gt;

&lt;p&gt;In a &lt;strong&gt;Retrospective of the Retrospective&lt;/strong&gt;, each member writes down what went well and areas for improvement at the end.&lt;/p&gt;

&lt;p&gt;By candidly sharing feedback such as "I couldn't express what I wanted to say," "There were moments when the discussion stalled," or "The connection between phases was weak," you can apply these insights to the design of the next retrospective.&lt;/p&gt;

&lt;h4&gt;
  
  
  Circle of Gratitude
&lt;/h4&gt;

&lt;p&gt;This activity is particularly effective in quarterly retrospectives. It's also very effective in overall retrospectives held at the end of a project or release.&lt;/p&gt;

&lt;p&gt;The method is very simple: participants take turns expressing gratitude to the team and each member.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Procedure:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The first person expresses gratitude to the team and to someone (or everyone) in the team.&lt;/li&gt;
&lt;li&gt;The person who just spoke nominates the next person, who then expresses gratitude to each member in the same way. (You can nominate someone who you expressed gratitude in step 1.)&lt;/li&gt;
&lt;li&gt;Once the last person has finished expressing gratitude, declare the completion of the retrospective.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Retrospectives are held &lt;strong&gt;to conduct continuous improvement&lt;/strong&gt;, and by concluding with expressions of gratitude to your colleagues, you can &lt;strong&gt;start the next sprint on a positive note&lt;/strong&gt;. This also leaves a positive impression of the retrospective itself and the overall improvement activities.&lt;/p&gt;

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

&lt;p&gt;This post has become quite lengthy, but that concludes the discussion on the concept of designing retrospectives.&lt;/p&gt;

&lt;p&gt;Retrospectives are one of the representative Scrum events, and I believe they are often conducted in a way where people "just try doing it without really understanding it."&lt;/p&gt;

&lt;p&gt;Since the goal of Scrum is to &lt;strong&gt;increase product value through continuous hypothesis testing and improvement&lt;/strong&gt;, the focus tends to shift towards improving the product or service itself, such as backlogs and sprint reviews.&lt;/p&gt;

&lt;p&gt;However, at the same time, &lt;strong&gt;the core of Scrum is the team&lt;/strong&gt;, and &lt;strong&gt;improving the quality of the team ultimately leads to the quality of the product&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If this article has piqued your interest in retrospectives, I encourage you to take this opportunity to design the retrospective event anew.&lt;/p&gt;

&lt;p&gt;Additionally, if you'd like to discuss or ask questions about this article, or if you'd like me to design and facilitate a retrospective for your team, please feel free to contact me at the email address below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email: &lt;a href="mailto:munchkins.hands@gmail.com"&gt;munchkins.hands@gmail.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lastly, as mentioned at the beginning, I wrote this article intending to for the proposal, so I really appreciate if you can put a &lt;strong&gt;like to my proposal&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://confengine.com/conferences/regional-scrum-gathering-tokyo-2025/proposal/21078" rel="noopener noreferrer"&gt;RSGT 2025 Proposal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading to the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.retrium.com/ultimate-guide-to-agile-retrospectives/five-phases-of-a-successful-retrospective" rel="noopener noreferrer"&gt;The Five Phases of a Successful Retrospective&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/blog/ja/products/gcp/using-the-four-keys-to-measure-your-devops-performance" rel="noopener noreferrer"&gt;Are you an Elite DevOps performer? Find out with the Four Keys Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hirolaboratory.com/lean-coffee-guide-for-agile-teams/" rel="noopener noreferrer"&gt;Lean Coffee Retrospective&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://a.co/d/0f8XKdp" rel="noopener noreferrer"&gt;Agile Retrospectives, Second Edition: A Practical Guide for Catalyzing Team Learning and Improvement&lt;/a&gt; (This is link to Amazon, but not for promotion or affiliates.)&lt;/p&gt;

</description>
      <category>scrum</category>
      <category>agile</category>
      <category>facilitation</category>
    </item>
    <item>
      <title>Why we used Typescript instead of Java on Serverless</title>
      <dc:creator>Sohei Chikama</dc:creator>
      <pubDate>Mon, 03 Feb 2020 15:15:59 +0000</pubDate>
      <link>https://dev.to/csohei/why-we-used-typescript-instead-of-java-on-serverless-39e2</link>
      <guid>https://dev.to/csohei/why-we-used-typescript-instead-of-java-on-serverless-39e2</guid>
      <description>&lt;p&gt;&lt;strong&gt;NOTE about this article&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Since this is related to our business application, I do not write all the things happened to our project in detail and some backgrounds are manipulated. However, I believe that the tech-related parts are all the fact and I tried to write as precisely as possible. I hope this article will help you gain some knowledge and solve your problem with the serverless shift.&lt;br&gt;&lt;br&gt;
This article was copied from my personal blog and not plagiarized from some other place.&lt;br&gt;
&lt;a href="https://munchkins-diary.hatenablog.com/entry/2020/02/03/235920"&gt;Why we used Typescript instead of Java on Serverless&lt;/a&gt; from &lt;a href="https://munchkins-diary.hatenablog.com/"&gt;Junks, GC cannot sweep&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Serverless&lt;/strong&gt; is one of the most modern and highlighted software architecture and recently more and more developers are starting to using it in their own application or services.  &lt;/p&gt;

&lt;p&gt;I also am loving it a lot now and I cannot think of getting back to the self-managed server model anymore.&lt;br&gt;&lt;br&gt;
Basically, if your application is well designed for scaling and distributing, most of the feature we rely on the server application has been lost, I believe.&lt;br&gt;&lt;br&gt;
So these days, I always encourage serverless if asked about the architecture or designs of web service.  &lt;/p&gt;

&lt;p&gt;Btw, since it is a totally different approach from the traditional development method, &lt;strong&gt;Serverless requires us to refresh our knowledge and review the tech stacks we've been using&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What language we should use&lt;/strong&gt; also is one of the things we need to review.&lt;br&gt;&lt;br&gt;
Finally, we started to use *&lt;em&gt;Typescript&lt;/em&gt; and have been working with it for more than 1 and a half years.&lt;br&gt;&lt;br&gt;
And, as just a personal opinion impression though, it was much nicer than we expected it to be.  &lt;/p&gt;

&lt;p&gt;So I would like to write what was a problem with the old tech stack and what was good after switching it to Typescript.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we needed to give up Java
&lt;/h2&gt;

&lt;p&gt;Before talking about the reason for choosing the Typescript. I would like to explain the reason why we gave up the previous tech stacks with one of the most excellent languages, Java.  &lt;/p&gt;

&lt;p&gt;--------------&lt;br&gt;
&lt;strong&gt;NOTE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the first place, I'm an enthusiastic Java Lover and my Mother Tongue also in Java. (Java 4 or 5, when there was no generics feature.)&lt;br&gt;&lt;br&gt;
I have studied about the JVM and was inspired a lot from it as well. I guess it was made by god.&lt;br&gt;&lt;br&gt;
So here &lt;strong&gt;I do not mean to despise or insult Java at all.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Any comments or complaints about Java are not welcomed, just it didn't work well with serverless at the moment.  &lt;/p&gt;

&lt;p&gt;---------------&lt;/p&gt;

&lt;p&gt;Ok, sorry, let's go ahead.  &lt;/p&gt;

&lt;p&gt;We’ve been using Java as the primary language for our service for a long time and we actually know that Java has a lot of advantages like     &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Platform-Free&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Well designed JIT compile&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excellent GC&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Well-structured grammar&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type strong&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supports functional programming recently&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Having a lot of libraries&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trustable communities.&lt;/strong&gt;(Not Oracle, but developers community)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and etc..&lt;br&gt;&lt;br&gt;
We really appreciated it and rely on them a lot.&lt;br&gt;&lt;br&gt;
However, when we tested our code with serverless, we found that Java is not too good to be running on the FaaS service such as AWS Lambda.  &lt;/p&gt;

&lt;p&gt;The reasons are the following.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The overhead to launch the JVM is not ignorable.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moreover, our primary framework Spring took more time for launching containers.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The final package of source code is relatively large. (Sometimes more than 100MB)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard to proxy the requests without using web framework when the number of functions increased&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;G1GC or JIT compile not works well since the container stops very shortly&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can not enjoy the benefit of the platform free since it always running on EC2 with Amazon Linux image.&lt;/strong&gt; (Not cons, but just reduced the reason to use Java)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the problems listed above were so annoying, but here I wanna explain the most troublesome one of the above.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Cold Start of Lambda is too troublesome
&lt;/h3&gt;

&lt;p&gt;The most troublesome thing we faced at first was &lt;strong&gt;the overhead of the cold start&lt;/strong&gt;. Yeah, I guess most of the serverless developers may have faced the same issue.    &lt;/p&gt;

&lt;p&gt;We used AWS Lambda for computing and AWS Lambda launches the container every time a request comes from users.&lt;br&gt;&lt;br&gt;
Once it is launched, it &lt;strong&gt;reuses the same container instance for a while&lt;/strong&gt;, but in the initial launch, &lt;strong&gt;it needs to launch the Java Runtime environment and all the necessary web container or environments of frameworks&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Additionally, &lt;strong&gt;one container can be used to handle just a single request and cannot be used for multiple requests concurrently&lt;/strong&gt; even though your application is ready with hundreds of request threads in your thread pool. It means that when several users send the request to the endpoint at the same time, AWS Lambda needs to launch another Lambda container to handle the other requests.  &lt;/p&gt;

&lt;p&gt;It was so troublesome actually since normally we cannot estimate the number of concurrent requests and hot standby mechanism doesn't work. (even if we make it somehow.) Eventually, it will force users to wait for several seconds to open the page or process the request and we were sure that it will surely degrade the user experience.  &lt;/p&gt;

&lt;p&gt;After seeing how the cold start is annoying, though we’ve already had a lot of codes written in the past several years, finally, we gave them up all and switched to use another language.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why we chose Typescript
&lt;/h2&gt;

&lt;p&gt;Actually, it is a bit shameful though, we’ve decided to use the Typescript from a really early phase without deep thought or comparison with other languages.&lt;br&gt;&lt;br&gt;
However, honestly, we have no choice of using other languages supported by Lambda from the beginning other than Typescript under that circumstance.  &lt;/p&gt;

&lt;p&gt;At first, we have &lt;strong&gt;no choice to use dynamic typing languages&lt;/strong&gt;. The service and code are supposed to be running, supported, maintained and extended for a long time by variously skilled developers. So we would not like to use the dynamic typing languages for serverside.  &lt;/p&gt;

&lt;p&gt;Thus, &lt;strong&gt;Python&lt;/strong&gt; and &lt;strong&gt;Ruby&lt;/strong&gt; were out of options.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt; and &lt;strong&gt;Go&lt;/strong&gt; have a &lt;strong&gt;totally different character from the language we (and other teams) were working on&lt;/strong&gt; and it may take some time for other newbies to catch up.&lt;br&gt;&lt;br&gt;
Of course, we all were aware that these days those 2 languages, especially Golang is winning the share gradually thanks to its nature.&lt;br&gt;&lt;br&gt;
However, the arch change was a too immediate mission and we didn’t have much time to catch it up for ourselves as well. Thus, though those 2 languages were fascinating for us, we gave up using those langs.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of using the Typescript
&lt;/h3&gt;

&lt;p&gt;So finally, we have decided to use Typescript.&lt;br&gt;&lt;br&gt;
The benefits of Typescript are as the following.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type Strong&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Much small size package&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Super fast launch overhead&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Able to reuse the knowledge of javascript and Java&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node libraries and communities are awesome&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suitable for functional programming even compared with the javascript&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Able to write well-structured codes with Class and interface&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As everybody knows, static typing is quite an important factor for the long-running project like B2B so I do not write much about it here. Here I wanna explain how the Typescript worked well with. With other features of the typescript, the type really works well more than we expected.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Less overhead to launch with small packages
&lt;/h2&gt;

&lt;p&gt;Probably this is the most important factor to switch from java to Typescript in serverless. (Other benefits are almost about the benefit of using the Typescript itself)  &lt;/p&gt;

&lt;p&gt;As mentioned in the previous part, Java has overhead to launch the JVM and DI/Web container for the framework.&lt;br&gt;&lt;br&gt;
Additionally, as the nature of Java, it has the following weak point to be used in the AWS Lambda.&lt;br&gt;&lt;br&gt;
Typescript doesn't have those weak points and it resolved our concerns.   &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Multithreading and its eco-system&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Multithreading is a powerful functionality of Java and it really helps us implement the high-performance codes.&lt;br&gt;&lt;br&gt;
Even the JVM itself is using it for the garbage collections to provide great performing runtime.&lt;br&gt;&lt;br&gt;
(See &lt;a href="https://www.oracle.com/technical-resources/articles/java/g1gc.html"&gt;G1GC&lt;/a&gt; or &lt;a href="https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/"&gt;JIT Compile&lt;/a&gt;)  &lt;/p&gt;

&lt;p&gt;However, you will find it takes from 100s milliseconds to several seconds to prepare for all the thread used in the container.&lt;br&gt;&lt;br&gt;
It is small enough and ignorable for the ordinal architecture like client-server running on EC2, but totally not ignorable for serverless applications which is running on the FaaS like Lambda.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typescript is based on the nodejs and it only supports single thread by default.&lt;/strong&gt; (Async or Sync is just controlled by call stack, not by thread)&lt;br&gt;&lt;br&gt;
Thus, the time to launch it is much short than Java with modern frameworks.  &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Big Package Archive&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In serverless, normally, &lt;strong&gt;a small-sized package is preferred.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;When the lambda container is launched, &lt;strong&gt;the container downloads the source code from the AWS managed source bucket in S3.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Time to download the S3 is normally small, but not ignorable if it is 100MB or 200MB.  &lt;/p&gt;

&lt;p&gt;With nodejs, the code size of a package could be relatively small compared with Java.  &lt;/p&gt;

&lt;p&gt;Honestly, I am not too sure why it is even now, but probably for the following reasons. (Please teach me in a comment if you know more.)  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java frameworks are usually comprehensive and can contain a lot of dependent libraries to cover everything, but javascript framework or libraries are more like on-the-spot and doesn't contain unnecessary files so much.&lt;/li&gt;
&lt;li&gt;Javascript can write multiple modules or functions in one file and can maintain it with less effort, but Java requires to design the classes and interfaces with multiple files to write maintainable and well-structured code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actually, when using Java, the packaged jar was nearly &lt;strong&gt;200MB&lt;/strong&gt; at the biggest.&lt;br&gt;&lt;br&gt;
However, with using the nodejs, it could be reduced to &lt;strong&gt;35MB+&lt;/strong&gt; at last.  &lt;/p&gt;

&lt;p&gt;It was partly because we tried to reuse the Spring Tech stack in the previous arch.&lt;br&gt;&lt;br&gt;
However, even after removing the unnecessary dependency and optimization, a package for one function still required 50MB.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Able to use the knowledge and eco-system of javascript
&lt;/h3&gt;

&lt;p&gt;As we have been working on the web service, we have some kinda stacks of knowledge about javascript and nodejs.  &lt;/p&gt;

&lt;p&gt;Through the era of Jquery to the modern javascript like React or Vue, we’ve already learned the pros and cons of it and have obtained some know-how to write good code in javascript.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typescript is a kinda extensive language of javascript and will be transpiled into javascript at last.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Therefore, many of the idiom or grammar is extended from the javascript and we could easily start to write the code without many preparations.  &lt;/p&gt;

&lt;p&gt;Additionally, &lt;strong&gt;most of the useful libraries are providing its type definition&lt;/strong&gt; for the typescript so that we were able to enjoy the benefit of nodejs eco-system as well.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Works well with the functional programming paradigm
&lt;/h3&gt;

&lt;p&gt;Functional programming is quite an important paradigm when we are talking about the tech trend these days.&lt;br&gt;&lt;br&gt;
It will let you write simple, testable, less-dangerous and stable codes with its nature.  &lt;/p&gt;

&lt;p&gt;AWS Lambda always requires us to get rid of the state from our code. &lt;strong&gt;Functional programming is requiring us to isolate the side effect or state from the functions and this idea surely is making our codes for Lambda more maintainable.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Basically, as John Resig told in &lt;a href="https://amzn.to/2Uf82sv"&gt;Secrets of the JavaScript Ninja&lt;/a&gt;, javascript is supporting functional programming from the beginning.&lt;br&gt;&lt;br&gt;
It treats the Function as the first-class object and jquery also were supposed to be written in a functional way as well.  &lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;plain javascript is a dynamic typing&lt;/strong&gt; and it sometimes introduces some difficulties to write good functions.&lt;br&gt;&lt;br&gt;
The variety of functions we can express with a single primitive type is quite limited and using the Object type for the arguments/return value is sometimes troublesome.  &lt;/p&gt;

&lt;p&gt;With typescript, we can specify the type of arguments or return value.  &lt;/p&gt;

&lt;p&gt;Additionally, following functionalities lets you write the code more safe, simple and expressive.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type: Lets you distinguish the common type and its aspects such as &lt;em&gt;string&lt;/em&gt; and &lt;em&gt;UserId&lt;/em&gt; or Promise and Either.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface/Class: Lets you organize the sets of the arguments/return type as suitable for the context in the service.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enum: No explanation necessary I guess.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readonly: Lets you make your objects immutable.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generics: Lets your functional interfaces be more expressive.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Typescript has more advantages for the functional programming, but do not mention them here all. (Partly because it's the advantage of javascript rather than Typescript..)&lt;br&gt;&lt;br&gt;
Please try it and enjoy your discoveries.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Able to reuse the best practice we used in Java
&lt;/h3&gt;

&lt;p&gt;Once you see the tutorial of the typescript, you would find &lt;strong&gt;it is quite similar to the Java or Scala&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;We’ve been trained how to write good code in Java through our long journey with them &lt;strong&gt;to some extent.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
We were aware of how we should design the classes and interfaces, how to use enum efficiently, how to make the stream API maintainable in Java and it was not the thing we can throw away instantly.  &lt;/p&gt;

&lt;p&gt;Thanks to the similarity of Typescript and Java, we could easily take the previous practices over to the new codebase.&lt;br&gt;&lt;br&gt;
Typescript supports the interfaces, classes, access modifier, and readonly properties(equivalent to the final of property in Java) and It actually helped us a lot to reuse the best practices we learned in Java including &lt;strong&gt;Object-oriented programming practices&lt;/strong&gt; and the &lt;strong&gt;Design Patterns&lt;/strong&gt;. (FP and OOP are not antinomy and can be used in the same project, I believe. )  &lt;/p&gt;

&lt;p&gt;If we would have chosen Python or Ruby, probably we needed to struggle again to find how to apply the practices into the new language for a long time,&lt;br&gt;&lt;br&gt;
(Actually, of course, I know it’s a lot of fun, but not for the time in hurry arch change)  &lt;/p&gt;

&lt;p&gt;Of course, we didn’t do the copy-paste of the logics in the existing java classes.&lt;br&gt;&lt;br&gt;
However, even though we re-wrote them with 80% from scratch, it didn’t take much time to write it again with acceptable quality.  &lt;/p&gt;

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

&lt;p&gt;We are still new in the journey of Typescript and needing a lot to learn, but already found a lot of benefits of it and we really are enjoying it.  &lt;/p&gt;

&lt;p&gt;If asked now, probably using the Golang can be an option, using the Micronauts with GraalVM also can be an option or maybe there can be more options we can choose. However, I am really satisfied with the typescript so far and believe it is one of the best options we can choose in serverless.&lt;/p&gt;

&lt;p&gt;Of course, already have faced some difficulties with Typescript and serverless like how to do the batch processing with relatively slow language, how to do the concurrent computing or distributed processing, how to make the workflow, how to overcome the timeout of API Gateway or how to ensure the data consistencies.  &lt;/p&gt;

&lt;p&gt;However, all those things are the most interesting things for us, geeks, to resolve.&lt;br&gt;&lt;br&gt;
Actually, we already have found some practices and have overcome them. I will write it in the near future.  &lt;/p&gt;

&lt;p&gt;If you are struggling with Java on serverless and losing hope for serverless, I strongly suggest you consider Typescript. I can promise that it will work better than you expect it to be.  &lt;/p&gt;

&lt;p&gt;Thanks for reading through this long article. I am happy to receive your comment or contact if any.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>serverless</category>
      <category>java</category>
    </item>
  </channel>
</rss>
