<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.5">Jekyll</generator><link href="https://www.devcycle.co.uk/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.devcycle.co.uk/" rel="alternate" type="text/html" /><updated>2024-03-08T09:43:06+00:00</updated><id>https://www.devcycle.co.uk/feed.xml</id><title type="html">DevCycle</title><subtitle>DevCycle is an IT consultancy with thirty years of Architecture, Design and Software Development experience. We also have over nineteen years of Lean and Agile coaching experience.</subtitle><author><name>Chris Howe-Jones</name></author><entry><title type="html">Not all KPIs are created equal</title><link href="https://www.devcycle.co.uk/kpis-not-all-equal/" rel="alternate" type="text/html" title="Not all KPIs are created equal" /><published>2024-03-07T00:00:00+00:00</published><updated>2024-03-07T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/kpis-not-all-equal</id><content type="html" xml:base="https://www.devcycle.co.uk/kpis-not-all-equal/"><![CDATA[<h1 id="not-all-kpis-are-created-equal">Not all KPIs are created equal</h1>

<p>I advocate for metrics tied to actual business value, like KPIs, but I sometimes see these miss the mark.</p>

<p>For example, I worked with an eCommerce software company and was tasked with meeting an SEO target of increasing the sites ranking to increase revenue.
This was in early 2016 when Google and other search engines weren’t crawling single-page applications properly. So the site was not appearing high up,
or at all, in searches for our product catalogue.</p>

<p>On the surface, this is a very reasonable target. We spent several weeks investigating rewriting parts of the single-page application to pre-render
server-side to allow the search engines to crawl the data. This was going to be a radical rewrite which would take many months involving most of the
engineering teams.</p>

<p>However, during this process, we started to look at the data we had around our user-profiles and the usage patterns on the site. The site sold high-end
luxury fashion clothes and jewellery. The conversion rate was quite low but the average basket value was very high (&gt; £30k).</p>

<p>By examining this data and publishing a survey attached to the registration  and checkout processes we determined that almost all of these high value clients were
not even searching for our site through search engines. The traffic to the site was driven evenly from fashion magazine advertising and
social media posts.</p>

<p>Due to this revelation, we switched our efforts from SEO to streamlining our registration process, checkout process, and started to sponsor social
media influencers. This increased conversion rate (albeit lowering the average basket value) and more efficiently pushed high-value clients to
the site.</p>

<p>As a happy side effect less than four months after abandoning the attempts at increasing site ranking, Google’s crawler was
updated to crawl single-page applications and our page ranking increased without us having to expend more time on it.</p>

<p>Sometimes, it’s worth challenging the hypothesis behind a target as not all KPIs are created equal.</p>

<hr />
<p><sub>If you want to discuss how to use hypothesis driven development please contact me through the comments, <a href="mailto:chris.howe-jones@devcycle.co.uk">email</a> or
<a href="https://www.linkedin.com/in/chrishowejones/">LinkedIn</a>.</sub></p>

<p><sub>Photo by <a href="https://www.pexels.com/photo/close-up-photo-of-survey-spreadsheet-590022/">Lukas</a></sub></p>]]></content><author><name>Chris Howe-Jones</name></author><category term="ai" /><category term="data" /><summary type="html"><![CDATA[Sometimes it's worth challenging the hypothesis behind a target...]]></summary></entry><entry><title type="html">Off-the-shelf is not always cheaper</title><link href="https://www.devcycle.co.uk/COTS/" rel="alternate" type="text/html" title="Off-the-shelf is not always cheaper" /><published>2024-03-05T00:00:00+00:00</published><updated>2024-03-05T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/COTS</id><content type="html" xml:base="https://www.devcycle.co.uk/COTS/"><![CDATA[<h1 id="off-the-shelf-is-not-always-cheaper">Off-the-shelf is not always cheaper</h1>

<p>I have had several clients who have asked me to carry out software architecture reviews to determine how to replace bespoke software
developed in-house with a commercial off-the-shelf (COTS) solution.</p>

<p>What I’ve found with most of these clients has been that the COTS solution (even if customisable) only covers about 70-80% of the functionality of the
bespoke solution that they wish to replace. It also covers a load of other areas and features that the client has no use for. In addition, they’re
often not aware of the operational expenditure that the COTS solution will take and haven’t factored in the cost of customisations and
maintenance so they’re not comparing like with like. They also tend to underestimate the cost and the timescale of the data migration work required to
move to the replacement system (usually by a factor of 2.5).</p>

<p>Even when all this is taken into account a small cost difference in favour of the bespoke solution alone would not necessarily prevent me from
recommending moving to an off-the-shelf solution as it can pay off in reduced opportunity cost due to freeing internal engineering capacity.</p>

<p>However, the biggest factor around how to progress is usually what makes your business unique. This is usually your value proposition and the reason
you get the market share you do. This value proposition is often built into your bespoke solution but not something easily replicated in the off-the-shelf solution (as it’s unique!).</p>

<p>This is usually what leads me to recommend either not moving to the off-the-shelf solution or even taking a hybrid approach of replacing all but the
unique value proposition and either keeping the bespoke solution or building a replacement for the value proposition only.</p>

<p>All of this can be summed up as don’t give away the Crown Jewels of your business to a vendor who can’t do it as well and can utilise your data to
determine how to replicate it for your competitors.</p>

<p>Conversely, if the bespoke solution does not make your business unique then consider a commercial replacement (depending on the costs).</p>

<hr />
<p><sub>If you want to discuss how to determine how to migrate to new solutions please contact me through the comments, <a href="mailto:chris.howe-jones@devcycle.co.uk">email</a> or
<a href="https://www.linkedin.com/in/chrishowejones/">LinkedIn</a>.</sub></p>

<p><sub>Photo by <a href="https://www.pexels.com/photo/grayscale-photography-of-assorted-apparels-on-shelf-rack-1884581/">Tembela Bohle</a></sub></p>]]></content><author><name>Chris Howe-Jones</name></author><category term="ai" /><category term="data" /><summary type="html"><![CDATA[... don't give away the Crown Jewels of your business to a vendor who can't do it as well...]]></summary></entry><entry><title type="html">You don’t need Artificial Intelligence, you need Active Information</title><link href="https://www.devcycle.co.uk/active-information/" rel="alternate" type="text/html" title="You don’t need Artificial Intelligence, you need Active Information" /><published>2024-03-03T00:00:00+00:00</published><updated>2024-03-03T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/active-information</id><content type="html" xml:base="https://www.devcycle.co.uk/active-information/"><![CDATA[<h1 id="you-dont-need-artificial-intelligence-you-need-active-information">You don’t need Artificial Intelligence, you need Active Information</h1>

<p>You may think that AI is the solution but are you even making the best use of the information you already have?</p>

<p>Last week I was having a chat with my friend and entrepreneur <a href="https://www.linkedin.com/in/mike-o-5309035/">Mike</a> in a
coffee shop the other day and the subject turned to AI.</p>

<p>During the discussion, we came to the conclusion that most businesses considering using AI don’t understand the data they already have or
could have. Often these jewels of information are in disparate locations, difficult to use formats or not even captured.</p>

<p>As we both enjoy a good simile we analogised this data to reservoirs whose locations are not even known let alone used
to power electric turbines.</p>

<p>Often these businesses jump to a solution (data warehouse, data lake, data lakehouse..) without even understanding what
the data is, how it might be used and how much it will cost to get it fit for use, let alone the opportunity costs of
not utilising it.</p>

<p>It sounds counter-intuitive but I tend to build data strategies, tactically, one question at a time, incrementing to build
towards a coherent approach, learning as I progress.</p>

<p>I’ve worked with dozens of clients to:</p>

<ol>
  <li>Identify the key value propositions.</li>
  <li>Identify a manageable number of metrics for this value.</li>
  <li>Build systems to capture and broadcast these metrics.</li>
  <li>Ingest and transform existing data sources.</li>
  <li>Blend existing data and metrics to answer a specific and manageable number of questions.</li>
  <li>Identify actions and implement them.</li>
  <li>Repeat from 1.</li>
</ol>

<p>Often this process can identify data you already have that’s not readily usable because:</p>

<ol>
  <li>You weren’t aware you already captured it.</li>
  <li>It’s in a format and/or location that makes it unmanageable.</li>
  <li>It’s missing a key dimension you’re not already capturing.</li>
</ol>

<p>In a lot of cases, the missing technology that’s preventing you from getting value from your data is data engineering and
not AI.</p>

<hr />
<p><sub>If you want to discuss how to release the potential of your data please contact me through the comments, <a href="mailto:chris.howe-jones@devcycle.co.uk">email</a> or
<a href="https://www.linkedin.com/in/chrishowejones/">LinkedIn</a>.</sub></p>

<p><sub>Photo by <a href="https://www.pexels.com/photo/full-frame-shot-of-shelf-256453/">Pixabay</a></sub></p>]]></content><author><name>Chris Howe-Jones</name></author><category term="ai" /><category term="data" /><summary type="html"><![CDATA[... the missing technology that's preventing you from getting value from your data is data engineering and not AI.]]></summary></entry><entry><title type="html">Living in a material world… part 1</title><link href="https://www.devcycle.co.uk/material-world-1/" rel="alternate" type="text/html" title="Living in a material world… part 1" /><published>2023-08-12T00:00:00+00:00</published><updated>2023-08-12T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/material-world-1</id><content type="html" xml:base="https://www.devcycle.co.uk/material-world-1/"><![CDATA[<h1 id="how-the-materials-of-development-affect-software">How the ‘materials’ of development affect software?</h1>

<p>I find it incongruous that in the software development industry we often talk about languages, frameworks, libraries and
architectural patterns but we don’t often consider them as construction materials. We do consider some ‘structural
properties’ like performance, resilience, security but we often make a decision based on these properties and apply it
to our entire system.</p>

<p>If we were fabricating something physical (non-digital) would we choose one material for our entire project? Would we
ignore other properties like malleability, texture, density? Would we require the same structural rigidity
everywhere or would we pick materials that had more ‘give’ in places that require change and add rigidity in places
under extreme stress?</p>

<p>We often think about programming languages and libraries as tools but they are part of our product. The choices we make
affect the amount of change we can accommodate, the ‘texture’ of those languages, frameworks and libraries have a
visceral impact on how our engineers work with them, to the point that they can make engineers leave to work on
something more fun.</p>

<p>This is often the underlying reason why we see large tech companies that start with one language and then re-write parts
(or all) of their system in other languages later, usually once the need for the product has been established, the problem
areas identified and the stresses caused by changes, performance constraints, load, etc. measured and understood.</p>

<p>This is also another reason modularization patterns, such as micro services, have gained popularity. But these patterns
in themselves are material choices. When we are proving our concept viable (startup mode) should we build lots of
separate components in concrete, stainless steel and glass, then fit them together with different glues, screws and fitments
(often bespoke) or should we shape something quickly out of polystyrene or wood and test it first?</p>

<p>We should think about computer science as a material science. We should consider the intrinsic properties of our
building materials and consider what is suitable for our current environment and how we might evolve to different
materials as our environment changes.</p>

<hr />
<p><sub>If you want to discuss how the ‘material science’ of software development has an impact on your software and your
development teams please contact me through the comments, <a href="mailto:chris.howe-jones@devcycle.co.uk">email</a> or
<a href="https://www.linkedin.com/in/chrishowejones/">LinkedIn</a> to discuss in more detail.</sub></p>

<p><sub>Photo by <a href="https://www.pexels.com/photo/curving-shaped-fragment-of-modern-building-7078717/">Laura Tancredi</a></sub></p>]]></content><author><name>Chris Howe-Jones</name></author><category term="startup" /><category term="scaling up" /><category term="software development" /><summary type="html"><![CDATA[How the 'materials' of development affect software]]></summary></entry><entry><title type="html">How to scale your technology… pick your constraints</title><link href="https://www.devcycle.co.uk/scaling-users/" rel="alternate" type="text/html" title="How to scale your technology… pick your constraints" /><published>2023-05-01T00:00:00+00:00</published><updated>2023-05-01T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/scaling-users</id><content type="html" xml:base="https://www.devcycle.co.uk/scaling-users/"><![CDATA[<h1 id="how-to-scale-technology">How to scale technology?</h1>

<p>As a start-up founder you probably lie awake worrying about “How will my technology cope with another 10 or even 100
thousand users overnight?”. Firstly, if you genuinely have this concern, congratulations it’s a great problem to have!
Most start-ups never get to the stage of having to worry about exponential growth.</p>

<p>Secondly, your major concern at this stage shouldn’t be rapidly adding shiny new features but things not breaking
catastrophically so you retain customers and don’t suffer irrevocable reputational damage.</p>

<h2 id="microservices-function-as-a-service-serverless">Microservices, Function-as-a-Service, Serverless…?</h2>

<p>Should you build your software as a number of microservices, should you use serverless database, should you use AWS
Lambdas/Azure Functions/Google Cloud Functions, do we need an API Gateway…? Too many technologies, too many buzzwords, and
too many choices.</p>

<p>In fact, you’re probably worrying about the wrong choices.</p>

<h2 id="not-can-my-tech-scale-but-can-my-engineers-scale-my-tech">Not ‘Can my tech scale’ but ‘Can my Engineers scale my tech’?</h2>

<p>If you’ve read my other writings you’ll recognise a theme, I like to think of software as existing within layers of
ecosystems.</p>

<figure>
	<img src="/assets/images/ecosystems_feedback.png" />
	<figcaption>Nested Tech Ecosystems.</figcaption>
</figure>

<p>Scaling your technology successfully relies on the ecosystems that it’s developed within, which depend,
incongruously, on constraints.</p>

<p>If you pick the right constraints for your technology team(s) you provide the right guard rails and support for your
team(s) which in turn will provide the right technology and architecture to respond rapidly to change, like rapid user
growth.</p>

<hr />

<p><sub>If you want to hear more about my thoughts on how to scale or software ecosystems let me know in the comments.</sub></p>]]></content><author><name>Chris Howe-Jones</name></author><category term="startup" /><category term="scaling up" /><category term="software development" /><summary type="html"><![CDATA[Like plants, technology growth needs support and constraints]]></summary></entry><entry><title type="html">Should I hire 10 Software Engineers or one x10 Software Engineer?</title><link href="https://www.devcycle.co.uk/scaling-developers/" rel="alternate" type="text/html" title="Should I hire 10 Software Engineers or one x10 Software Engineer?" /><published>2023-04-17T00:00:00+00:00</published><updated>2023-04-17T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/scaling-developers</id><content type="html" xml:base="https://www.devcycle.co.uk/scaling-developers/"><![CDATA[<h1 id="should-i-hire-10-software-engineers-or-one-x10-software-engineer">Should I hire 10 Software Engineers or one x10 Software Engineer?</h1>

<p>Neither!</p>

<p>Well that was quick… on to the next subject!</p>

<p>Seriously though when I hear a startup/scaleup asking how to hire many Engineers quickly it’s usually symptomatic of a
business whose current Engineers are swamped or a business that’s trying to tackle a founder/investor wish list of many
targets at once.</p>

<h2 id="what-problem-are-you-solving">What problem are you solving?</h2>

<p>The first question I’d ask is why do you think you need 10 more engineers or an engineer superstar?</p>

<p>Often the answer is either;</p>

<ul>
  <li>We have x many features we have to deliver, promised to investors/customers</li>
  <li>Our current engineering team is swamped with issues/bugs/rework</li>
</ul>

<p>Or even both.</p>

<p>So if you have either or both these issues your problem is your team is context switching (what I less politely call
“thrashing”). Context switching is highly inefficient so you’re not using your current engineering capacity effectively.</p>

<p>In general, doing something productive in software engineering takes concentrated focus and unbroken time for at least
2-3 hours, or about half a day. This is different from a manager who can gather information or make a decision in a 30
minute meeting. <a href="http://www.paulgraham.com/makersschedule.html">Engineers work on a different schedule to managers</a>.</p>

<p>You don’t need to hire more engineers unless you’re hiring a consultant or senior engineer to coach your existing team
to be more effective.</p>

<h2 id="stop-thrashing">Stop thrashing</h2>

<p>How can you stop context switching?</p>

<ol>
  <li>Identify the highest priority feature and focus an entire team of engineers on just that one feature to deliver
something of value in 1-2 week, measure it’s effect, rinse and repeat until it’s not the highest priority then move
on to the now highest priority.</li>
  <li>If bugs and rework are sucking time from your team, be brutal about what bugs to address, only those losing you
customers today! Carve out half of each day for addressing bugs. The other half should be looking to increase
engineering efficiency. How? This requires another post to answer but the one liner is, start introducing practices
that focus on continuous integration and deployment (not just tooling but culture and architectural decisions).</li>
  <li>Reduce the number of meetings you pull engineers into. Schedule them to allow blocks of at least two hours between
meetings.</li>
</ol>

<p>I have a lot more detail on these subjects and if these are issues you struggle with let me know and I’ll write more.</p>

<h3 id="ps">PS</h3>

<p>You never want to hire a so-called x10 Engineer, or at least the usual definition of a x10 Engineer, i.e someone who churns
out loads of code and fast, is usually disruptive to a team and often produces code that’s hard to grok and harder to
change. What you want is an engineer who multiplies your <em>teams</em> <em>effectiveness</em> by 5! I.e. not necessarily the best
engineer technically but someone who identifies opportunities to communicate better and promotes quality and changability
as first class concepts.</p>]]></content><author><name>Chris Howe-Jones</name></author><category term="startup" /><category term="scaling up" /><category term="software development" /><summary type="html"><![CDATA[Neither!]]></summary></entry><entry><title type="html">Clojure Adoption - The Usual Suspects</title><link href="https://www.devcycle.co.uk/Clojure-Adoption/" rel="alternate" type="text/html" title="Clojure Adoption - The Usual Suspects" /><published>2022-11-01T00:00:00+00:00</published><updated>2022-11-01T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/Clojure-Adoption</id><content type="html" xml:base="https://www.devcycle.co.uk/Clojure-Adoption/"><![CDATA[<h1 id="clojures-adoption">Clojure’s Adoption</h1>

<p>Ever since I took up Clojure as my preferred programming language in 2013 I’ve been asked or seen in the Clojure
Community discussions around “Why is Clojure not widely adopted in the software development industry”?</p>

<p>If you want some perspective on the arguments in this debate here is a small selection of the discussions:</p>

<ul>
  <li><a href="https://www.thewatchtower.com/blogs_on/why-is-clojure-not-popular#:~:text=Clojure%20may%20not%20find%20much,being%20unfamiliar%20with%20the%20tool.">Why is Clojure not
 popular?</a></li>
  <li><a href="https://www.reddit.com/r/Clojure/comments/v6fzur/why_clojure_is_not_widely_adopted_like_mainstream/">Why Clojure is not widely adopted like mainstream languages?</a></li>
  <li><a href="https://www.reddit.com/r/Clojure/comments/t53hlt/some_thoughts_about_clojure_its_latent_potential/">Some thoughts about Clojure, its latent potential and adoption</a></li>
</ul>

<p>I’ve engaged in some of these conversations over the years and I’ve put forward similar opinions as many of the
respondents in the discussions above.</p>

<h2 id="the-usual-suspects">The Usual Suspects</h2>

<p>The arguments over why Clojure is not more ‘popular’ range from the banal to the ridiculous:</p>

<ul>
  <li>there is no framework ‘to rule them all’</li>
  <li>there is no ‘killer application’ to ‘rule them all’</li>
  <li>functional programming is hard</li>
  <li>Lisps are hard</li>
  <li>there are too many parenthesis</li>
</ul>

<p>I’ve left off this list the most ridiculous argument because it’s less of an argument and more of a self-fulfilling
prophecy “We can’t hire 100 Clojure developers”.</p>

<p>This last one is simultaneously re-enforcing a reason not to use Clojure by not providing demand for developers to learn
or migrate to using Clojure but is also an example of misunderstanding Clojure’s benefits of being able to do more with
less developers by assuming you even need 100 developers. Unless you’re
<a href="https://building.nubank.com.br/welcoming-cognitect-nubank/">Nubank</a> sized you probably don’t!</p>

<p>However, although annoyingly silly this argument about a smaller pool of developer talent is probably the most
destructive argument against increasing Clojure adoption as it’s one non-technical managers without a detailed understanding
of the ‘economics’ of the constraints and benefits of different programming languages latch on to.</p>

<p>You can read in the many discussions online (some I mentioned above) the somewhat subjective analysis of the most common
arguments, however in thinking about this recently I thought I’d attack the problem from the opposite angle.</p>

<h1 id="why-do-people-adopt-clojure">Why do people adopt Clojure?</h1>

<p>In order to get to the root of ‘Why’ people and organisations find Clojure interesting enough to adopt we need to look
at who adopts Clojure.</p>

<h2 id="who-adopts-clojure">Who adopts Clojure?</h2>

<p>I will use a point of personal privilege by ‘speaking from authority’ by citing my personal experience of working with
more than 7 organisations that decided to adopt Clojure, working on the programme committee of a Clojure conference for
4 years and spending over 7 years talking to Clojurians online.</p>

<p>My experience is that most people who were in the position to be decision-makers in adopting Clojure in an organisation
are:</p>

<ol>
  <li>as decision-makers they tend to be senior in terms of job title and have &gt; 8 years of software development
experience,</li>
  <li>they are exclusively technical and either still hands on with code or recently removed from coding,</li>
  <li>they have extensive experience of working in some quite complex problem spaces,</li>
  <li>they are not directly from academia although some have higher degrees their experience is grounded in solving real
world problems,</li>
  <li>they have extensive experience of building software with the object-oriented paradigm (and sometimes also
procedural paradigm) but not necessarily a functional programming background.</li>
</ol>

<p>Obviously my experience is not a scientific survey but these characteristics seem to be prevalent in the decision-makers
who adopt Clojure.</p>

<h2 id="what-organisations-adopt-clojure">What organisations adopt Clojure</h2>

<p>For this question we have some slightly more objective data. The State of Clojure 2022 survey:</p>

<p><img src="/assets/images/org-size.png" alt="Clojure organization size" /></p>

<p>As we can see the majority of organisations using Clojure are &lt; 100 people in size.</p>

<p><img src="/assets/images/ppl-using-in-org.png" alt="People using Clojure" /></p>

<p>Perhaps more telling is the number of people in the organisation using Clojure. It tends to be either organisations with
small engineering functions or just a few teams in the organisation.</p>

<h2 id="whats-clojure-being-adopted-for">What’s Clojure being adopted for?</h2>

<p>What kind of applications is Clojure being put to?</p>

<p><img src="/assets/images/domains-used-in.png" alt="Domains Clojure is used in" /></p>

<p>As we can see most people are currently using Clojure for web development, building and delivering commercial services
and enterprise applications. We can fairly assume that the Open Source development is supporting the building of the
rest of the applications.</p>

<h2 id="programmers-adopting-clojure">Programmers adopting Clojure</h2>

<p>What about the kinds of people using Clojure? What does that tell us?</p>

<p><img src="/assets/images/lang-prior-to-clojure.png" alt="Primary Language prior to Clojure" /></p>

<p>We can also see that most people moving to Clojure come from a programming language typically used to solve practical
business problems. These languages are also typically used in web and mobile-based applications rather than more
scientific or engineering problems. These languages are also primarily object-oriented in focus although several can be
written in a more functional programming style.</p>

<p>Judging from the number of people who skipped this question (17 of 2373 = 0.7%) we can assume that very few people are
new to programming. Almost none it seems.</p>

<p>Lastly, how long have people adopting Clojure been programming professionally?</p>

<p><img src="/assets/images/how-long-programming.png" alt="How long programming" /></p>

<p>and how long have they used Clojure for?</p>

<p><img src="/assets/images/how-long-clojure.png" alt="How long programming Clojure" /></p>

<p>We can see from this that most people using Clojure have been programming for more than 5 years and these two results
seem to reinforce the assumption that almost all have come from programming in another language first. Also most people
adopting Clojure seem to stick with it (although that’s hard to determine solely from the people who’ve stopped using it
as this is only the respondents to the Clojure survey who would be self selecting to be mainly Clojure users, the high
number of people using Clojure for &gt; 5 years is indicative of high retention).</p>

<h2 id="characteristics-of-those-adopting-clojure">Characteristics of those adopting Clojure</h2>

<p>So, what does this tell us about ‘Who is adopting Clojure’?</p>

<ol>
  <li>they’re solving pragmatic business problems,</li>
  <li>they’ve come from other programming languages (mostly object-oriented focused),</li>
  <li>they’ve a lot of experience already before coming to Clojure</li>
</ol>

<h1 id="why-people-adopt-clojure-revisited">Why people adopt Clojure revisited</h1>

<p>So, back to the earlier question, ‘Why do people adopt Clojure?’.</p>

<p>The answer I will give is obviously subjective to some extent but rooted in my personal experience in working with over
7 different organisations on over 35 different services or applications.</p>

<p>I believe that people adopt Clojure because they see in it’s philosophy and constraints a language that tends to
naturally support:</p>

<ol>
  <li>simple code (as Rich Hickey will tell you definitely <strong>not</strong> the same as
<a href="https://www.youtube.com/watch?v=SxdOUGdseq4&amp;ab_channel=StrangeLoopConference">easy</a>!),</li>
  <li>code that’s easier to change,</li>
  <li>code that’s easier to reason about with regard to state changes,</li>
  <li>code that’s expressive of the problem to be solved (i.e. more code related to the business problem and less code
   related to just running the software)</li>
</ol>

<h1 id="so-why-is-clojure-not-more-widely-adopted">So, why is Clojure not more widely adopted?</h1>

<p>Again this is my subjective opinion, but I think the answer to that lies in the profile of who recognises the need to
adopt the language. I think that you have to have suffered a number of failures and frustrations with other programming
languages to recognise that the benefits far out weigh the alien syntax of a Lisp which has a functional programming
paradigm and immutable data by default.</p>

<hr />

<p><sub>Photograph attributed to <a href="https://www.flickr.com/photos/8533266@N04/">~bostonbill~</a> under <a href="https://creativecommons.org/licenses/by-nc/2.0/">creative commons license</a>.</sub></p>]]></content><author><name>Chris Howe-Jones</name></author><category term="clojure" /><category term="software development" /><summary type="html"><![CDATA[I think that you have to have suffered a number of failures and frustrations with other programming languages to recognise that the benefits far out weigh the alien syntax of a Lisp]]></summary></entry><entry><title type="html">Clojure the Devil…Revisited</title><link href="https://www.devcycle.co.uk/Clojure-the-devil-2/" rel="alternate" type="text/html" title="Clojure the Devil…Revisited" /><published>2022-10-31T00:00:00+00:00</published><updated>2022-10-31T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/Clojure-the-devil-2</id><content type="html" xml:base="https://www.devcycle.co.uk/Clojure-the-devil-2/"><![CDATA[<h1 id="clojures-bedevilment">Clojure’s bedevilment</h1>

<p>Back in 2018 I wrote a, somewhat, critical <a href="https://www.devcycle.co.uk/clojure-is-the-devil/">essay</a> on Clojure and how
a lack of developer discipline can easily build up in a Clojure codebase to make it hard to grok and hard to change.</p>

<p>I just wanted to revisit this as some time has passed and in the meantime I’ve worked on three more Clojure codebases as
well as a Java one.</p>

<p>Although I still feel all the points that I made in the original post are still valid my recent experience has tempered
my opinions.</p>

<p>My main critiques could be summarised as:</p>

<ol>
  <li>Clojure’s dynamic typing &amp; lack of language enforced patterns can make building a mental model of the problem
 more difficult.</li>
  <li>Clojure’s lack of ubiquitous frameworks also tends to increase the cognitive load on the developers understanding.</li>
</ol>

<h1 id="clojure-revisited">Clojure revisited</h1>

<p>Having worked on three more Clojure codebases and another Java codebase I’d like to readdress my opinion on the
cognitive load Clojure tends to introduce compared with that introduced by statically typed languages (or at least those
not derived from the ML tradition of Hindley–Milner type systems).</p>

<h2 id="change-trumps-all">Change trumps all</h2>

<p>One of the things I noticed when working on these codebases was that the higher the rate of change the easier the
cognitive load imposed by Clojure was compared with Java.</p>

<p>Initially I thought this was counter intuitive as I’d expected that the strict types of Java would reduce the amount of
mental juggling I had to do to construct a model that needed to change. Although having types (classes) in Java helped
me superficially to determine the shape of data in my mental model that initial at-a-glance definition wasn’t that much
of a time saver.</p>

<h3 id="why">Why?</h3>

<p>Although Java classes show the data encapsulated in a concept;</p>

<ul>
  <li>unless small they are not that fast to scan and absorb</li>
  <li>they tend to describe one small concept and not the concept in context</li>
  <li>often you’re only interested in one or two fields in the class and not the whole class</li>
  <li>changing one or two fields may subtly change the meaning of the class or conflate multiple meanings of the same
class in different contexts</li>
  <li>even with refactoring tools it can be laborious to change a class to include/exclude data</li>
</ul>

<p>Treating data as a generic data structure (a map [dictionary] or a vector [array]) means within a given context (i.e.
within a call chain or a single function) you only have to change/add/remove a field and that only impacts that field
and the access path of that field.</p>

<p>With good naming and use of something like Spec to describe the data at the boundaries of the system or components of
the system generic data structures may add a few seconds extra to building a mental model but this is easily compensated
by minutes or hours of time saved in changing types (classes/interfaces) or introducing new types (classes/interfaces).</p>

<h1 id="in-summary">In summary</h1>

<p>Therefore, I think that Clojure’s ‘disadvantages’ as a dynamically typed language that doesn’t enforce a data definition
burden on the developer up front are more than out weighed by the advantages of making changes faster and in a more
isolated manner.</p>]]></content><author><name>Chris Howe-Jones</name></author><category term="clojure" /><category term="software development" /><summary type="html"><![CDATA[This all comes down to developer discipline.]]></summary></entry><entry><title type="html">Levers of change</title><link href="https://www.devcycle.co.uk/levers-of-change/" rel="alternate" type="text/html" title="Levers of change" /><published>2020-06-10T00:00:00+00:00</published><updated>2020-06-10T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/levers-of-change</id><content type="html" xml:base="https://www.devcycle.co.uk/levers-of-change/"><![CDATA[<h1 id="a-confession">A Confession</h1>

<p>I’m old.</p>

<p>No, really, relative to most software developers I’m really old!</p>

<p>I’ve been a professional software developer for over 30 years and I’ve designed software systems for over 29 years.</p>

<p>This means I’ve seen software trends come and go, and then return again in a different guise…. multiple times.
During that time I’ve had to forget many tools, techniques and languages and learn new ones. Recently this has lead me
to thinking about what knowledge has endured over that time.</p>

<p>I can only think of a few subjects that I studied at degree level or below that are still highly relevant today. Setting
aside basic mathematics and underlying computer science concepts, like logic, there is one field that I think not only
holds relevant but has become even more relevant - Systems Theory.</p>

<h1 id="what-is-systems-theory">What is Systems Theory?</h1>

<p>People have literally written whole books on this so I can’t explain this in any depth in a blog but here’s <em>a</em>
definition:</p>

<blockquote>
  <p>Systems Theory is the interdisciplinary study of systems, where a System is:</p>

  <p>A set of elements or parts that is coherently organised and inter-connected in a pattern or structure that produces a
characteristic set of behaviours, often classified as it’s “function” or “purpose”.</p>
</blockquote>

<p>Obviously in software development we often think about systems. However, we often lose sight of a number of truisms.</p>

<ul>
  <li>Our software is a representation of an incomplete, inaccurate model of the system.</li>
  <li>We, the people designing and building the software, are a part of that system and therefore we exert influence over
it’s behaviours.</li>
</ul>

<p>Systems are dynamic. They consist of stocks (‘reservoirs’ of information), flows (of information) and feedback loops
(with delays).</p>

<h1 id="mapping-systems-theory-to-software">Mapping systems theory to software</h1>

<p>If we are trying to solve a problem using software one of the first things we need to do is draw a boundary around what
it is that we are trying to solve: What is inside our problem and what is external?</p>

<p>In Domain-Driven Design this boundary is called ‘bounded context’.</p>

<p>Defining a bounded context is both critical to success and really hard. I’ve never worked on a software system where we
got this context ‘right’ first time with the exception of a system re-write two years after the first system was
written. Even if, as in that case, the bounded context reasonably contains the problem, the world moves on and the
problem space changes.</p>

<p>This is the fundamental driver for ‘agile’ methods. The acceptance that things will change and our software needs to
adapt to this change. As a result, we accept that we, the development team, are an integral part of the system over
time. Our bounded context is an imperfect model of the problem our software is representing. The runtime environment,
the development team, the organisation we work in and the market that organisation is operating in all have an effect on
that model and are potentially affected by the models dynamics.</p>

<h1 id="what-levers-do-we-have-for-changing-systems">What levers do we have for changing systems?</h1>

<p>So if we accept that the team, department, organisation and the market we operate in all influence our software how do
we make changes to that larger system if we want to transform it? This is often the question organisations ask when
starting a transformative journey.</p>

<p>Examples of these transformative journeys are often expressed in trite marketing phrases like; ‘Agile Transformation’,
‘Digital First Strategy’, ‘Customer-centric approach’. However, I would add ‘Evolutionary Software Architecture’ to that
list.</p>

<p>So what are the levers we can use to affect change in whole systems?</p>

<p>In increasing order of effectiveness:</p>

<ol reversed="">
    <li><strong>Numbers:</strong> Constants and parameters such as thresholds, targets and standards.</li>
    <li><strong>Buffers:</strong> The sizes of stabilising stocks relative to their flows e.g. Work in progress limits, team size, number
    of specialists, datastores, etc.</li>
    <li><strong>Stock-and-Flow Structures:</strong> Physical systems and their nodes of intersection e.g. Departments in an
    organisation, responsibilities across teams, services, etc.</li>
    <li><strong>Delays:</strong> The length of time relative to the rates of system changes e.g. milliseconds in runtime
    environment, days and weeks in teams changing software, months/quarters in organisations, quarter and years in
    markets. Shortening these delays has an effect on the system overall (sometimes in the wrong direction if not careful).</li>
    <li><strong>Balancing feedback loops:</strong> The strength of the feedbacks relative to the impacts they are trying
    to correct e.g. Rate limiting APIs, Circuit breakers, Fixing forward or rollback, Customer complaints feeding backlogs.</li>
    <li><strong>Reinforcing feedback loops:</strong> The strength of the gain of driving loops e.g. adding more
    developers adds more code with more complexity, more code needs more developers to change it...</li>
    <li><strong>Information Flows:</strong> The structure of who does and does not have access to the information.
    Missing information flows is one of the most common causes of system malfunction. For example: not measuring the
    impact of code quality can lead to seeing the code rot, thus slowing delivery this leads to adding more developers to
    increase delivery, focusing on new features and not improving code quality, which results in more code rot and slower
    delivery.</li>
    <li><strong>Rules:</strong> Incentives, punishments, constraints. For example: rewarding 'hero' behaviour over
    collaboration leads to individuals hoarding knowledge and becoming both a bottleneck and a single point of failure.</li>
    <li><strong>Self organisation:</strong> The power to add, change, or evolve system structure. Here's where
    evolutionary architecture sits. The ability to self organise is a key lever to responding to change. In this
    context, self organising means changing any aspect of a system already mentioned in this list. Enabling self
    organisation means inherently giving up some 'control' to allow for experimentation and diversity, the trick is to
    recognise when you are pulling the lever in the desired direction.</li>
    <li><strong>Goals:</strong> The purpose or function of the system. The goal of a system is what drives all the
    things already mentioned. Changing the fundamental purpose of a system by definition will remake the system to chase
    that new goal. The goal chosen has a huge impact. Most corporations would state their primary goal as "To make
    profits" but this is just a necessary condition. How different are two corporations that chose goals of "Increase
    the wealth of our shareholders" and "Improve the health, happiness and well-being of our customers and employees"?</li>
    <li><strong>Paradigms:</strong> The mind-set out of which the system - its goals, structure, rules, delays
    parameters - arises. Paradigms are the sources of systems. The ancient Egyptians built pyramids because they believed
    in a specific material afterlife. Paradigms can be both incredibly difficult to change and also changed in an
    instant. A change of leader of an organisation can start to impact the direction of that organisation
    overnight.</li>
    <li><strong>Transcending paradigms:</strong> If you keep yourself unattached in the arena of paradigms, stay
    flexible, realise that <em>no</em> paradigm is "true", this allows you to choose the paradigm that helps achieve
    your purpose or even defines your purpose.</li>
</ol>

<p>So some of the levers in that list may appear to be beyond the scope of a development team or a software architect but
it’s important to understand where pressure to resist change comes from and where we can use these same levers to affect
change.</p>

<h1 id="scope-of-change">Scope of change</h1>

<p>The order of effectiveness of the levers shown above is somewhat fluid. Depending on the context you may find some
movement in the order but it’s generally limited to the swapping of the order of two ‘levers’ next to each other.</p>

<p>If we assume the ascending order of effectiveness shown we can use this to understand whether we are likely to be
effective in driving change using one of these levers.</p>

<p>Assume that we are trying to change an organisation to react more quickly to change from the market it operates in, what
is typically referred to as an ‘agile’ transformation.</p>

<p>Adding visibility on ‘stories’ delivered by a single development team through some kind of information radiator like a
‘sprint’ or ‘kanban’ board (information flows) is not likely to make a drastic change in the organisations
responsiveness. We haven’t incentivized team members to collaborate (rules) and given the team the authority over their
own tools &amp; work (self organisation) and therefore the current hierarchy of communication and management structures will
apply pressure to resist responsiveness to change.</p>

<p>In fact, the reason most ‘agile’ transformations fail, or at least only partially succeed, is that the lever you
actually need to ‘pull’ to make the whole organisation more responsive is at least at the level of ‘goals’ for the
entire organisation but more often that of a complete ‘paradigm’ shift for the entire organisation.</p>

<p>Note that not only is the lever further down the list but that the scope of the focus of the lever is much broader.
Introducing agile information radiators to development teams is not going to address the way the work flows to the
teams from other parts of the organisation, how the work is delivered or measured.</p>

<p>True agile transformations are a complete mind shift in the whole organisation, driving fundamental restructuring of all
the systematic structures in the organisation.</p>

<h1 id="evolutionary-architecture">Evolutionary architecture</h1>

<p>As, by definition, evolutionary architecture is the concept of software design and implementation being responsive to
change it is predicated on the goal of the organisation responding rapidly and effectively to change.</p>

<p>Evolutionary architecture is the art of self organisation of both the human subsystems that produce software and the
automated systems that form the environment and materials for that software.</p>

<p>Therefore to be successful in producing architecture capable of evolution, which is predominantly at the level of ‘self
organisation’, we need to already be in an organisation that embraces a paradigm of change.</p>

<p>For a more detailed discussion of the various potential tools and techniques of evolutionary architecture I suggest
reading my blog post on <a href="https://circleci.com/blog/prerequisites-for-evolutionary-architectures/">Prerequisites for evolutionary
architectures</a> and/or read <a href="https://www.thoughtworks.com/books/building-evolutionary-architectures">Building
evolutionary architectures</a> by Neal Ford,
Rebecca Parsons &amp; Patrick Kua.</p>]]></content><author><name>Chris Howe-Jones</name></author><category term="architecture" /><category term="systems thinking" /><category term="methodologies" /><summary type="html"><![CDATA[Evolutionary architecture is the art of self organisation of both the human subsystems that produce software and the automated systems that form the environment and building materials for that software.]]></summary></entry><entry><title type="html">Prerequisites for evolutionary architectures</title><link href="https://www.devcycle.co.uk/prerequisites-evolutionary-architectures/" rel="alternate" type="text/html" title="Prerequisites for evolutionary architectures" /><published>2020-05-22T00:00:00+00:00</published><updated>2020-05-22T00:00:00+00:00</updated><id>https://www.devcycle.co.uk/prerequisites-evolutionary-architectures</id><content type="html" xml:base="https://www.devcycle.co.uk/prerequisites-evolutionary-architectures/"><![CDATA[<h1 id="prerequisites-for-evolutionary-architectures">Prerequisites for Evolutionary Architectures</h1>

<p>Designing software that is flexible and changeable is arguably the most important architectural property. I often get
other software architects saying “What about performance?” or “What about security?” I’m not saying these other
properties are not important to consider early on. They are. However, if we optimise our architecture for change
(evolvability), when we discover a performance issue or a security vulnerability we can change our system to help
address it. The ability to respond quickly to issues like these is exactly what makes evolutionary architecture so
essential.</p>

<h2 id="what-properties-are-important-in-evolution">What properties are important in evolution?</h2>

<p>You can think of the way a species adapts to its environment in the same way that you think of evolutionary
architecture. To be successful, animals need to produce new generations with advantageous traits, respond to feedback
from the environment, and leave room for failure by falling back on what works.</p>

<p>Software is similar. You need to make sure it’s adaptable and that you’re making changes to your system based on what
works. There are a few key ways that we can create these adaptable architectures: Pick constraints to support rapid
change</p>

<ul>
  <li>Separate the concepts of deployment from release</li>
  <li>Gather and share fast (appropriate) feedback
    <ul>
      <li>In development</li>
      <li>In production</li>
    </ul>
  </li>
  <li>Build a responsive culture</li>
</ul>

<h2 id="pick-your-constraints-to-support-changeability">Pick your constraints to support changeability</h2>

<p>In order to support evolution in software we need to be aware of the constraints of the software and the environment
that the software operates in.</p>

<p>As software architects and developers we have control over some aspects of the environment we build and run software in.
Here are some of the constraints we might want to consider to support change/evolution.</p>

<h3 id="pick-the-right-building-materials">Pick the right building materials</h3>

<p>At the start of my career, I believed that any Turing complete programming language was equivalent to any other and the
language picked was not that important. As I’ve become exposed to more programming languages, paradigms, libraries, and
frameworks I’ve realised that the ‘building materials’ we pick have a huge impact on the inherent properties of our
software systems, especially on changeability.</p>

<p>When you start building a new system, consider the following:</p>

<ul>
  <li>Favour languages, libraries, and approaches that allow you to parse the data you need from larger more complex
structures.</li>
  <li>If you are using a strongly statically typed language consider using a language that infers type to reduce changes you
need to make through your code base.</li>
  <li>If you use a weakly typed language, think about what libraries or idioms you may need to add constraints on the types
of changes allowed and how they can occur (otherwise you are in the wild west and anything goes)</li>
  <li>Favour immutable data structures - immutability constrains the way state can change in your executing program thus
simplifying reasoning about state, especially in a multi threaded environment. If your language doesn’t support
immutable data structures as the default there are plenty of libraries out there for most languages (look for
persistent immutable data structures that reuse memory).</li>
  <li>Favour declarative approaches over imperative ones.</li>
  <li>Do you understand the problem well enough to pick a framework early on or should you maintain the flexibility by
constructing your solution using small libraries? Pick tools and approaches to support feedback and deployment</li>
</ul>

<p>In order to evolve, our software needs to be easy and quick to release, and we need feedback about it’s appropriateness
during development and while in production. Therefore we should pick tooling and approaches that support those
properties. Here’s a non-exhaustive list of some things to consider:</p>

<ul>
  <li>Continuous integration</li>
  <li>Continuous delivery</li>
  <li>Dark deployments</li>
  <li>Canary deployments</li>
  <li>Blue/green deployments</li>
  <li>Automated testing</li>
  <li>Automated alerting/monitoring</li>
</ul>

<p>Though it may sound frightening, it can be useful to incorporate production-testing alongside these other testing
methodologies. Sometimes testing less and allowing something to alert if it fails can be a risk worth taking or even be
advantageous in detecting the actual problem in production. Production is the only real test environment. However, this
is a risk judgement dependent on the problem, architecture etc.</p>

<p>Implementing some or all of these approaches can enable you to respond to a bug by fixing forward fast rather than
taking a more defensive approach of testing excessively and reverting if a bug occurs.</p>

<h3 id="stay-small-as-long-as-possible">Stay small as long as possible</h3>

<p>For every additional person involved in writing a system, you exponentially increase the communication paths on your
team. If you can keep your teams and the number of teams as small as practical you reduce the amount of communication
and coordination required to implement each change.</p>

<p>I would extend this principle to keeping the number of teams as small as possible too. Working with a constraint of a
limited number of (the right) people will result in innovative approaches to solutions. Just make sure that one of them
is not to work longer hours (therefore consider an upper limit on working hours as another constraint!).</p>
<h3 id="organisation-wide-systems-thinking">Organisation-wide systems thinking</h3>

<p>Even the most ‘brick and mortar’ businesses do a lot if not the majority of their customer interactions via software
(even if it’s B2B) and therefore your organisation should think of software as the primary means of revenue generation.</p>

<p>Forcing ‘project thinking’ onto software development is a bad idea. Trying to implement a number of ‘features’ to a
deadline and budget is often necessary but if every change to your software happens this way then that short term focus
never leads to longer term consideration of the product or platform and it’s quality properties.</p>

<p>You can use projects to manage budgets but always think about the product or platform when choosing what to implement.</p>

<h2 id="separate-deployment-from-release">Separate deployment from release</h2>

<p>In order to evolve, our software has to generate a new ‘mutated’ generation. If you can deploy your changes in a canary
deployment or even, depending on the change, a dark deployment you can test the change in the only realistic test
environment, production.</p>

<p>Without mandating a specific architecture (e.g. microservices, event streaming, modular monolith) Domain Driven
Development (DDD) and Event Storming are very useful in determining the boundaries of deployment units.</p>

<p>Don’t consider static modelling in isolation If you build a data, component or class model in isolation you often focus
on the wrong attributes. For example, you can model hundreds of attributes about a student in a university but the
bursary system probably only cares about identification, fees and payment information plus events that change the state
of those attributes whereas student services care about much more personal information. Use the dynamic aspects of the
system to guide what information is important to that context.</p>

<p>Thinking about events and flows often leads to discovering the components (deployment units) of the system. Each high
level process that sends and/or receives a message is a potential component.</p>

<p>Here is a list of techniques that can be useful for separating deployment from release:</p>

<ul>
  <li>Feature toggling</li>
  <li>Branch by abstractions</li>
  <li>Continuous Integration/Continuous Delivery</li>
  <li>Immutable servers – packaging aspects of the runtime environment in an immutable image makes deployment and rollback a
much less risky proposition.</li>
  <li>Schema on Read DB’s – they make adding data in a deployment much easier provided you always ‘accrete’ (or add to) your
schema.</li>
  <li>Consider always API ‘accretion’ – Always adding to your APIs and only logically deprecating functionality or data is
easier for client applications to deal with and a ‘breaking’ change is really a new API so treat it that way. Think
about how to deal with data returned if you don’t have full control over your clients and can’t trust they parse only
the data they need (e.g. do all clients implement tolerant reader pattern?). This is where using GraphQL even in
service to service calls can have benefits as it’s inherent constraints assume only returning what’s requested (and
you get schema introspection).</li>
</ul>

<h2 id="fast-appropriate-feedback">Fast appropriate feedback</h2>

<p>I like to think about software as ‘living’ inside increasing larger ecosystems in the same way that biological organisms
do.</p>

<figure> <img src="/assets/images/ecosystems_feedback.png" /> <figcaption>Illustration 1: Ecosystems
	feedback.</figcaption> </figure>

<p>Illustration 1 shows the layers of ecosystems that our software ‘lives’ in. We can see from this illustration that the
inner ecosystem can be affected by a change in one of the outer ecosystems but, conversely, the inner ecosystem can
cause a change in the outer ecosystems.</p>

<p>Additionally not shown in this diagram is the concept of the frequency of the feedback.</p>

<ul>
  <li>Software environment feedback is measured/sampled in microsecond/seconds/minutes/hours.</li>
  <li>Team/product environment feedback is likely to be measured/sampled in days or weeks.</li>
  <li>Organisational/departmental environment feedback is likely to be measured/sampled in weeks or months.</li>
  <li>World wide/market environment feedback is likely to be measured/sampled in quarters/bi-annually/annually.</li>
</ul>

<p>Without going into an exhaustive list of metrics and techniques that might be used to provide feedback the following
illustrations give you some ideas of what you might want to consider, but as always, there’s no silver bullet and YMMV.</p>

<figure> <img src="/assets/images/microecosystems.png" /> <figcaption>Illustration 2: Software environment
	metrics.</figcaption> </figure>

<p>The micro-ecosystem translates to the runtime environment and the software development practices used in developing the
software. The illustration above gives some metrics and techniques that can provide feedback at that level.</p>

<figure> <img src="/assets/images/biotope.png" /> <figcaption>Illustration 3: Team/product environment
	metrics.</figcaption> </figure>

<p>The biological concept of a Biotope (or habitat) translates to the team and/or product that the software is a part of
and Illustration 3 gives some examples of metrics and techniques for feedback at this level.</p>

<figure> <img src="/assets/images/biome.png" /> <figcaption>Illustration 4: Org/dept environment metrics.</figcaption>
	</figure>

<p>Illustration 4 shows some examples of metrics and techniques to provide feedback at the organisation or departmental
level.</p>

<figure> <img src="/assets/images/biosphere.png" /> <figcaption>Illustration 5: World wide/market environment
	metrics</figcaption> </figure>

<p>Finally, Illustration 5 gives examples of potential feedback mechanisms at the level of the target market or in other
markets.</p>

<p>As you can see the example metrics I’ve suggested are a mix of measurements of the processes for producing/running
software and the measurement of external factors that may impact or be impacted by that software. It’s important not to
concentrate on only measuring the things you can change directly but also measure the factors that you only have
indirect influence over to enable your software to evolve to those pressures too.</p>

<p>Although I’ve given a number of metrics you should start by identifying between 2 and 5 metrics in each ecosystem level.
I also try to map lower-level metrics to metrics in the ecosystem above in order to ensure that a metric is driving the
desired behaviour.</p>

<h3 id="building-a-responsive-culture">Building a responsive culture</h3>

<p>Lastly, none of these techniques can be implemented effectively without a culture that embraces, seeks out, and thrives
on change. The typical characteristics of this type of culture are all the things you see in agile and lean
books/courses:</p>

<ul>
  <li>No blame culture</li>
  <li>Empowerment of teams/individuals</li>
  <li>Delegating responsibility and authority for entire problems to teams</li>
  <li>Smaller teams to reduce communication networks</li>
  <li>Clear, high-level targets/goals with clear measurable objectives (see ‘Fast appropriate feedback’)</li>
  <li>etc.</li>
</ul>

<p>However, I think it’s important to emphasise this culture is something that needs to be pervasive throughout the whole
organisation. It’s all very well having a software development team or department that has this culture but if the rest
of the organisation interfacing with that group is in a strictly hierarchical command and control culture this will
cause friction and ultimately be much less effective in responding to change. So what do you do if the organisation is
not on board with this culture?</p>

<p>Ideally you can convince the ‘C’ level management and the board that this culture is required and demonstrate how to
achieve it through some ‘localised’ success by adopting some of the strategies suggested.</p>

<p>However, I have found some success in tying the metrics that the ‘C’ level management look at, which tend to be either
in the organisational/department environment or world wide/market environment, to the metrics in the ecosystems below to
show how ‘moving the needle’ in one metric impacts the others. I’ve also found that this helps start the conversation
about software not being a ‘cost’ to the organisation but it’s primary means of revenue generation in the future for
most organisations. Demonstrating that software is not only about automating processes but about creating new ways to
interact with customers in new markets. This in turn can provoke a move away from project focused development towards
product/platform focused development.</p>

<p>If you’re trying to convince the upper management/board of something, demonstrating how it impacts the metrics they care
about is hugely powerful.</p>

<h2 id="summary">Summary</h2>
<p>I’ve covered a lot of ground in this post. However, if there are only three things you take away from this I hope they
would be:</p>

<ul>
  <li>Pick a couple of properties in each ecosystem that you wish to change and identify metrics for them (preferably
linking lower level metrics with those higher up the ecosystems ‘ladder’)</li>
  <li>Pick a couple of ‘constraints’ that you don’t yet implement that might help support the required changes above and
think about how to implement those constraints</li>
  <li>Use the constraints you pick to guide the ‘materials’ you use and the ‘culture’ you need. For example, if you want to
deal with changes in data/message structure more effectively you may decide to concentrate on structural typing and
accretion only approaches to interfaces and data storage. This might lead you to picking certain languages/libraries
that support structural typing, easy parsing of data, tolerant reader pattern and immutable databases.</li>
</ul>

<p>There’s no one-size-fits-all solution when it comes to evolutionary architecture. Instead, it’s important to gather
feedback over an appropriate timescale, adjust your approaches as you learn and grow, and don’t try to change everything
all at once. I hope this post has given you some food for thought and a few practical approaches to try.</p>]]></content><author><name>Chris Howe-Jones</name></author><category term="architecture" /><category term="methodologies" /><category term="software development" /><summary type="html"><![CDATA[Designing software that is flexible and changeable is arguably the most important architectural property.]]></summary></entry></feed>