<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:base="https://chrissimon.au/">
  <title>Chris&#39; Blog</title>
  <subtitle>Thoughts on software design, startups, allyship &amp; technical leadership.</subtitle>
  <link href="https://chrissimon.au/blog/rss.xml" rel="self"/>
  <link href="/"/>
  <updated>2026-04-16T16:43:56Z</updated>
  <id>https://chrissimon.au/</id>
  <author>
    <name>Chris Simon</name>
    <email>chris@chrissimon.au</email>
  </author>
  <entry>
    <title>Learning to Love DDD - A Tale of Two Products</title>
    <link href="https://chrissimon.au/blog/2023/01/11/learning-to-love-ddd/"/>
    <updated>2023-01-11T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2023/01/11/learning-to-love-ddd/</id>
    <content xml:lang="en" type="html">&lt;p&gt;Learning to Love DDD - A Tale of Two Products is a conference talk I started delivering in 2022.&lt;/p&gt;
&lt;p&gt;In some respects, it&#39;s a love letter to Domain-Driven Design after years of building systems both with and without the practice.  See &lt;a href=&quot;https://chrissimon.au/blog/2023/01/11/learning-to-love-ddd/#videos&quot;&gt;below for videos&lt;/a&gt; of the talk at a few conferences.&lt;/p&gt;
&lt;h3 id=&quot;talk-description&quot; tabindex=&quot;-1&quot;&gt;Talk Description&lt;/h3&gt;
&lt;p&gt;Over the last 16 years, I&#39;ve been fortunate enough to help launch two successful businesses as a hands-on CTO/co-founder &amp;amp; developer/architect.&lt;/p&gt;
&lt;p&gt;The first, Flexischools, provides online services to schools &amp;amp; parent communities, and has supported millions of Australians over the years.&lt;/p&gt;
&lt;p&gt;When we launched Flexischools, I was relatively inexperienced - I did my best to follow the guidance I could find online, but I frequently found myself struggling to incorporate the burgeoning growth in complexity of its feature-set into an increasingly tightly coupled code-base with a very small team of developers.&lt;/p&gt;
&lt;p&gt;In 2015, I discovered DDD, and when reading the Blue Book, I felt a light bulb going off on every page. When we launched our second product, LanternPay, I vowed not to make the same mistakes.&lt;/p&gt;
&lt;p&gt;LanternPay is a healthcare &amp;amp; disability claiming &amp;amp; payments platform supporting hundreds of thousands of Australian care providers and recipients to ensure prompt and equitable access to care.&lt;/p&gt;
&lt;p&gt;In this talk, I&#39;ll reflect on the comparative experience of launching, operating &amp;amp; scaling both products and the impact DDD had on the technology &amp;amp; the business.&lt;/p&gt;
&lt;p&gt;Some key questions we&#39;ll explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How to use DDD when you&#39;re launching a new product into a new market and there are no domain experts to consult?&lt;/li&gt;
&lt;li&gt;Why it&#39;s not a good idea to use the same object/table to store both the size of a school uniform t-shirt and the presence of a slice of cheese on a sandwich&lt;/li&gt;
&lt;li&gt;How to make the business case for a major multi-service refactor when your DDD-inspired domain understanding evolves mid-project&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;videos&quot; tabindex=&quot;-1&quot;&gt;Videos&lt;/h3&gt;
&lt;h4 id=&quot;ndc-oslo-2022&quot; tabindex=&quot;-1&quot;&gt;NDC Oslo 2022&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://ndcoslo.com/agenda/learning-to-love-ddd-a-tale-of-two-products-0e6e/04ckucdy4nv&quot;&gt;Conference Schedule&lt;/a&gt; | &lt;a href=&quot;https://chrissimon.au/assets/presentations/2022-09%20-%20NDC%20Oslo/Learning%20to%20Love%20DDD%20-%20A%20Tale%20of%20Two%20Products%20(2022%20-%20NDC%20Oslo).pdf&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This one is good for newcomers to DDD as it doesn&#39;t assume any pre-existing DDD knowledge.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=QqvYIIobZ6A&quot;&gt;https://www.youtube.com/watch?v=QqvYIIobZ6A&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;kandddinsky-2022&quot; tabindex=&quot;-1&quot;&gt;KanDDDinsky 2022&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://kandddinsky.de/home#agenda&quot;&gt;Conference Schedule&lt;/a&gt; | &lt;a href=&quot;https://chrissimon.au/assets/presentations/2022-10%20-%20KanDDDinsky/Learning%20to%20Love%20DDD%20-%20A%20Tale%20of%20Two%20Products%20(2022%20-%20KanDDDinsky).pdf&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Being a Domain-Driven Design focussed conference, this one is a bit shorter as I skipped/glossed over some of the more introductory material.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ApDjFCnvsj8&quot;&gt;https://www.youtube.com/watch?v=ApDjFCnvsj8&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Engineering &amp; Product: Join Forces!</title>
    <link href="https://chrissimon.au/blog/2022/07/28/engineering-product-join-forces/"/>
    <updated>2022-07-28T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2022/07/28/engineering-product-join-forces/</id>
    <content xml:lang="en" type="html">&lt;p&gt;Sometimes I meet software engineers who say &amp;quot;Just tell me what to build and let me work out how to build it.&amp;quot;&lt;/p&gt;
&lt;p&gt;While I &lt;em&gt;think&lt;/em&gt; I understand the motivation behind the statement it always makes me a little sad.&lt;/p&gt;
&lt;p&gt;In this dynamic, the requirements are rarely informed by what&#39;s technically possible, and the solution is rarely informed by the organisation&#39;s real purpose.&lt;/p&gt;
&lt;p&gt;My assumption is this is a form of learned helplessness- the outcome of having worked in environments that punish creativity and innovation, are strict about role boundaries and filled with command &amp;amp; control style authoritarian leadership.&lt;/p&gt;
&lt;p&gt;So I have empathy for these engineers - you can&#39;t help where you&#39;ve been.&lt;/p&gt;
&lt;p&gt;But the mind boggles at the wasted potential!&lt;/p&gt;
&lt;p&gt;The potential of inviting genuine collaboration; the potential for more innovative solutions to real problems, for aligning everyone with their work&#39;s purpose.&lt;/p&gt;
&lt;p&gt;So my advice to my clients and mentees is: join forces! Invite your engineers into customer conversations. Immerse them in the domain, let them contribute to the product vision and don&#39;t punish them when an idea doesn&#39;t work out. Foster psychological safety by focussing on the lessons learnt and incorporate them into the next iteration.&lt;/p&gt;
&lt;p&gt;Product &amp;amp; Engineering: stronger, more creative, more innovative, together!&lt;/p&gt;
&lt;p&gt;Have you worked in environments that rewarded or prohibited such collaboration?&lt;/p&gt;
&lt;p&gt;(Cross-posted to &lt;a href=&quot;https://twitter.com/ChrisSimonAu/status/1553216169053925377&quot;&gt;twitter&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/posts/chrissimon-au_leadership-innovation-engineering-activity-6958980363482263552-OBtC?utm_source=share&amp;amp;utm_medium=member_desktop&quot;&gt;LinkedIn&lt;/a&gt;)&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The Software Engineer as a Novelist</title>
    <link href="https://chrissimon.au/blog/2022/07/21/software-engineer-as-a-novelist/"/>
    <updated>2022-07-21T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2022/07/21/software-engineer-as-a-novelist/</id>
    <content xml:lang="en" type="html">&lt;p&gt;In conversations with non-technical founders and leaders, I often come across the lament that the engineering department is an opaque box - requirements go in, working (sometimes not working) software comes out (but sometimes doesn&#39;t).&lt;/p&gt;
&lt;p&gt;When imagining what&#39;s inside this box, many folk envision some kind of production assembly line - a conveyor belt transporting user stories, developers mechanically adding code as the story trundles past them.&lt;/p&gt;
&lt;p&gt;With such a metaphor in mind it&#39;s understandable how confusing the unpredictability of engineering&#39;s output can be. This confusion is frequently quite frustrating - especially given how much of an organisation&#39;s scarce capital is involved.&lt;/p&gt;
&lt;p&gt;Happily, I&#39;m here to say that this metaphor could not be further from the truth.&lt;/p&gt;
&lt;p&gt;Rather than an assembly line, I think things make more sense if you imagine that engineering teams are being asked to write a novel.&lt;/p&gt;
&lt;p&gt;Immediately, you get a sense of the unknowns. Creativity, design, empathy are involved, and there&#39;s also plot coherency, narrative arc &amp;amp; language (architecture &amp;amp; software design) to consider - not to mention of course the dreaded &amp;quot;Writer&#39;s Block&amp;quot; (analysis paralysis).&lt;/p&gt;
&lt;p&gt;To get this novel written faster, it&#39;s not uncommon to assign it to a team - or multiple teams.&lt;/p&gt;
&lt;p&gt;Sometimes each team is assigned a chapter, and since they are working concurrently, the last chapter is written at the same time as the first.&lt;/p&gt;
&lt;p&gt;Sometimes the front-end team is assigned the first sentence in each paragraph, the backend team is assigned the middle of the paragraph and the infrastructure team is assigned the last.&lt;/p&gt;
&lt;p&gt;And sometimes the team assignment is as unwieldy as assigning each word in each sentence to different teams!&lt;/p&gt;
&lt;h2 id=&quot;what-to-do-about-it%3F&quot; tabindex=&quot;-1&quot;&gt;What to do about it?&lt;/h2&gt;
&lt;p&gt;There are a number of helpful approaches, but here are 3 ideas I&#39;ve found incredibly useful:&lt;/p&gt;
&lt;p&gt;The first is acceptance - that software is an inherently complex, creative, and unpredictable endeavour.  Much like writing a novel, you don&#39;t always know how it&#39;s going to finish when you start, and it can take several drafts (iterations &amp;amp; refactors) before you&#39;re happy with the end result.&lt;/p&gt;
&lt;p&gt;The second is to orient your engineers not around chapters, paragraphs, sentences and words (i.e. the technical elements), but around characters, themes and plots - in design parlance, your business domain: the &lt;a href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#event-storming&quot;&gt;concepts, stakeholders, processes and points of value&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The third is to exploit the ways in which software is NOT like writing a novel: it&#39;s hard to sell the first draft of a novel, but the first draft of a software system (an MVP) can still be valuable to a subset of your customers. Over time, you can expand the pool of prospective customers by incrementally enhancing your software.&lt;/p&gt;
&lt;p&gt;The keys to this approach are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#user-story-mapping&quot;&gt;effective customer-value-focused prioritisation&lt;/a&gt; to ensure you&#39;re delivering real value early, and&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#test-driven-development&quot;&gt;automated quality checks&lt;/a&gt; to ensure that as you expand the capabilities and support a broader customer base you can move quickly without breaking anything your early adopters are counting on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So next time you&#39;re asking a developer how long it will take them to complete a task, imagine you&#39;re asking a novelist how long it will take to finish a book - perhaps the conversation will take you in a different direction!&lt;/p&gt;
&lt;p&gt;(Cross-posted to &lt;a href=&quot;https://twitter.com/ChrisSimonAu/status/1550440480332460033&quot;&gt;twitter&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/posts/chrissimon-au_the-software-engineer-as-a-novelist-activity-6956434920286146561-T5By?utm_source=share&amp;amp;utm_medium=member_desktop&quot;&gt;LinkedIn&lt;/a&gt;)&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>UNSW 2022 Co-Op Scholarship Induction Ceremony</title>
    <link href="https://chrissimon.au/blog/2022/03/18/unsw-2022-co-op-scholarship-induction-ceremony/"/>
    <updated>2022-03-18T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2022/03/18/unsw-2022-co-op-scholarship-induction-ceremony/</id>
    <content xml:lang="en" type="html">&lt;p&gt;I was recently flattered to be invited to speak at the UNSW 2022 Co-Op Scholarship Induction Ceremony as an Alumni. What follows is the text of the written speech - as I don&#39;t refer to notes when speaking, what came out was slightly different but this hits the key themes.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Thank you to Kay and the Co-op program for the invitation to speak to you here this evening, and to Michelle for your stellar organisation and co-ordination during such unpredictable times!&lt;/p&gt;
&lt;p&gt;Firstly - to the 2022 co-op scholars, congratulations! You have no doubt done great things to be included in the cohort, and I&#39;m sure you will continue to do great things into the future. You are embarking on what will very likely be a life changing experience, and I speak as someone whose life was definitely changed by being part of this program.&lt;/p&gt;
&lt;p&gt;It&#39;s a while ago now, but I vaguely recall participating in a ceremony much like this one back in 1997 - having just met and started to get to know my fellow co-ops at that point I had no idea that this group would become so important to me - since then I have lived with some of them, worked with many, started a business with one, and been in the wedding parties of two, just to mention a few key events.&lt;/p&gt;
&lt;p&gt;The brief for this evening was to share the story of my career and any pieces of wisdom that I have picked up along the way that might be useful to new scholars. I feel uncomfortable describing anything I have to say as particularly &#39;wise&#39; - I have done much, and learnt much, but there is so much more to do and learn and everyone needs to find their own path to peace, success &amp;amp; satisfaction in life.  But I will intersperse the story of my career with some things I have come to consider to be true and let you decide if they are wise or not!&lt;/p&gt;
&lt;p&gt;The first, speaking of the lifelong friendships formed in the co-op program, is that I have come to consider that everything is relational.  This is a complex word, and it means many things.  I mean it in the human sense - that the relationships with your peers in the program, with your sponsors, with your teachers and staff at the university will all be foundational to your lives. I also mean it in the technical sense that as engineers, technologists and business people you will be designing, building and engaging with systems &amp;amp; processes that exist in a context - the value of those systems will lie in how they relate to the broader world, and in the internal relationships between the components they are comprised of.  Finally I also mean it in the socio-technical sense - technology is shaped by society, but it also shapes it - sometimes for the better as in how it helped us adapt and stay connected through a global pandemic, not to mention the rapid production of the vaccine.  But sometimes in less positive ways, from the impact on mental health and widespread disinformation caused by the rise of social media through to the devastating environmental impact of technically exciting innovations like cryptocurrencies and blockchain which are exhibiting burgeoning energy consumption. Everything is connected, everything is relational.&lt;/p&gt;
&lt;p&gt;But back to my career - I studied Electrical Engineering and enjoyed a nice mix of industry placements. The first was over the summer after first year with a firm called JTec which was building pioneering high speed internet (for the late-90s) - I wrote some programs that helped speed up some of their circuit board layout design &amp;amp; manufacturing processes, which I really enjoyed  as I was working beside the users of the programs and I got to see the positive impact it had on their lives immediately.&lt;/p&gt;
&lt;p&gt;After 3rd year, my first 6 months were at a company that is now known as Dematic.  This was by far the most impactful for me - I worked part time for them through 5th year, and then seamlessly transitioned into full time work after graduation.  The technical work was interesting - we were designing automated control systems for the logistics industry - programs that would, amongst other things, sense the movement of packages around conveyor belts and instruct actuators to send particular packages down particular conveyor belts into the backs of waiting trucks. All of this was cool, and I loved contributing to a technology that was so useful to society, but if I&#39;m honest, it was the people and culture that I really loved, and which made me confident that I would enjoy my time there.&lt;/p&gt;
&lt;p&gt;In between Dematic and 5th year, I also spent 6 months at Alcatel - another telecommunications firm, and once again I found myself working on systems that were helping to roll out &amp;quot;high speed&amp;quot; internet. At the time, Alcatel had the primary contract with Telstra and the components we were working on were being deployed into the green telecommunications boxes that you see around the city providing some of the very first ADSL connectivity - how exciting it was to feel I was contributing to a service that was so valued by the community.&lt;/p&gt;
&lt;p&gt;Following graduation, I ended up back at Dematic full time, and after less than a year, they asked me to relocate to the US - Grand Rapids, Michigan, to join a global Research &amp;amp; Development team helping to design the next generation of automated conveyor systems. I had always loved travelling and couldn&#39;t say no. I landed in the coldest December I had ever experienced and had an absolute blast. For a time I&#39;d spend my days working on interesting technical challenges, and my evenings night skiing at a small hill 1/2 hrs drive from the office. A bizarre juxtaposition for an Australian!&lt;/p&gt;
&lt;p&gt;Professionally, it was also a fascinating experience - while the Sydney office had felt like a small family business, the US office felt very much like a division of a large corporation. I made some more amazing friends there, some of whom I&#39;m still in touch with to this day and we did some great work together on this new product, but it helped me understand something about myself, which is that I&#39;m very much a &#39;small business&#39; type of person.&lt;/p&gt;
&lt;p&gt;I greatly respect the things a large corporation can achieve, and the people who can work together across multiple distributed teams to make it happen - but it had become clear that that wasn&#39;t for me.&lt;/p&gt;
&lt;p&gt;After two years, the Dematic office in Sydney asked me to return to be one of the first engineers in a new department called Systems Engineering. This was another amazing opportunity, and I learnt some important skills in that role, including an understanding of some of the engineering &amp;amp; project management practices used to build incredibly large systems, with budgets of hundreds of millions of dollars.&lt;/p&gt;
&lt;p&gt;One of the great things about returning was reconnecting with Steve Austen - a fellow Co-op scholar who had also joined Dematic after graduation and who was still in the sydney office.  We&#39;d head out for lunch every day and gradually our conversations turned to aspirations of doing something novel - starting a business together.  Steve&#39;s older brother Geoff had had a successful career in Finance and thankfully decided that funding us was something he was keen to do, and before we knew it we were in business together.  It was difficult saying goodbye to Dematic, but they were very understanding and I&#39;ll always be grateful to the incredible colleagues &amp;amp; mentors I met there.&lt;/p&gt;
&lt;p&gt;Somewhat predictably, given that our startup conversations had been over lunch, and the Dematic sydney office was in French&#39;s Forest, a place with no particularly good lunch options, our initial startup idea was to setup an online lunch ordering service. The concept was that you could punch in a lunch order online, it would be sent to a local cafe or restaurant, and by setting up relationships between the cafes and companies, the cafe would get to deliver a larger volume of meals in one go.  Geoff, having worked in Finance was aware of a tax benefit scheme that meant you could pay for meals provided at work from your pre-tax pay, and bam, we had our business, launched in 2005 - only 4 years after graduation.  It was called FlexiMeals and within 2-3 years it was well on its way to being highly successful - we had about 12 staff, and almost 20 client companies, some of which were quite large, including Macquarie Bank &amp;amp; IAG insurance using our services in their CBD offices.&lt;/p&gt;
&lt;p&gt;Being such a small business, I really felt in my element. One minute I&#39;d be writing some code, the next helping answer a customer service call, and in the afternoon making a sales call to a prospective client.  I loved the diversity and the excitement of getting to see something that had started as an idle thought become tangible and generating a strong buzz and positive response from our customers.&lt;/p&gt;
&lt;p&gt;Unfortunately, in 2008 the government changed the tax legislation and the pre-tax benefit disappeared. Many of our clients who had engaged us to offer a benefit to their staff felt that the value had gone, and dropped us overnight.  It was a difficult time, but thankfully we had recently had some feedback from a customer that they would love to use our service to order their children&#39;s lunches at school, and we had just started our first pilot school when the tax laws changed.  We decided that the time was right to pivot hard towards that opportunity, and a new business, Flexischools, was born.&lt;/p&gt;
&lt;p&gt;Flexischools took off like a rocket - by the end of that year we had 10 schools, the end of the next year about 40-50 and a few years later several hundred.  Today, Flexischools services almost 2,000 schools around Australia, hundreds of thousands of families at a time, processes almost 200,000 lunch orders a day - most of which are placed on our systems at almost the same time - around 7:45am - a fascinating engineering&lt;br /&gt;
challenge.  And finally, with my daughter having just turned 6, I&#39;m actually a Flexischools customer myself, and placed a sausage sizzle order for earlier today.&lt;/p&gt;
&lt;p&gt;This is a good time to mention another thing I have come to consider to be true: perseverance and resilience are some of the most valuable qualities you can develop.  When the tax laws changed, or when any number of other challenges threatened to derail our goals, we never once considered stopping.  Our attitude was always &#39;well, this way isn&#39;t working, what other things can we try?&#39;.  The assumption that we would one day be successful was never questioned, and although it did take us quite a while in the end, I feel very proud of where this business has arrived at today.&lt;/p&gt;
&lt;p&gt;I have to say, while that moment in 2008 was a crisis at the time, it was really a blessing in disguise. While FlexiMeals had been interesting, I had always somewhat questioned the value provided by helping high income financiers and insurers in saving a few dollars in taxes off their lunches each day. After launching Flexischools, one day we got a call from a school telling us that thanks to Flexischools, their canteen had switched in one year from needing parent fund-raising activities to stay open, to being able to donate money back to the school, which was spent on a new playground for the kids.  Needless to say we were thrilled, and I once again felt the purpose in our work.&lt;/p&gt;
&lt;p&gt;So - another thing I have come to consider to be true: there are at least three properties that need to be satisfied to be fulfilled in your career - you need to find the intersection of the things where 1) you enjoy the doing of the work itself - it&#39;s essential that the actual day to day is a pleasure and not a chore; 2) you need to find the things that you are actually good at and can do well and 3) you need to find the things that fill you with a sense of purpose.  Work that satisfies all three is truly the most rewarding, and the work at which I believe you will be most successful.&lt;/p&gt;
&lt;p&gt;The next major milestone in my career was in 2015.  Flexischools was thriving, and a new opportunity landed on our laps. Although Flexischools was oriented towards school lunches, what we had built, in effect, was a general capability to handle complex multi-party transactions in high duty of care environments - unlike a traditional purchase between a buyer and seller, Flexischools had to handle purchases between a buyer (the student), the seller (the canteen or uniform shop), the funder (the parents) all through the lens of the rules and constraints setup by the school.&lt;/p&gt;
&lt;p&gt;An analogue presented itself in the form of the National Disability Insurance Scheme - a new government initiative for helping people with a disability have more equitable access to life&#39;s opportunities. The vision was to invert the traditional funding model, where people with a disability were told what services they could access and when, without regard for whether the services were actually assisting them, into a model founded on the principles of choice and control - where participants in the scheme would be given access to a budget, and given sliding scales of freedom and autonomy to spend on the services and providers that would work for them - with the budgets oriented around individualised life goals.&lt;/p&gt;
&lt;p&gt;It was clear that this was something we wanted to help with - although we were new to the field of disability and health support, we felt we had the technical skills to assist, and the desire to make a positive difference.  We launched a new product called LanternPay - by this time we had a team looking after the Flexischools technology, and so I threw myself back into the space I love the most - early startup land, creating something real from nothing more than an idea. We built LanternPay from scratch, grew the team, and over the last 6 years it has helped 10s of thousands of people with a disability access a wider range of service providers as well as streamline payments and reduce the overheads of operating in the scheme.  On top of this, we&#39;ve expanded into the broader healthcare insurance landscape, helping tens of thousands of people who have been victims of traffic accidents or workplace injuries receive care when funded by state government support schemes and more recently expanding into private health insurance for some of the types of care which don&#39;t currently have electronic payments.&lt;/p&gt;
&lt;p&gt;This was a very different journey to Flexischools - we were well funded from the beginning and playing in a different league - engaging with government and enterprise, and needing to really put on our grown up pants. But, it has been an immensely rewarding journey, both in terms of the impact we have had, and the fact that last year LanternPay was acquired by National Australia Bank to join forces with their existing healthcare claiming product, HICAPS.&lt;/p&gt;
&lt;p&gt;The timing was a co-incidence, but the acquisition has certainly helped with the most recent career change for me - last year I decided that after 16 years of being on the coalface, a hands on CTO (I was writing code until the very end, as well as leading and managing a growing team of engineers) it was time for something different.  We had luckily found a very skilled person to take on the CTO role, which allowed me to transition into being a non-executive board director which means I get to stay closely connected to the company and the people I love, but freed up my time to launch something new.&lt;/p&gt;
&lt;p&gt;That something new is an independent boutique technology advisory service.  I support a range of startups around Australia with technology strategy and advice to help them launch their great idea, mentoring and coaching their engineering teams and just generally trying to be helpful.  Frankly, I&#39;m loving it - this last year has been the happiest time in my career.  I work part time - usually 3 or 4 days a week, so I get to spend much more time with my children and my hobbies (including contributing to open source projects, and some home automation engineering), and the rest of my time meeting and working with a huge range of energetic, passionate and creative people working on the next generation of great startups, teaching them, yes, but also learning from them, in a symbiotic relationship I value enormously.&lt;/p&gt;
&lt;p&gt;And this brings us to the present day, so I&#39;ll close with a few more things I have come to consider to be true:&lt;/p&gt;
&lt;p&gt;Learning beyond your degree is immensely valuable for many reasons.  Reading literature, engaging with the arts, seeing live theatre and music, studying history, learning about the history of your field, but also the history of humanity - they will all furnish you intrinsic delight in their own right&lt;/p&gt;
&lt;p&gt;They will help you become a student of humanity: human nature being what it is, patterns repeat and observing and identifying those patterns as they recur is incredibly powerful.&lt;/p&gt;
&lt;p&gt;And they will help with another skill I have come to value highly - the skill of empathy.  In the modern era where organisations are increasingly aware of the importance of psychological safety - that fortunate condition where those working side by side are not scared to speak candidly about issues, are empowered to try new things and experiment with solutions - in this world, empathy is becoming a more prized skill than any technical capability. Having empathy for your colleagues, for the people who came before you and the people who come after - having empathy for your users, for your customers, for those affected by hidden externalities in the systems you build and the systems you engage with - all of these will make you a more fully present and intentional contributor to your workplace and society.&lt;/p&gt;
&lt;p&gt;Once again congratulations to all the new scholars - I wish you all the best with your degrees, your industry placements, and your careers wherever they take you - but most of all, I wish you the good fortune I have had, that you can say in 20-odd years that you are a lifelong learner - still learning, still discovering and still filled with excitement and anticipation for what you will get to learn next.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>3 Startup Software Superpowers - Part 1 - Introduction</title>
    <link href="https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/"/>
    <updated>2022-02-25T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/</id>
    <content xml:lang="en" type="html">&lt;p&gt;One of the awesome things about working in a startup is that you get to take on an enormously diverse range of tasks. But how do you ensure you&#39;re delivering high quality work across all of them?&lt;/p&gt;
&lt;p&gt;I love experiencing the full lifecycle of a product. When it&#39;s just you and a small team taking an idea from initial concept through design, planning, implementation, sales and operations you get to wear a lot of hats (or capes?) - something that can be immensely rewarding.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/superpowers/woman-with-many-hats.png&quot; alt=&quot;A lady&#39;s head, wearing a yellow hat, a nurse&#39;s hat, a police officer&#39;s hat, a chef&#39;s hat and a student&#39;s cap.&quot; /&gt;&lt;figcaption&gt;Working in a startup, you get to wear a lot of &lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#hats-note&quot; id=&quot;hats-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;hats&lt;/a&gt;!&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Over the years I&#39;ve learnt three conceptual tools that have helped me be effective at different stages of the journey. I&#39;ll go further: they are like having superpowers. Once you learn and apply them, you&#39;ll feel like a superhero too!&lt;/p&gt;
&lt;p&gt;In this series of posts we&#39;ll take a look at these superpowers and demonstrate how to make the most of them in a startup context.&lt;/p&gt;
&lt;p&gt;Part 1 (this post) will briefly introduce the ideas, explain why they feel like having superpowers, and share links to other online resources with more details.  Parts 2, 3 &amp;amp; 4 will take a deeper dive into each as we go on the journey of our fictional startup.&lt;/p&gt;
&lt;p&gt;They are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#event-storming&quot;&gt;The Concepting &amp;amp; Design Superpower&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#user-story-mapping&quot;&gt;The Planning Superpower&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#test-driven-development&quot;&gt;The Software Development Superpower&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;our-&#39;super&#39;-startup&quot; tabindex=&quot;-1&quot;&gt;Our &#39;Super&#39; Startup&lt;/h2&gt;
&lt;p&gt;If you&#39;re starting work on software for a startup, I&#39;m assuming you and your partners already have a &lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#businessidea-note&quot; id=&quot;businessidea-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;business idea&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To illustrate these superpowers, let&#39;s get to work for our fictional startup - and since we&#39;re talking about superpowers, and inspired by the &lt;a href=&quot;https://en.wikipedia.org/wiki/2022_eastern_Australia_floods&quot;&gt;recent flooding in northern NSW&lt;/a&gt;, lets build a product for some real-world super-heroes - the volunteers getting involved to help out those affected.&lt;/p&gt;
&lt;p&gt;Our startup is codename &lt;code&gt;E.A.S.&lt;/code&gt; - Emergency Alert System.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/superpowers/seas_logo.png&quot; alt=&quot;Superhero figure above the E.A.S. acronym.&quot; /&gt;&lt;figcaption&gt;&lt;code&gt;E.A.S.&lt;/code&gt; - Emergency Alert System&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Our mission is help co-ordinate response efforts when disaster strikes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Members of the public want to request help, and get alerts about nearby incidents so they can steer clear.&lt;/li&gt;
&lt;li&gt;Response volunteers want to find out about people who need help so that they can attend and assist.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Future expansion might include an integration with Waze to help route traffic around incidents and an integration channels to support formal government emergency services.&lt;/p&gt;
&lt;p&gt;With the scene set, time to launch our startup!&lt;/p&gt;
&lt;h2 id=&quot;event-storming&quot; tabindex=&quot;-1&quot;&gt;The Concepting &amp;amp; Design Superpower&lt;/h2&gt;
&lt;p&gt;As the technical co-founder of &lt;code&gt;E.A.S.&lt;/code&gt;, the first question you&#39;re probably asking yourself is: what do you build to make that idea a reality?&lt;/p&gt;
&lt;p&gt;The concepting and design superpower is known as &lt;a href=&quot;https://www.eventstorming.com/&quot;&gt;Event Storming&lt;/a&gt; and when you&#39;re first working out what&#39;s needed, this superpower will save the day.&lt;/p&gt;
&lt;p&gt;Event Storming was invented by &lt;a href=&quot;https://twitter.com/ziobrando&quot;&gt;Alberto Brandolini&lt;/a&gt; as a way to foster collaborative domain modelling in organisations with isolation between IT and other parts of the business, such as customer support, sales and management.  Over the years it has expanded, and is now frequently used in a range of scenarios, including envisioning a startup ecosystem.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/superpowers/Event_Storming_example_process.jpg&quot; alt=&quot;Whiteboard with coloured sticky notes on it in an event storming pattern.&quot; /&gt;&lt;figcaption&gt;&lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#event_storming-note&quot; id=&quot;event_storming-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;Event Storming In Action&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Event Storming is a startup superpower because of how well it helps you and your stakeholders collaboratively explore the uncharted landscape. It rapidly establishes a shared vision of what your system will do ensuring you&#39;re all in sync and can move quickly.&lt;/p&gt;
&lt;p&gt;Event storming follows a fairly simple process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identify all the &#39;events&#39; that occur in your system.  E.g. for &lt;code&gt;E.A.S.&lt;/code&gt; we might have:
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Help Requested&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Help Arrived&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Get agreement on the time sequencing of events&lt;/li&gt;
&lt;li&gt;Work out what causes the events - user interactions? Integrations? Time-based workflow?&lt;/li&gt;
&lt;li&gt;Re-organise around key objects/entities (known as &lt;code&gt;aggregates&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result is an your starting model - one that is closely aligned with the language and domain of your stakeholders.&lt;/p&gt;
&lt;p&gt;In Part 2 of this series, we&#39;ll follow this process for &lt;code&gt;E.A.S.&lt;/code&gt;, but if you want to check out some real life event storming now, there are great examples all over the web, like &lt;a href=&quot;https://www.rubiconred.com/blog/event-storming&quot;&gt;this article&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=mLXQIYEwK24&quot;&gt;these&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/watch?v=Y7NzXl-ahtU&quot;&gt;videos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The really hard part is that in a startup, you don&#39;t know what&#39;s coming next - startups are all about exploring and learning, so you have to be prepared to evolve and iterate your ideas as you go - and that&#39;s where the other superpowers come in.&lt;/p&gt;
&lt;h2 id=&quot;user-story-mapping&quot; tabindex=&quot;-1&quot;&gt;The Planning Superpower&lt;/h2&gt;
&lt;p&gt;Once you have an vision of what to build, you need a plan for building it. Unsurprisingly this is where many projects go off the rails.&lt;/p&gt;
&lt;p&gt;The two most common mistakes are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Doing a huge amount of up front planning trying to schedule the whole project.&lt;/li&gt;
&lt;li&gt;Just getting started without planning ahead at all.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Put that way, it&#39;s obvious that success lies somewhere in the middle.  This is where the planning superpower, known as &lt;a href=&quot;https://www.jpattonassociates.com/story-mapping/&quot;&gt;User Story Mapping&lt;/a&gt; shines.&lt;/p&gt;
&lt;p&gt;It&#39;s a startup superpower that helps you make the most of your initial investment by launching quickly, learning &amp;amp; iterating so you can rapidly find product market fit.&lt;/p&gt;
&lt;p&gt;The genius of User Story Mapping is that guides you to plan &lt;em&gt;just enough&lt;/em&gt; to implement a true MVP (Minimum Viable Product) --- that is, one that is both &lt;em&gt;minimum&lt;/em&gt; &lt;strong&gt;AND&lt;/strong&gt; &lt;em&gt;viable&lt;/em&gt;. (Many folks miss one part or the other!)&lt;/p&gt;
&lt;p&gt;For example, with &lt;code&gt;E.A.S.&lt;/code&gt; you may be so focussed on &lt;em&gt;minimum&lt;/em&gt; that you spend too much time on the general public requesting help, but not enough on volunteers responding. Your MVP will fall flat, as it doesn&#39;t deliver value - it&#39;s not &lt;em&gt;viable&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Or, you might be so intent on &lt;em&gt;viable&lt;/em&gt; that you lose focus on who the MVP is for. You spend a lot of time on features (e.g. a Waze integration) that your first customers don&#39;t care about, wasting time before you can launch - it&#39;s not &lt;em&gt;minimum&lt;/em&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/superpowers/User_story_mapping.jpg&quot; alt=&quot;Diagram of a user story map illustrating elements, no content.&quot; /&gt;&lt;figcaption&gt;&lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/#userstorymap-note&quot; id=&quot;userstorymap-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;User Story Mapping&lt;/a&gt; helps you find your MVP&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;In Part 3 of this series we&#39;ll produce a user story map for &lt;code&gt;E.A.S.&lt;/code&gt;, but if you&#39;d like to read more now, the &lt;a href=&quot;https://www.jpattonassociates.com/wp-content/uploads/2015/01/how_you_slice_it.pdf&quot;&gt;first article&lt;/a&gt; by its creator &lt;a href=&quot;https://twitter.com/jeffpatton&quot;&gt;Jeff Patton&lt;/a&gt; is a very clear explanation.&lt;/p&gt;
&lt;p&gt;After user story mapping your concept, you have a realistic plan for incrementally building, with plenty of opportunities to incorporate lessons learnt.&lt;/p&gt;
&lt;p&gt;Now how do you build the software so that you can rapidly respond to all the twists and turns that lie ahead?&lt;/p&gt;
&lt;h2 id=&quot;test-driven-development&quot; tabindex=&quot;-1&quot;&gt;The Software Development Superpower&lt;/h2&gt;
&lt;p&gt;The software development superpower is one that many have heard of, but less frequently used: Test Driven Development (TDD).&lt;/p&gt;
&lt;p&gt;If you&#39;re familiar with TDD, you may be surprised I recommend it for startups. There is a perception that TDD is only useful if you have stable requirements, or only doable if you have the luxury of time and capital to spend writing tests.&lt;/p&gt;
&lt;p&gt;Neither sound like the dynamic, exploratory, fast-paced world of startups.&lt;/p&gt;
&lt;p&gt;And in my experience, neither could be further from the truth.&lt;/p&gt;
&lt;p&gt;If you&#39;re not familiar with TDD, it&#39;s the practice of building software in very small cycles, each cycle consisting of three steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write a failing test&lt;/li&gt;
&lt;li&gt;Make the test pass in the simplest way you can&lt;/li&gt;
&lt;li&gt;Refactor to improve your code &amp;amp; design while keeping all tests passing&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is often visualised as &lt;em&gt;Red&lt;/em&gt; -&amp;gt; &lt;em&gt;Green&lt;/em&gt; -&amp;gt; &lt;em&gt;Refactor&lt;/em&gt; - a familiar loop I included in my logo because I find it so valuable!&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/superpowers/apple-touch-icon-152x152.png&quot; alt=&quot;The Dev Cycles Logo&quot; /&gt;&lt;figcaption&gt;The inner cycle of the site logo represents TDD&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;It&#39;s a simple idea, but hard to grasp the implications of until you&#39;ve given it a try. &lt;a href=&quot;https://twitter.com/davefarley77&quot;&gt;Dave Farley&lt;/a&gt; has a great &lt;a href=&quot;https://www.youtube.com/watch?v=yfP_v6qCdcs&quot;&gt;video&lt;/a&gt; demonstrating the technique for beginners. &lt;a href=&quot;https://chrissimon.au/blog/2022/02/25/3-startup-software-superpowers/%5Bhttps:%5D(https://twitter.com/KentBeck)&quot;&gt;Kent Beck&lt;/a&gt; originally developed the idea and wrote the &lt;a href=&quot;https://www.amazon.com.au/Test-Driven-Development-Kent-Beck/dp/0321146530&quot;&gt;seminal book&lt;/a&gt; on the topic. &lt;a href=&quot;https://twitter.com/GeePawHill&quot;&gt;GeePaw Hill&lt;/a&gt; is also well worth following for excellent advice and content.&lt;/p&gt;
&lt;p&gt;There are many positive benefits of TDD, but in a startup context the most important one is that it allows you to &lt;em&gt;continuously refactor&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The early days of a startup are when your design is most likely to need to change/evolve rapidly.  By ensuring you diligently refactor during each TDD cycle, you will find your code absorbs these changes more easily - and you will have high confidence that you haven&#39;t broken anything that your early customers are relying on.&lt;/p&gt;
&lt;p&gt;This is important because your early customers are the ones you need to impress the most - both by delivering a reliable service, and by demonstrating that you are listening closely to their feedback.&lt;/p&gt;
&lt;p&gt;If Part 4 of this series, I&#39;ll illustrate some key refactoring efforts the &lt;code&gt;E.A.S.&lt;/code&gt; developers need to make and the impact of TDD.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot; tabindex=&quot;-1&quot;&gt;Summary&lt;/h2&gt;
&lt;p&gt;If you want to be a startup superhero try out these tools:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Event storming to explore an initial concept and design&lt;/li&gt;
&lt;li&gt;User Story Mapping to find the MVP&lt;/li&gt;
&lt;li&gt;Test Driven Development to keep your implementation moving quickly&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Even if you&#39;re not in a startup, these tools are well worth learning.  They are superpowers in many situations; this blog post just focusses on their application for startups.&lt;/p&gt;
&lt;h2 id=&quot;what-are-your-superpowers%3F&quot; tabindex=&quot;-1&quot;&gt;What are your Superpowers?&lt;/h2&gt;
&lt;p&gt;This is not an exhaustive list of software superpowers by any means!&lt;/p&gt;
&lt;p&gt;What are yours? Share them in the comments below, on my &lt;a href=&quot;https://twitter.com/ChrisSimonAu&quot;&gt;Twitter&lt;/a&gt; or &lt;a href=&quot;https://www.linkedin.com/in/chrissimon-au/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;getting-your-superpowers&quot; tabindex=&quot;-1&quot;&gt;Getting your Superpowers&lt;/h2&gt;
&lt;p&gt;If you&#39;d like to experience what it feels like to have these superpowers, &lt;a href=&quot;https://chrissimon.au/contact?engagement-type=training&quot;&gt;send me a message&lt;/a&gt; - I offer workshops &amp;amp; training in all the above topics and would love to share my experience with you.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What I Think About When I Think About Coupling</title>
    <link href="https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/"/>
    <updated>2020-10-28T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/</id>
    <content xml:lang="en" type="html">&lt;p&gt;The phrase “loosely coupled” is used alongside “microservices“ so often you&#39;d be forgiven for assuming you get loose coupling for free, just by “doing“ microservices. (Spoiler: you don&#39;t.) But what actually is coupling? How loose is loose? Should we also be worried about cohesion? And why do we care?&lt;/p&gt;
&lt;h2 id=&quot;introduction&quot; tabindex=&quot;-1&quot;&gt;Introduction&lt;/h2&gt;
&lt;h3 id=&quot;talking-about-coupling-%26-cohesion&quot; tabindex=&quot;-1&quot;&gt;Talking about Coupling &amp;amp; Cohesion&lt;/h3&gt;
&lt;p&gt;Before we begin it needs acknowledging - talking about coupling and cohesion is &lt;em&gt;hard&lt;/em&gt;! Informal conversations often rely on intuition and analogy, and while academic research has given us reams of classification schemes and complex formulas, they are infrequently applied in commercial development.&lt;/p&gt;
&lt;p&gt;In my experience, part of the problem is that over the years the industry&#39;s understanding of coupling and cohesion has expanded dramatically, leading to a number of different ways of thinking about the concepts. While all of these ways are linked by a common thread, that commonality is not always apparent, and the reason &lt;em&gt;why&lt;/em&gt; coupling is important can become disconnected from its definition.  I&#39;ve had conversations with other engineers where it felt like we were speaking completely different languages when trying to discuss the merits or risks of a particular design with respect to coupling.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/coupling_confusion.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Talking about Coupling &amp;amp; Cohesion can feel like speaking different languages&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;When talking about &lt;em&gt;loose&lt;/em&gt; coupling, we have the added challenge of relativity - loose is often not used as an absolute.  Frequently it is used to talk implicitly about loos&lt;em&gt;er&lt;/em&gt; coupling, compared with what came before.  A system might be described as loosely coupled - and it may well be, next to a previous iteration of the same system - yet it may still exhibit many characteristics of &lt;em&gt;tight&lt;/em&gt; coupling.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/loose_vs_tight.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;v2 may feel like loose coupling compared with v1&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The aim of this blog post is to summarise a number of the most common ways of thinking about coupling and cohesion, and hopefully draw out the common thread that links them all.&lt;/p&gt;
&lt;h3 id=&quot;why-do-we-care%3F&quot; tabindex=&quot;-1&quot;&gt;Why do we care?&lt;/h3&gt;
&lt;p&gt;The concepts of coupling &amp;amp; cohesion are not new. They were developed by &lt;a href=&quot;https://en.wikipedia.org/wiki/Larry_Constantine&quot;&gt;Larry Constantine&lt;/a&gt; in the late 1960s and 70s as part of a broader idea called &amp;quot;Structured Design&amp;quot;.&lt;/p&gt;
&lt;p&gt;In 1979, Constantine and Edward Yourdon published &lt;a href=&quot;https://www.amazon.com/Structured-Design-Fundamentals-Discipline-Computer/dp/0138544719&quot;&gt;Structured Design: Fundamentals of a Discipline of Computer Program and System Design&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/structured_design.jpeg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Structured Design&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The book contained explorations of these relatively new ideas, with the inspiration noted as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For a given problem, the human error production and, therefore, the cost of coding, debugging, maintenance, and modification are minimized when the problem is subdivided into the smallest functional units that can be treated independently&lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/#structured_design-note&quot; id=&quot;structured_design-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With a focus on the &lt;em&gt;cost&lt;/em&gt; of a software project, &lt;em&gt;Structured Design&lt;/em&gt; had the economics of software development firmly in mind.&lt;/p&gt;
&lt;p&gt;So why do we care? The first reason, historically speaking, is that the concepts were invented specifically to help design software that is less costly to implement and maintain.&lt;/p&gt;
&lt;p&gt;But how did they propose to achieve this goal?  They started by investigating what seemed an unnecessary portion of the cost - dealing with errors (aka bugs, faults, defects).  In particular, they honed in on the root cause of those errors - the humans who introduced them in the first place, and their capacity to deal with software&#39;s growing complexity.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/coupling_map_1.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;We care about loose coupling and high cohesion, because it helps us design software that is less costly to build and maintain.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;As we work through this post, we are going to extend this map to illustrate how the different ways of thinking about coupling and cohesion relate to these goals.&lt;/p&gt;
&lt;h2 id=&quot;ways-of-thinking-about-coupling-%26-cohesion&quot; tabindex=&quot;-1&quot;&gt;Ways of Thinking about Coupling &amp;amp; Cohesion&lt;/h2&gt;
&lt;h3 id=&quot;the-basics&quot; tabindex=&quot;-1&quot;&gt;The Basics&lt;/h3&gt;
&lt;p&gt;Before taking that thought further, it will help to establish some baseline understanding about the general structures involved.&lt;/p&gt;
&lt;p&gt;Any system can be thought of as a collection of interconnected &lt;a href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/&quot;&gt;components&lt;/a&gt; (Constantine&#39;s &amp;quot;functional units&amp;quot;).  In &lt;em&gt;Structured Design&lt;/em&gt;, he referred to them as &lt;code&gt;modules&lt;/code&gt;, but the principles apply to any type of component.  In Object Oriented Programming, you might be talking about a &lt;code&gt;class&lt;/code&gt;, or at a higher level you might consider a &lt;code&gt;package&lt;/code&gt;, or &lt;code&gt;assembly&lt;/code&gt;.  In Microservices architectures, you&#39;re typically talking about an independently deployed and operating &lt;code&gt;microservice&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;With that in mind, we can start with some basics:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Coupling&lt;/em&gt; is about the relationship between two components.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Cohesion&lt;/em&gt; is about the internals of a component.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Since coupling is about relationships, it&#39;s important to note that it is &lt;em&gt;directional&lt;/em&gt;.  Components A &amp;amp; B are coupled if there is any kind of relationship between them but the impact of B on A might be far more significant than the impact of A on B.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/coupling_cohesion_basics.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Coupling is about the relationship between components, cohesion about the internals of a component.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;coupling&quot; tabindex=&quot;-1&quot;&gt;Coupling&lt;/h3&gt;
&lt;p&gt;We&#39;re going to talk about coupling first, and for the purposes of this post, I&#39;ve loosely grouped the ways of thinking about it into three conceptual models:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/#software-is-written-by-people&quot;&gt;Software is written by people&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/#interconnections-between-components&quot;&gt;Interconnections between components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/#change-blast-radius&quot;&gt;Change blast radius&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;software-is-written-by-people&quot; tabindex=&quot;-1&quot;&gt;Software is written by people&lt;/h4&gt;
&lt;p&gt;In pursuit of more cost effective software development practices, Constantine noted that most of the cost of system development is in fixing bugs - in other words, correcting errors made by humans. To reduce the cost, he went looking for ways to reduce the bug-rate.&lt;/p&gt;
&lt;p&gt;It&#39;s been observed that humans have an information processing limit of about 7±2 objects at any point in time.  Constantine concluded from this that most sources of human-introduced errors are a result of attempting to code modules that are naturally too complex for humans to understand.&lt;/p&gt;
&lt;p&gt;In Constantine and Yourdon&#39;s own words:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The key question is: How much of one module must be known in order to understand another module? The more that we must know of module B in order to understand module A, the more closely connected A is to B. The fact that we must know something about another module is a priori evidence of some degree of interconnection even if the form of the interconnection is not known.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;The measure that we are seeking is known as coupling; it is a measure of the strength of interconnection. ... Obviously, what we are striving for is loosely coupled systems --- that is, systems in which one can study (or debug, or maintain) any one module without having to know very much about any other modules in the system.&lt;/p&gt;
&lt;p&gt;Coupling as an abstract concept --- the degree of interdependence between modules --- may be operationalized as the probability that in coding, debugging, or modifying one module, a programmer will have to take into account something about another module. &lt;a href=&quot;https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/#structured_design-note&quot;&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This definition clearly incorporates the limitations of human thinking - if a developer needs to keep facts about component B in their head while working on component A, then we increase the likelihood that we will exceed the 7±2 object limit - bugs will inevitably follow!&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/coupling_processing_limit.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Coupling between ClassA and ClassB increases the risk of exceeding our human information processing limits.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Following this to its logical conclusion, we can reduce coupling by arranging our system design such that in order to work on a given component, we do not need to know much about other components.  This has a strong link to the idea of designing for high cohesion - further details &lt;a href=&quot;https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/#cohesion&quot;&gt;below&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;An interesting aspect of this way of thinking relates to modern DevOps style of working in that errors while developing are one thing but errors at run-time become operational incidents.  For the same reason that looser coupling makes things easier when designing and bugfixing, it also makes operational incidents easier to resolve as the response team will have less parts of the system to think about and can focus on the component with the fault.&lt;/p&gt;
&lt;p&gt;To visualise this way of thinking about coupling we can map out the chain of reasoning:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/coupling_map_2.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Loose coupling helps us work within our limits, reducing the risk of errors, and the overall cost to build, maintain &amp;amp; operate software.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;!--
1. Designing systems that are loosely coupled with highly cohesive components will...
2. Help human engineers (with natural limitations in their capacity)...
3. To reason about the system, resulting in fewer bugs, and bugs that are more easily found and resolved...
4. Which should reduce the overall cost of software development.
--&gt;
&lt;h4 id=&quot;interconnections-between-components&quot; tabindex=&quot;-1&quot;&gt;Interconnections Between Components&lt;/h4&gt;
&lt;p&gt;Constantine &amp;amp; Yourdan were quoted above: &amp;quot;The fact that we must know something about another module is a priori evidence of some degree of interconnection even if the form of the interconnection is not known.&amp;quot;&lt;/p&gt;
&lt;p&gt;In the search for ways of objectively measuring this degree of interconnection, researchers have necessarily needed to focus on scenarios where the form of the interconnection &lt;em&gt;is&lt;/em&gt; known.&lt;/p&gt;
&lt;p&gt;For example, an interconnection might be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A call to a method in another class&lt;/li&gt;
&lt;li&gt;A dependency on another package or assembly&lt;/li&gt;
&lt;li&gt;A remote API call&lt;/li&gt;
&lt;li&gt;A message exchange via a queue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The outcome of this research is probably given the most attention in the formal software engineering education and online documentation.  For example, Wikipedia&#39;s article on &lt;a href=&quot;https://en.wikipedia.org/wiki/Coupling_(computer_programming)&quot;&gt;Coupling&lt;/a&gt; and &lt;a href=&quot;https://www.geeksforgeeks.org/software-engineering-coupling-and-cohesion/&quot;&gt;other&lt;/a&gt; &lt;a href=&quot;https://www.javatpoint.com/software-engineering-coupling-and-cohesion&quot;&gt;online tutorials&lt;/a&gt; contain a laundry list of coupling types under various classification schemes as well as formula for computing a coupling metric based on these specific methods of interconnection.&lt;/p&gt;
&lt;p&gt;These formula and classification schemes are thoroughly and expertly discussed elsewhere so I won&#39;t repeat them here, but I would like to discuss some of the extra &lt;em&gt;benefits&lt;/em&gt; of loose coupling that have been identified through the research that produced them.  These further benefits all contribute to reducing the cost to build, maintain and operate software systems.&lt;/p&gt;
&lt;p&gt;By reducing the degree of interconnection between components (i.e. looser coupling), we achieve the following benefits:&lt;/p&gt;
&lt;hr /&gt;
&lt;h5 id=&quot;reduce-error-impact&quot; tabindex=&quot;-1&quot;&gt;Reduce error impact&lt;/h5&gt;
&lt;p&gt;When there is an interconnection between components, a fault in one component can cause failures in other components. For example, if &lt;code&gt;ClassA&lt;/code&gt; calls a method on &lt;code&gt;ClassB&lt;/code&gt; then does something with the return value, a bug in &lt;code&gt;ClassB&lt;/code&gt; can manifest as an incorrect result in &lt;code&gt;ClassA&lt;/code&gt;.  Hopefully you have unit testing to catch and isolate these sorts of errors, but reducing coupling will reduce their likelihood altogether.&lt;/p&gt;
&lt;h5 id=&quot;improve-runtime-performance&quot; tabindex=&quot;-1&quot;&gt;Improve runtime performance&lt;/h5&gt;
&lt;p&gt;At runtime, inter-process interconnections (such as remote API calls between microservices) carry a performance overhead, and introduce &lt;em&gt;temporal coupling&lt;/em&gt; - that is, the execution time of the &lt;em&gt;caller&lt;/em&gt; is affected by the execution time of the &lt;em&gt;callee&lt;/em&gt;.  This latter point is part of why asynchronous message queues are often recommended for inter-process communications.&lt;/p&gt;
&lt;h5 id=&quot;reduce-incident-impact&quot; tabindex=&quot;-1&quot;&gt;Reduce incident impact&lt;/h5&gt;
&lt;p&gt;An incident in a component can spread to other components.  For example, when a component is experiencing an incident, it may become unavailable to components that connect to it, or present degraded service quality.  In the reverse direction, a component experiencing an issue can overload components that it calls out to.  Reducing coupling can help isolate the incident and reduce its spread, improving availability and reliability.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;To visualise this way of thinking about coupling, once again we can map out the chain of reasoning:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/coupling_map_3.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Reducing the interconnection between modules reduces error impact, improves runtime performance and reduces incident impact.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h4 id=&quot;change-blast-radius&quot; tabindex=&quot;-1&quot;&gt;Change Blast Radius&lt;/h4&gt;
&lt;p&gt;The observation that loose coupling reduces the impact of errors was first published in a book based on Constantine&#39;s work called &lt;a href=&quot;https://www.amazon.com/gp/product/0136907695/ref=dbs_a_def_rwt_bibl_vppi_i1&quot;&gt;The Practical Guide To Structured Systems Design&lt;/a&gt; by &lt;a href=&quot;https://www.amazon.com/Meilir-Page-Jones/e/B001ITVFZQ&quot;&gt;Meilir Page-Jones&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This way of thinking about the impact of the relationship between components has come to be known as the &amp;quot;blast radius&amp;quot; of the component.  It&#39;s usually defined in terms of the number of other components affected by an event in the component.  The looser (or fewer) the connections a component has with other components, then the blast radius of the event is smaller.  (Note: Page-Jones did not use the term &amp;quot;blast radius&amp;quot; - this is a more modern term for the same concept.)&lt;/p&gt;
&lt;p&gt;Errors &amp;amp; incidents are types of events that can have a blast radius.  Another type of event is a &lt;em&gt;change&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It is a rare software system that is built once and never modified.  Software systems, especially in the modern product-led Saas world, are living things, undergoing continuous evolution.  Inspiration for changes can come from anywhere - a startup pivot, a strategic review, customer feedback, operational efficiency goals, just to scratch the surface!&lt;/p&gt;
&lt;p&gt;When embarking on a change, one has to start by considering the component(s) most obviously responsible for the functionality that needs to change - and then work out if any of the changes impact other components.  Components that are tightly coupled are more likely to require changes to accommodate the initial change; conversely, components that are loosely coupled are less likely.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/change_blast_radius.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Change blast radius refers to the scale of impact of a change - in this example, components A and D are in the blast radius of component E.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;In the image above, when component E is updated to v2, components A and D are broken - they are in the blast radius of this change.  To complete the change successfully, they must also be updated - adding cost and time to the change, especially if those components are owned by other teams.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/change_blast_radius_fixed.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;The change is only complete when components A and D are updated.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The analysis of change impact is so significant that Page-Jones continued his research in this area and ended up coining a new term just to describe it: &lt;em&gt;&lt;a href=&quot;https://connascence.io/&quot;&gt;Connascence&lt;/a&gt;&lt;/em&gt;.  Connascence has also been analysed in formal research and &lt;a href=&quot;https://connascence.io/&quot;&gt;https://connascence.io&lt;/a&gt; has a good summary of the classification schemes that have been produced.&lt;/p&gt;
&lt;p&gt;This way of thinking about coupling has become one of the most popular informal understandings I&#39;ve seen (although the term &lt;em&gt;connascence&lt;/em&gt; appears less well known).  In fact for many engineers, this has become the default, and most intuitive way of thinking about coupling.  For example, this tweet from Kent Beck defines coupling exactly in this way:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/KentBeck/status/1116379072781619200&quot;&gt;https://twitter.com/KentBeck/status/1116379072781619200&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I do think that this focus on the impact of &lt;em&gt;change&lt;/em&gt; reveals one of the most challenging aspects of striving for loose coupling - in many scenarios, predicting the future types of changes is almost impossible, particularly when in response to a startup pivot, or a strategic review.  We&#39;ll consider these types of changes more in a future post about the &lt;a href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/#logical-view&quot;&gt;Logical View&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A formal concept associated with this idea of &lt;em&gt;change&lt;/em&gt; is the &lt;a href=&quot;https://en.wikipedia.org/wiki/Software_package_metrics&quot;&gt;&lt;em&gt;Instability Index&lt;/em&gt;&lt;/a&gt; - a metric derived by analysing the number of &amp;quot;inbound&amp;quot; vs &amp;quot;outbound&amp;quot; dependencies, with the goal of predicting the &amp;quot;instability&amp;quot; of the component - or how likely it is going to need to change when other related components change.&lt;/p&gt;
&lt;p&gt;Similarly to errors, there is a run-time impact of connascence, particularly in the world of microservices.  One of the goals of microservices is to have independently deployable units, owned by autonomous teams.  If two microservices have a high degree of connascence, then it&#39;s more likely that a change in one microservice will necessitate a change in another - reducing the likelihood that the change in the first service can be safely deployed without coordinating the deployment of the consequent change in the other service, and thus reducing team autonomy.&lt;/p&gt;
&lt;p&gt;Once again, we can visualise this way of thinking by mapping out the chain of reasoning:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/coupling_map_4.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Reducing the change blast radius reduces the cost and complexity of changes, and enhances team autonomy.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;cohesion&quot; tabindex=&quot;-1&quot;&gt;Cohesion&lt;/h3&gt;
&lt;p&gt;Cohesion naturally follows as a sort of inverse of coupling:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&#39;Intramodular functional relatedness&#39; is a clumsy term. What we are considering is the cohesion of each module in isolation --- how tightly bound or related its internal elements are to one another.&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;p&gt;Clearly, cohesion and coupling are interrelated. The greater the cohesion of individual modules in the system, the lower the coupling between modules will be. ...&lt;/p&gt;
&lt;p&gt;Both coupling and cohesion are powerful tools in the design of modular structures, but of the two, cohesion emerges from extensive practice as more important. &lt;a href=&quot;https://chrissimon.au/blog/2020/10/28/what-i-think-about-when-i-think-about-coupling/#structured_design-note&quot;&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In other words, if all the functionality in a given component is related to the &lt;em&gt;same idea&lt;/em&gt; then while the developer is working on that component there is less risk of other unrelated stuff taking up space in the 7±2 object limit and crowding out the relevant material.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/cohesion_processing_limit.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;When class A contains functionality related to both foo and bar, we run the risk of exceeding our human limitations.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;It may come as a surprise that Constantine and Yourdan considered cohesion as more important than coupling, considering the industry focus on coupling, and the many ways it has come to be understood.  I believe it makes some sense, though, given that they were focussed on the introduction of errors by humans.  The other benefits of loose coupling had not yet been articulated.&lt;/p&gt;
&lt;p&gt;While the word &lt;em&gt;cohesive&lt;/em&gt; is less frequently used to describe microservices, this idea is at the heart of the advice to organise your services around &amp;quot;business capabilities&amp;quot; -- the intention is to ensure the functionality within each service is all related -- i.e. that the service is cohesive.&lt;/p&gt;
&lt;p&gt;We can visualise the impact of cohesion similarly to coupling:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/cohesion_map_1.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Highly cohesive modules can reduce the risk of errors, and consequently the cost to build and maintain software.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;conclusion&quot; tabindex=&quot;-1&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;To bring together all our maps of the different ways of thinking about coupling and cohesion:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/coupling/coupling_cohesion_map_full.png&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;The complete coupling/cohesion landscape.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Given that most conversations focus on a narrow band of this landscape, it starts to make sense why these are such difficult topics to get your head around, particularly for people new to the field!&lt;/p&gt;
&lt;p&gt;In summary, there are many different ways to think about coupling &amp;amp; in this post we&#39;ve explored three:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Software is written by humans&amp;quot; - how much can we keep in our heads at one time&lt;/li&gt;
&lt;li&gt;&amp;quot;Interconnection between components&amp;quot; - the actual interconnections between components and their characteristics&lt;/li&gt;
&lt;li&gt;&amp;quot;Change blast radius&amp;quot; - changes, and the way they necessitate further changes in related components&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my experience, these different ways of thinking are at the root cause of many unfruitful conversations about coupling -- but while they appear different, hopefully it now makes sense that they are in fact all related.  The common thread is the strength of relationships between components and the benefits of reducing the strength of those relationships.  At different times and in different scenarios, you may find one way of thinking or the other more useful, and I encourage you to keep in mind the broader perspective so you can make an informed choice about when it makes sense to adopt a particular approach.&lt;/p&gt;
&lt;p&gt;Stay tuned for future posts (coming soon!), in which we will apply these different ways of thinking to concrete code and system designs -- making good on the spoiler above to explain in detail why you don&#39;t get loose coupling for free just by &amp;quot;doing&amp;quot; microservices.&lt;/p&gt;
&lt;p&gt;When returning to the series of posts about the &lt;a href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/&quot;&gt;4+1 views&lt;/a&gt;, we will also analyse coupling &amp;amp; cohesion through the lens of each view, examining how different types of coupling are more relevant in different views, and how increasing cohesion in one view can actually decrease it in another.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>History of the 4 + 1 Architectural View Model</title>
    <link href="https://chrissimon.au/blog/2019/02/28/history-of-the-4--1-architectural-view-model/"/>
    <updated>2019-02-28T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2019/02/28/history-of-the-4--1-architectural-view-model/</id>
    <content xml:lang="en" type="html">&lt;p&gt;This post explores the history and legacy of the 4 + 1 views.  See &lt;a href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/&quot;&gt;4 + 1 Architectural View Model: Introduction&lt;/a&gt; for the more technical overview.&lt;/p&gt;
&lt;h2 id=&quot;origin-story&quot; tabindex=&quot;-1&quot;&gt;Origin Story&lt;/h2&gt;
&lt;p&gt;In 1995, &lt;a href=&quot;https://en.wikipedia.org/wiki/Philippe_Kruchten&quot;&gt;Philippe Kruchten&lt;/a&gt; was working at &lt;a href=&quot;https://en.wikipedia.org/wiki/Rational_Software&quot;&gt;Rational Software Corp&lt;/a&gt;, at the time the pre-eminent vendor of software development tools.&lt;/p&gt;
&lt;p&gt;With years of experience designing large scale complex software systems across telecommunications, aerospace, transport and defense, he had observed that software architecture diagrams often failed to provide clarity as to the actual system design.  It was frequently confusing as to what the boxes, lines and arrows really represent, and stakeholders struggled to discover the information they needed.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/generic-simple-architecture.svg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Boxes and lines and arrows... but what do they mean?&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;He proposed a solution in a paper published that year - &lt;a href=&quot;https://www.cs.ubc.ca/~gregor/teaching/papers/4+1view-architecture.pdf&quot;&gt;Architectural Blueprints—The “4+1” View Model of Software Architecture&lt;/a&gt; - to organise the description of a software architecture using a set of concurrent &#39;views&#39;, each addressing specific concerns, for specific stakeholders.&lt;/p&gt;
&lt;h3 id=&quot;historical-context&quot; tabindex=&quot;-1&quot;&gt;Historical Context&lt;/h3&gt;
&lt;p&gt;Comparisons between software architecture and the architecture of buildings have been made since at least 1968, when the Nato Science Committee sponsored a Working Conference on Software Engineering.  Amongst many other topics the attendees discussed how to discover the &amp;quot;right attitude to design&amp;quot;.  &lt;a href=&quot;https://en.wikipedia.org/wiki/Peter_Naur&quot;&gt;Peter Naur&lt;/a&gt; (the &amp;quot;N&amp;quot; in &lt;a href=&quot;https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form&quot;&gt;BNF&lt;/a&gt;) suggested:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;software designers are in a similar position to architects and civil engineers, particularly those concerned with the design of large heterogeneous constructions, such as towns and industrial plants. It therefore seems natural that we should turn to these subjects for ideas about how to attack the design problem. &lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2019/02/28/history-of-the-4--1-architectural-view-model/#nato_conf-note&quot; id=&quot;nato_conf-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The following decades contained numerous efforts to grapple with the large scale design of software systems with many foundational principles proposed and refined, but applied sporadically.&lt;/p&gt;
&lt;p&gt;It was only in the early 1990s that the term &amp;quot;Software Architecture&amp;quot; came to the fore. In 1992 &lt;a href=&quot;https://en.wikipedia.org/wiki/Dewayne_E._Perry&quot;&gt;Dewayne Perry&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Alexander_L._Wolf&quot;&gt;Alexander Wolf&lt;/a&gt; published &amp;quot;Foundations for the study of Software Architecture&amp;quot;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The 1990s, we believe, will be the decade of software architecture. We use the term &amp;quot;architecture&amp;quot;, in contrast to &amp;quot;design&amp;quot;, to evoke notions of codifcation, of abstraction, of standards, of formal training (of soft-ware architects), and of style. &lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2019/02/28/history-of-the-4--1-architectural-view-model/#sw_arch-note&quot; id=&quot;sw_arch-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So it was in the context of a discipline with decades of development, but only nascent formalisation, that Kruchten proposed his 4 + 1 views.&lt;/p&gt;
&lt;p&gt;It&#39;s no surprise given the historical analogues with building architecture that he would refer to the views as &lt;em&gt;blueprints&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;legacy&quot; tabindex=&quot;-1&quot;&gt;Legacy&lt;/h2&gt;
&lt;p&gt;In 1996, Kruchten was appointed the Director of Process at Rational Software where he led the development of the &amp;quot;Rational Unified Process&amp;quot; (RUP).  The 4 + 1 views are a key concept in the RUP section on Analysis and Design.&lt;/p&gt;
&lt;p&gt;While Kruchten was working at Rational, his colleagues were tackling the challenge of communicating about software on a different tack - the outcome was the &lt;a href=&quot;https://en.wikipedia.org/wiki/Unified_Modeling_Language&quot;&gt;Unified Modelling Language&lt;/a&gt; (UML).&lt;/p&gt;
&lt;p&gt;The 4 + 1 views are a generic approach that does not prescribe any specific notation or diagramming structure (although &lt;a href=&quot;https://en.wikipedia.org/wiki/Booch_method&quot;&gt;Booch notation&lt;/a&gt; is used in the paper); UML fills in the blanks with prescriptive definitions of how to notate certain types of diagrams. Although the 4 + 1 views are not specifically referenced in UML, the intention of the RUP was that it would work in concert with UML as the notation for diagrams.  It seems no coincidence and there is a neat alignment with the 4 + 1 views, with many UML diagrams being well suited for use in a specific view.&lt;/p&gt;
&lt;p&gt;These days the 4 + 1 views are rarely utilised - technology and tech culture have moved on.&lt;/p&gt;
&lt;h3 id=&quot;where-did-the-4-%2B-1-views-go%3F&quot; tabindex=&quot;-1&quot;&gt;Where did the 4 + 1 views go?&lt;/h3&gt;
&lt;p&gt;Perhaps the fledgling rumblings of Service-Oriented Architecture (SOA) in 1998 heralded the end? In the context of Kruchten&#39;s paper, systems were large complex beasts with often custom implementations of both hardware and software. The rise of SOA aligned with the web as the communications medium of choice, the adoption of commodity hardware, and increased search for &#39;re-usable&#39; components (often pre-packaged components from vendors). It&#39;s possible that engineers started to see less value in explicitly documenting the separate views.&lt;/p&gt;
&lt;p&gt;Or perhaps it was the rise of Extreme Programming (XP) and Agile?  They have paved the way for a new kind of development process, one which eschews heavy formal frameworks like RUP (although Kruchten maintains that RUP is agile-compatible).  Were the 4 + 1 views the baby thrown out with the bathwater?&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>4 + 1 Architectural View Model: Introduction</title>
    <link href="https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/"/>
    <updated>2019-02-27T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/</id>
    <content xml:lang="en" type="html">&lt;p&gt;Have you ever worked on a microservices system experiencing challenges like these?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&#39;ve separated my system into loosely coupled microservices - why is integration between them still so hard?  I&#39;m spending all my time implementing circuit breakers, bulkheads &amp;amp; retry patterns when I&#39;d rather be writing business logic!&lt;/li&gt;
&lt;li&gt;My autonomous microservices teams are still blocking each other from delivery - why?&lt;/li&gt;
&lt;li&gt;We still struggle with version incompatibilities between microservices... we&#39;ve had to invest heavily in consumer driven contract testing to ensure we don&#39;t break things&lt;/li&gt;
&lt;li&gt;Making an update is so hard - we have to update code in multiple repositories containing our shared libraries and wait for a nuget or npm publish cycle in each of them before we can test the integration of changes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Or perhaps you&#39;re a startup who doesn&#39;t want to over-engineer their launch solution, but also doesn&#39;t want to end up with a big ball of mud, or unable to scale their system when the business starts doing well?&lt;/p&gt;
&lt;p&gt;Either way - the &amp;quot;4 + 1 Architectural Views&amp;quot; may help.&lt;/p&gt;
&lt;p&gt;This is the first in a series of posts about the views. Throughout the series, I hope to demonstrate how useful the 4 + 1 Views can be in understanding complex distributed systems, as well as facilitating more nuanced approaches to system design.&lt;/p&gt;
&lt;p&gt;This first post will provide a brief introduction to each of the views, with deep dives into each view coming soon.&lt;/p&gt;
&lt;h2 id=&quot;origin-story&quot; tabindex=&quot;-1&quot;&gt;Origin Story&lt;/h2&gt;
&lt;p&gt;The origin and context of the 4 + 1 architectural views model is a fundamental part of the history of Software Architecture itself - a &lt;a href=&quot;https://chrissimon.au/blog/2019/02/28/history-of-the-4--1-architectural-view-model/&quot;&gt;separate post&lt;/a&gt; explores that history.&lt;/p&gt;
&lt;h2 id=&quot;the-views&quot; tabindex=&quot;-1&quot;&gt;The Views&lt;/h2&gt;
&lt;p&gt;The &amp;quot;4 + 1 Architectural Views&amp;quot; were proposed in 1995 to solve increasing challenges communicating about software architectures.&lt;/p&gt;
&lt;p&gt;The purpose of separating the architecture into multiple concurrent views was to isolate and illustrate different aspects of the design with information specifically oriented towards different stakeholders.&lt;/p&gt;
&lt;p&gt;Each view should:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;define the system in terms of Components, Connectors and Containers&lt;/li&gt;
&lt;li&gt;use appropriate styles, forms and patterns for each view&lt;/li&gt;
&lt;li&gt;consider applicable constraints in each view&lt;/li&gt;
&lt;li&gt;consider the relationship between the views&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following diagram from the &lt;a href=&quot;https://en.wikipedia.org/wiki/4%2B1_architectural_view_model&quot;&gt;wikipedia article&lt;/a&gt; illustrates the views and relationships between them.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/4+1_Architectural_View_Model.svg.png&quot; alt=&quot;Diagram of the 4+1 Views&quot; /&gt;&lt;figcaption&gt;The &#39;classic&#39; 4 + 1 views&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;For any given system, you may not need to document all the views, and there may be other, more relevant views for your system.  I recommend creating the minimal documentation to explain architectural decisions, and ensure you are ready and willing to evolve your architecture (in each of the views) as your solution matures.&lt;/p&gt;
&lt;h3 id=&quot;logical-view&quot; tabindex=&quot;-1&quot;&gt;Logical View&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The logical architecture primarily supports the functional requirements — what the system should provide in terms of services to its users.&lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/#kruchten-note&quot; id=&quot;kruchten-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/logical-view.svg&quot; alt=&quot;Diagram showing a set of bounded contexts&quot; /&gt;&lt;figcaption&gt;Logical View&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The logical view illustrates how the system is decomposed into specific areas of functionality.  You will likely need to diagram the system at various levels of abstraction.&lt;/p&gt;
&lt;p&gt;If you are using Domain-Driven Design (DDD) then at the highest level (the most abstract) you might show domains, sub-domains and bounded contexts and the flow of events between them. In the Domain Blue Book&lt;a class=&quot;Footnotes__ref&quot; href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/#ddd-note&quot; id=&quot;ddd-ref&quot; aria-describedby=&quot;footnotes-label&quot; role=&quot;doc-noteref&quot;&gt;&lt;/a&gt;, this is called the &#39;context map&#39;.  At the lowest level (the most concrete), you might illustrate aggregates, aggregate roots, entities and relationships.&lt;/p&gt;
&lt;p&gt;However, DDD is not the only way to design software - for some systems it may be better to illustrate functional modules, perhaps with a simple entity-relationship diagram.&lt;/p&gt;
&lt;p&gt;Deep dive into the Logical View: coming soon...&lt;/p&gt;
&lt;h3 id=&quot;process-view&quot; tabindex=&quot;-1&quot;&gt;Process View&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The process architecture takes into account some non-functional requirements, such as performance and availability. It addresses issues of concurrency and distribution, of system’s integrity, of fault-tolerance, and how the main abstractions from the logical view fit within the process architecture &lt;a href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/#kruchten-note&quot;&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/process-view.svg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Process View&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The process view gets us to closer to an illustration of running software. Components in the process view are real executables that make up the run-time of your system.&lt;/p&gt;
&lt;p&gt;For example, each of the following would be considered a &#39;process&#39;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IIS Web Application Pool&lt;/li&gt;
&lt;li&gt;Single-page app running in a browser&lt;/li&gt;
&lt;li&gt;Linux Daemon&lt;/li&gt;
&lt;li&gt;Database engine running stored procedures or SQL scripts&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Processes can be thought of as a unit of &#39;tactical control&#39;.  An individual process can be deployed, started, recovered, reconfigured, scaled out, and shutdown.&lt;/p&gt;
&lt;p&gt;The purpose of the process view is to start to capture both the flow of inter-process information exchange (e.g. REST API calls, messaging via a bus) and the sequence and timing of these inter-process communications.  This allows us to consider questions such as concurrency and reliability.&lt;/p&gt;
&lt;p&gt;Deep dive into the Process View: coming soon...&lt;/p&gt;
&lt;h3 id=&quot;physical-view&quot; tabindex=&quot;-1&quot;&gt;Physical View&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The physical architecture takes into account primarily the non-functional requirements of the system such as availability, reliability (fault-tolerance), performance (throughput), and scalability. The software executes on a network of computers, or processing nodes (or just nodes for short). The various elements identified — networks, processes, tasks, and objects—need to be mapped onto the various nodes. &lt;a href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/#kruchten-note&quot;&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/physical-view.svg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Physical View&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Even with the advent of Cloud computing and virtualised hardware, the physical architecture view still plays a critical role in understanding system performance and capacity.&lt;/p&gt;
&lt;p&gt;Components are either processing nodes (servers, virtual machines, docker containers, serverless configurations, etc.) or networking channels (routers, firewalls, proxies, load balancers, etc.) and the diagram should illustrate which nodes host which processes from the process view.  This allows us to start considering compute and network capacity, as well as latency and other performance considerations.&lt;/p&gt;
&lt;p&gt;Deep dive into the Physical View: coming soon...&lt;/p&gt;
&lt;h3 id=&quot;development-view&quot; tabindex=&quot;-1&quot;&gt;Development View&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The development architecture focuses on the actual software module organization on the software development environment. The software is packaged in small chunks — program libraries, or subsystems — that can be developed by one or a small number of developers. &lt;a href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/#kruchten-note&quot;&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/development-view.jpg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Development View&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I often think about the development view as the &amp;quot;source code&amp;quot; view.  As such, you can consider it as having two &#39;sub-views&#39;, or perspectives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Physical perspective, comprised of:
&lt;ul&gt;
&lt;li&gt;repositories&lt;/li&gt;
&lt;li&gt;file systems&lt;/li&gt;
&lt;li&gt;IDE projects/solutions &amp;amp; structure (e.g. Visual Studio Solutions)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The physical perspective helps you &#39;find&#39; the code.  There is a concept of &#39;nearness&#39; which can be helpful when considering what code you want to keep &#39;near&#39; what other code to enhance cohesion.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logical perspective, comprised of:
&lt;ul&gt;
&lt;li&gt;modules (e.g. assemblies, packages)&lt;/li&gt;
&lt;li&gt;dependencies between modules&lt;/li&gt;
&lt;li&gt;layering of modules&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The logical perspective helps you understand how the code modules work together.  It allows you to understand static dependencies between the modules, as well as the flow of execution through the actual source code.  This should help with understanding a run-time model - i.e. which modules will execute within which processes in the process view.&lt;/p&gt;
&lt;p&gt;Deep dive into the Development View: coming soon...&lt;/p&gt;
&lt;h3 id=&quot;scenario%2Fuse-case-view&quot; tabindex=&quot;-1&quot;&gt;Scenario/Use Case View&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The elements in the four views are shown to work together seamlessly by the use of a small set of important scenarios —instances of more general use cases—for which we describe the corresponding scripts (sequences of interactions between objects, and between processes) &lt;a href=&quot;https://chrissimon.au/blog/2019/02/27/4--1-architectural-view-model-introduction/#kruchten-note&quot;&gt;[1]&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/scenario-view.svg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;Scenario View&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The scenario, or &#39;use case&#39; view helps tie the architecture together.  Different diagrams help to illustrate the flow of activity in a system and illustrate which logical, process, physical and development components are working together to facilitate the outcome.&lt;/p&gt;
&lt;p&gt;Deep dive into the Scenario/Use Case View: coming soon...&lt;/p&gt;
&lt;h2 id=&quot;why-should-i-care%3F&quot; tabindex=&quot;-1&quot;&gt;Why should I care?&lt;/h2&gt;
&lt;p&gt;In this series of posts, I hope to demonstrate that many challenges facing teams today are a consequence of blending and ignoring the distinctions between the views - trying to solve problems in one view with design patterns in a different view, or by tightly aligning the design in each view.  My experience is that if you allow yourself to evolve your solution in each view independently, many of these challenges become much easier to reason about.&lt;/p&gt;
&lt;p&gt;This means you can plan ahead to scale appropriately, you can more easily trace performance or scalability issues back to the source, and you can understand why different teams (owning different components in the development view) have complex developer-time interactions affecting autonomy and progress.&lt;/p&gt;
&lt;p&gt;After exploring each of the views in depth in the coming posts, we&#39;ll return to this idea in more detail and explore how specific view alignment (or mis-alignment) patterns cause common risks and challenges.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Introduction</title>
    <link href="https://chrissimon.au/blog/2019/02/24/introduction/"/>
    <updated>2019-02-24T00:00:00Z</updated>
    <id>https://chrissimon.au/blog/2019/02/24/introduction/</id>
    <content xml:lang="en" type="html">&lt;p&gt;Hi, welcome to my blog - it&#39;s a place for me to share my experiences co-founding and helping grow two technology businesses to scale.  I&#39;m a developer at heart so it will mostly be about the tech, but it will also be about the intersection of technology, business, leadership, society and ethics.&lt;/p&gt;
&lt;p&gt;Along the way, I hope to explore the history of our discipline.  Over the years I&#39;ve noticed how frequently the solution to a problem I was facing had been developed many years before.  So began my fascination with the trajectory of ideas: how they are shared, diluted, abandoned, and reinvented, each time with a new spin in a new context.&lt;/p&gt;
&lt;h3 id=&quot;about-the-name&quot; tabindex=&quot;-1&quot;&gt;About the Name&lt;/h3&gt;
&lt;p&gt;For a while I was calling this site (and my coaching/advisory business) &amp;quot;Dev Cycles&amp;quot;.  Although I no longer use that branding, this is an explanation of the name, as I still find it interesting! Dev Cycles is a reference to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Systems_development_life_cycle&quot;&gt;software development life-cycle&lt;/a&gt;, which describes a general process of software development from concept to outcome.&lt;/p&gt;
&lt;p&gt;The banner image above is tangentially related - it&#39;s a slice from &lt;a href=&quot;https://en.wikipedia.org/wiki/Deferent_and_epicycle#/media/File:Cassini_apparent.jpg&quot;&gt;a diagram&lt;/a&gt; of &lt;a href=&quot;https://en.wikipedia.org/wiki/Deferent_and_epicycle&quot;&gt;epicycles&lt;/a&gt; in the Geocentric model - an ancient idea in the history of astronomy (which turned out to be very wrong!) trying to explain what was at the time inexplicable - the motion of the planets and stars.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://chrissimon.au/assets/images/blog/cassini_apparent.jpg&quot; alt=&quot;&quot; /&gt;&lt;figcaption&gt;The Geocentric Model&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Apart from the name association, the metaphor continues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The epicycles themselves relate to the cyclical nature of technology trends - fads come and go like dancing planets.&lt;/li&gt;
&lt;li&gt;I hope to use this blog to tell stories about the evolution of ideas, and the journey from epicycles to the general theory of relativity is surely a gold standard in the field!&lt;/li&gt;
&lt;li&gt;I have often felt like I was trying to solve a technical challenge with a conceptual framework that was as ill-equipped to understand the work ahead of me as epicycles were to explain the motion of the heavens.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;sub&gt;Image: &lt;a href=&quot;https://en.wikipedia.org/wiki/Deferent_and_epicycle#/media/File:Cassini_apparent.jpg&quot;&gt;Cassini_apparent.jpg&lt;/a&gt; by James Ferguson (1710-1776), based on similar diagrams by Giovanni Cassini (1625-1712) and Dr Roger Long (1680-1770); engraved for the Encyclopaedia by Andrew Bell. - Encyclopaedia Britannica (1st Edition, 1771; facsimile reprint 1971), Volume 1, Fig. 2 of Plate XL facing page 449.  Sourced from &lt;a href=&quot;https://en.wikipedia.org/wiki/Deferent_and_epicycle&quot;&gt;wikipedia&lt;/a&gt;.&lt;/sub&gt;&lt;/p&gt;
&lt;h3 id=&quot;join-the-conversation&quot; tabindex=&quot;-1&quot;&gt;Join the Conversation&lt;/h3&gt;
&lt;p&gt;An aspiration of this blog is to explore a connection with the origins of ideas, so I value any personal stories and experiences that add flavour and context.&lt;/p&gt;
&lt;p&gt;Please join the conversation and leave a comment - a critique, an observation, or a memory of your own experiences - all welcome!&lt;/p&gt;
</content>
  </entry>
</feed>