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

<channel>
	<title>Complexity Archives - Grado</title>
	<atom:link href="https://grado.group/category/complexity/feed/" rel="self" type="application/rss+xml" />
	<link>https://grado.group/category/complexity/</link>
	<description>Growing Adaptive Organizations</description>
	<lastBuildDate>Wed, 05 Mar 2025 22:53:33 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/grado.group/wp-content/uploads/2024/04/cropped-growing-plant-1x1-1-300x300-1-e1711995706593.webp?fit=32%2C32&#038;ssl=1</url>
	<title>Complexity Archives - Grado</title>
	<link>https://grado.group/category/complexity/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">222979984</site>	<item>
		<title>Application Programming Interface First</title>
		<link>https://grado.group/35224-2/</link>
					<comments>https://grado.group/35224-2/#respond</comments>
		
		<dc:creator><![CDATA[Jens Paggel]]></dc:creator>
		<pubDate>Wed, 05 Mar 2025 21:57:38 +0000</pubDate>
				<category><![CDATA[Complexity]]></category>
		<category><![CDATA[Architecture]]></category>
		<guid isPermaLink="false">https://grado.group/?p=35224</guid>

					<description><![CDATA[<p>API are not for software alone. They work for everything. They are a concept to be discovered.</p>
<p>The post <a href="https://grado.group/35224-2/">Application Programming Interface First</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Application Programming Interface First (API-First) is said to be documentation-centric. It may and may not be. It just depends on what you make out of the principle. The principle itself is not heavy-weight document centric. Let us have a look at what&nbsp;<a href="https://www.youtube.com/watch?v=8_Xs8Ik0h1w">Werner Vogels, the Amazon Web Services CTO published in his re:invent 2021 performance</a>&nbsp;(check around 1:11):</p>



<p>Six rules for APIs according to Werner Vogels:</p>



<ol class="wp-block-list">
<li>APIs are forever</li>



<li>Never break backward compatibility</li>



<li>Work backwards from customer use cases</li>



<li>Create APIs with explicit and well-documented failure modes</li>



<li>Create APIs that are self-describing and have a clear, specific purpose</li>



<li>Avoid leaking implementation details at all costs</li>
</ol>



<p>According to Werner Vogels, these are lessons learned over 15+ years or so in AWS. He talks about cloud -facing software development. I have more of a systems background. Let me just look at the six rules and translate them into systems speak as I understand them. I am not interpreting. Werner can speak for himself. I just take the punch lines and transfer them into my universe.</p>



<ol class="wp-block-list">
<li><strong>APIs are forever. </strong>Whatever you are exposing as an interface, people will use it. They will build their functions on your API. DO NOT CHANGE IT. It does not need to be a software interface. Any interface will do. <br>O.K. this is a bit scary. I am a big advocate of iterative development. How does this then go together? It does well. Just think of working with a sandbox. In a sandbox you have a lot of freedom in what you are doing and how you are doing it. Remember to start your activities with some architecture. Architecture is the founding principle. Later I will discuss function centricity vs. data centricity and data orientation. Right now we are agnostic to what we are focusing on. <br>If and when we start something entirely new, we will have an idea on the solution architecture of our function. On thing is a given fact: The first idea will not be the best one we will have. Very likely we are going to learn something. A statement you can already find in the <a href="http://www.melconway.com/Home/pdf/committees.pdf">Melvin Conway paper</a>. We need to adapt the architecture as we go. Interfaces between the architectural elements are defined via APIs. So fixing the interfaces will fix the architecture. Simply do it as late as possible. I am not advocating to avoid decisions or delay them. No. Just commit as late as possible, but if you commit, commit. You need to be brave. That is all. And there is one more thing, I learned from some digital lawyers when writing terms and conditions for a product. Once you publish an AIP, you have NO CONTROL over how people are using it. You may have had the best intentions. When it is published, it is published and what follows is damage control. </li>



<li><strong>Never break backwards compatibility.</strong> If you break backwards compatibility, you are going to hurt people. You need to have a good reason to break it. (When I was working as a function developer, I needed an approval by the department head to generate a branch. You could get a branch if you really needed it. Well, there always was a better solution. You can do many things on the trunk if you are forced to think. Yes, you are not fast in the beginning, but imagine all the time saved in the future. – Kudos to Gerd! What a valuable lesson.) The same goes with backwards compatibility. If you break it, you are going to upset a lot of people. BUT: Very few people oppose progress. You will find a solution. If it is in mechanics, a solution might be a physical adapter. Like in SIM-cards for example. They come in different sizes. With adapters to make them fit physically.</li>



<li><strong>Work backwards from customer use cases.</strong> Each of the units in the value stream or boundary diagram needs to produce something. If a block does not deliver a tangible result, what is the justification for its existence? Why is it there if it does not do anything? The entire value stream needs to have a purpose, just like the product or artifact I am delivering. Once I have that, I can throw the entire <a href="https://learnwardleymapping.com/">Wardley Mapping machine</a> on it and get make or buy decisions and focus on what is most important. Again, I am simplifying a lot. I believe Haier is driving the idea of architecture centricity and working backwards towards an extreme and very successful direction. Again, I am only interested in some aspects of the story. See the full <a href="https://hbr.org/2018/11/the-end-of-bureaucracy">HBR article on the Haier concept</a>. What I have in consequence is a succession of sub-systems or process steps with a defined input and output and a price tag in terms of duration and costs. I can assess if I want do do the job on my own (for financial or strategic reasons) or if I am going to buy it. This is pure Taylor scientific management at its best – to my understanding. And Wardley mapping. Taylor focuses on money alone. Wardley adds the strategic component. Get your strategy right and put the effort into what separates you from the rest and is not worth buying. Or buy what is not worth generating yourself. How to decide when to do what? My suggestion is to look at what Simon Wardley has to say. Again, do not copy. Understand and apply the concept to your problem.</li>



<li><strong>Create APIs with explicit and well-documented failure modes.</strong> This sounds familiar to systems engineers. In our context the APIs are representing the architecture of our system. All inputs and outputs are documented. If I am attaching the malfunctions and failures to this documentation, I can see the propagation of failures and basically can define countermeasures for these failures. That is an FMEA (Failure Mode and Effect Analysis) built into the design of the function. In the modern times of “anything as code” I can have this all linked and even automatically generate a Fault Tree Analysis. I could have this “life”. Directly from the code. Right in the beginning of the design of the function I can control all consequences of failures. This is essential for safety relevant functions or otherwise regulated functions. This feature generates enormous transparency and will lead to new solutions of known problems. This is not science fiction. The products you need to get a concept like this up and running do exist and even are open source.</li>



<li><strong>Create APIs that are self-describing and have a clear, specific purpose. </strong>O.K. this is a bit redundant to my interpretation of point 3., but that does not matter. The purpose was mentioned in 3. already. What was not mentioned was the self-describing nature of the API. Who likes to read manuals? Well, I was know in the laboratories I worked in for actually reading manuals of the devices we were using. Not everybody likes to read manuals. If and when the API is self-describing, nobody needs to read a manual. I acknowledge the benefit and think it is a good idea. If the function is self describing, who then needs a manual or instructions? It is not about reducing work or documentation. The point is simply, no matter how hard you are trying, there is always the challenge that two documentations (code and specification) will separate at some point. Solution: see above. Document in the code, a.k.a. documentation as code — I understand, this is not the same, but you get the picture. <br>There is another thing: If the API describes a sub-unit of a functionality, with a specific purpose, then each of the sub-units can be seen as a process. This a 1:1 correspondence to a production line if you like. There is a definition of the a process as “having an input and an output and consuming time, i.e. modifying the input into output (adding value).” </li>



<li><strong>Avoid leaking implementation details at all costs.</strong> This is the pixie dust. Super tough for a technology person like me, not to present all the cool stuff I am doing to the customer/user of the function we are delivering. Just shut up and commit to the deliverables you promise. This is a big challenge in some business contexts that are dominated by lack of trust. There the engineers on the receiving side who often want to be convinced by technical detail. This spoils the game, because then you cannot improve what you have developed. At least not without disclosing all this to the customer. Challenge accepted. At least you should try as hard as you can, not to disclose any details. The less details of your function are known to the outside, the more flexibility you keep for improvement and ratio measures. I am not talking about keeping secrets in front of the customer or betraying the customer in any way. I am talking about keeping autonomy in the development of your function. As long as you deliver the promised result, why should anybody care about what is inside? You are the expert. You know best. I perfectly know that this may be a big challenge. However, when living in a world of mutual respect and co-development and partnership, this should not be an issue any longer. In the end, I could say: “This is what you are paid for.” </li>
</ol>



<p>In consequence, this leads to a service orientation-like architecture. Just with the limitation that the services have defined interfaces. There is nothing wrong with starting with a code-first, function and requirements based strategy if we know nothing. The more we however know, the more we should modularize the solution with the help of the API first concept. It is fine to “freeze” the proven APIs and keep flexibility for others. Rule number 6 should always be in place.</p>



<p>Is this all anarchy behind the APIs? No. For sure not. Remember that YOU can define rules yourself after understanding the principles. There could and probably should be governance guarding the methodologies or standards within all the teams. There could be overarching standards. Very likely, as a consumer of the interface, you will have some expectation with respect to the quality of the solution behind the interface. How the quality is achieved depends. Sometimes there is regulated business and there are expectations from external bodies with respect to regulations or so called “best practices”. This can all be part of the governance topics. It is important not to over-regulate the system in order to maintain adaptability and flexibility of the solution. In the end, the idea is that the sub-system or process step in the value map is delivering according to expectation and agreement.</p>



<p>Still there is the idea that all the APIs need to be externizable — the Bezos thing from the article before. Cool. Make or buy decision are then possible on the level of boxes. And the entire thing can scale. We had this earlier. If a subsystem becomes too big and slow to be managed, make it smaller. Either by splitting it at the same level or by introducing sub-level. The API being externizable however also means, I can buy the function somewhere. If I do that, I need to trust the supplier of the function that the supplier will deliver the agreed quality and functionality. Rule six simply means that I need to trust the API.&nbsp;</p>



<p>A little story to loosen the discussion a bit. When I worked with AWS as a partner in some project, we had a management call. Somebody asked: “What would Jeff say now?” I was close to panicking. Whom did I forget to invite? Jeff who? There was no Jeff in the entire project. Then it struck me. O.K. THIS Jeff. They were checking guardrails.&nbsp;</p>



<p>Externizable API simply also means, we are following Simon Wardleys mapping idea. This is the make or buy decision in the&nbsp;<a href="https://learnwardleymapping.com/">Wardley mapping</a>. I understand that Wardley mapping is more than this single idea. I just want to give Kudos to where it belongs. And the idea of externalizing APIs is reversible. You can sell the functions to others, like AWS did with the cloud service or Amazon does with its accounting services. Or you can simply buy commodity services. It works full scale.</p>



<p>On big remark: sometimes modularity makes no sense. In this case, just dump it. You will save a hell of a lot of administrative work, but you will loose modularity and serviceability. There is a lot of polemics being exchanged. This and that company now goes back to monolithic solutions, so dump your modularity approach and so on. Remember: your choice. This is what you are paid for. Make up your mind and decide. Nobody will do it for you unless the person takes your job. Whatever gets the job done in your very situation is right. Nothing else.</p>



<p>When should modularity be dropped? There are cases when your adaptive cash-cow product turns to a commodity product. You will have a lot of competition. Others can do the same trick. Now you have the choice: There are two rabbit holes. One is to drop the product and let do others care for the commodity product and maybe buy yourself. Just make sure your supplier then has some competition. The other is to make you product a commodity product. Maybe even re-design it to make it a lot cheaper. Whatever it takes. These are two very valid paths. Make a data-supported decision on what to do and commit. Ever forget: Data does not take the decision for you. You decide, informed by data. (We can go on here on which decisions are to be taken by AIs and so on… I don’t do it here. maybe later.)</p>



<p>Is this now the solution for all the problems? Go API-first instead of code-centric and remember Melvin Conway to generate a homomorphism between team structure and product architecture? No. Something additional is needed. Experience simply tells that if we have no overarching governance in form of an architecture and a targeted functionality that is clearly specified, we are going to generate something that is not well structured and not easy to be modified.</p>



<p>And another question needs to be answered: When am I going to use agile methods and when is a classical set-up more promising? Closely related is a more general concept of how not to loose focus on the important stuff and how to find our what is important. The concept that helps us decide is called Situation Awareness and is formulated by Mica Endsley. Situation Awareness helps us to make the decision. The article “<a href="https://grado.group/agile-or-not/" target="_blank" rel="noreferrer noopener">Agile or Not Agile</a>” gives us the parameter.</p>



<p></p>
<p>The post <a href="https://grado.group/35224-2/">Application Programming Interface First</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://grado.group/35224-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">35224</post-id>	</item>
		<item>
		<title>Architecture Considerations. More Important Than You Might Think.</title>
		<link>https://grado.group/architecture-considerations-more-important-than-you-might-think/</link>
					<comments>https://grado.group/architecture-considerations-more-important-than-you-might-think/#respond</comments>
		
		<dc:creator><![CDATA[Jens Paggel]]></dc:creator>
		<pubDate>Tue, 25 Feb 2025 14:12:10 +0000</pubDate>
				<category><![CDATA[Complexity]]></category>
		<category><![CDATA[Evolution]]></category>
		<category><![CDATA[Guiding Principles]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Organization Design]]></category>
		<category><![CDATA[Strategy]]></category>
		<guid isPermaLink="false">https://grado.group/?p=35201</guid>

					<description><![CDATA[<p>Architecture documentation. That is what we do, when we are done. Well, that is possible. Just like in classical civil engineering, the architects rule. If you like it or not. In iterative software or system development, things are slightly different, but only slightly different.</p>
<p>The post <a href="https://grado.group/architecture-considerations-more-important-than-you-might-think/">Architecture Considerations. More Important Than You Might Think.</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Architecture, which architecture? The architecture of the things we are delivering. On a pretty abstract level. We are going to build something the fulfills the need of some user. Does not even matter if he or she or they pay us. There is a job to be done and we either get the job done directly or we are going to provide some means to get this job done. This is my level of abstraction.</p>



<p>If we are doing something for our user, (who now secretly turned into a customer, because the user now does not <strong>actively</strong> use our work product) we need to focus on the workflow for the activity. This workflow is actually the value stream. There is a number of methods or recipes out there that tell and educate you on how find the value stream. Just find it yourself. When you are done you will have a structure like this:</p>





<p>Value stream for a hypothetical activity executed for our customer</p>



<p>There are three “swim lanes” associated with with three different teams or competences or manufacturing stations, and the work is being passed through the different entities and teams until it gets finished. There are parallel activities, there are dependencies. Each box describes a discrete activity that has a start and an end, receives some specific input and delivers a specific output. This work breakdown is like an architecture of the workflow. The building blocks are specific activities. Time by the way is running from left to right. There might be some improvement potential, but at least the work is structured and well prepared for improvement measures. I will not discuss them here. They are in the expertise of lean management or lean manufacturing.</p>



<p>For me it is enough that we see clear input and output and clear interfaces. The work can be modularized and measured and improved in the sense of scientific management – if the management knows how to do the steps in the boxes or we can use the ideas from the Toyota Manufacturing System to have the value generators improve the process. (The only place where value is generated is a the shop floor. Everybody else is doing work classified as “non value-add necessary”. In best case. All other cases qualify as “waste”.) In a way, this is also classical scientific management by F.W. Taylor.</p>



<p>In the case of a physical or logical product, i.e. some output the customer wants to use him or herself to generate value no his/her own, we have a similar concept: the boundary diagram.</p>





<p>A boundary diagram for a system. Boxes denote an internal structure called subsystems. There are well defined inputs and outputs for the system and its subsystem.</p>



<p>There probably are a number of definitions for boundary diagrams. A very simple one is that we structure the system in such a way that all sub-units are independent and communicate with the environment though interfaces with defined</p>



<ul class="wp-block-list">
<li>material transfer</li>



<li>information transfer</li>



<li>energy transfer</li>



<li>mechanical contact.</li>
</ul>



<p>(Yes, information transfer is the same as energy transfer in a Physics world, but in engineering it is smart to separate both, even when it is not correct at all.)</p>



<p>If you follow me down this rabbit hole (see “Alice’s Adventures in Wonderland” by Lewis Caroll), we can realize that all products and services can be implemented in independent boxes with defined interfaces. Pretty spooky thing, right?</p>



<p>Now it is time to learn from some big guys. I can describe everything in units with interfaces. Sounds like service based solutions. Yes. This would be service based and each box represents a service. If I now freeze the interfaces, all these services now become independent. Correct? In consequence, all the insides of the boxes can be hidden behind a magic curtain. You might want to check out the famous example of the <a href="https://en.wikipedia.org/wiki/Mechanical_Turk">Mechanical Turk</a>. From the outside you cannot detect if there is a machine or a person. (Yes, you can remember the <a href="https://en.wikipedia.org/wiki/Turing_test">Turing test</a> now <img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/pf-emoji-service--cdn.us-east-1.prod.public.atl-paas.net/standard/caa27a19-fc09-4452-b2b4-a301552fd69c/32x32/1f607.png?resize=20%2C20&#038;ssl=1" alt="smiling face with halo" width="20" height="20"> ). Same story: as long as I do not tell you what is in side the box, I can do what I want and you will not be unhappy as long as I am delivering according to what I promised. In our speak: I deliver according to my output specification.</p>



<p>If you are at that point, you may want to check the ideas of Simon Wardley on <a href="https://learnwardleymapping.com/">Wardley mapping</a>. (Simon, I know I am oversimplifying, but this is the way my brain works. Sorry.) The Amazon way of monetizing services is also an option. I believe this is how Amazon Web Services were started.</p>



<p>Back to our architecture. Perfect situation: I am free to do whatever I like if and when I keep my promise. I can optimize my work. I can use the tools I want, I can use the methods I want, etc. Which tools and methods do I want? Typically the ones that make my life as easy as possible. Nature always takes the path of least resistance. No, that is a lie. Nature takes the path of <a href="https://www.feynmanlectures.caltech.edu/II_19.html">least action</a>, which is the physicist way of saying: “The path of the least effort.” We can describe nature pretty well, when we assume it to be lazy. Now tell me Physics is not fun. After sneaking in some Richard Feynman wisdom, let us have a look at the ideas of Application Programming Interface first (API-first) as a useful concept.</p>



<p>The Steve Yegge’s “Google Platforms Rant” <a href="https://courses.cs.washington.edu/courses/cse452/23wi/papers/yegge-platform-rant.html">CSE 452: Google&#8217;s Introduction to Distributed System Design</a></p>



<p>“[…]</p>



<p>His Big Mandate went something along these lines:</p>



<ol start="1" class="wp-block-list">
<li>All teams will henceforth expose their data and functionality through service interfaces.</li>



<li>Teams must communicate with each other through these interfaces.</li>



<li>There will be no other form of interprocess communication allowed: no direct linking, no direct reads of another team’s data store, no shared-memory model, no back-doors whatsoever. The only communication allowed is via service interface calls over the network.</li>



<li>It doesn’t matter what technology they use. HTTP, Corba, Pubsub, custom protocols – doesn’t matter. Bezos doesn’t care.</li>



<li>All service interfaces, without exception, must be designed from the ground up to be externalizable. That is to say, the team must plan and design to be able to expose the interface to developers in the outside world. No exceptions.</li>



<li>Anyone who doesn’t do this will be fired.</li>



<li>Thank you; have a nice day!</li>
</ol>



<p>[…]”</p>



<p>This is what Steve Yegge claims has been mandated by Jeff Bezos for Amazon. Quite some time ago.</p>



<p>In the light of what we just looked at before, these are some simple rules to follow in order to generate something very modular, adaptable and externizable, i.e. if you find the function somewhere a bit cheaper and it is not of strategic value for you, buy it, don&#8217;t make it. If you can sell the function as a service: sell it. Maybe you have heard of Amazon Web Services before. Something they sold to the outside world. This is the meaning of “externizable”. If you can sell it, sell it as a package. The same thing in reverse: If you can sell it as a package, you can easily also buy it from somebody else and weave it into your solution.</p>



<p>Wait a second though. Steve Yegge writes that Jeff Bezos wrote about teams, while I talked about functions and subsystems. You can match sub-system structure with team structure. Mathematically this is an isomorphism. In the <a href="http://www.melconway.com/Home/pdf/committees.pdf">original paper, Melvin Conway</a> promoted a homomorphism between team structure and product/service architecture. He did not talk about service architecture, but see above. Difference between isomorphism and homomorphism? Something is isomorphic if the structure is exactly the same. If two subsystems or two functions are very small and it for some reason makes sense to keep them separate, you can ask one team to work on both. Voilà: the isomorphism becomes a homomorphism. Very simple. One team does one sub-system. If the sub-system is too large, make it smaller, BUT fix the interfaces.</p>



<p>The screw can be turned one more notch: Haier, the appliance maker, or rather its CEO Zhang Ruimin has taken an extreme approach to generate sub-system solutions: <a href="https://hbr.org/2018/11/the-end-of-bureaucracy">Micro-enterprises</a>. The internal contracting as principle for coordination can be seen as a (very abstract) API. Simply an API between companies. In the bottom of the article, you will find the statement that complex systems cannot be engineered top down, but that they need to emerge bottom up. We will come to this point in the next chapter.</p>



<p>On the practical side: How should I know in the beginning which structure is the right one? Building teams takes a bit of time and in the end we are dealing with people. We do not want to move people around the organization with a high frequency. Simple solution: Separate the flow organization from the hierarchical organization. In the areas of high uncertainty, it make sense to separate line responsibilities from content responsibilities. If you do that, you can borrow the idea of <a href="https://www.lucidchart.com/blog/what-is-a-tiger-team">“Tiger Teams”. </a>Keep the team structure malleable until the solution becomes clear. Then harden the structure to give security to people. Still hierarchical leadership does not need to coincide with technical leadership. It can however. Understanding this concept explains the success of a number of startup compared to teams from corporations. In the startup, you focus on the product and the hierarchy follows. Like the Bauhaus Form follows Function concept. Keep even your hierarchy product centric. Corporations often react differently to challenges.</p>



<ul class="wp-block-list">
<li>Separate line organization from technical organization, i.e. line leadership is different from technical leadership. This causes conflicts between leaders, but this is not presenting a problem, since leadership is “non-value add necessary” at best and the developer produce the value in the organization. The conflict is not where value is generated.</li>



<li>Match the technical organization to the product architecture. That allows the right people to be in close vicinity (not necessarily in physical proximity, but in terms of functionality.</li>



<li>Understand that the architects in your organization are in a leadership role. Choose and and educate them wisely. Listen to them and provide them with the necessary power. A seasoned developer may not necessarily be the best architect. Make him or her a senior or “executive” developer. A more junior developer may in fact be a better architect. Architecting things and developing things are two different trades. Sometimes.</li>



<li>Architecture is more than the documentation of your product. It is defining the products future and modularity and feature roadmap. As a Danish proverb says: “Predictions are very difficult. Especially about the future”, the task is difficult. One solution thus is to keep the architecture as adaptive as possible.</li>
</ul>



<p>So far so good. As takeaway for now, we have:</p>



<ol start="1" class="wp-block-list">
<li>Understand the product/service.</li>



<li>Decide if you need a modular and adaptive architecture or you are better off with a monolithic solution.</li>



<li>If you want a modular and adaptive product/service, structure your product or service with focus on modularity.</li>



<li>Define and document the architecture. Make sure the architecture welcomes adaptations.</li>
</ol>



<p>And two more things.</p>



<ul class="wp-block-list">
<li>There is intentional architecture and emergent design. Both work hand in hand.</li>



<li>A monolithic solution has its benefits, just as modular solutions have their benefits. As always: It depends on the context. The lead architect needs to make a decision. The decision may be right or wrong, but a decision is needed.</li>
</ul>



<h3 class="wp-block-heading" id="Intentional-and-Emergent-Design">Intentional and Emergent Design</h3>



<p>Architecture plays at different levels. Above we discussed abstract boxes of functionalities in value streams and boundary diagrams. How boxes are connected at the level of interest is the realm of intentional architecture. An architect understands the functionality of the product or the execution of the workflow and structures the topic. This is what we understand as “intentional architecture“. What happens within the box is in the authority of the team, developing the functionality. On this level, one level lower than the “intended” architecture, we also have an intended architecture. Just one inside the functionality. When we now add feedback or “correction loops” into the system, i.e. we allow the architects and developer from inside the boxes to communicate with the architects defining the system architecture, new ideas and solutions may appear. If they do, new solutions ideas may manifest. This is the realm of emergent design. Emergence means that the system has properties that could not be foreseen in the properties of its constituents. Emergent design results from iterative delivery of constituents of the system we are working to deliver. (See also the <a href="https://hbr.org/2018/11/the-end-of-bureaucracy">HBR article on Haier</a>.) There is no such thing as emergent architecture. In order to control the design of things, architecture needs to be intentional. If architecture just “happens” it may be seen as emergent, but in fact it is just reverse engineering of a solution and trying to justify decisions taken on the fly. Emergent design is a very useful consequence of iterative development. Architecture may change and evolve as the solution develops. There is no contradiction: if architecture is sketched/documented/drawn as the solution is developed, the solution structure is validated with an architectural description. Trust me: you will find flaws right away. It is similar to the statement “If you can&#8217;t explain it to a six-year old, you don&#8217;t understand it yourself.” (Probably by Einstein.) If your design is not simple, it will not be easy to modify and to extend in the sense of iterative development. Thus, you will automatically kill it after a few weeks latest. Simply BECAUSE you cannot extend the functionality in the sense of iterative development. But, you will only kill it if I insist on interactive development and frequent demos. This is where puzzle pieces fall together and generate a solution. Remember this thing with with agility? Always demo the product. This is the very reason why. If you can demo every week or every other week, you HAVE a modular architecture that welcomes changes. If you can&#8217;t demo frequently, I have an idea why… BTW: you can plan a modular architecture. Agility is not a must. It just points you to an adaptive solution.</p>



<p>After discussion architecture in general, let us have a look at possible solutions for easy and cheap adaptability: The API-first approach.</p>



<p></p>
<p>The post <a href="https://grado.group/architecture-considerations-more-important-than-you-might-think/">Architecture Considerations. More Important Than You Might Think.</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://grado.group/architecture-considerations-more-important-than-you-might-think/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">35201</post-id>	</item>
		<item>
		<title>Stop Scaling Agile</title>
		<link>https://grado.group/stop-scaling-agile/</link>
					<comments>https://grado.group/stop-scaling-agile/#respond</comments>
		
		<dc:creator><![CDATA[Jens Paggel]]></dc:creator>
		<pubDate>Fri, 07 Feb 2025 14:41:49 +0000</pubDate>
				<category><![CDATA[Complexity]]></category>
		<category><![CDATA[Guiding Principles]]></category>
		<category><![CDATA[Manage]]></category>
		<category><![CDATA[Organization Structure]]></category>
		<category><![CDATA[System Thinking]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Systems View]]></category>
		<guid isPermaLink="false">https://grado.group/?p=35159</guid>

					<description><![CDATA[<p>Agile scaling is more business than agile itself. The question is: What is it and why should I want it?</p>
<p>The post <a href="https://grado.group/stop-scaling-agile/">Stop Scaling Agile</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>Stop scaling agility and focus on the development of a viable product. </strong>That is my entry statement and I will guide you through all the bits and pieces necessary to get there. I am talking a lot, but I do not like to write that much. Being a lazy person, I will document the principles, so information may be a bit dense. You have to fill in all the prose for yourself.</p>



<p>Good. Let us get started. Two questions are to be answered first:</p>



<ol start="1" class="wp-block-list">
<li>What is a product?</li>



<li>What is a viable product?</li>
</ol>



<p>First things first: What is a product?</p>



<p>For me a product is something that one person creates and some other person uses. It could be something physical that you can touch. It could be something immaterial, such as a service. An idea that I have and somebody else uses, does not count as a product. There are strange situations possible, where one person creates something and nobody is actually using it. O.K. there was an intended user. So more complete would be “something the somebody creates for the intended use by somebody else. That should be good enough. There is no need to be mathematically correct and complete in the definition. <a href="https://en.wikipedia.org/wiki/Product_(business)">The definition is simple and very close to what is found in wikipedia.</a></p>



<p>The second point is about a “viable product”. What makes a product a viable product? In the biological sense, something viable is able to live and to develop. This is the definition I am going to use. That means, the product needs to have a lifecycle. It needs to be able to develop, change its features and adapt to changes in the environment. It needs to respond to different needs. Worst case, it will perish in case it cannot adapt enough to the changing market requirements. The definition of the death of a product then is related to its use. In case the product is still there, but nobody is actually using it, it needs to be considered “dead”. The mere existence of a product does not make it alive.</p>



<p>Based on these considerations, we have some boundary conditions for our products:</p>



<ul class="wp-block-list">
<li>products are never static. Products adapt to the changing needs of the user or stake holder.</li>



<li>they fulfill at least a subset of desires expressed by the user. They fulfill at least one job that needs to be delivered by the user or that pleases the user.</li>



<li>maybe more…</li>
</ul>



<p>This is an abstract definition of the entity product, however it excludes built-to-order deliverables. Built-to-order jobs in some cases are built on top of a product platform or are just simple configurations of a platform. The trivial example is computer hardware that is “built-to-order”, where you can select RAM size and mass storage space, and maybe the color of the housing. This is “built-to-order” in many cases just to reduce the amount of material in the storage. There might be a yacht that you order, that is built according to your specifications or large truck. Both products are products in a sense that They are built on top of a certain platform, but very customer specific. In case of the yacht, we may enter a pretty unique job at the higher end of the price range.</p>



<p>In most cases, things developed based on a specific order are built on top of something that had been pre-developed and are then adapted. The adaptations may be larger or smaller. that does not matter in principle. The delivered units however do not have a lifecycle. They do not have versions after they went into production. They will not be phased out and replaced with a new version.</p>



<p>Now it should be clear what we discuss when we talk about a “product”. If what you are doing, falls into the category of “built-to-order” items – no matter how big your item is – many things what we are discussing will not directly address your topic, but: Aspects of nearly everything we discuss can be of good use to you, so please stay with us. In an extreme case, your product might be a harbor. It will be built to order. It will be very unique, but it has a lifecycle. You very likely will not build it once and then forget it. It will be extended (hopefully for the owner), maintained, adapted, changed, modified, re-purposed, … . It for sure has a lifecycle like this. In consequence many of the practices and treats I am introducing here will be perfectly useable.</p>



<p>”Stop scaling agility” is the title of this post. Why should I use agility and by the way, what is “agility” at all? And why should I scale it?</p>



<p>Definition of terms continued: “agility”. Many people have tried to define it. There is no definition for a good reason. I believe the best thing is: Follow the agile manifesto. If you do that, then the next topic is also solved. Then there is no need for “scaling agility”. That then makes no sense. Logically. You may need to scale scrum for example. That is correct, but scrum is just a single method. Before now hell breaks loose, check the <a href="https://agilemanifesto.org/">web page on the agile manifesto</a> and read about <a href="https://agilemanifesto.org/history.html">the history.</a> There are just principles, no recipes. There is nothing that needs scaling. Period.</p>



<p>Agile methods now mainly reflect on the <a href="https://hbr.org/1986/01/the-new-new-product-development-game">“New New Product Development Game” article by Takeuchi and Nonaka</a>. No discussion, there the teams need to be small, just like scrum teams for example. To build a large product in reasonable time, you need to have a large team. Here the work of <a href="https://www.melconway.com/Home/Home.html">Melvin Conway</a> kicks in. &#8211;&gt; with little interaction between the constituents of the system, you can develop a team setup that consists of units with little interaction. Scaling topic solved.</p>



<p>Scaling agility is a big topic and big business nowadays. Agility in its original form is used in teams to collaborate. One of the key elements is communication. Thus in consequence, the team size is limited. To the lower end at doubt three to four individuals. At this size or in even smaller teams communication and alignment is automatically build in. For larger teams, the upper limit may be discussed but lies somewhere between ten and 20 team members. If we want to organize work, delivered by coordinated actions of more people, we embark on so-called agile scaling concepts. These concepts come with more or less formal overhead.</p>



<p>There are commercial and non-commercial solutions available. All have one thing in common: they are more or less complex and involve coordination of different activities. Discussing complexity with system engineers shows that there are elaborated methods to manage complexity. No matter what, all of these methods slow down the value generation. In consequence complexity kills innovation and productivity. The most natural reaction then is to reduce complexity and make things simple: Always strive for simplicity to be fast. <a href="https://grado.group/dealing-with-complexity/">Complexity is killing speed.</a></p>



<p>This does not imply to the keep the problem we are tackling simple. Problems we are solving may be very complex. The solutions however need to be simple for the teams to develop them with high quality and little distraction.</p>



<p>How can we develop something complex and keep it simple for the teams? The answer is in the product, not in the way we orchestrate the project execution.</p>



<p>Focus on</p>



<ul class="wp-block-list">
<li>Architecture</li>



<li>Loose coupling</li>



<li>API first principles</li>



<li>Data orientation</li>
</ul>



<p>These are the big topics I will be addressing. In this order.</p>



<p>As Hors’d Oeuvre let me focus on the obvious thing: Do we always need agile methods (if you now come with “agile is a mindset, not a method”, <a href="https://agilemanifesto.org/history.html">please read here</a>.)? My clear answer to that is: NO. And this is the most agile answer you can give. Do what ever gives the best results in the given context to satisfies the customer (and yourself).</p>



<p></p>



<p></p>
<p>The post <a href="https://grado.group/stop-scaling-agile/">Stop Scaling Agile</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://grado.group/stop-scaling-agile/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">35159</post-id>	</item>
		<item>
		<title>Dealing With Complexity</title>
		<link>https://grado.group/dealing-with-complexity/</link>
					<comments>https://grado.group/dealing-with-complexity/#respond</comments>
		
		<dc:creator><![CDATA[Jens Paggel]]></dc:creator>
		<pubDate>Fri, 07 Feb 2025 14:21:29 +0000</pubDate>
				<category><![CDATA[Complexity]]></category>
		<category><![CDATA[Guiding Principles]]></category>
		<category><![CDATA[Innovate]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Systems View]]></category>
		<guid isPermaLink="false">https://grado.group/?p=35155</guid>

					<description><![CDATA[<p>Curiosity killed the cat and complexity kills speed. Simple solutions can be simple, rugged, of high quality, and fast. On top of things, they can even be re-used and adapted or modified.</p>
<p>The post <a href="https://grado.group/dealing-with-complexity/">Dealing With Complexity</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>A constant struggle in current life is “dealing with complexity and uncertainty”. At least this is what I hear a lot. Some years ago, I read the following sentence in the presentation by a consulting company: “You need to improve your management of complexity!”</p>



<p>In a second it struck me that there is something dreadfully wrong in this statement. I just could not nail it down.</p>



<p>Some years ago around the same time. Enter podium discussion at a tiny conference close to Detroit. Some agile “what-ever”. I was on stage with two big names. No idea why I was asked to participate on stage. The topic was agile scaling or rather how to run big projects in agile. At the time, I was very much into micro services and reversing Conway’s law and architecture centricity and topics around it. We were discussing the standards like big room planning, program boards, minimum viable products, walking skeletons, whatever… At one point I had an idea. “We need to manage the work such that there are as few as possible dependencies on the board. Best case scenario is NO dependencies.” That one touched a nerve and I was disqualified as not understanding systems at all. Easy bait. Lesson learned: Do not be creative on stage. Does not work. <img data-recalc-dims="1" decoding="async" width="20" height="20" src="https://i0.wp.com/pf-emoji-service--cdn.us-east-1.prod.public.atl-paas.net/standard/caa27a19-fc09-4452-b2b4-a301552fd69c/64x64/1f607.png?resize=20%2C20&#038;ssl=1" alt="smiling face with halo"></p>



<p>But: Still, the idea was attractive to me. It leads to simple solutions with very little dependencies and dependencies is where I get a headache.</p>



<p>Fast forward to some project management conference. Quite a few system engineers were presenting. I have seen a few people proudly showing off their skills in management of complex dependencies.</p>



<p>My mantra became a lot clearer: “Keep it simple, stupid.” There are many variants to the idea and it dates back a couple of hundred years. Just search the web for some trivia. Anyhow, the recommendation to the executives by the consulting company should have been:</p>



<p>“You need to <strong>reduce</strong> complexity.”</p>



<p>How to reduce complexity? Make it complicated for few and simple for many. This involves</p>



<ul class="wp-block-list">
<li>Unterstanding that architects are in a leadership role. They shape business and products. Cannot be separated. Both go hand in hand.</li>



<li>Understanding that organizations that develop systems are systems themselves and that these are social systems of people, developing for people. (In the end there most of the time there is still a human interacting with your product. The product should be there to serve a purpose.)</li>



<li>Understanding that the world is changing at a certain pace. To manage solutions, you need to be faster than the changing environment. Elements of self-management might be a good idea to maintain speed.</li>



<li>Understanding that “divide and conquer” does not necessarily mean micro-management.</li>
</ul>



<p>Why should we reduce complexity at all?</p>



<ul class="wp-block-list">
<li>Simple solutions are easy to build.</li>



<li>Simple solutions are easy to adapt and to modify.</li>



<li>Simple solutions are cheap. </li>



<li>Simple solution can be delivered very fast. </li>
</ul>



<p>Complexity kills speed. I want to move </p>



<p></p>
<p>The post <a href="https://grado.group/dealing-with-complexity/">Dealing With Complexity</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://grado.group/dealing-with-complexity/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">35155</post-id>	</item>
		<item>
		<title>Cynefin</title>
		<link>https://grado.group/tapa/cynefin/</link>
		
		<dc:creator><![CDATA[Krishan Mathis]]></dc:creator>
		<pubDate>Tue, 12 Nov 2024 12:11:33 +0000</pubDate>
				<category><![CDATA[Complexity]]></category>
		<category><![CDATA[Cynefin]]></category>
		<category><![CDATA[Decisions]]></category>
		<category><![CDATA[Sensemaking]]></category>
		<guid isPermaLink="false">https://grado.group/?post_type=tapa&#038;p=34104</guid>

					<description><![CDATA[<p>The sensemaking framework: Two short videos as an overview of Cynefin.</p>
<p>The post <a href="https://grado.group/tapa/cynefin/">Cynefin</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Two short videos as an overview of Cynefin.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="ast-oembed-container " style="height: 100%;"><iframe title="A celebration of beautifully entangled complexity, 1999 - 2023" width="1200" height="900" src="https://www.youtube.com/embed/25Rwbb8iOBE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
</div></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>A short overview of the evolution of Cynefin</p>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<div class="ast-oembed-container " style="height: 100%;"><iframe loading="lazy" title="How to organise a Children&#039;s Party" width="1200" height="675" src="https://www.youtube.com/embed/Miwb92eZaJg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
</div></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p>A funny explanation what complexity is about</p>
</div>
</div>
<p>The post <a href="https://grado.group/tapa/cynefin/">Cynefin</a> appeared first on <a href="https://grado.group">Grado</a>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">34104</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Minified using Disk

Served from: grado.group @ 2026-04-03 13:22:36 by W3 Total Cache
-->