{"id":485199,"date":"2026-06-26T14:42:18","date_gmt":"2026-06-26T14:42:18","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=485199"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=485199","title":{"rendered":"The Value of Complaining Properly"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>How we turned unresolved problems into one of our most valuable efficiency boosts<\/em><\/p>\n<p>At the end of 2023, just after we\u2019d been through a successful Agile transformation, we realised we had a problem with complaints. Not that we had too many of them, but that they weren\u2019t changing anything. We were failing to make proper use of a Scrum ceremony called the sprint retrospective, one of the key meetings in the Scrum framework.<\/p>\n<p>Used properly, sprint retrospectives are a powerful method of voicing problems and, crucially, finding their solutions. We were good at voicing problems. But we weren\u2019t doing very well at finding solutions.\u00a0<\/p>\n<p>We were running retrospectives that were, in theory, useful. But in practice, they felt pointless. We spent an hour venting and getting cross about problems, and then at the next retrospective we\u2019d talk about exactly the same issues. During the course of the sprint, nothing changed.\u00a0<\/p>\n<p>Scrum defines the purpose of retrospective as \u201cto plan ways to increase quality and effectiveness.\u201d That wasn\u2019t what we got out of them. We just did a lot of complaining.\u00a0<\/p>\n<p>We complained about the quality of requests coming in from other teams, the missing context needed to analyse them and how much time it was costing the team to produce answers. We complained about who was responsible for tasks not reaching the release. And sometimes we even found someone to blame. But because we didn\u2019t have a process to resolve any of the complaints, nothing changed.<\/p>\n<p>We realised that if we were going to spend time complaining, we should at least do it constructively.<\/p>\n<h3>Why our retrospectives weren\u2019t working<\/h3>\n<p>A few years ago, our retros felt like a rushed therapy session. In an hour, we tried to recall everything that had annoyed us over the past two weeks. It was hard for two reasons.<\/p>\n<ol>\n<li>\n<p>We had to dig up problems from across the sprint because there was no shared space to capture them as they happened.<\/p>\n<\/li>\n<li>\n<p>Once someone raised an issue, nothing was done about it. There was no plan for resolving the problem.<\/p>\n<\/li>\n<\/ol>\n<p>We were using retrospectives as a rage room: a place to vent and then move on, with no follow up or resolution.\u00a0<\/p>\n<p>Meanwhile, genuinely suboptimal processes weren\u2019t discussed, such as the way we operated load distribution. In theory, we were meant to share responsibility for release outcomes. What actually happened is the QA engineer organised the release process on their own. I know this because I spent hours doing it. And we didn\u2019t share knowledge properly; critical information lived in individuals\u2019 heads rather than in accessible documentation. But because our retrospectives weren\u2019t being run properly, we never dealt with these problems.\u00a0<\/p>\n<h3>Building a productive way to complain<\/h3>\n<p>Once we\u2019d identified why the retrospectives weren\u2019t working, we set about fixing them.\u00a0<\/p>\n<p>Instead of trying to remember problems at the end of a sprint, we started logging issues as they happened. We created a shared board in Miro so when we got to the retro, we already had a ready backlog of pain points, wins and open questions.<\/p>\n<p>We created a resolution template so every complaint ended with an action item and an owner, rather than being left as a complaint. By making someone responsible we turned it into a problem looking for a solution, rather than an open-ended complaint.\u00a0<\/p>\n<p>And we stopped looking for who was at fault and started looking for the bottleneck in the process. Mediation replaced blame, which made it easier for people to raise concerns.\u00a0<\/p>\n<p>Here are four real examples of how complaining with purpose changed things for us.<\/p>\n<h4>1. A bot for scheduling on-call shifts<\/h4>\n<p>On-call duties are an important part of how our team operates. They include monitoring overnight test runs and fixing flaky tests, answering questions from internal stakeholders and helping to localise production incidents. They\u2019re part of the job; not the most popular one, perhaps, but essential for a product as complex and critical as ours.\u00a0<\/p>\n<p>But we didn\u2019t manage them very well. We tracked the rotation in an Excel spreadsheet, filling in weekends and public holidays by hand. Everyone hated it. We started griping about updating the spreadsheet, but instead of the griping becoming a problem in itself, we turned it into a solution.\u00a0<\/p>\n<p>We built a bot. The bot now handles the rota (using a database instead of Excel) and sends notifications to the team channel.<\/p>\n<p>The bot then spread to other teams and became a popular internal product. It no longer just allocates shifts; it accounts for holidays and removed any unfairness associated with a human picking the rota uses a random draw when someone needs to cover unexpectedly. And you cannot argue with randomness.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/318\/e96\/dfb\/318e96dfb7efa577f65103368c2c2746.png\" width=\"1280\" height=\"716\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/318\/e96\/dfb\/318e96dfb7efa577f65103368c2c2746.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/318\/e96\/dfb\/318e96dfb7efa577f65103368c2c2746.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>2. Balancing the workload<\/h4>\n<p>Our release procedure involves more than ten mandatory steps, covering formal sign-offs and quality acceptance testing in the staging environment. The whole process takes up to three or four hours per release. Historically, it all fell on QA. For everyone apart from the QA engineers, this was helpfully convenient. For the QA engineers, it was not.<\/p>\n<p>We wrote out the procedure step by step and began sharing release ownership with the development team, using the same bot we used for the on-call rota. We increased the release frequency from once a sprint (every two weeks), to weekly, which cuts the volume of work to be done in one hit. And if nothing else, we have a much happier bunch of QA engineers.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f7d\/b5b\/799\/f7db5b799fa4cfe35b4463e8a39837d2.png\" width=\"1269\" height=\"716\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f7d\/b5b\/799\/f7db5b799fa4cfe35b4463e8a39837d2.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f7d\/b5b\/799\/f7db5b799fa4cfe35b4463e8a39837d2.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h4>3. Fixing the grooming<\/h4>\n<p>We used to repeatedly blow sprints because of poorly defined requirements and mid-sprint rethinking of tasks. After several retrospective discussions, we overhauled our grooming sessions (another Scrum ceremony) to include deep task analysis and mandatory acceptance criteria. In parallel, we introduced shift-left practices in analysis and testing. The result was more predictable sprints: well-defined tasks generate fewer questions during implementation.<\/p>\n<h4>4. A platform for any question (even the small ones)<\/h4>\n<p>One of our developers kept coming to QA to get an authorisation token for developing and testing internal services. It disrupted both sides every time; he had to come to us, and we had to stop what we were doing to help him. Yet, no one stopped to ask how we could improve the situation.<\/p>\n<p>It wasn\u2019t until our retrospectives became a safe space\u2014allowing him to finally vent about how inconvenient this was\u2014that things changed. The team immediately suggested a few simple ways for him to generate the token himself. As a result, he got the autonomy he needed, and we eliminated an unnecessary context switch for both sides.<\/p>\n<h3>How complaining improved our working life<\/h3>\n<p>First, the team became a more comfortable place to work. Second, our incident numbers dropped by 76%. In two years of active process work, we cut the number of production incidents from 87 to 21, while both system complexity and release frequency continued to grow.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6d5\/c5f\/31c\/6d5c5f31c13df0c2a51e18b0f2df9b7d.png\" width=\"900\" height=\"630\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6d5\/c5f\/31c\/6d5c5f31c13df0c2a51e18b0f2df9b7d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6d5\/c5f\/31c\/6d5c5f31c13df0c2a51e18b0f2df9b7d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p><em>A note on severity levels: our production incident prioritisation runs from SEV-1 (highest) to SEV-4 (lowest).<\/em><\/p>\n<ul>\n<li>\n<p>2022\u20132023: 87 incidents. The starting point. Mostly low-severity noise (55 SEV-4 incidents) with a significant number of SEV-3 (32 incidents).<\/p>\n<\/li>\n<li>\n<p>2023\u20132024: 45 incidents. First results. The total count dropped by nearly half. We started filtering requirements more carefully at the input stage.<\/p>\n<\/li>\n<li>\n<p>2024\u20132025: 21 incidents. Another drop of more than 50%. Critical incidents (SEV-1\/2) are now counted in single digits.<\/p>\n<\/li>\n<\/ul>\n<p>It wasn\u2019t always easy. Motivating the team took effort. There were moments when people wanted to abandon the whole thing and return to the old, comfortable chaos. But we persisted, and eventually the new process became a habit.<\/p>\n<p><strong>The three most useful things we learned\u00a0<\/strong><\/p>\n<ol>\n<li>\n<p>Talk about difficulties. As in any relationship, things tend to get resolved when you name them clearly and calmly.<\/p>\n<\/li>\n<li>\n<p>Don\u2019t let problems accumulate. Log them as they arise. Better still, set up a shared space where the whole team can capture issues in real time and keep them until the next retro.<\/p>\n<\/li>\n<li>\n<p>Automate whatever annoys you. If a process can be handed to a bot, hand it to a bot.<\/p>\n<\/li>\n<\/ol>\n<p>Complaining is a powerful tool when it\u2019s used properly, but it\u2019s a starting point. It\u2019s what you do with the complaints that makes the difference.\u00a0<\/p>\n<p><em>If you want to go deeper, I recommend Agile Retrospectives: Making Good Teams Great by Esther Derby and Diana Larsen.<\/em><\/p>\n<p><em>Ksyusha Ivannikova is a QA Lead at EXANTE<\/em><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1052432\/\">https:\/\/habr.com\/ru\/articles\/1052432\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>How we turned unresolved problems into one of our most valuable efficiency boostsAt the end of 2023, just after we\u2019d been through a successful Agile transformation, we realised we had a problem with complaints. Not that we had too many of them, but that they weren\u2019t changing anything. We were failing to make proper use of a Scrum ceremony called the sprint retrospective, one of the key meetings in the Scrum framework.Used properly, sprint retrospectives are a powerful method of voicing problems and, crucially, finding their solutions. We were good at voicing problems. But we weren\u2019t doing very well at finding solutions.\u00a0We were running retrospectives that were, in theory, useful. But in practice, they felt pointless. We spent an hour venting and getting cross about problems, and then at the next retrospective we\u2019d talk about exactly the same issues. During the course of the sprint, nothing changed.\u00a0Scrum defines the purpose of retrospective as \u201cto plan ways to increase quality and effectiveness.\u201d That wasn\u2019t what we got out of them. We just did a lot of complaining.\u00a0We complained about the quality of requests coming in from other teams, the missing context needed to analyse them and how much time it was costing the team to produce answers. We complained about who was responsible for tasks not reaching the release. And sometimes we even found someone to blame. But because we didn\u2019t have a process to resolve any of the complaints, nothing changed.We realised that if we were going to spend time complaining, we should at least do it constructively.Why our retrospectives weren\u2019t workingA few years ago, our retros felt like a rushed therapy session. In an hour, we tried to recall everything that had annoyed us over the past two weeks. It was hard for two reasons.We had to dig up problems from across the sprint because there was no shared space to capture them as they happened.Once someone raised an issue, nothing was done about it. There was no plan for resolving the problem.We were using retrospectives as a rage room: a place to vent and then move on, with no follow up or resolution.\u00a0Meanwhile, genuinely suboptimal processes weren\u2019t discussed, such as the way we operated load distribution. In theory, we were meant to share responsibility for release outcomes. What actually happened is the QA engineer organised the release process on their own. I know this because I spent hours doing it. And we didn\u2019t share knowledge properly; critical information lived in individuals\u2019 heads rather than in accessible documentation. But because our retrospectives weren\u2019t being run properly, we never dealt with these problems.\u00a0Building a productive way to complainOnce we\u2019d identified why the retrospectives weren\u2019t working, we set about fixing them.\u00a0Instead of trying to remember problems at the end of a sprint, we started logging issues as they happened. We created a shared board in Miro so when we got to the retro, we already had a ready backlog of pain points, wins and open questions.We created a resolution template so every complaint ended with an action item and an owner, rather than being left as a complaint. By making someone responsible we turned it into a problem looking for a solution, rather than an open-ended complaint.\u00a0And we stopped looking for who was at fault and started looking for the bottleneck in the process. Mediation replaced blame, which made it easier for people to raise concerns.\u00a0Here are four real examples of how complaining with purpose changed things for us.1. A bot for scheduling on-call shiftsOn-call duties are an important part of how our team operates. They include monitoring overnight test runs and fixing flaky tests, answering questions from internal stakeholders and helping to localise production incidents. They\u2019re part of the job; not the most popular one, perhaps, but essential for a product as complex and critical as ours.\u00a0But we didn\u2019t manage them very well. We tracked the rotation in an Excel spreadsheet, filling in weekends and public holidays by hand. Everyone hated it. We started griping about updating the spreadsheet, but instead of the griping becoming a problem in itself, we turned it into a solution.\u00a0We built a bot. The bot now handles the rota (using a database instead of Excel) and sends notifications to the team channel.The bot then spread to other teams and became a popular internal product. It no longer just allocates shifts; it accounts for holidays and removed any unfairness associated with a human picking the rota uses a random draw when someone needs to cover unexpectedly. And you cannot argue with randomness.2. Balancing the workloadOur release procedure involves more than ten mandatory steps, covering formal sign-offs and quality acceptance testing in the staging environment. The whole process takes up to three or four hours per release. Historically, it all fell on QA. For everyone apart from the QA engineers, this was helpfully convenient. For the QA engineers, it was not.We wrote out the procedure step by step and began sharing release ownership with the development team, using the same bot we used for the on-call rota. We increased the release frequency from once a sprint (every two weeks), to weekly, which cuts the volume of work to be done in one hit. And if nothing else, we have a much happier bunch of QA engineers.3. Fixing the groomingWe used to repeatedly blow sprints because of poorly defined requirements and mid-sprint rethinking of tasks. After several retrospective discussions, we overhauled our grooming sessions (another Scrum ceremony) to include deep task analysis and mandatory acceptance criteria. In parallel, we introduced shift-left practices in analysis and testing. The result was more predictable sprints: well-defined tasks generate fewer questions during implementation.4. A platform for any question (even the small ones)One of our developers kept coming to QA to get an authorisation token for developing and testing internal services. It disrupted both sides every time; he had to come to us, and we had to stop what we were doing to help him. Yet, no one stopped to ask how we could improve the situation.It wasn\u2019t until our retrospectives became a safe space\u2014allowing him to finally vent about how inconvenient this was\u2014that things changed. The team immediately suggested a few simple ways for him to generate the token himself. As a result, he got the autonomy he needed, and we eliminated an unnecessary context switch for both sides.How complaining improved our working lifeFirst, the team became a more comfortable place to work. Second, our incident numbers dropped by 76%. In two years of active process work, we cut the number of production incidents from 87 to 21, while both system complexity and release frequency continued to grow.A note on severity levels: our production incident prioritisation runs from SEV-1 (highest) to SEV-4 (lowest).2022\u20132023: 87 incidents. The starting point. Mostly low-severity noise (55 SEV-4 incidents) with a significant number of SEV-3 (32 incidents).2023\u20132024: 45 incidents. First results. The total count dropped by nearly half. We started filtering requirements more carefully at the input stage.2024\u20132025: 21 incidents. Another drop of more than 50%. Critical incidents (SEV-1\/2) are now counted in single digits.It wasn\u2019t always easy. Motivating the team took effort. There were moments when people wanted to abandon the whole thing and return to the old, comfortable chaos. But we persisted, and eventually the new process became a habit.The three most useful things we learned\u00a0Talk about difficulties. As in any relationship, things tend to get resolved when you name them clearly and calmly.Don\u2019t let problems accumulate. Log them as they arise. Better still, set up a shared space where the whole team can capture issues in real time and keep them until the next retro.Automate whatever annoys you. If a process can be handed to a bot, hand it to a bot.Complaining is a powerful tool when it\u2019s used properly, but it\u2019s a starting point. It\u2019s what you do with the complaints that makes the difference.\u00a0If you want to go deeper, I recommend Agile Retrospectives: Making Good Teams Great by Esther Derby and Diana Larsen.Ksyusha Ivannikova is a QA Lead at EXANTE\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1052432\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-485199","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=485199"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485199\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=485199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=485199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=485199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}