<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Evolvable Me</title>
	<atom:link href="http://www.grahamlea.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.grahamlea.com/</link>
	<description>Graham Lea</description>
	<lastBuildDate>Mon, 04 Aug 2025 05:16:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Are We Making Progress On Climate Action?</title>
		<link>https://www.grahamlea.com/2025/08/climate-change-action-are-we-making-progress/</link>
					<comments>https://www.grahamlea.com/2025/08/climate-change-action-are-we-making-progress/#respond</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Sun, 03 Aug 2025 13:38:31 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<guid isPermaLink="false">https://www.grahamlea.com/?p=1293</guid>

					<description><![CDATA[<p>Climate Change: You've heard a lot about it, and seen a lot being done about it. But are we making progress? Here's two relevant charts...<br />
 <a href="https://www.grahamlea.com/2025/08/climate-change-action-are-we-making-progress/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2025/08/climate-change-action-are-we-making-progress/">Are We Making Progress On Climate Action?</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Climate Change is an <a href="https://press.un.org/en/2021/sc14445.doc.htm">existential threat</a>.<br>It&#8217;s a massive problem, and it requires massive changes for us to solve it.</p>



<p>I&#8217;m sure you&#8217;ve heard a lot about it, and seen a lot being done about it.</p>



<p>But are we making progress? Let&#8217;s take a quick look:</p>



<h2 class="wp-block-heading has-medium-font-size">CO2 Emissions Are Still Increasing Most Years</h2>



<p>To get climate change under control, we need to get greenhouse gas emissions from human activities first to stop rising, then down to zero (or negative!). Here&#8217;s a chart about CO2 emissions, which is the largest category of GHGs (75%).</p>



<span id="more-1293"></span>



<iframe width="600" height="330" src="//embed.chartblocks.com/1.0/?c=688f0a5b3ba0f63d57711f6b&#038;t=358892e92250b76" frameBorder="0" title="Stacked area chart of Annual CO2 emissions worldwide, from 1975 to 2023, split by high-income countries vs others. Source data: Global Carbon Budget via Our World In Data"></iframe>



<p>As of 2023 (where this dataset ends), <strong>CO2 emissions were still going up</strong> most years. This is obviously not good. Climate models that show how to limit global warming to +1.5ºC <a href="https://www.ipcc.ch/report/ar6/syr/downloads/report/IPCC_AR6_SYR_SPM.pdf">rely on emissions peaking between 2020 and 2025</a>, and roughly halving by just 2030.</p>



<p>If you spend enough time online, you might have seen the above summarised by an anti-renewables campaigner as <em>&#8220;We&#8217;ve spent all this money, and it hasn&#8217;t even stopped emissions going up!&#8221;</em></p>



<h2 class="wp-block-heading has-medium-font-size">But ! &#8230; Peak CO2 Emissions Is Very Close</h2>



<p>     &#8230; and already in the past for many countries.</p>



<p>While looking at continually growing emissions is not a great feeling, looking at the <em>rate of growth</em> (the <a href="https://www.youtube.com/watch?v=9vKqVkMQHKk">first derivative</a> of the above chart) shows us some very encouraging signs: </p>



<ol class="wp-block-list">
<li>In <strong>high-income countries</strong>, emissions are already <strong>heading down</strong>, not up. They&#8217;ve been doing this <strong>for 15 years </strong>now. And the world hasn&#8217;t ended.</li>



<li>While the <strong>rest of the world</strong> had a period of rapid growth in emissions, that <strong>growth has rapidly reduced</strong>. They&#8217;re still emitting a lot each year, but at least the amount isn&#8217;t growing quickly any more.</li>



<li>The <strong>total CO2 emissions</strong> of the world is now <strong>very close to going negative</strong>, averaging growth of less than 1% per year for the last decade.</li>
</ol>



<iframe width="600" height="330" src="//embed.chartblocks.com/1.0/?c=688f0c593ba0f65558711f66&#038;t=b13e5d05f337879" frameBorder="0" title="Line chart of Annual CO2 Emissions growth percentage worldwide, from 1975 to 2023, split by high-income countries vs others. Source data: Global Carbon Budget via Our World In Data"></iframe>



<p>In short, the richest nations are <em>already</em> weaning themselves off fossil fuels (and seemingly faster as time progresses) while the rest of the world looks like they&#8217;ll be following that lead soon.</p>



<h2 class="wp-block-heading has-medium-font-size">Some Reasons To Be Hopeful</h2>



<p>It&#8217;s disappointing that we&#8217;re only now looking like we&#8217;re about to turn the corner of preventing emissions from increasing, and we still have to reverse 200 years of growth in a very short time frame. But there&#8217;s some <a href="https://fs.blog/mental-model-feedback-loops/">positive feedback loops</a> that might help swing things around rather rapidly:</p>



<ul class="wp-block-list">
<li>A significant portion of fossil fuels are used just to extract, process, and transport fossil fuels! So as we start <em>consuming</em> less fossil fuels, that in turn <em>requires</em> less fossil fuels to get them out of the ground and into a burning machine somewhere. If we&#8217;re lucky, perhaps the sources that require the most in-process emissions will be the first to be left in the ground.</li>



<li>Many renewable energy assets (solar panels, wind turbines, batteries, EVs) currently have significant CO2 emissions in their supply chains from mining, industrial processes, and transport, simply because that&#8217;s where a lot of our energy comes from today. As we deploy these assets, building the next generation of renewable assets will result in <em>less</em> emissions, because they&#8217;ll be partially built using clean energy. Each time we go around that cycle, replacing a given amount of fossil fuels with a renewable asset &#8220;costs&#8221; us less emissions than replacing the same FF amount did previously.</li>



<li>The rate at which we&#8217;re deploying solar and wind power is <a href="https://www.carbonbrief.org/wind-and-solar-are-fastest-growing-electricity-sources-in-history/">the fastest in history</a>, and it looks like it&#8217;s still getting faster. Battery energy storage system (BESS) prices are still plummeting most years, and EVs are only just getting a foothold in many countries but rapidly accelerating on their take-over of the transport world. If these exponential tailwinds continue, there&#8217;s a good chance that GHG emissions could drop off not gradually but precipitously &#8211; though this relies on renewables deployment outpacing growth in energy demand.</li>
</ul>



<h2 class="wp-block-heading has-medium-font-size">So, Are We Making Progress On Climate Action?</h2>



<p><strong>Absolutely, yes!</strong></p>



<p>By zooming in on growth rates and separating out the leading nations vs the followers, we can see the trend that is happening amongst the world&#8217;s richest nations: the massive win which is the now <em>negative</em> growth (i.e. contraction) in CO2 emissions. And as that trend is moving further away from zero, it&#8217;s an <em>accelerating</em> shift. We also see that the rest of the world is not too far behind in terms of moving closer to a phase where they&#8217;re shrinking their fossil fuel dependence.</p>



<p>Of course, we <em>should</em> be going faster. <a href="https://www.grahamlea.com/2024/11/climate-action-accelerate-safely/">As fast as practical</a>! But the efforts we&#8217;ve been putting in over recent decades are paying off, and there&#8217;s reasons to hope that a rapid downwards shift in emissions across the globe is just around the corner.</p>



<p></p>



<h3 class="wp-block-heading">Charts Data Source</h3>



<p><a href="https://ourworldindata.org/co2-emissions">Global Carbon Budget (2024) – with major processing by Our World in Data</a></p>
<p>The post <a href="https://www.grahamlea.com/2025/08/climate-change-action-are-we-making-progress/">Are We Making Progress On Climate Action?</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2025/08/climate-change-action-are-we-making-progress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Climate Action: Accelerate. Safely. But, Accelerate.</title>
		<link>https://www.grahamlea.com/2024/11/climate-action-accelerate-safely/</link>
					<comments>https://www.grahamlea.com/2024/11/climate-action-accelerate-safely/#comments</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Fri, 29 Nov 2024 13:26:35 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<guid isPermaLink="false">https://www.grahamlea.com/?p=1286</guid>

					<description><![CDATA[<p>Why can&#8217;t nuclear power help Australia solve the climate crisis? Read on to find out. I Had To Explain The Energy Transition To My Local Federal MP&#8230; My local Australian Federal MP, a member of the Liberal party (that&#8217;s roughly &#8230; <a href="https://www.grahamlea.com/2024/11/climate-action-accelerate-safely/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2024/11/climate-action-accelerate-safely/">Climate Action: Accelerate. Safely. But, Accelerate.</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignright size-full is-resized"><a href="https://www.grahamlea.com/wp-content/uploads/2024/11/SolveClimateOrDebateNuclearMeme.jpg"><img fetchpriority="high" decoding="async" width="524" height="499" src="https://www.grahamlea.com/wp-content/uploads/2024/11/SolveClimateOrDebateNuclearMeme.jpg" alt="" class="wp-image-1287" style="width:353px;height:auto" srcset="https://www.grahamlea.com/wp-content/uploads/2024/11/SolveClimateOrDebateNuclearMeme.jpg 524w, https://www.grahamlea.com/wp-content/uploads/2024/11/SolveClimateOrDebateNuclearMeme-300x286.jpg 300w, https://www.grahamlea.com/wp-content/uploads/2024/11/SolveClimateOrDebateNuclearMeme-315x300.jpg 315w" sizes="(max-width: 524px) 100vw, 524px" /></a></figure>
</div>


<p><strong><em>Why can&#8217;t nuclear power help Australia solve the climate crisis?</em></strong></p>



<p>Read on to find out.</p>



<h1 class="wp-block-heading">I Had To Explain The Energy Transition To My Local Federal MP&#8230;</h1>



<p>My local Australian Federal MP, a member of the Liberal party (that&#8217;s roughly equivalent to Republican / Tory / conservative, for overseas readers) &#8211; posted a video on Facebook implying that recent blackouts in the area, as well as increasing energy costs, are Labor&#8217;s fault. It accused Labor of making energy security &#8220;partisan&#8221;, and called for &#8220;a mature debate&#8221;.</p>



<p>I replied, trying to stay as factual as I could, pointing out that the blackouts in NSW are the result of one third (4 out of 12) of our coal power plants being out of action, nothing to do with (unmentioned but dog-whistled in &#8220;Labor&#8217;s energy plan&#8221;) renewables, and that the finger point for a lack of energy supply likely shouldn&#8217;t go to the government that only came into power 2.5 years ago, but the (Liberal + Nationals) one that was in power for the decade before that and did little to prepare for the inevitable exit and breakdown of many ageing coal plants.</p>



<p>He replied &#8211; politely, I will say &#8211; asking:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Should we be closing coal early and taking it offline?<br>That is what is in the AEMO plan.</p>
</blockquote>



<span id="more-1286"></span>



<p>&#8230; along with platitudes that he is focused on the future, not what previous governments could have done differently. He also dropped in a recent quote from a very highly-paid, conservative-leaning, and polarising former bigwig of the public service, which included, <em>&#8220;We are rushing into a third-world country.&#8221;</em></p>


<div class="wp-block-image">
<figure class="alignright size-full is-resized"><a href="https://www.spicybaboon.com.au/products/its-a-trap-&#x2757;-sticker" target="_blank" rel="noreferrer noopener"><img loading="lazy" decoding="async" width="800" height="800" src="https://www.grahamlea.com/wp-content/uploads/2024/11/it-s-a-trap-sticker-39922710413597_800x.png.webp" alt="" class="wp-image-1288" style="width:226px;height:auto" srcset="https://www.grahamlea.com/wp-content/uploads/2024/11/it-s-a-trap-sticker-39922710413597_800x.png.webp 800w, https://www.grahamlea.com/wp-content/uploads/2024/11/it-s-a-trap-sticker-39922710413597_800x.png-300x300.webp 300w, https://www.grahamlea.com/wp-content/uploads/2024/11/it-s-a-trap-sticker-39922710413597_800x.png-150x150.webp 150w, https://www.grahamlea.com/wp-content/uploads/2024/11/it-s-a-trap-sticker-39922710413597_800x.png-768x768.webp 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></a></figure>
</div>


<p>Here&#8217;s the thing about that question, though:<br><strong>IT&#8217;S A TRAP!</strong></p>



<p>Wrapped up in the notion of &#8220;early&#8221; is some sense that there&#8217;s an inherent reason <em>not</em> to close a coal plant before&#8230; well, when, exactly?</p>



<p>Anti-climate action folks like to play on this notion imbued in that word &#8220;early&#8221; to try to make climate action advocates look like we want to <em>waste things</em>, or perhaps even <em>ruin society</em>! (Ye gods, could <em>anything</em> be further from the truth?!)</p>



<p>So, I thought that trap needed addressing.</p>



<h1 class="wp-block-heading">Now You Can Read About It Too&#8230;</h1>



<p>Since he&#8217;d taken the time to write a polite, sensibly-lengthed reply, and asked a question of me, I took the time to respond in kind, though, admittedly, with a bit of passion thrown in. But I answered his question honestly &#8211; and thoroughly &#8211; I checked my facts, and I walked through the logic of why nuclear doesn&#8217;t get to have a &#8216;Climate Action&#8217; badge slapped on it in Australia.</p>



<p>Proof-reading it before sending it to Zuck&#8217;s cloud, I thought, &#8220;Hey this isn&#8217;t half bad. Other people might benefit from reading this.&#8221; So, here it is. Hope it&#8217;s useful to you in understanding and/or explaining to others where we find ourselves.</p>



<p>I wrote&#8230;</p>



<h1 class="wp-block-heading">Thank You For Your Reply</h1>



<p>I think it&#8217;s important we are clear with people about what &#8220;early&#8221; means. Early in regards to closing coal plants does not mean &#8220;earlier than when the grid is ready&#8221;. It means &#8220;earlier than when the plant owners currently plan to switch them off&#8221;.&nbsp;</p>



<p>Should we close coal plants &#8220;early&#8221; if we can? Absolutely! We should be ending all use of fossil fuels AS SOON AS PRACTICAL. Solving the climate crisis depends upon this transition happening right now, and rapidly. We should all be heavily invested in making &#8220;as soon as practical&#8221; earlier, wherever we can. So yeah, if we can accelerate when we can switch off coal generators, 100% we should do that.</p>



<p>This does not imply putting the grid in a bad state!<br>It is about accelerating the grid&#8217;s transition into a better state, where coal isn&#8217;t needed.</p>



<p>How do we bring forward the date when we can safely turn off coal generators? Simply: By accelerating the deployment of firmed renewables and their integration into the grid ASAP.</p>



<h2 class="wp-block-heading">On nuclear power: It has no role to play in accelerating the transition [in Australia]</h2>



<p>Unequivocally. Why?</p>



<p>Currently half of remaining coal fleet owners WANT to retire their plants by 2035, with those closures being voluntarily brought earlier all the time. <a href="https://aemo.com.au/-/media/files/major-publications/isp/2024/2024-integrated-system-plan-isp.pdf?la=en">AEMO&#8217;s ISP (that&#8217;s the long-term national plan for Australia&#8217;s electricity) </a><a href="https://aemo.com.au/-/media/files/major-publications/isp/2024/2024-integrated-system-plan-isp.pdf?la=en" target="_blank" rel="noreferrer noopener">advises</a><a href="https://aemo.com.au/-/media/files/major-publications/isp/2024/2024-integrated-system-plan-isp.pdf?la=en"> us</a> that, for Australia to meet our climate goals, that needs to be closer to 90% by 2035.</p>



<p>There is no pathway by which starting a nuclear power industry here is going to deliver any power before 2035, and yet ALMOST ALL of our coal should be replaced BEFORE then to meet our goals. That means it can only be replaced by firmed renewables. (Or those who speak on behalf of the gas lobby might say lots more gas, too. But that would be giving up on the climate goals.) </p>



<p>What&#8217;s great news is this: Renewables don&#8217;t need a debate, don&#8217;t need a new industry, don&#8217;t need 15+ years of lead time, and don&#8217;t need to be 100% bankrolled by taxpayers. Firmed renewables are available now, are cheap, and constantly getting cheaper, and there&#8217;s a huge industry and workforce ready and willing to roll them out.</p>



<p>There is a narrative from fossil fuel lobbies and many conservative politicians and pundits, trying to fool people into thinking that the people most vocal about climate action want to do it faster than it&#8217;s safe to do. That is a straw man argument.</p>



<p>What people concerned about the future want is to <strong>accelerate a safe and just transition</strong>, not a transition faster than is practical. That is why all this talk about nuclear is so infuriating and concerning, because a plan for replacing coal with nuclear power in Australia can only achieve delay, not acceleration.</p>



<p>P.S. I think talk of Australia becoming a third-world nation is farcical hyperbole, and I don&#8217;t think it belongs in a mature debate, as your video calls for.</p>
<p>The post <a href="https://www.grahamlea.com/2024/11/climate-action-accelerate-safely/">Climate Action: Accelerate. Safely. But, Accelerate.</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2024/11/climate-action-accelerate-safely/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Microservices: The Benefits and Costs</title>
		<link>https://www.grahamlea.com/2023/02/microservices-benefits-and-costs/</link>
					<comments>https://www.grahamlea.com/2023/02/microservices-benefits-and-costs/#respond</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Thu, 09 Feb 2023 07:25:31 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[continuous-integration]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[teams]]></category>
		<category><![CDATA[trade-offs]]></category>
		<guid isPermaLink="false">https://www.grahamlea.com/?p=1262</guid>

					<description><![CDATA[<p>If you work in tech, you&#8217;ve almost definitely heard about microservices: the trendy style of software architecture where a system is split into multiple, independently-releasable services, that are modelled around business domains, and communicate via a network. Some people rave &#8230; <a href="https://www.grahamlea.com/2023/02/microservices-benefits-and-costs/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2023/02/microservices-benefits-and-costs/">Microservices: The Benefits and Costs</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignright size-medium"><img loading="lazy" decoding="async" width="300" height="199" src="https://www.grahamlea.com/wp-content/uploads/2023/02/Screenshot-2023-08-04-at-9.21.07-pm-300x199.png" alt="'Mycenaean Bronze Scales' - a set of ancient, bronze scales. Any tech team should weigh microservices benefits against their costs before deciding whether to make the switch. Photographed by Mark Cartwright." class="wp-image-1267" srcset="https://www.grahamlea.com/wp-content/uploads/2023/02/Screenshot-2023-08-04-at-9.21.07-pm-300x199.png 300w, https://www.grahamlea.com/wp-content/uploads/2023/02/Screenshot-2023-08-04-at-9.21.07-pm-1024x680.png 1024w, https://www.grahamlea.com/wp-content/uploads/2023/02/Screenshot-2023-08-04-at-9.21.07-pm-768x510.png 768w, https://www.grahamlea.com/wp-content/uploads/2023/02/Screenshot-2023-08-04-at-9.21.07-pm-452x300.png 452w, https://www.grahamlea.com/wp-content/uploads/2023/02/Screenshot-2023-08-04-at-9.21.07-pm.png 1114w" sizes="auto, (max-width: 300px) 100vw, 300px" /></figure>
</div>


<p>If you work in tech, you&#8217;ve almost definitely heard about <strong>microservices</strong>: the trendy style of software architecture where a system is split into multiple, <em>independently-releasable services</em>, that are <em>modelled around business domains</em>, and communicate via a network. Some people rave about all the amazing things they&#8217;ve achieved by using microservices&#8217; benefits. Others rant about how much of their time it wastes and how much they hate it.</p>



<p>Like pretty much everything in tech, <strong><em>microservice architecture is a trade-off</em></strong>. Will it do great things for your organisation or not? That depends largely on how well set up you are to take advantage of the benefits and to absorb the costs.</p>


<hr /><p><em>Microservice Architecture is a trade-off. Whether it&#039;s going to do great things for your organisation depends on how well set up you are to take advantage of the benefits and absorb the costs. Read more: Microservices: The Benefits and Costs</em><br /><a href='https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.grahamlea.com%2F2023%2F02%2Fmicroservices-benefits-and-costs%2F&#038;text=Microservice%20Architecture%20is%20a%20trade-off.%20Whether%20it%27s%20going%20to%20do%20great%20things%20for%20your%20organisation%20depends%20on%20how%20well%20set%20up%20you%20are%20to%20take%20advantage%20of%20the%20benefits%20and%20absorb%20the%20costs.%20Read%20more%3A%20Microservices%3A%20The%20Benefits%20and%20Costs&#038;related' target='_blank' rel="noopener noreferrer" >Share on X</a><br /><hr />


<p>If you&#8217;re looking to make a decision about whether to use microservices in your team (or reverse one!), here&#8217;s a list of many of the pros and cons which you&#8217;ll want to consider.</p>



<span id="more-1262"></span>



<h2 class="wp-block-heading">Benefits of Using Microservices</h2>



<p>Microservice architectures are about having <em>independently releasable</em> services that are <em>modelled around business domains</em>. There&#8217;s a number of benefits to pursuing this style of software architecture. Here&#8217;s a really quick run-through of the main benefits people typically cite:</p>



<h3 class="wp-block-heading"><strong>Team Autonomy</strong></h3>



<p>By assigning ownership of services to teams and enabling them to deploy services individually, they can release changes on their own chosen timeline. This minimises the need for coordination and negotiation with a wider group around deployments. That, in turn, can greatly reduce the time between making changes to the software and getting feedback about the value that has (or hasn&#8217;t) been delivered.</p>



<h3 class="wp-block-heading"><strong>Fault Isolation</strong></h3>



<p>When designed well, a microservices architecture can insulate failures in one service from affecting the functionality of others, reducing the &#8220;blast radius&#8221; of any fault. When designed poorly, though, failures in microservice systems can be just as bad as with monoliths, and much harder to track down!</p>



<h3 class="wp-block-heading"><strong>Technology Choice</strong></h3>



<p>If you properly isolate services from each other using technology-agnostic interfaces, you can make use of different technologies in different services. That means, for example, you could employ a different programming language or framework where that will provide a benefit to the software. It also provides the opportunity for teams to experiment with new technologies with minimal impact on the overall system. These things are very hard to do when the whole system is built as a single monolith.</p>



<h3 class="wp-block-heading"><strong>Independent Scaling</strong></h3>


<div class="wp-block-image">
<figure class="alignright size-large is-resized"><img loading="lazy" decoding="async" src="https://archium.io/wp-content/uploads/2022/09/15512862984_a35cca824c_c.jpg" alt="A picture of the Hong Kong skyline, with the International Commerce Centre soaring almost twice as high as the surrounding buildings. One of the benefits of microservices is the ability to scale different services with different resources depending on requirements.
Photographed by Bernard Spragg" width="300" height="217"/></figure>
</div>


<p>In contrast to a monolithic architecture, independent services allow you to increase the resources for only one part of your system, rather than needing to provision all instances of your monoliths with the resources to handle the most demanding peak loads.</p>



<h3 class="wp-block-heading"><strong>Smaller, Simpler Codebases</strong></h3>



<p>Microservices is all about building smaller pieces of software focused on individual, cohesive business domains. For developers, this results in it being simpler to navigate and comprehend codebases.</p>



<h3 class="wp-block-heading"><strong>Simpler Deployments</strong></h3>



<p>Deploying individual pieces of software separately can mean many parts of the system can be deployed with little or no effect on customers, partners, or other internal systems. You may still have parts of the system that need extra caution to be applied when they&#8217;re deployed, but that caution no longer needs to get in the way of deploying everything else.</p>



<h2 class="wp-block-heading">Some Costs of Microservices</h2>



<p>So there&#8217;s no doubt there&#8217;s significant microservices benefits. If there weren&#8217;t it wouldn&#8217;t have become so popular.</p>



<p>But, of course, your team won&#8217;t get any of those benefits without huge changes to the way you do things. Some of those changes are going to require costly adaptations from your team. </p>



<p>Here&#8217;s some of the most frequently highlighted costs of moving to microservices:</p>



<h3 class="wp-block-heading"><strong>Complexity Is Distributed</strong></h3>


<div class="wp-block-image">
<figure class="alignright size-full is-resized"><img loading="lazy" decoding="async" src="https://archium.io/wp-content/uploads/2022/09/4587421918_465310f6ef_c.jpg" alt="Pipes crossing over and wrapping around each other. The benefits of microservices don't come without costs, and one of those biggest costs is the complexity of integration.
Photographed by Flickr user 'morisius cosmonaut'" class="wp-image-1123" width="300" height="190"/></figure>
</div>


<p>Ideally, any operation in your system will involve as few services as possible (because you designed your services around business domain boundaries, right?). But ultimately it&#8217;s a <strong><em>system</em></strong>, and not just a bunch of independent software, because the services <em>interact</em>. And understanding those interactions will be crucial to understanding your running system.</p>



<h3 class="wp-block-heading"><strong>Infrastructure Needs More People-Power</strong></h3>



<p>Microservices results in more infrastructure, and often more <em>types</em> of infrastructure. That means more infrastructure work, so you&#8217;ll need more people working on infrastructure. As a result, you&#8217;ll have <em>less</em> people working on initiatives that add value to your organisation&#8217;s primary mission. Infrastructure work may happen mostly in a dedicated team, or it may be spread across all your teams and somewhat hidden. Either way, you&#8217;re going to be investing a higher proportion of your team&#8217;s time in infrastructure with microservices than without.</p>



<h3 class="wp-block-heading"><strong>Increased Network Traffic &amp; Latency</strong></h3>



<p>Splitting software into multiple services that communicate across a network obviously increases the network traffic and the bandwidth required to support that. It also <a href="https://gist.github.com/hellerbarde/2843375" target="_blank" rel="noreferrer noopener">adds significant latency</a> to any synchronous process that needs to cross a service boundary. Your team will need to become proficient at recognising and minimising network latency. They&#8217;ll also need to learn techniques for avoiding latency when it&#8217;s introducing unacceptable delays.</p>



<h3 class="wp-block-heading"><strong>New <strong><strong>Network</strong></strong></strong> <strong>Failure Modes</strong></h3>



<p>Dropped packets, connection limits, read timeouts, DNS… There&#8217;s a myriad of ways any network interaction can fail. Moving to microservices will probably bring a lot of them into the scope of your developers&#8217; daily work, but they weren&#8217;t something many of them would have had to think about while working in a monolith.</p>



<h3 class="wp-block-heading"><strong>Monitoring Scope Explodes</strong></h3>



<p>Monolithic systems often have very few <em>things</em> needing monitoring &#8211; be that hosts, networks, databases etc. Even when there&#8217;s a lot of <a href="https://www.section.io/blog/scaling-horizontally-vs-vertically/" target="_blank" rel="noreferrer noopener">horizontal scaling</a>, you may only be monitoring a very small number of <em>types</em> of thing, which means each new node added requires a fairly trivial change. With microservices, this is not the case. Instead, we&#8217;re creating many different <em>types</em> of things, each having some shared and some unique monitoring requirements, as well as having far more activity occurring across networks. All of that adds up to a need to invest far more into monitoring than a monolithic approach would require.</p>



<h3 class="wp-block-heading"><strong>More Codebases</strong></h3>



<p>This is the flip side of the coin for the benefit of &#8220;<strong>Smaller, More Easily Understood Codebases</strong>&#8220;. There&#8217;s now not just one codebase, but many. What&#8217;s more, they integrate with each other across a network, not through function calls, so navigating between them will likely involve some manual searching rather than a simple click-to-browse. Again, a well-designed microservice architecture will minimise the number of services you need to look at in order to understand a single operation or workflow. But you&#8217;re not going to get away from sometimes needing to open up several projects in your IDE and trying to piece together how the code interacts.</p>



<h3 class="wp-block-heading"><strong>More Build Pipelines</strong></h3>



<p>Independent releasability typically means independent build and deploy pipelines for each service. You might have had one or two people that looked after your build pipeline in the past. Now you&#8217;re going to need at least some expertise in each team to manage the pipelines for their services. You&#8217;re going to need a build / Continuous Deployment tool that allows your whole tech team to manage large numbers of pipelines and builds. You&#8217;ll want to figure how to get fast builds with minimal delays, but without wasting a lot of resources on idling servers. And you&#8217;re probably going to need to think about how standardised or bespoke you want your many build pipelines to be, and how you&#8217;ll manage any shared or mandated build patterns.</p>



<h3 class="wp-block-heading"><strong>Testing Has To Adapt</strong></h3>



<p>Think about testing software, both automatically and manually. And now think about how microservices means changing your software architecture to be multiple different pieces of software, owned by different teams, that can be deployed independently, and which communicate with each other over a network using APIs and/or asynchronous messages. That means a <strong>lot</strong> of things need to change when it comes to how you&#8217;ll test your system and build confidence about its quality. Unit + integration tests alone aren&#8217;t going to cut it any more. Testing the full cycle of some features may become so complex that it&#8217;s impractical to automate it. And your quality advocates are going to need to learn about a whole new set of risks, failure modes, and tooling in order to deliver expert advice to the team.</p>



<h3 class="wp-block-heading"><strong>Technology Governance</strong></h3>



<p>Microservices introduces the possibility of <em>thousands</em> of different technologies across all of your services, managed in many different places. Most organisations won&#8217;t want a technology &#8220;free-for-all&#8221;, for a variety of reasons. That means you&#8217;ll probably need a way to record which technologies are currently recommended, deprecated, and being experimented with, and a process for moving things through that lifecycle. (A common approach is to <a href="https://www.thoughtworks.com/radar/byor" target="_blank" rel="noreferrer noopener">maintain an internal tech radar</a>.) At the very least, you&#8217;ll want to be monitoring all of your dependencies for security vulnerabilities. You might also want to consider nipping this in the bud by consciously <a href="https://mcfunley.com/choose-boring-technology">choosing boring technology</a>.</p>



<h3 class="wp-block-heading"><strong>Increased Security Attack Surface</strong></h3>



<p>While there are <a href="https://www.grahamlea.com/2015/07/microservices-security-questions/" target="_blank" rel="noreferrer noopener">many aspects to application and system security</a>, the interface between the network and software is commonly a choke point where many security controls are implemented. Microservices architecture vastly increases the number of interfaces that the software exposes to the network. Because of that, microservices can enlarge the <em>attack surface</em> of the system by an order of magnitude. The end result is you&#8217;ll have a lot more security work to undertake in order to protect your system from attackers. The opportunity to use a variety of different technologies, and to be using various different versions of each one, also adds to the complexity of managing microservices security.</p>



<h3 class="wp-block-heading"><strong>Comprehensive Data Analysis Is Harder</strong></h3>



<p>Monolithic applications usually have monolithic databases. Microservice architectures following best practices around information hiding almost definitely won&#8217;t. That means if you need to do some reporting that will combine data from multiple services, you probably won&#8217;t be able to just whip up a SQL query. Many organisations with microservices and non-trivial reporting requirements end up investing heavily in building a data warehouse or data lake.</p>



<h3 class="wp-block-heading"><strong>Module Refactoring can get Harder</strong></h3>



<p>Few things make the costs of microservices apparent to software developers more than needing to refactor some functionality that is distributed across two or more services. In a monolith, shifting code around and just running the tests to check everything still works is child&#8217;s play. On the contrary, refactoring code between services is positively painful. It often requires unhealthy amounts of planning, cross-team coordination, multi-stage migrations, and the moving or re-writing of many existing tests. And all of that is just to make the system do what it already does but in a better way. Ouch.</p>



<h2 class="wp-block-heading">Do Microservices Benefits Outweigh The Costs for YOUR Team?</h2>



<p>So that&#8217;s the main microservices benefits and costs you&#8217;ll need to be aware of as you make a decision about whether or not to employ the approach in your team.</p>



<p>Okay &#8211; it was a lot. The list of microservices <em>downsides</em> may seem a lot bigger than the upsides. Depending on your team size and what you&#8217;re trying to achieve, though, the benefits of decoupling the work of individual teams may be huge, and the costs manageable as long as you&#8217;re aware of them.</p>



<p>So, knowing all this, is it the right decision for <em>your organisation</em> to take on microservices or not?</p>



<p>To answer that, we need a way to compare these benefits and costs to your organisational context. In the next post, <strong>I&#8217;ll be sharing 5 heuristics</strong> that you can use to get a feel for whether your team is in a better position to leverage microservices, or be inundated by them.</p>



<p class="has-text-align-right"><em>Image Credits:<br><a href="https://www.worldhistory.org/image/3735/mycenaean-bronze-scales/">&#8216;Mycenaean Bronze Scales&#8217;</a> by <a href="https://www.worldhistory.org/user/markzcartwright/" target="_blank" rel="noreferrer noopener">Mark Cartwright</a><br><a href="https://www.flickr.com/photos/volvob12b/15512862984/in/photolist-pCPtGU-bWFSSW-2k8YHNr-bkeWsF-6nwj3R-eXj12u-AUh7cY-GJ3QFH-2fsXULw-JH8cX-2jHWxtR-68ssko-wGp7Lj-owrQwf-4si4wp-2mTN4YM-839ujM-UutxGW-oumVbm-oeRNhs-AyjZ3a-ZpMNFT-owh86Q-2mci31N-ypEX1N-oeR12v-osxMsA-DXjX9K-o7wXTT-61Wwyv-61Ww6B-2kbTogB-eX7hbv-oukgAt-oeUMy7-Z8Pbio-atmpFd-EUNYc7-4JHdBR-2jy47MC-29kaw53-9NH11D-2jrGbbv-pFtAKK-u567gV-oV9nEw-ypCxmN-SGX2Py-atmpCC-839vki" target="_blank" rel="noreferrer noopener">&#8216;Hong Kong International Commerce Centre&#8217;</a> by <a href="https://www.flickr.com/photos/volvob12b/15512862984/in/photolist-pCPtGU-bWFSSW-2k8YHNr-bkeWsF-6nwj3R-eXj12u-AUh7cY-GJ3QFH-2fsXULw-JH8cX-2jHWxtR-68ssko-wGp7Lj-owrQwf-4si4wp-2mTN4YM-839ujM-UutxGW-oumVbm-oeRNhs-AyjZ3a-ZpMNFT-owh86Q-2mci31N-ypEX1N-oeR12v-osxMsA-DXjX9K-o7wXTT-61Wwyv-61Ww6B-2kbTogB-eX7hbv-oukgAt-oeUMy7-Z8Pbio-atmpFd-EUNYc7-4JHdBR-2jy47MC-29kaw53-9NH11D-2jrGbbv-pFtAKK-u567gV-oV9nEw-ypCxmN-SGX2Py-atmpCC-839vki" target="_blank" rel="noreferrer noopener">Bernard Spragg</a><br><a href="https://www.flickr.com/photos/mo_cosmo/4587421918/in/photolist-7ZnJHm-7fmGtb-BpyS-2kNh4Rj-53wUqQ-6HTM3T-27GywRC-4958i-86uRDk-SDXAQJ-2TT2Le-3TLGPp-2HCjW-MFm1u-r7D3W-PAag-dCNYzH-7XwK2H-BYBG8L-bo9o4q-4958M-JjFR-nJ6CA-QXe3bZ-Kkmvq-6HXToy-vWfWDU-6g17bT-3p4n5-kuuC4-FYafw3-7cgpM8-24HqQxy-5YuC5L-54ixmE-98tRyE-9ptgaG-HYSeR2-f9Wq57-G3vJES-8CsHu5-xMkn-6o1vxB-6o1vER-q5Np3e-2kVrMa4-38HqrU-2feb8cJ-92Lwhb-4yD2VD" target="_blank" rel="noreferrer noopener">&#8216;pipes&#8217;</a> by <a href="https://www.flickr.com/photos/mo_cosmo/" target="_blank" rel="noreferrer noopener">morisius cosmonaut</a></em></p>
<p>The post <a href="https://www.grahamlea.com/2023/02/microservices-benefits-and-costs/">Microservices: The Benefits and Costs</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2023/02/microservices-benefits-and-costs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Using Microservices to Make Costly Deployments Less Frequent</title>
		<link>https://www.grahamlea.com/2019/07/costly-deployments-microservices-less-frequent/</link>
					<comments>https://www.grahamlea.com/2019/07/costly-deployments-microservices-less-frequent/#comments</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Thu, 11 Jul 2019 03:38:11 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tyro]]></category>
		<guid isPermaLink="false">https://www.grahamlea.com/?p=1256</guid>

					<description><![CDATA[<p>This article on costly deployments is part of a series on How to Choose Your First Microservices. Switching to a new software architecture style is costly. I advocate choosing where to employ microservices first by using them to solve existing problems &#8230; <a href="https://www.grahamlea.com/2019/07/costly-deployments-microservices-less-frequent/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2019/07/costly-deployments-microservices-less-frequent/">Using Microservices to Make Costly Deployments Less Frequent</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><em>This article on costly deployments is part of a series on <a href="https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/">How to Choose Your First Microservices</a>.</em></p>



<p><em>Switching to a new software architecture style is costly. I advocate choosing where to employ microservices first by using them to solve existing problems in the team. This helps the organisation extract value from the new architecture with each step towards the new world. This series is working through a set of problems that your org may have, and how microservices might help solve them.</em></p>



<h2 class="wp-block-heading">Tricky Deployments</h2>



<div class="wp-block-image"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="https://www.grahamlea.com/wp-content/uploads/2019/07/fighter-jet-deploy.jpg" alt="A fighter jet on an aircraft carrier being signalled to launch by two ground staff. Launching a fighter jet is a costly deployment, just as deploying a monolith may be." class="wp-image-1257" width="292" height="198"/></figure></div>



<p>Some components of your system will be tricker to <a href="https://en.wikipedia.org/wiki/Software_deployment">deploy</a> than others. This is true regardless of whether you’ve already got microservices or you&#8217;re deploying a monolith. Some components might be in use by 1000s of customers 24&#215;7, while others might only be used once a month. Upgrading a component might require other components to be placed into a certain state, while others can be upgraded independently of the rest of the system. Coordination may be required between multiple teams in order to effect a trouble-free deploy of some components, whereas others might be actioned by a single person. </p>



<span id="more-1256"></span>



<p>Ultimately, we’d like all our components to fall into the second half of those categorisations. The reality of prioritisation and resource constraints means we’re unlikely to reach deployment nirvana for all artefacts.</p>



<p>Let’s think about a <a href="https://microservices.io/patterns/monolithic.html">monolithic architecture</a> which, in this context, refers specifically to a monolithic deployment. In this type of architecture, deploying a change to one component means deploying everything &#8211; you’re unable to deploy components separately. That means that whatever is the trickiest step of the trickiest component to deploy becomes a necessary step in every deploy.</p>



<h2 class="wp-block-heading">Costly Deployments</h2>



<p>I’m going to flip the language now from “tricky” to “expensive”. Usually, when something is tricky to deploy, it’s expensive to deploy. It may be expensive because there’s <a href="https://blog.inedo.com/blog/deployment-failures">manual steps</a> to make it lower risk; or there’s coordination required that takes people’s time away from other, more valuable work; or maybe you literally lose revenue every time a component is taken down for a few minutes. Imagine if each component were able to be deployed independently. It’s easy to conceive that the deployment of any component has an average cost to the organisation. And now we can see clearly a huge downside of monolithic deployments: the cost of any deploy is at least the cost of the most expensive component to deploy.</p>


<hr /><p><em>In an architecture with a monolithic deployment, the cost of deploying a change to any component is at least the cost of the deploying the component that is most expensive to deploy.</em><br /><a href='https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.grahamlea.com%2F2019%2F07%2Fcostly-deployments-microservices-less-frequent%2F&#038;text=In%20an%20architecture%20with%20a%20monolithic%20deployment%2C%20the%20cost%20of%20deploying%20a%20change%20to%20any%20component%20is%20at%20least%20the%20cost%20of%20the%20deploying%20the%20component%20that%20is%20most%20expensive%20to%20deploy.&#038;related' target='_blank' rel="noopener noreferrer" >Share on X</a><br /><hr />


<p>Actually, the situation might be even worse. If these &#8220;costs&#8221; of deployment can&#8217;t be significantly mitigated by the fact that the deploy happens all at once, the cost of deploying any component may be the cost of all components combined.</p>



<p>So, do you have a component in your monolith which costs you significantly more to deploy than other components? If you do, you can reduce the cost of deploying the monolith by extracting that component from the monolithic deploy.</p>



<h2 class="wp-block-heading">Here’s an Example</h2>



<p>At Tyro, we had a piece of software which routed financial transactions from payment terminals to banks and card schemes. It also had many corollary responsibilities. Most notable of those were reporting the results of transactions to backend systems and providing payment terminals with their configuration.</p>



<p>As well as doing the routing, this software maintained the actual links to the banks and schemes. That included Layer 7 protocols for connection establishment, keep-alive and security; multiplexing of message requests and responses; and marshalling/unmarshalling of messages. As much of this code was based off specifications used by hundreds of banks across the world, it was very static. The big international schemes typically issued changes which we <em>might</em> incorporate once every six months. The local banks were even less likely to change.</p>



<p>Now, there was an expectation from our partners about these links. The expectation was that the links remain up &#8211; that is, the TCP connections should remain active for a long time. Long time here = <em>months</em>. If a connection went down, they expected to see it re-established almost instantly. If the link wasn’t going to be re-established instantly, e.g. because of scheduled maintenance, they wanted us to tell them in advance. From memory, they wanted to be given a week’s notice.</p>



<p>The code for operating the links rarely changed, but other code in this mini-monolith changed regularly. We were constantly adding new features to the terminals, so the corollary functions were changing constantly. We were rolling out these changes on a two-week schedule.</p>



<p>So, we had a piece of software which contained components that were hardly ever changed, but which were deployed every two weeks because their deployment was tied to other frequently changing components. There was an expense of having to advise third parties of “scheduled maintenance” every other week. More often than not, though, the message about the maintenance wouldn’t get delivered to the right people in one of these partners. A panicked call would then come in during the deployment from one of the partners. They would see the link had been down for 1 minute, their incident management process would trigger and we would then need to respond to that. </p>



<h2 class="wp-block-heading">Reducing our Costly Deployments</h2>



<p>To resolve our costly deployment issue, we decided to move the links to the third parties out into their own piece of software. In fact, we moved each link into its own individual service. This meant that, going forward, each link would only be taken down if the code for that specific partner changed. The links are now able to meet the partners’ expectations of staying online for months. Consequently, the expense for us to coordinate with the other parties was constrained to the few times a year we did an upgrade.</p>



<p>Some years later, the work to separate these components into their own services also paid extra dividends. As the company’s business scaled and transaction traffic increased, the transaction routing software was able to be scaled independently of the links.</p>



<h2 class="wp-block-heading">Gotchas</h2>



<p>The first caveat to this approach is to ensure that deployments of the component you intend to break out will be infrequent. The key payoff comes from just deploying the expensive-to-deploy component less frequently.  If the component is actually in active development, then you’re not going to see much saving by moving it out. There’s <a href="https://www2.poems.in.th/home/derivatives/en/options04.htm">a relationship</a> between how much non-valuable work is created by deploying the component and the amount of deploys you’ll want to avoid in order to get a positive ROI.</p>



<p>The second caveat is that it’s a good idea to first look for ways to reduce the cost of deploying the expensive component before extracting it. Think about how you can somehow remove the coordination with other teams, or make it less time-consuming, or automate any manual steps associated with costly deployments. Extracting a component from a monolith into its own service its often a costly exercise itself. Reducing the pain associated with deployment may be a cheaper investment in many cases. However, also keep in mind that having components moved into their own services can have many other advantages in the short and long term.</p>



<p><em>If you want to be notified when future articles are published, sign up using the form just under my photo.</em></p>



<p><em>Previous article in this series: </em><a href="https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/"><em>Use Microservices to Solve Developers Stepping on Each Other&#8217;s Toes</em></a></p>



<p style="text-align:right"><em>Image credit:<br>&#8216;</em><a href="https://commons.wikimedia.org/wiki/File:US_Navy_070720-N-8119R-040_Lt._Eric_Walborn_and_Lt._Reynaldo_Stanley_give_the_signal_to_launch_an_F-A-18F_Super_Hornet,_assigned_to_the_Black_Aces_of_Strike_Fighter_Squadron_(VFA)_41,_from_nuclear-powered_aircraft_carrier_USS.jpg"><em>US Navy 070720-N-8119R-040</em></a><em>&#8216; by Gretchen M. Roth (U.S. Navy)</em></p>
<p>The post <a href="https://www.grahamlea.com/2019/07/costly-deployments-microservices-less-frequent/">Using Microservices to Make Costly Deployments Less Frequent</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2019/07/costly-deployments-microservices-less-frequent/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Using Microservices to Solve Developers Stepping on Each Other&#8217;s Toes</title>
		<link>https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/</link>
					<comments>https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/#comments</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Wed, 03 Jul 2019 04:33:02 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[collective-code-ownership]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[merge conflicts]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tyro]]></category>
		<guid isPermaLink="false">https://www.grahamlea.com/?p=1250</guid>

					<description><![CDATA[<p>This article on reducing merge conflicts is part of a series on How to Choose Your First Microservices. Switching to a new software architecture style is costly. I advocate choosing where to employ microservices first by using them to solve &#8230; <a href="https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/">Using Microservices to Solve Developers Stepping on Each Other&#8217;s Toes</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><em>This article on reducing merge conflicts is part of a series on <a href="https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/">How to Choose Your First Microservices</a>.</em></p>



<p><em>Switching to a new software architecture style is costly. I advocate choosing where to employ microservices first by using them to solve existing problems in the team. This helps the organisation extract value from the new architecture with each step towards the new world. This series is working through a set of problems that your org may have, and how microservices might help solve them.</em></p>



<h2 class="wp-block-heading">Is your team wasting a lot of time working around each other?</h2>



<div class="wp-block-image"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="https://www.grahamlea.com/wp-content/uploads/2019/07/42450603994_0ae20a225d_z.jpg" alt="A side-collision car crash at an intersection, surrounded by emergency personnel. Like this, merge conflicts can be messy and dangerous." class="wp-image-1251" width="315" height="201" srcset="https://www.grahamlea.com/wp-content/uploads/2019/07/42450603994_0ae20a225d_z.jpg 640w, https://www.grahamlea.com/wp-content/uploads/2019/07/42450603994_0ae20a225d_z-300x191.jpg 300w, https://www.grahamlea.com/wp-content/uploads/2019/07/42450603994_0ae20a225d_z-472x300.jpg 472w" sizes="auto, (max-width: 315px) 100vw, 315px" /></figure></div>



<p>If you have a large team of developers working in a single code base, it’s inevitable that the work of some team members will interfere with the work of others. Many of us are now using tools (like git) and processes (like <a href="https://www.jamesshore.com/Agile-Book/continuous_integration.html">continuous integration</a>) that can lessen the impact of interference. (Although other modern practices like <a href="https://www.grahamlea.com/2013/11/git-mercurial-anti-agile-continuous-integration/">feature branching can make conflicts worse</a>.)</p>



<span id="more-1250"></span>



<p>Despite improved tooling, merge conflicts are still annoying and sometimes expensive to recover from. Everyone fears finding someone else has been making wholesale changes to code that they were also making wholesale changes to.</p>



<p>This can get exacerbated when people from multiple <em>teams</em> are working in the same area of a codebase. It&#8217;s especially true if the organisation isn&#8217;t set up to encourage <a href="https://www.infoq.com/news/2014/03/scrum-of-scrums/">regular communication between such teams</a>. And the more your monolith&#8217;s internal architecture looks like spaghetti, the more people will bump into each other&#8217;s changes.</p>



<h2 class="wp-block-heading">How Microservices Reduce Merge Conflicts and Enhance Collective Ownership</h2>



<p>One of the key advantages of microservices is that it places natural limits on the amount of cross-team interference. Giving teams their own codebase/s to work in means they know that only the people they work closest with will be changing the same repository.</p>



<p>The first problem this (obviously) helps with is reducing merge conflicts. Conflicts cost time to resolve and increase the risk of defects, so minimising them is a good thing. The other issue it can help with is the pressure that regular interference puts on <a href="https://martinfowler.com/bliki/CodeOwnership.html">collective code ownership</a>. I&#8217;ve seen developers avoid making improvements to code because they want to limit the chances of a merge conflict. With their own codebase, developers have the confidence to re-shape code so that it’s the best design it can be. There is a scale beyond which collective code ownership doesn&#8217;t work for a single codebase. But that doesn&#8217;t mean you should abandon it. What&#8217;s better is to create smaller scopes of code and teams within which it can continue to work well.</p>


<hr /><p><em>There is a scale beyond which collective code ownership doesn&#039;t work for a single codebase. But that doesn&#039;t mean you should abandon it. What&#039;s better is to create smaller scopes of code and teams within which it can continue to work well.</em><br /><a href='https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.grahamlea.com%2F2019%2F07%2Fmicroservices-reduce-merge-conflicts%2F&#038;text=There%20is%20a%20scale%20beyond%20which%20collective%20code%20ownership%20doesn%27t%20work%20for%20a%20single%20codebase.%20But%20that%20doesn%27t%20mean%20you%20should%20abandon%20it.%20What%27s%20better%20is%20to%20create%20smaller%20scopes%20of%20code%20and%20teams%20within%20which%20it%20can%20continue%20to%20work%20well.&#038;related' target='_blank' rel="noopener noreferrer" >Share on X</a><br /><hr />


<p>If you’re hearing that developers stepping on each others toes in a monolithic codebase is causing a lot of pain, here&#8217;s what you can try. See if you can find upcoming work that will allow one or more of the teams to develop almost completely outside of the existing system. You might even decide that the team working on the new service won’t do <em>any</em> code in the monolith. Instead, they can rely on one of the other teams to implement any changes required in the existing code.</p>



<h2 class="wp-block-heading">Here&#8217;s an Example</h2>



<p>When I first led a team at Tyro, we had recently split into three Engineering teams. Two of the teams were working almost full time on our big backend monolith. The third team would also jump in there from time to time as needed to support their work. It was a big repository, so we didn’t butt into each other’s changes every day, but it did happen. It also made other things more effort than they should be. When the build broke, or an alert came in from production, deciding which team should respond wasn&#8217;t always straightforward.</p>



<p>Right at this time, a new project came up to build a private health claiming solution. This was a new product that would integrate with our existing payment products, but also be distinct in many ways. Though it would need to integrate with the existing monolith, we made the call to develop as much as we could in new services. This resulted in three new artefacts. One was for handling online requests and was used by the software our payment terminals connected to. Two backend services were created for two different types of configuration that needed to be managed, one of which integrated with the payments backend monolith. The decision meant the team spent most of their time developing new software which other teams weren’t touching. There was almost no chance of conflict, except with the other three pairs on the same team.</p>



<h2 class="wp-block-heading">Gotchas</h2>



<p>The first thing to watch out for here is the same as when <a href="https://www.grahamlea.com/2019/06/slow-build-times-microservices/">using microservices to resolve long build times</a>. Avoid separating out something which requires some work right now, but won’t require much attention past the short term. If you do, you&#8217;ll only get temporary relief from teams stepping on each other&#8217;s toes before people return to working on top of each other in the monolith. Different services will (and should) have varying degrees of complexity and ongoing work based on how you define your bounded contexts. Some domains are simply more complex and/or will change more as the product evolves. If you’re prioritising to get teams off each other’s toes, you&#8217;ll want to look at separating out something that has a long-term development roadmap associated with it. That way, the team that builds it can stay in there and stay separate from other teams for an extended period.</p>



<p>The second thing to watch out for is creating a distributed monolith. By that I mean code deployed as separate components but which is tightly coupled in the way it operates. You don&#8217;t want development of features to regularly require changes across a large number of services. If it does, you&#8217;re still going to end up with multiple teams working on the same pieces of code and getting in each other&#8217;s way.</p>



<p><em>If you want to be notified when future articles are published, sign up using the form just under my photo.</em></p>



<p><em>Previous article in this series: </em><a href="https://www.grahamlea.com/2019/06/slow-build-times-microservices/"><em>Using Microservices to Solve Slow Build Times</em></a><br><em>Next article in this series: <a href="https://www.grahamlea.com/2019/07/costly-deployments-microservices-less-frequent/">Using Microservices to Make Costly Deployments Less Frequent</a></em></p>



<p style="text-align:right"><em>Image credits:<br>&#8216;</em><a href="https://www.flickr.com/photos/cemillerphotography/42450603994"><em>Car Crash 7-1-18 2252</em></a><em>&#8216; by Charles Edward Miller</em></p>
<p>The post <a href="https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/">Using Microservices to Solve Developers Stepping on Each Other&#8217;s Toes</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Using Microservices to Solve Slow Build Times</title>
		<link>https://www.grahamlea.com/2019/06/slow-build-times-microservices/</link>
					<comments>https://www.grahamlea.com/2019/06/slow-build-times-microservices/#comments</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Sat, 29 Jun 2019 12:20:47 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[build times]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tyro]]></category>
		<category><![CDATA[webapp]]></category>
		<guid isPermaLink="false">https://www.grahamlea.com/?p=1248</guid>

					<description><![CDATA[<p>This article on slow build times is part of a series on How to Choose Your First Microservices. Switching to a new software architecture style is costly. I advocate choosing where to employ microservices first by using them to solve &#8230; <a href="https://www.grahamlea.com/2019/06/slow-build-times-microservices/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2019/06/slow-build-times-microservices/">Using Microservices to Solve Slow Build Times</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><em>This article on slow build times is part of a series on <a href="https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/">How to Choose Your First Microservices</a>.</em></p>



<p><em>Switching to a new software architecture style is costly. I advocate choosing where to employ microservices first by using them to solve existing problems in the team. This helps the organisation extract value from the new architecture with each step towards the new world. This series is working through a set of problems that your org may have, and how microservices might help solve them.</em></p>



<h2 class="wp-block-heading">Slow Build Times?</h2>



<div class="wp-block-image"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="https://www.grahamlea.com/wp-content/uploads/2019/06/Mucus-Snail-Nature-Animal-Close-Up-Shell-Reptile-4200009-1024x682.jpg" alt="A snail crossing a road, which might happen faster your slow build time." class="wp-image-1249" width="286" height="192" srcset="https://www.grahamlea.com/wp-content/uploads/2019/06/Mucus-Snail-Nature-Animal-Close-Up-Shell-Reptile-4200009-300x200.jpg 300w, https://www.grahamlea.com/wp-content/uploads/2019/06/Mucus-Snail-Nature-Animal-Close-Up-Shell-Reptile-4200009-768x512.jpg 768w, https://www.grahamlea.com/wp-content/uploads/2019/06/Mucus-Snail-Nature-Animal-Close-Up-Shell-Reptile-4200009-450x300.jpg 450w, https://www.grahamlea.com/wp-content/uploads/2019/06/Mucus-Snail-Nature-Animal-Close-Up-Shell-Reptile-4200009.jpg 1280w" sizes="auto, (max-width: 286px) 100vw, 286px" /></figure></div>



<p>Does your team have an application that takes a long time to build and run tests? Is a large portion of the development team working on it? That could be a huge amount of idle time you&#8217;re pouring down the drain. The <a href="https://xkcd.com/303/">classic XKCD &#8216;Compiling&#8217; comic</a> makes light of developers enjoying the time they spend waiting for their code to build. The truth for most devs is they would far prefer to be making fast progress on their work than sitting around waiting.</p>



<span id="more-1248"></span>



<p>If you can identify a slice of upcoming work that (a) would typically be added in where the slow build is, and (b) could be easily cordoned off into a new artefact, it might make sense to create a new service with a fast build and do the work there.</p>



<h2 class="wp-block-heading">Here&#8217;s an Example</h2>



<p>At Tyro, we had this slow build situation with our single internal webapp. Up to a certain point, all the features of our system used by all our internal staff were clumped into a single web application. It had a lot of screens and a lot of tests. The build took ages &#8211; 30+ min. on a beefy dev desktop. And that’s with all the calls to the backend API service mocked.</p>



<p>We were embarking on a new project that would re-write a number of the functions used by the Finance team. While planning, we identified the webapp build time as something that would slow us down. We decided that a new, empty web application &#8211; where we would build just financial functions &#8211; would allow us to move a lot faster. We:</p>



<ul class="wp-block-list"><li>copy+pasted the existing webapp;</li><li>deleted everything except the login and home page functions and the test framework;</li><li>find+replaced the webapp name;</li><li>bumped all the dependencies to the latest version; and</li><li>started iterating with our sweet, sub-1-minute build.</li></ul>



<p>No sword-fighting was required. It was a successful strategy that we repeated many times. Tyro now has a suite of smaller internal webapps serving different functions and business domains.</p>



<h2 class="wp-block-heading">Gotchas</h2>



<p>There’s two things to watch out for when breaking out microservices to solve slow build times.</p>



<p>Firstly, you want to ensure that the domain you carve out is one that’s going to see active development in the future. In particular, you ideally want it to be a piece that will see much more active development in the medium term than the pieces that you’re choosing not to break out. If you give some functionality a really fast build, but are still doing most of your development in the domain with the slow build, you’ve lost out.</p>



<p>Secondly, you want to ensure you actually get rid of the cause of the build slowness when you make the new service. In the example above, it was the sheer volume of features that made the build slow, so dropping to zero features dropped the build time to near zero. For other apps, though, the build may be slow for some other reason, like dependencies being downloaded too often, long-running steps like unoptimised Docker builds, or an integration testing suite with a long setup time. You may miss out on the build time savings if you repeat the mistakes of the past.</p>



<p><em>If you want to be notified when future articles are published, sign up using the form just under my photo.</em></p>



<p><em>Next article in the series: </em><a href="https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/"><em>Using Microservices to Solve Developers Stepping on Each Other&#8217;s Toes</em></a></p>



<p style="text-align:right"><em>Image credits:<br></em><a href="https://www.maxpixel.net/Mucus-Snail-Nature-Animal-Close-Up-Shell-Reptile-4200009"><em>Snail from MaxPixel.net</em></a></p>
<p>The post <a href="https://www.grahamlea.com/2019/06/slow-build-times-microservices/">Using Microservices to Solve Slow Build Times</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2019/06/slow-build-times-microservices/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>How to Choose Your First Microservices</title>
		<link>https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/</link>
					<comments>https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/#comments</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Thu, 27 Jun 2019 01:29:50 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[patterns]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[service-oriented-architecture]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[tips]]></category>
		<guid isPermaLink="false">https://www.grahamlea.com/?p=1245</guid>

					<description><![CDATA[<p>Are you early in your microservices journey? Maybe you’ve decided you need to start deploying applications outside your monolith but you haven’t cut any code yet. Or maybe you’ve put your first few services into production and addressed some of &#8230; <a href="https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/">How to Choose Your First Microservices</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Are you early in your <a href="https://www.grahamlea.com/2015/03/microservices-tyro-evolution-presentation/">microservices journey</a>? Maybe you’ve decided you need to start deploying applications outside your monolith but you haven’t cut any code yet. Or maybe you’ve put your first few services into production and addressed some of the first pains that happen when you start on that path.</p>


<div class="wp-block-image">
<figure class="alignright is-resized"><img loading="lazy" decoding="async" src="https://www.grahamlea.com/wp-content/uploads/2019/06/33274863931_29599da615_z.jpg" alt="A large number of interacting LEGO cogs making one large machine, similar to a monolith from which you want to break out your first microservices" class="wp-image-1246" width="299" height="169" srcset="https://www.grahamlea.com/wp-content/uploads/2019/06/33274863931_29599da615_z.jpg 639w, https://www.grahamlea.com/wp-content/uploads/2019/06/33274863931_29599da615_z-300x169.jpg 300w, https://www.grahamlea.com/wp-content/uploads/2019/06/33274863931_29599da615_z-500x282.jpg 500w" sizes="auto, (max-width: 299px) 100vw, 299px" /></figure>
</div>


<p>A common question that comes up for teams at around this time is:</p>



<blockquote class="wp-block-quote is-style-large is-layout-flow wp-block-quote-is-layout-flow">
<p>“What should we split out into a microservice first? </p>



<p>And why?”</p>
</blockquote>



<span id="more-1245"></span>



<p>A lot of organisations start with a monolith and move to a more distributed architecture once the business has some traction. At the point where microservices becomes “a thing we want to do”, there can be many options for which parts of the product could be used as the pioneering experiments.</p>



<p>Over the next few weeks, I’ll be publishing a series of articles that looks at <a href="https://www.youtube.com/watch?v=ReFqFPJHLhA">heuristics</a> you can use to choose valuable parts of your system to separate out. First, though, let’s talk about the overarching heuristic that drives all of the suggestions in the following articles:</p>



<h2 class="wp-block-heading">The #1 Heuristic for Your First Microservices: Choose a Problem to Address</h2>



<p>You’re doing microservices for a reason, right? Maybe you have some problems already that you think it will address. Or maybe your foresee problems that will rise up soon if you don’t start doing things differently. You&#8217;ve decided to either <a href="https://www.oreilly.com/library/view/building-microservices/9781491950340/ch05.html">split up your monolith</a>, or do new work outside the monolith as much as possible.</p>



<p>My over-arching guideline for choosing what to attack first is this: You’re moving to microservices to solve problems, so your first microservices should be things which will solve your current problems.</p>


<hr /><p><em>You’re moving to microservices to solve problems, so your first microservices should be things which will solve your current problems.</em><br /><a href='https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.grahamlea.com%2F2019%2F06%2Ffirst-microservices-how-to-choose%2F&#038;text=You%E2%80%99re%20moving%20to%20microservices%20to%20solve%20problems%2C%20so%20your%20first%20microservices%20should%20be%20things%20which%20will%20solve%20your%20current%20problems.&#038;related' target='_blank' rel="noopener noreferrer" >Share on X</a><br /><hr />


<p>In the upcoming posts, I’ll cover a slew of problems which your organisation might already have identified. I&#8221;ll show how each of them could be solved as part of your migration to a microservices architecture.</p>



<h2 class="wp-block-heading">Get a Return On Investment From Your First Microservices</h2>



<p>One thing you want to keep in mind with each problem area I&#8217;ll cover is to always judge the return on investment. Just because you identify with one of these problems doesn’t mean that it’s a problem that your team must solve now.</p>



<p>Remember that the cost of deploying microservices is usually high for orgs who are new to this. You&#8217;ll have to figure out new approaches to deployments, monitoring, and <a href="https://www.grahamlea.com/2015/07/microservices-security-questions/">security</a>, among many other things. If you choose to attack a problem that has a small impact, you could find that deploying the functionality into a new service won&#8217;t pay off in the near term. Ideally, you’ll want to look for the service opportunities that are <strong>quick wins</strong> in terms of the value returned to the organisation.</p>



<p>However, there is also a counter-argument to consider here. Each new service deployed will give the team feedback and start building their muscle around deploying and operating a distributed system. That muscle will result in compounding returns in the long run. So you won&#8217;t get <em>all</em> of the benefits immediately, but ideally you&#8217;d love to get a large chunk of payback quickly.</p>



<h2 class="wp-block-heading">Focus on Making Measured and Continual Progress</h2>



<p>Finally, I recommend being careful about not chewing off too much at once. Don&#8217;t try to change too many things or tackle multiple hard problems in one go.</p>



<p>For example, let’s think of an organisation that’s building their first microservice, and everything in their monolith currently uses a single database schema. Such an org should consider making their first service something which doesn’t need a database. That way, they can focus on the problem of getting a second piece of software deployed into production, without the added concerns of getting a new schema into production and all the ripple effects that has on usernames, passwords, backups, and the like.</p>



<p>However, you also don’t want to leave those extra hard things too long. As soon as you’re comfortable with deploying new things that don&#8217;t have databases, move on to <a href="https://microservices.io/patterns/data/database-per-service.html">deploying something with its own database</a>. If you leave the harder bits for too long, that extra challenge may start to appear too hard and become a mythological danger zone where no team wants to tread.</p>



<h2 class="wp-block-heading">Problems That Could Be Solved By Your First Microservices</h2>



<p>I&#8217;ll be adding each blog in the series in a list below as it is published. If you want to be notified when future articles are published, sign up using the form on the right just under my photo.</p>



<ul class="wp-block-list">
<li><a href="https://www.grahamlea.com/2019/06/slow-build-times-microservices/">Using Microservices to Solve Slow Build Times</a></li>



<li><a href="https://www.grahamlea.com/2019/07/microservices-reduce-merge-conflicts/">Using Microservices to Solve Developers Stepping on Each Other&#8217;s Toes</a></li>



<li><a href="https://www.grahamlea.com/2019/07/costly-deployments-microservices-less-frequent/">Using Microservices to Make Costly Deployments Less Frequent</a></li>
</ul>



<p class="has-text-align-right"><em>Image credits:<br>&#8216;</em><a href="https://www.flickr.com/photos/comedynose/33274863931/in/photostream/"><em>Project 365&nbsp;#71:&nbsp;120317 Box Of Cogs</em></a><em>&#8216; by Pete (from Liverpool)</em></p>
<p>The post <a href="https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/">How to Choose Your First Microservices</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2019/06/first-microservices-how-to-choose/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Feature Flags and Test-Driven Design: Some Practical Tips</title>
		<link>https://www.grahamlea.com/2019/05/feature-flags-tdd-practical-tips/</link>
					<comments>https://www.grahamlea.com/2019/05/feature-flags-tdd-practical-tips/#respond</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Fri, 31 May 2019 12:40:20 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[feature-branching]]></category>
		<category><![CDATA[feature-flags]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[test-driven-design]]></category>
		<category><![CDATA[test-driven-development]]></category>
		<category><![CDATA[tips]]></category>
		<guid isPermaLink="false">http://grahamlea.wpengine.com/?p=1234</guid>

					<description><![CDATA[<p>In 2018, our team spent a lot of time working with feature flags and test-driven design (TDD). Our project was to effect an architectural change to our system, changing the source of truth of some data, moving it out of &#8230; <a href="https://www.grahamlea.com/2019/05/feature-flags-tdd-practical-tips/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2019/05/feature-flags-tdd-practical-tips/">Feature Flags and Test-Driven Design: Some Practical Tips</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="p1"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-1235" src="https://www.grahamlea.com/wp-content/uploads/2019/03/4000195795_6841659fc6_z-300x235.jpg" alt="A country road with a fork going off to one side, symbolic of a feature flag in code" width="300" height="235" srcset="https://www.grahamlea.com/wp-content/uploads/2019/03/4000195795_6841659fc6_z-300x235.jpg 300w, https://www.grahamlea.com/wp-content/uploads/2019/03/4000195795_6841659fc6_z-192x150.jpg 192w, https://www.grahamlea.com/wp-content/uploads/2019/03/4000195795_6841659fc6_z-383x300.jpg 383w, https://www.grahamlea.com/wp-content/uploads/2019/03/4000195795_6841659fc6_z.jpg 640w" sizes="auto, (max-width: 300px) 100vw, 300px" />In 2018, our team spent a lot of time working with feature flags and <a href="https://hackernoon.com/introduction-to-test-driven-development-tdd-61a13bc92d92">test-driven design</a> (TDD).</p>
<p class="p1">Our project was to effect an architectural change to our system, changing the source of truth of some data, moving it out of the database owned by a legacy monolith into a new database controlled by a new <a href="https://www.grahamlea.com/tag/microservices/">microservice</a>. However, much of the code requiring the data would remain in the monolith.*</p>
<p class="p1">Some examples of the types of things we feature-flagged are:</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li class="p1">whether to go down a <a href="https://www.grahamlea.com/tag/refactoring/">refactored</a> code path or not;</li>
<li class="p1">whether to publish messages to a message queue when a certain event occurred;</li>
<li class="p1">how to publish those messages (we tried multiple variations of batching and transaction boundaries to achieve acceptable performance);</li>
<li class="p1">whether to just delete messages at the receiving end or actually handle them; and</li>
<li class="p1">whether to use a local source of data or remote one.</li>
</ul>
</li>
</ul>
<p class="p1">We were working on a pretty important piece of code; the kind of business function where, if we stuffed it up, someone would probably have to spend several days doing remedial fixups or making phone calls to chase up millions of dollars. <span id="more-1234"></span>Hence, most of the feature flags we put in were to ensure we could test new code paths in production, and rollback safely &amp; quickly. Some of them we even deliberately switched on for 10 minutes, let the new code run, shut them off again and then looked at the results offline. From memory, all of these flags were simple on/off switches, although we do have the capability to do per client/customer/category flags when we need to. These tips should work for either type.</p>
<p class="p1">Because we used so many different feature flags in a relatively short period of time, we got to experiment with and see the affect of a number of different patterns, both good and bad, and developed the following set of guidelines.</p>
<p class="p1">For context, in this particular app, our oldest and biggest monolith, most classes have a 1:1 unit test. That’s not our current preferred practice any more, but it’s a legacy we live with when working in this app. It also has a large collection of integration tests.</p>
<h2 class="p1"><b>Goals for Feature Flags with TDD</b></h2>
<p class="p1"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-1236" src="https://www.grahamlea.com/wp-content/uploads/2019/03/man-tree-grass-plant-male-recreation-748210-pxhere.com_-300x193.jpg" alt="An archer shooting an arrow past the viewer towards a target" width="300" height="193" srcset="https://www.grahamlea.com/wp-content/uploads/2019/03/man-tree-grass-plant-male-recreation-748210-pxhere.com_-300x193.jpg 300w, https://www.grahamlea.com/wp-content/uploads/2019/03/man-tree-grass-plant-male-recreation-748210-pxhere.com_-768x494.jpg 768w, https://www.grahamlea.com/wp-content/uploads/2019/03/man-tree-grass-plant-male-recreation-748210-pxhere.com_-233x150.jpg 233w, https://www.grahamlea.com/wp-content/uploads/2019/03/man-tree-grass-plant-male-recreation-748210-pxhere.com_-466x300.jpg 466w, https://www.grahamlea.com/wp-content/uploads/2019/03/man-tree-grass-plant-male-recreation-748210-pxhere.com_.jpg 800w" sizes="auto, (max-width: 300px) 100vw, 300px" />There’s a couple of goals that we were aiming for as we did this work:</p>
<ul class="ul1">
<li style="list-style-type: none;">
<ul class="ul1">
<li class="li1">We want to make sure all currently tested paths that the flag affects are tested with the flag on <i>and</i> off.</li>
<li class="li1">We don’t want our test suites to become too large and/or hard to understand because of feature flags.</li>
<li class="li1">We want a git history that’s easy to understand despite the temporary complexity of a feature flag.</li>
<li class="li1">Ideally, deleting a feature flag will be a quick task that requires no in-depth reading of the code or tests.</li>
</ul>
</li>
</ul>
<hr /><p><em>Ideally, deleting a feature flag will be a quick task that requires no in-depth reading of the code or tests.</em><br /><a href='https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.grahamlea.com%2F2019%2F05%2Ffeature-flags-tdd-practical-tips%2F&#038;text=Ideally%2C%20deleting%20a%20feature%20flag%20will%20be%20a%20quick%20task%20that%20requires%20no%20in-depth%20reading%20of%20the%20code%20or%20tests.&#038;via=evolvable&#038;related=evolvable' target='_blank' rel="noopener noreferrer" >Share on X</a><br /><hr />
<h2 class="p1"><b>Feature Flags and TDD: Our Five Guidelines</b></h2>
<h3 class="p1"><b>1: Make a copy of every affected test</b></h3>
<p class="p1">The first step to ensuring tests don’t get unwieldy is to not try and test all the feature flag ON and OFF cases in one test. So: don’t open up the existing test file and start adding new “Feature X ON” test cases. Instead, make TWO test files: one for flag on, one for flag off. Yes, we’ll probably have a bunch of duplicated test cases that are exactly the same in both files, maybe even most of them, but this is only temporary.</p>
<p class="p1">There are three benefits to this approach: First, we’ve avoided creating a confusing monstrosity of a test with flag on, flag off, and flag-agnostic tests all mingled in together. Second, once we’ve decided to keep the flag on permanently, we can just delete the whole “flag off” test file. “Simples!” Thirdly, we can do the setup for the flag once at the top of each test file, rather than having to set it at the start of each test case and hoping people notice that detail when reading the test.</p>
<h3 class="p1"><b>2. Make the copied file the test for the “Old” functionality, and the original file the test for the “New”</b></h3>
<p class="p1">When we make a copy of the existing test to a new file, we want to make the new file the<span class="Apple-converted-space">  </span>tests for the <i>old</i> functionality &#8211; with the feature flag off (e.g. cp FooTest<span class="Apple-converted-space">  </span>FooPreFeatureXTest) &#8211; and change the <i>original</i> test file to have the test cases for when the flag is on. This helps to keep a contiguous SCM history for the enduring test suite showing how the functionality progressed.</p>
<p class="p1">The alternative is to put the “feature flag on” test cases in the new file, then, when we get rid of the feature flag, deleting the original test and renaming the “new” one to the “normal” one (e.g. mv FooWithNewFeatureXTest<span class="Apple-converted-space">  </span>FooTest). We found problems with this latter approach when we looked at our git history: it would often show the whole test being deleted then re-created, which makes it much harder to inspect what changes were made to the tests when the new change was introduced.</p>
<h3 class="p1"><b>3. At the end of any test that enables a feature flag, always set the flag back to what it was before the test started</b></h3>
<p class="p1">This is important because, if our flags are stateful in a way that isn’t automatically reset<span class="Apple-converted-space">  </span>between tests, we can end up with tests that <i>don’t</i> specifically turn the flag on or off then randomly running with the flag on depending on the order in which our tests are executed. For most tests this won’t make a difference, but for some it will and we could get failures in our build that don’t make sense because we can’t see from the single test’s code that the flag was left on by another test before it ran.</p>
<p class="p1">Note also the careful wording of this rule: we don’t always <i>disable</i> the flag at the end of the test; we set it back to what it was before the test. Being disciplined in resetting the flag is crucial to making the next tip work.</p>
<h3 class="p1"><b>4. Run the whole build with the feature flag ON</b></h3>
<p class="p1">Once we think we’ve created pre-feature and post-feature versions of all the test suites that we believe are affected by the feature flag, we need to run the whole build with the flag ON. This will flush out tests that are affected by the flag where we haven’t yet created a divergent suite. If we’ve been sufficiently comprehensive in our test modifications, nothing should fail, because all tests of paths that care about the flag should already be explicitly setting the flag in the test.</p>
<p class="p1">In a simple microservice, we’re probably unlikely to find anything with this step, although it should be quick to run so it’s still worth doing. On the other hand, in a complex monolith with many components, it’s quite possible that there are parts of the system that we’ve forgotten rely on the behaviour that we’ve just changed, and their integration tests may well fail as a result of the changes. We really want to find these transitive breakages before switching on the feature flag in a production system. If we don’t, we actually end up running an untested version of that dependent component in prod.</p>
<h3 class="p1"><b>5. Switch on and delete feature flags ASAP</b></h3>
<p class="p1">Feature flags are a device for assisting in controlled, reversible migration in production systems, but they also complicate the code. We want our code to be simple, so when there are feature flags in place, we make it a high priority to get them switched on in production. If we don’t prioritise switching them on, we can’t prioritise deleting them. This becomes especially taxing if we find the need to put other feature flags in the same area and start getting feature flag interplay.</p>
<p class="p1">The instant that a migration is completed in prod and we’re happy that the functionality should remain, the feature flags become <a href="https://en.wikipedia.org/wiki/Technical_debt">technical debt</a>. We want to remove them as soon as possible afterwards so that we revert our code to being as simple as it can be.</p>
<hr /><p><em>The instant that a migration is completed in prod and we’re happy that the functionality should remain, the feature flags become technical debt.</em><br /><a href='https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.grahamlea.com%2F2019%2F05%2Ffeature-flags-tdd-practical-tips%2F&#038;text=The%20instant%20that%20a%20migration%20is%20completed%20in%20prod%20and%20we%E2%80%99re%20happy%20that%20the%20functionality%20should%20remain%2C%20the%20feature%20flags%20become%20technical%20debt.&#038;via=evolvable&#038;related=evolvable' target='_blank' rel="noopener noreferrer" >Share on X</a><br /><hr />
<h2 class="p1"><b>Yo, what about the Strategy pattern?</b></h2>
<p class="p1"><img loading="lazy" decoding="async" class="alignright" src="https://upload.wikimedia.org/wikipedia/commons/3/39/Strategy_Pattern_in_UML.png" alt="Class diagram of the strategy pattern showing a context using a strategy interface, with two concrete implementations" width="256" height="160" />When I shared some of the above tips on Twitter, a few people responded that they like to use the <a href="https://en.wikipedia.org/wiki/Strategy_pattern">Strategy pattern</a> when they’re doing feature flagging.</p>
<p class="p1">While I’m a big fan of the Strategy pattern, I would generally avoid it when feature flagging. My reasoning is that feature flagging is ideally a <i>temporary</i> measure, whereas the Strategy pattern is a design construct for supporting multiple implementations. While feature flagging often results in multiple implementations for a short time, I don’t think it’s worth introducing a design construct for this short period, only to delete it again shortly after, once the flag is removed. So we generally just used an if/else in all places that rely on the flag, knowing that the ‘else’ branch will be removed shortly. We would probably make an exception to this if the feature flag pertained to a large or complex piece of code that was being almost entirely re-written, and it was clear that readability would be greatly improved by having the two implementations in separate classes.</p>
<h2 class="p1"><b>How do YOU do Feature Flags and TDD?</b></h2>
<p class="p1">These are the main guidelines that our team developed through almost a year of feature-flagging our way through a complex piece of migration work. If you’ve got other tips for how the work with feature flags, particularly in a TDD environment, I’d love to hear about them in the comments below.</p>
<p><em>* I just want to note that this is <span style="text-decoration: underline;">not</span> a good design, nor one that we were keen on implementing. It was a compromise forced by a data migration effort with a deadline and some very old code that couldn&#8217;t be extracted from a monolith easily.</em></p>
<p style="text-align: right;"><em>Image credits:<br />&#8216;<a href="https://www.flickr.com/photos/bs0u10e0/4000195795">Fork in the road</a>&#8216; by Bs0u10e0</em><br /><em><a href="https://pxhere.com/en/photo/748210">Archer</a> by Unknown</em><br /><em>&#8216;<a href="https://commons.wikimedia.org/wiki/File:Strategy_Pattern_in_UML.png">Strategy pattern in UML</a>&#8216; by Jason S. McDonald</em></p>


<p></p>
<p>The post <a href="https://www.grahamlea.com/2019/05/feature-flags-tdd-practical-tips/">Feature Flags and Test-Driven Design: Some Practical Tips</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2019/05/feature-flags-tdd-practical-tips/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Time to Evolve Again</title>
		<link>https://www.grahamlea.com/2019/04/time-to-evolve-again/</link>
					<comments>https://www.grahamlea.com/2019/04/time-to-evolve-again/#respond</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Fri, 05 Apr 2019 07:29:14 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[culture]]></category>
		<category><![CDATA[fintech]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[neobank]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[tyro]]></category>
		<guid isPermaLink="false">https://www.grahamlea.com/?p=1242</guid>

					<description><![CDATA[<p>After 12.3 years, yesterday was my last day at @Tyro. &#x1f622; It’s been a huge journey, from a perilous payments startup with less than 20 employees and only &#x261d;&#x1f3fb; customer, to now a VC-backed, fully-licensed bank with well over 400 &#8230; <a href="https://www.grahamlea.com/2019/04/time-to-evolve-again/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2019/04/time-to-evolve-again/">Time to Evolve Again</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="alignright size-large is-resized"><a href="https://www.grahamlea.com/wp-content/uploads/2019/04/IMGP5869-e1691149423864.jpg"><img decoding="async" src="https://www.grahamlea.com/wp-content/uploads/2019/04/IMGP5869-e1691149423864-987x1024.jpg" alt="My mid-2000s, fresh-faced, professional look from around the time I joined Tyro." class="wp-image-1271" width="-408" height="-405" srcset="https://www.grahamlea.com/wp-content/uploads/2019/04/IMGP5869-e1691149423864-987x1024.jpg 987w, https://www.grahamlea.com/wp-content/uploads/2019/04/IMGP5869-e1691149423864-289x300.jpg 289w, https://www.grahamlea.com/wp-content/uploads/2019/04/IMGP5869-e1691149423864-768x797.jpg 768w, https://www.grahamlea.com/wp-content/uploads/2019/04/IMGP5869-e1691149423864.jpg 1226w" sizes="(max-width: 987px) 100vw, 987px" /></a></figure>
</div>


<p>After 12.3 years, yesterday was my last day at <a rel="noreferrer noopener" href="https://twitter.com/Tyro" target="_blank">@Tyro</a>. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f622.png" alt="😢" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>It’s been a huge journey, from a perilous payments startup with less than 20 employees and only <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/261d-1f3fb.png" alt="☝🏻" class="wp-smiley" style="height: 1em; max-height: 1em;" /> customer, to now a VC-backed, fully-licensed bank with well over 400 staff that is Australia’s 5th largest EFTPOS provider (by transaction volume).</p>



<p>I’ve done time as a Software Engineer, Development Lead, Engineering Lead (part of the management team), Technical Project Manager, Team Lead, Product Lead, and this last year, back to Software Engineer. I must have hired 50+ (awesome) people and interviewed many times that.</p>



<span id="more-1242"></span>


<div class="wp-block-image">
<figure class="alignright size-full is-resized"><a href="https://www.grahamlea.com/wp-content/uploads/2019/04/8D823CA4-7D63-45B6-95E1-84DAF26CF633_1_201_a.jpeg"><img decoding="async" src="https://www.grahamlea.com/wp-content/uploads/2019/04/8D823CA4-7D63-45B6-95E1-84DAF26CF633_1_201_a.jpeg" alt="My late-2010s, &quot;I still want to look like I work at a startup even though we're really not&quot; style." class="wp-image-1272" width="-50" height="-57" srcset="https://www.grahamlea.com/wp-content/uploads/2019/04/8D823CA4-7D63-45B6-95E1-84DAF26CF633_1_201_a.jpeg 547w, https://www.grahamlea.com/wp-content/uploads/2019/04/8D823CA4-7D63-45B6-95E1-84DAF26CF633_1_201_a-206x300.jpeg 206w" sizes="(max-width: 547px) 100vw, 547px" /></a></figure>
</div>


<p>We listened to new voices in tech and followed their common sense advice. Often we only discovered years later that we were on the bleeding edge of movements like agile, DB evolution, microservices, and continuous delivery.</p>



<p>We built a bank.</p>



<p>From scratch.</p>



<p>In Java.</p>



<p>While still figuring out how to do microservices.</p>



<p>WE BUILT A FRIGGIN BANK! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f633.png" alt="😳" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>And what I’ve come to realise is that every achievement on my LinkedIn profile while at Tyro will look like this:<br>“We…<br>We…<br>We…<br>We…&#8221;<br>Because it was all about the team, all the time. *I* achieved very little. Together, we’ve achieved so much. And that’s how it should be.</p>



<p>What’s next? It’s very exciting. A short break, then I’m starting my own business.</p>



<p>It’s no secret that I’m all in on&nbsp;<a href="https://twitter.com/hashtag/microservices?src=hash" target="_blank" rel="noreferrer noopener">#microservices</a>. The “post-DevOps” style of architecture solves some big problems, but creates a bunch of new ones. Our mission will be to help teams solve those, pulling the brakes off microservices so teams can reach their full potential.</p>



<p>If you want to hear more about that journey, DM me your email address <a href="https://twitter.com/evolvable">on Twitter</a> with the message “Add me” and I’ll put you in my personal mailing list. (You should also turn on notifications for <a rel="noreferrer noopener" href="https://twitter.com/TechDownunder" target="_blank">@TechDownunder</a>!)</p>



<p>Finally, I want to confirm&nbsp;<a href="https://twitter.com/BillGates" target="_blank" rel="noreferrer noopener">@BillGates</a>’ observation: “Most people overestimate what they can do in one year and underestimate what they can do in ten years.” If you only stay in a company for a year or two, don’t expect to see any significant progress come out of your efforts. But if you hang around for a decade, you might just get to be part of changing an industry.</p>
<p>The post <a href="https://www.grahamlea.com/2019/04/time-to-evolve-again/">Time to Evolve Again</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2019/04/time-to-evolve-again/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>&#8220;This work kinda sucks right now&#8221;: Staying motivated in the uninspiring phases of long projects</title>
		<link>https://www.grahamlea.com/2018/09/staying-motivated-long-projects/</link>
					<comments>https://www.grahamlea.com/2018/09/staying-motivated-long-projects/#comments</comments>
		
		<dc:creator><![CDATA[Graham Lea]]></dc:creator>
		<pubDate>Sun, 30 Sep 2018 10:43:27 +0000</pubDate>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[engagement]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[teams]]></category>
		<category><![CDATA[tyro]]></category>
		<guid isPermaLink="false">http://grahamlea.wpengine.com/?p=1224</guid>

					<description><![CDATA[<p>In April 2015, I was the technical project manager of six software teams all working on one gigantic project. It was the biggest challenge the company had ever taken on. The goal: create and stand up a transaction account product &#8230; <a href="https://www.grahamlea.com/2018/09/staying-motivated-long-projects/">Continue reading <span class="meta-nav">&#8594;</span></a></p>
<p>The post <a href="https://www.grahamlea.com/2018/09/staying-motivated-long-projects/">&#8220;This work kinda sucks right now&#8221;: Staying motivated in the uninspiring phases of long projects</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In April 2015, I was the technical project manager of six software teams all working on one gigantic project. It was the biggest challenge the company had ever taken on. The goal: create and stand up a transaction account product for small and medium business so that we could apply for an unrestricted bank license.</p>
<p><img loading="lazy" decoding="async" class="alignright wp-image-1225 size-medium" src="https://www.grahamlea.com/wp-content/uploads/2018/09/runner_marathon_tired_street_young_male_chinese_mongolia-739332.jpgd_-300x172.jpeg" alt="Tired marathon runner with hands on hips" width="300" height="172" /></p>
<p>We were 12 months in and were about to finish the project bang on the week we’d estimated, when the inevitable happened: we received a new raft of requirements that would add at least another 3 months of work. The extra work wasn’t glamorous; it was mostly security enhancements, disaster recovery preparation, and a complicated behind-the-scenes tweak of the product that added little benefit for users but was a requirement from a regulatory point of view.</p>
<p>Understandably, morale took a hit, but we needed to keep the pace up or we’d risk missing the deadline we’d been set for acquiring our license. After an interesting discussion with my father-in-law about the project, I found a new perspective on where we were at, and it prompted me to write the internal blog below to help motivate the team towards our final goal. <span id="more-1224"></span>A few people told me they appreciated it, and grumbling seemed to subside as everyone hunkered down and pushed towards the finish line.</p>
<p>Just recently, though, I was surprised when I overheard a colleague, in a team that is in a similar last-20%-grind scenario, recommending this three-year-old blog to a newer comrade and looking it up for them to read. Curious, I went back and had a re-read of it myself, and I found that what I thought was a point-in-time pep talk for a particular team, was actually a fairly general motivational piece.</p>
<p>So, whether you’re currently in a team slogging its way through the boring final stages of a project, or in the exciting first phases of something that will eventually end up in the same place, I hope you find this useful in granting you some perspective and grit for the long haul.</p>
<hr />
<h1><em>“This work kinda sucks right now”</em></h1>
<p><em><img loading="lazy" decoding="async" class="alignright size-medium wp-image-1226" src="https://www.grahamlea.com/wp-content/uploads/2018/09/91147636_ddf67df098_z-300x200.jpg" alt="Woman with glasses looking very bored" width="300" height="200" srcset="https://www.grahamlea.com/wp-content/uploads/2018/09/91147636_ddf67df098_z-300x200.jpg 300w, https://www.grahamlea.com/wp-content/uploads/2018/09/91147636_ddf67df098_z-225x150.jpg 225w, https://www.grahamlea.com/wp-content/uploads/2018/09/91147636_ddf67df098_z-451x300.jpg 451w, https://www.grahamlea.com/wp-content/uploads/2018/09/91147636_ddf67df098_z.jpg 640w" sizes="auto, (max-width: 300px) 100vw, 300px" />Hi folks,</em></p>
<p><em>I’ve had a number of people comment to me over the last month or two that [Project T] work “seems to be drying up” or “we seem to be just doing lots of little things”.</em></p>
<p><em>I can understand where these sentiments are coming from. Over the last year, we’ve built…</em></p>
<ul>
<li><em>a transaction account, integrated with our payments services;</em></li>
<li><em>a phone app;</em></li>
<li><em>integration with Xero;</em></li>
<li><em>a new accounting system;</em></li>
<li><em>an on-phone registration experience;</em></li>
<li><em>an application processing and customer support web app;</em></li>
<li><em>account provisioning, orchestrated across a distributed system;</em></li>
<li><em>bank statements and other crucial regulatory reports and features;</em></li>
<li><em>undoubtedly a whole bunch of other stuff I’ve forgotten.</em></li>
</ul>
<p><em>But now, over the last couple of months, each team has been moving onto the huge mound of security remediation work we created for ourselves. Some of this work has been large and somewhat interesting, for example the principal propagation with [technology redacted] piques my interest. Other parts have been less glamorous, like preventing log files from having newlines or dodgy data injected into them. (You win some, you lose some, hey [team who did the log filtering, but also some of the most interesting early work]?)</em></p>
<p><em>At the same time, many of us have been tying up a lot of loose ends: pact tests, tools for Ops to configure Rabbit MQ or firewalls, build processes for iPhones, preparing SIT and Production environments with test data, and documentation. Documentation, for goodness sake! How un-Tyro of us.</em></p>
<h2><em>Big Projects</em></h2>
<p><em><img loading="lazy" decoding="async" class="alignright size-medium wp-image-1227" src="https://www.grahamlea.com/wp-content/uploads/2018/09/2018-Road-Construction-Excavation-cmp-for-web-225x300.jpg" alt="Large digger ripping up road next to large dump truck" width="225" height="300" srcset="https://www.grahamlea.com/wp-content/uploads/2018/09/2018-Road-Construction-Excavation-cmp-for-web-225x300.jpg 225w, https://www.grahamlea.com/wp-content/uploads/2018/09/2018-Road-Construction-Excavation-cmp-for-web-113x150.jpg 113w, https://www.grahamlea.com/wp-content/uploads/2018/09/2018-Road-Construction-Excavation-cmp-for-web.jpg 336w" sizes="auto, (max-width: 225px) 100vw, 225px" />I was chatting with my father-in-law about this “large project” of ours last weekend. He used to build roads. Big roads. He built the F3 from Sydney to Newcastle. (Not by himself of course.) He has some great stories about tricking magpies to come and sit on explosives just when they were going to blow them. But I digress…</em></p>
<p><em>He said they had exactly the same circumstance when building freeways. At the start there was all kinds of interesting stuff going on: blowing up mountains, building bridges, levelling huge swathes of bushland and surfacing them with huge machines that were the latest technology.</em></p>
<p><em>As the project neared the end, though, it was the little things that started to become important. On-ramps to local roads were built, safety fences had to be erected, road signs put in place, paint laid down for the lines, and yes… documentation. The project tailed off with the little things, but they’re still crucially important. Without onramps, you can’t get on the road in the first place; without safety fences, the road is too risky in the infrequent but inevitable occurrence of an accident; without road signs, the road can’t be navigated and drivers might drive at unsafe speeds; without that paint marking the lanes: bedlam! These aren’t jobs anyone would write home about, but without each one being completed, not a single public car would be allowed to drive the road.</em></p>
<p><em>And so it is with our project. These “little things” we have been focussed on for the last few months, and will continue to focus on for a month or two ahead, are no less important than those big things that have come before. They’re no less important because, without doing them, we have nothing &#8211; we will have no license and without a license we have no product.</em></p>
<p><em>A few of you may have been down this road before, but some may not. Some who’ve been at Tyro for a while may have forgotten what the end of a project feels like, because it’s rare for us to batch this much functionality into a single “release”. The fact is, the end of projects always has this runoff, and it’s often a hard slog and seems like it’s never going to end.</em></p>
<p><em>I’ve been through this experience personally a couple of times in recent years, having developed and released both an app on the App Store and a commercial Atlassian Stash [now Bitbucket Server] plugin. In both situations, developing the product was only 50-70% of the work, and the rest was &#8220;admin&#8221;: creating icons, setting up accounts, writing marketing copy, making web sites &#8211; nothing to do with the interesting coding problems that got me started in the first place. It was super hard to be motivated while doing this stuff, especially as I was spending my minuscule spare time on it. I literally considered giving up a number times with each project, but I kept going, spurred on by the idea of finishing something significant and seeing it released into the wild, in other people’s hands.</em></p>
<h2><em>So what am I really writing about here?</em></h2>
<p><em>Three things:</em></p>
<p><em><img loading="lazy" decoding="async" class="alignright size-medium wp-image-1228" src="https://www.grahamlea.com/wp-content/uploads/2018/09/4970062156_1bec957120_z-300x225.jpg" alt="Swiss army knife" width="300" height="225" srcset="https://www.grahamlea.com/wp-content/uploads/2018/09/4970062156_1bec957120_z-300x225.jpg 300w, https://www.grahamlea.com/wp-content/uploads/2018/09/4970062156_1bec957120_z-200x150.jpg 200w, https://www.grahamlea.com/wp-content/uploads/2018/09/4970062156_1bec957120_z-400x300.jpg 400w, https://www.grahamlea.com/wp-content/uploads/2018/09/4970062156_1bec957120_z.jpg 640w" sizes="auto, (max-width: 300px) 100vw, 300px" />Firstly: What is a Software Engineer? It’s more than a programmer, or a software developer. It’s a <a href="http://en.wikipedia.org/wiki/T-shaped_skills">T-shaped role</a> with very long sleeves, and that’s why we use that &#8220;Engineer&#8221; title rather than other ones. We don’t have architects or designers or DBAs or performance tuning gurus<sub>[1]</sub> &#8211; the software engineers do all that. At the same time, we don’t have a security infrastructure team, or a security logging team, or an iPhone build maintenance team, because, as Software Engineers, we can stretch our arms to those skills as well. The role is broader than a full-stack developer &#8211; it’s a technologist that does a lot of programming but can also do lots of other things. Sometimes those things are big and exciting, sometimes they’re neither, but the people we hire here have the skills and the attitude to get stuff done that needs to be done. And you&#8217;re doing that, so well done.</em></p>
<p><em>Secondly: I think quite a few people are struggling to feel motivated about the work we’re doing right now. I get that. I’ve been there. Eight and a half years I’ve worked at Tyro now and I’m not going to pretend that every single day has been a mind-blowing celebration of awesome coding fun. One of the great things about Tyro, though, is that, a lot of the time, the work is interesting enough that it really is self-motivating: you want to get in to work each day and start coding on that feature or solving that problem. Right now, a lot of you may not be feeling that.</em></p>
<p><em>So, how can you stay motivated? My suggestion is to focus on the end goal, which is not that far off. Think about the collective thrill we’ll feel when the first pilot merchant deposits their hard-earned cash into a Tyro Account and then uses it to pay a bill through our app with just a PIN number and one tap. This is history in the making. That&#8217;s worth repeating: This is history in the making. You&#8217;re a part of it. The work you’re on right now might not be stimulating your mind, but without it we’ll never be able to step across that finish line and launch this awesome product that we’ve spent the last year on. This is the last 500m of a marathon. Keep your chin up, look at the goal, and keep moving.</em></p>
<p><em>Thirdly: What comes next? We’re clocking through this security work at the rate of one person-month per day. (Yes, between 6 [Project T] teams you do a month of work every day! It stresses me out!) What are we all going to do as we wrap this stuff up? Well, that is not up to me, and not entirely decided yet, but [the Head of Product] has lots of ideas for where to go next and is working right now on picking exactly what the next priorities are going to be. He’s kindly offered to do another “state of the [Project T]” session and share some of the ideas about where release 2 might head. We’re going to do this at the end of this week&#8217;s Tech Talk after lunch this Thursday.</em></p>
<h2><em>tl;dr</em></h2>
<p><em>• You’re Software Engineers. You can do anything, big or small. Sometimes that means doing small stuff.</em><br />
<em>• If the “what” of your work sucks for a little while, try to focus on the “why” and push ahead towards the goal. Stick in there. It’ll get better. (If it doesn’t, tell us so we can fix that for you.)</em><br />
<em>• [Project T] release 2 is right around the corner. Stay tuned.</em></p>
<p><em>Finally, if you want to talk about any of this, or about how you&#8217;re feeling about work, feel free to come and grab me for a chat any time.</em></p>
<hr />
<p>By the way, we got across the finish line, and we got a banking license. We made history.</p>
<p>But <a href="https://www.grahamlea.com/2015/03/microservices-tyro-evolution-presentation/">that&#8217;s another story</a>.</p>
<p style="text-align: right;"><em>Image credits: <a href="https://pxhere.com/en/photo/739332">Tired man running</a>, public domain<br />
&#8216;<a href="https://www.flickr.com/photos/scragz/91147636">Colleen is bored</a>&#8216; by Jason Scragz<br />
&#8216;<a href="https://www.nps.gov/colm/planyourvisit/construction-projects.htm">Excavator Working to Remove the Road Base on Rim Rock Drive</a>&#8216; by NPS<br />
&#8216;<a href="https://www.flickr.com/photos/capcase/4970062156">Victorinox Swiss Army Knife</a>&#8216; by James Case</em></p>
<p><sub>[1] Since 2015, we have hired architects and DBAs, though delivery teams are still largely responsible for designing their own software and databases.</sub></p>
<p>The post <a href="https://www.grahamlea.com/2018/09/staying-motivated-long-projects/">&#8220;This work kinda sucks right now&#8221;: Staying motivated in the uninspiring phases of long projects</a> appeared first on <a href="https://www.grahamlea.com">Evolvable Me</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.grahamlea.com/2018/09/staying-motivated-long-projects/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
