<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Software Engineering</title>
		<link>https://richashworth.com/</link>
		<description>Recent content on Software Engineering</description>
		<generator>Hugo</generator>
		<language>en-gb</language>
		
		
		
		
			<lastBuildDate>Sun, 26 Oct 2025 10:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://richashworth.com/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Introducing Fidra: Monte Carlo Forecasting for Software Teams</title>
				<link>https://richashworth.com/blog/introducing-fidra/</link>
				<pubDate>Sun, 26 Oct 2025 10:00:00 +0000</pubDate>
				<guid>https://richashworth.com/blog/introducing-fidra/</guid>
				<description>&lt;p&gt;Most teams I&amp;rsquo;ve worked with are asked to commit to delivery dates. The&#xA;difficulty is that software timelines are uncertain, and a single-date&#xA;commitment doesn&amp;rsquo;t capture that. When a team says &amp;ldquo;March 15th&amp;rdquo;, it&amp;rsquo;s unclear&#xA;whether that&amp;rsquo;s a best case or a conservative estimate, and stakeholders will&#xA;often hear it as a promise. &lt;a href=&#34;https://fidra.app&#34;&gt;Fidra&lt;/a&gt; is a tool I built to&#xA;make these conversations more effective.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The Friction Matrix: Visualising the Cost of Tech Debt</title>
				<link>https://richashworth.com/blog/the-friction-matrix/</link>
				<pubDate>Mon, 09 Jun 2025 21:01:00 +0000</pubDate>
				<guid>https://richashworth.com/blog/the-friction-matrix/</guid>
				<description>&lt;p&gt;This post outlines a practical, data-driven method for understanding how&#xA;technical debt impacts upcoming deliverables. It helps teams and their&#xA;stakeholders quantify where debt is creating the most friction so they can&#xA;prioritise work to tackle it effectively.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Privacy Policy</title>
				<link>https://richashworth.com/privacy/</link>
				<pubDate>Sat, 18 Jan 2025 00:00:00 +0000</pubDate>
				<guid>https://richashworth.com/privacy/</guid>
				<description>&lt;p&gt;This website respects your privacy and is committed to protecting your personal data.&lt;/p&gt;&#xA;&lt;h3 id=&#34;analytics&#34;&gt;Analytics&lt;/h3&gt;&#xA;&lt;p&gt;We use &lt;a href=&#34;https://counter.dev&#34;&gt;counter.dev&lt;/a&gt; for simple, privacy-friendly analytics. Counter.dev is a privacy-focused analytics service that:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does not use cookies&lt;/li&gt;&#xA;&lt;li&gt;Does not track individual users&lt;/li&gt;&#xA;&lt;li&gt;Does not collect personal information&lt;/li&gt;&#xA;&lt;li&gt;Only collects aggregate statistics about page views and visitor counts&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;data-collection&#34;&gt;Data Collection&lt;/h3&gt;&#xA;&lt;p&gt;The only data collected through counter.dev includes:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Page views&lt;/li&gt;&#xA;&lt;li&gt;Referrer information&lt;/li&gt;&#xA;&lt;li&gt;Browser and device type (aggregated)&lt;/li&gt;&#xA;&lt;li&gt;Country-level geographic data (not precise location)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;No personally identifiable information is collected or stored.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Analysing Subtitles with Natural Language Processing</title>
				<link>https://richashworth.com/blog/analysing-subtitles-with-natural-language-processing/</link>
				<pubDate>Thu, 16 Sep 2021 12:24:53 +0000</pubDate>
				<guid>https://richashworth.com/blog/analysing-subtitles-with-natural-language-processing/</guid>
				<description>&lt;p&gt;A write-up of how we used Natural Language Processing at ITV to analyse how different topics are represented in our content through subtitles.&lt;/p&gt;&#xA;&lt;p&gt;Link to article: &lt;a href=&#34;https://medium.com/itv-technology/analysing-subtitles-with-natural-language-processing-4969071b9839&#34;&gt;https://medium.com/itv-technology/analysing-subtitles-with-natural-language-processing-4969071b9839&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Building A Smarter Business With Event-Driven Architecture</title>
				<link>https://richashworth.com/blog/smarter-business-with-event-driven-architectures/</link>
				<pubDate>Thu, 30 Jul 2020 10:41:00 +0000</pubDate>
				<guid>https://richashworth.com/blog/smarter-business-with-event-driven-architectures/</guid>
				<description>&lt;p&gt;Write-up of how we&amp;rsquo;ve used event-driven architecture at ITV to enable a data-driven approach to the&#xA;content supply chain. By rearchitecting an existing message-driven, microservice-based system, we&#xA;were able to introduce data and analytics capabilities without impacting feature development.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Decision-Making in Autonomous Teams</title>
				<link>https://richashworth.com/blog/decision-making-in-autonomous-teams/</link>
				<pubDate>Sun, 28 Jun 2020 19:22:31 +0000</pubDate>
				<guid>https://richashworth.com/blog/decision-making-in-autonomous-teams/</guid>
				<description>&lt;p&gt;One of the most difficult aspects of a leader&amp;rsquo;s role is striking the right balance between giving&#xA;direction and encouraging teams to make decisions independently. While experience may suggest that a&#xA;particular approach is likely to be the most effective, it&amp;rsquo;s unlikely to be successful unless the&#xA;team commits to it. There&amp;rsquo;s also a chance that better solutions exist, and given the right&#xA;environment, teams will often discover these for themselves. Building that environment and providing&#xA;their teams with &lt;em&gt;just enough&lt;/em&gt; direction is where a leader really adds value.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Interactive Kotlin with kscript and fswatch</title>
				<link>https://richashworth.com/blog/kotlin-worksheets-with-kscript/</link>
				<pubDate>Sun, 31 Mar 2019 08:38:12 +0000</pubDate>
				<guid>https://richashworth.com/blog/kotlin-worksheets-with-kscript/</guid>
				<description>&lt;p&gt;Experimenting with snippets of code and getting rapid feedback is a good way to get up to speed with&#xA;a new language or library. I&amp;rsquo;ve been using Kotlin and &lt;a href=&#34;https://arrow-kt.io&#34;&gt;Λrrow&lt;/a&gt; at work this&#xA;week, so have been looking for tools that help achieve this workflow.&lt;/p&gt;&#xA;&lt;p&gt;Worksheets in IntelliJ provide some of this functionality, but personally I prefer the immediacy of&#xA;a text editor and the command line for this kind of thing. It turns out that&#xA;&lt;a href=&#34;https://github.com/holgerbrandl/kscript&#34;&gt;kscript&lt;/a&gt; adds rich functionality to Kotlin scripts (e.g.&#xA;importing code from other files, jcenter artifacts, etc.), and by combining this with the&#xA;&lt;a href=&#34;https://emcrisostomo.github.io/fswatch&#34;&gt;fswatch&lt;/a&gt; tool, we can approximate the basic features of a&#xA;worksheet without the need to spin up an entire project or IDE.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Scala Central: Functional Design Patterns in Scala</title>
				<link>https://richashworth.com/talks/fp-patterns-scala-talk/</link>
				<pubDate>Wed, 06 Jun 2018 20:05:33 +0000</pubDate>
				<guid>https://richashworth.com/talks/fp-patterns-scala-talk/</guid>
				<description>&lt;p&gt;Video recording of a talk I gave on functional programming at a&#xA;&lt;a href=&#34;https://www.meetup.com/Scala-Central/&#34;&gt;Scala Central&lt;/a&gt; meetup.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Moving to a Startup: The Changing Role of Dev Manager</title>
				<link>https://richashworth.com/talks/moving-to-a-startup-the-changing-role-of-dev-manager/</link>
				<pubDate>Fri, 05 Jan 2018 13:08:23 +0000</pubDate>
				<guid>https://richashworth.com/talks/moving-to-a-startup-the-changing-role-of-dev-manager/</guid>
				<description>&lt;p&gt;Moving from the corporate world to a startup can be an exciting and rewarding experience. As a&#xA;technical leader, there is a lot to adjust to in terms of what the new environment demands from the&#xA;role. That said, there are a number of valuable lessons that can be applied from the corporate&#xA;world. Having made the move myself, I was invited to discuss this on the latest episode of the&#xA;&lt;a href=&#34;http://www.venturi-group.com/podcast/corporate-startup/&#34;&gt;Venturi&amp;rsquo;s Voice podcast&lt;/a&gt;. Recorded in November 2017. Thanks to &lt;a href=&#34;https://twitter.com/andymkdavis&#34;&gt;Andy Davis&lt;/a&gt; and the team for&#xA;having me on the show.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Functional Design Patterns in Scala: 3. Monads</title>
				<link>https://richashworth.com/blog/functional-patterns-in-scala-monads/</link>
				<pubDate>Sat, 30 Dec 2017 18:49:37 +0000</pubDate>
				<guid>https://richashworth.com/blog/functional-patterns-in-scala-monads/</guid>
				<description>&lt;p&gt;Learning (and subsequently trying to explain) monads has become something of a rite of passage in&#xA;functional programming. Burrito analogies aside, the most helpful description I have come across is given by&#xA;Noel Welsh and Dave Gurnell in &lt;a href=&#34;https://underscore.io/books/scala-with-cats/&#34;&#xA;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Scala with Cats&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;A monad is a mechanism for &lt;em&gt;sequencing computations&lt;/em&gt;.&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
			</item>
			<item>
				<title>Functional Design Patterns in Scala: 2. Lenses</title>
				<link>https://richashworth.com/blog/functional-patterns-in-scala-lenses/</link>
				<pubDate>Sat, 24 Jun 2017 09:31:08 +0000</pubDate>
				<guid>https://richashworth.com/blog/functional-patterns-in-scala-lenses/</guid>
				<description>&lt;p&gt;Case classes provide a convenient way of working with immutable objects in scala. Manipulating&#xA;fields within them can be tedious, however. In this post, we will look at how &lt;em&gt;lenses&lt;/em&gt; can be used&#xA;to abstract over this complexity while preserving the benefits of immutability.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Functional Design Patterns in Scala: 1. Monoids</title>
				<link>https://richashworth.com/blog/functional-patterns-in-scala-monoids/</link>
				<pubDate>Tue, 30 May 2017 17:30:45 +0000</pubDate>
				<guid>https://richashworth.com/blog/functional-patterns-in-scala-monoids/</guid>
				<description>&lt;p&gt;Monoids are used to describe an aggregation pattern: whenever we need to combine values of a particular type, a monoid instance helps abstract the mechanics of the aggregation from the program’s business logic. In this post, we will use the &lt;a href=&#34;https://richashworth.com/blog/lcd-digits-kata-with-scala&#34;&gt;LCD Digits kata that we tackled previously&lt;/a&gt; as a motivating example for applying this pattern. The goal here is to transform a sequence of input digits into a string resembling their representation on an LCD display. For example, given the input &lt;span class=&#34;lang:default highlight:0 decode:true crayon-inline &#34;&gt;0123456789&lt;/span&gt;, the program should produce:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Agile Estimation For Distributed Teams</title>
				<link>https://richashworth.com/blog/agile-estimation-for-distributed-teams/</link>
				<pubDate>Mon, 15 Aug 2016 19:24:53 +0000</pubDate>
				<guid>https://richashworth.com/blog/agile-estimation-for-distributed-teams/</guid>
				<description>&lt;p&gt;The teams I&amp;rsquo;m working with use Planning Poker to estimate the size of user stories. This has proved&#xA;to be an extremely useful activity, and we rely on it to plan upcoming work.  In the past, we used&#xA;special card decks for this, which worked well when everyone was based in the same room.  However,&#xA;with team members now distributed across two continents, this quickly became less effective.&lt;/p&gt;&#xA;&lt;p&gt;To address this, we initially tried running the sessions over a conference call, using group chat&#xA;channels to record votes on the items being discussed. However, the quality of estimates noticeably&#xA;deteriorated as a result, with less confident developers waiting to see what others thought before&#xA;voting, and outliers not always being discussed. With distributed IT teams becoming more prevalent,&#xA;a number of online Planning Poker tools have been developed. Since none of the available&#xA;offerings quite met our requirements, I set about building our own. The key features of this version&#xA;are:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Steve Reich’s Clapping Music with Akka</title>
				<link>https://richashworth.com/blog/clapping-music-in-scala/</link>
				<pubDate>Thu, 31 Mar 2016 21:45:02 +0000</pubDate>
				<guid>https://richashworth.com/blog/clapping-music-in-scala/</guid>
				<description>&lt;p&gt;Using functions to express musical ideas is nothing new: Harmony, time signatures, the relations&#xA;between notes in a scale and musical form all have their roots in mathematics, and composers have&#xA;used mathematical abstractions for millennia (see Pythagorean Tuning for a 2500-year-old example).&lt;/p&gt;&#xA;&lt;p&gt;These abstractions, however, are not always obvious from they way that music is written down,&#xA;leading to a potential disconnect between composer and performer. In this post, we will use Steve&#xA;Reich&amp;rsquo;s 1972 Clapping Music to show how functional programming can be used to capture an underlying&#xA;musical idea.&lt;/p&gt;</description>
			</item>
			<item>
				<title>LCD Digits Kata with Scala</title>
				<link>https://richashworth.com/blog/lcd-digits-kata-with-scala/</link>
				<pubDate>Fri, 01 Jan 2016 16:41:39 +0000</pubDate>
				<guid>https://richashworth.com/blog/lcd-digits-kata-with-scala/</guid>
				<description>&lt;p&gt;I recently attended one of the coding dojos run by the &lt;a&#xA;href=&#34;http://www.meetup.com/london-scala/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;London Scala User&#xA;Group&lt;/a&gt;. It was great fun, and I’d recommend getting involved to anyone who’s&#xA;interested in meeting other developers and learning more about scala and functional programming.&#xA;After breaking into groups, we set about tackling the ‘LCD Digits’ problem from &lt;a&#xA;href=&#34;http://cyber-dojo.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;cyber-dojo.org&lt;/a&gt;. Although fairly&#xA;straightforward as a programming challenge, it offers a number of ways to experiment with different&#xA;functional idioms. The goal is to write a program that takes an integer, and formats this as a&#xA;string composed of the ‘.’, ‘_’, “|’ and ” ”&#xA;characters so that the output resembles an LCD display.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Turbocharge Your Mocking Framework With PowerMock</title>
				<link>https://richashworth.com/blog/turbocharge-your-mocking-framework-with-powermock/</link>
				<pubDate>Fri, 16 Mar 2012 01:32:00 +0000</pubDate>
				<guid>https://richashworth.com/blog/turbocharge-your-mocking-framework-with-powermock/</guid>
				<description>&lt;p&gt;As mentioned in my last post, I am an ardent fan of the &lt;a href=&#34;http://code.google.com/p/mockito/&#34;&#xA;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Mockito Framework&lt;/a&gt;. Originally developed as a &lt;a&#xA;href=&#34;http://code.google.com/p/mockito/wiki/MockitoVSEasyMock&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;fork&#xA;of EasyMock&lt;/a&gt;, it equips developers with the tools to create mock objects using clean and&#xA;expressive code. In this post, we will show how &lt;a href=&#34;http://code.google.com/p/powermock/&#34;&#xA;target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PowerMock&lt;/a&gt; can be used alongside Mockito (or EasyMock) to create&#xA;mocks for classes that appear at first ‘unmockable’. Suppose we have the following&#xA;class:&lt;/p&gt;&#xA;&lt;script src=&#34;https://gist.github.com/richashworth/62a558a13631e222e750.js&#34;&gt;&lt;/script&gt;&#xA;&#xA;&lt;p&gt;&amp;hellip;which has a dependency on a DataProvider:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Using Reflection To Create Mock Objects</title>
				<link>https://richashworth.com/blog/using-reflection-to-create-mock-objects/</link>
				<pubDate>Fri, 07 Oct 2011 11:40:11 +0200</pubDate>
				<guid>https://richashworth.com/blog/using-reflection-to-create-mock-objects/</guid>
				<description>&lt;p&gt;Well-established tools like Mockito and EasyMock offer a powerful range of features for defining and&#xA;interacting with mock objects. I use both heavily in my unit tests, and would recommend them to&#xA;anyone looking for a mocking framework. Sometimes, however, a &lt;em&gt;real&lt;/em&gt; (i.e. non-proxied) collaborator&#xA;is called for, or adding third-party libraries may not be an option. In most cases, a suitable&#xA;object could be instantiated by calling the constructor and setting it as a dependency to the object&#xA;under test.  Suppose though that we have the following ‘Footballer’ class, and we want&#xA;to write a test for the ‘getAvgGoalsPerGame()’ method:&lt;/p&gt;</description>
			</item>
			<item>
				<title>About Me</title>
				<link>https://richashworth.com/about/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://richashworth.com/about/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m a technical leader and software engineer with experience in scaling&#xA;high-performing engineering teams.&lt;/p&gt;&#xA;&lt;p&gt;To get in touch, please send a message via LinkedIn. CV available on request.&lt;/p&gt;&#xA;&#xA;&lt;script src=&#34;https://platform.linkedin.com/badges/js/profile.js&#34; async defer type=&#34;text/javascript&#34;&gt;&lt;/script&gt;&#xA;&#xA;&lt;div class=&#34;badge-base LI-profile-badge&#34; data-locale=&#34;en_US&#34; data-size=&#34;large&#34; data-theme=&#34;light&#34; &#xA;  data-type=&#34;HORIZONTAL&#34; data-vanity=&#34;richashworth&#34; data-version=&#34;v1&#34;&gt;&#xA;  &lt;!-- &lt;a class=&#34;badge-base__link LI-simple-link&#34; href=&#34;https://uk.linkedin.com/in/richashworth?trk=profile-badge&#34;&gt;Richard Ashworth&lt;/a&gt; --&gt;&#xA;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Projects</title>
				<link>https://richashworth.com/projects/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://richashworth.com/projects/</guid>
				<description>&lt;!-- Check out my [GitHub profile](https://github.com/richashworth) for examples of some of the projects --&gt;&#xA;&lt;!-- I&#39;ve contributed to. --&gt;&#xA;&lt;!----&gt;&#xA;&lt;!--  --&gt;&#xA;&lt;!-- &lt;div class=&#34;github-card&#34; data-github=&#34;richashworth&#34; data-width=&#34;400&#34; data-height=&#34;150&#34; data-theme=&#34;default&#34;&gt;&lt;/div&gt; --&gt;&#xA;&lt;!----&gt;&#xA;&lt;!-- &lt;script src=&#34;//cdn.jsdelivr.net/github-cards/latest/widget.js&#34;&gt;&lt;/script&gt; --&gt;&#xA;&lt;!--  --&gt;&#xA;&lt;!----&gt;&#xA;&lt;!-- ---- --&gt;&#xA;&lt;h3 id=&#34;fidra&#34;&gt;Fidra&lt;/h3&gt;&#xA;&lt;p&gt;Monte Carlo forecasting for development teams: a tool to predict project completion dates using statistical modeling.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://fidra.app&#34;&gt;Try Fidra&lt;/a&gt; | &lt;a href=&#34;https://richashworth.com/blog/introducing-fidra/&#34;&gt;Blog Post&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://richashworth.com/images/fidra-demo.gif&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;https://richashworth.com/images/fidra-demo.gif&#34; alt=&#34;Fidra&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;planning-poker&#34;&gt;Planning Poker&lt;/h3&gt;&#xA;&lt;p&gt;Agile estimation for distributed teams.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://richashworth.com/blog/agile-estimation-for-distributed-teams&#34;&gt;Blog Post&lt;/a&gt; |&#xA;&lt;a href=&#34;https://github.com/richashworth/planningpoker&#34;&gt;GitHub&lt;/a&gt; |&#xA;&lt;a href=&#34;https://planning-poker.up.railway.app/&#34;&gt;Demo Environment&lt;/a&gt;&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
