Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cohesion in Modeling and Design

Michael Plöd
September 26, 2024

Cohesion in Modeling and Design

“Loose coupling & high cohesion” are key design principles for creating maintainable and understandable software. These principles can be applied on different levels of granularity ranging from classes to even systems. They also play an integral part when setting boundaries for domains and bounded contexts. While there have already been many talks and workshops on coupling at various conferences the topic of cohesion hasn’t been covered as much. This talk is all about cohesion.

We will begin by exploring the fundamental principles of cohesion in software design, illustrating its significance in creating clear, maintainable, and scalable systems. In this course you will learn what cohesion is and what kinds of cohesion there are. We will talk about types of cohesion in software design like functional, sequential, temporal or coincidental cohesion. But this talk will also look at the term cohesion in other disciplines like chemistry, geology, social behavior or soil mechanics.

In the second part this talk will cover cohesion in Domain Driven Design. A holistic approach to the topic of cohesion is especially interesting in the context of Domain Driven Design. For instance an Ubiquitous Language aims at a high degree of cohesion between terminology, conversations, code and documents within a Bounded Context. Special attention will be given to practical approaches for achieving high cohesion in domain models. We will explore real-world scenarios where cohesive design directly impacts the effectiveness of DDD, offering insights into overcoming common challenges faced in complex domain scenarios. Through this, attendees will gain a deeper appreciation of how cohesive design principles can simplify complex domain models, leading to more robust and adaptable software systems. But we will also look at the meaning of cohesion in other disciplines, which are mentioned in the intro of the talk, and learn how they can help us during collaborative and interdisciplinary design work.

This talk is designed not only for software architects and developers but also for non-technical stakeholders who wish to understand how cohesive software design can directly contribute to meeting business objectives. By the end of this session, attendees will be equipped with actionable strategies to enhance their domain models, ensuring that their software truly reflects and serves their business domain with clarity and precision.

Michael Plöd

September 26, 2024
Tweet

More Decks by Michael Plöd

Other Decks in Programming

Transcript

  1. Michael Plöd Fellow at INNOQ Socials: @bitboss (@mastodon.social / .bsky.social)

    LinkedIn: https://www.linkedin.com/in/michael-ploed/ Current consulting topics: • Domain-Driven Design • Team Topologies • Transformation from IT Delivery to digital product orgs Regular speaker at (inter-)national conferences and author of books + various articles
  2. Information Hiding 6 Protection of data and internal logic of

    a component against access from the outside (= encapsulation) Use of modules via interfaces In programming languages/UML realized e.g., by: public (+) private (-) protected (#) package (~) Module Interfaces Direct access A B Open Module Encapsulated building block
  3. Loose coupling Low dependency between building blocks The goal is

    low / low dependencies between building blocks Bad: High coupling • Low maintainability / changeability / extensibility / comprehensibility • High vulnerability to error spreading (something completely different gets broken after changes) High coupling Loose coupling
  4. High cohesion 8 De f ines how closely a module

    is related in terms of content Building block of high cohesion completes tasks that belong together in terms of content Building block with low cohesion done ✗No related tasks ✗Too many tasks High cohesion Low cohesion Explicit criteria for "Cohesion" necessary!
  5. Modularization, coupling & cohesion 9 Component A Component C Component

    B 1 2 3 4 5 6 7 8 9 10 Component A’ Component C’ Component B’ 1 2 3 4 5 6 7 8 9 10 Bad modularization: low cohesion, high coupling Good modularization: high cohesion, low coupling
  6. „Coupling is reduced when the relationships among elements notin the

    same module are minimized. There are two ways of achieving this minimizing the relationships among modules and maximizing relationships among elements in the same module“ Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974.
  7. „Coupling is reduced when the relationships among elements notin the

    same module are minimized. There are two ways of achieving this minimizing the relationships among modules and maximizing relationships among elements in the same module“ Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974.
  8. COHERERE Latin verb cohereo, coheres, coherere, cohesi, cohesum •to stick/cling/hold/grow

    together •to adhere •to embrace •to touch •to adjoin •to be in contact
  9. Cohesion Chemistry Force of attraction between molecules of the same

    substance. This is related to intermolecular forces, such as hydrogen bonds in water or van der Waals forces in non-polar molecules. Soil Mechanics Attraction between particles within a soil, typically due to moisture or the presence of clays, which can hold the particles together. Cohesion helps determine the stability of soils and their ability to form aggregates, affecting erosion resistance and soil strength. Sociology and Psychology Degree of connection and unity within a group, often measured by how well members stick together, cooperate, or share a common identity. Social cohesion refers to the strength of relationships and the sense of solidarity among members of a community. Sociocultural Anthropology Strength of cultural, social, or kinship ties that bind a community or group together. Social cohesion in traditional societies often stems from shared customs, rituals, and kinship structures that maintain group identity and solidarity. Linguistics Ways in which different parts of a text or discourse are connected to create meaning. It includes grammatical and lexical linking, such as pronouns, conjunctions, and repetitions, which help to unify a text. Civil Engineering Ability of construction materials, like concrete or soil, to hold together. The cohesive forces in these materials contribute to their overall structural stability.
  10. Common Terminology Force of attraction Strength of ties Degree of

    connection Ability to hold together Contribution to structural stability Ability to form aggregates Connection to create a meaning
  11. Which of these perspectives are relevant for cohesion in IT?

    Chemistry Force of attraction between molecules of the same substance. This is related to intermolecular forces, such as hydrogen bonds in water or van der Waals forces in non-polar molecules. Soil Mechanics Attraction between particles within a soil, typically due to moisture or the presence of clays, which can hold the particles together. Cohesion helps determine the stability of soils and their ability to form aggregates, affecting erosion resistance and soil strength. Sociology and Psychology Degree of connection and unity within a group, often measured by how well members stick together, cooperate, or share a common identity. Social cohesion refers to the strength of relationships and the sense of solidarity among members of a community. Sociocultural Anthropology Strength of cultural, social, or kinship ties that bind a community or group together. Social cohesion in traditional societies often stems from shared customs, rituals, and kinship structures that maintain group identity and solidarity. Civil Engineering Ability of construction materials, like concrete or soil, to hold together. The cohesive forces in these materials contribute to their overall structural stability. Linguistics Ways in which different parts of a text or discourse are connected to create meaning. It includes grammatical and lexical linking, such as pronouns, conjunctions, and repetitions, which help to unify a text.
  12. ALL

  13. Chemistry Force of attraction between molecules of the same substance.

    This is related to intermolecular forces, such as hydrogen bonds in water or van der Waals forces in non-polar molecules. Soil Mechanics Attraction between particles within a soil, typically due to moisture or the presence of clays, which can hold the particles together. Cohesion helps determine the stability of soils and their ability to form aggregates, affecting erosion resistance and soil strength. Civil Engineering Ability of construction materials, like concrete or soil, to hold together. The cohesive forces in these materials contribute to their overall structural stability. Software Architecture: Structural Cohesion
  14. Sociology and Psychology Degree of connection and unity within a

    group, often measured by how well members stick together, cooperate, or share a common identity. Social cohesion refers to the strength of relationships and the sense of solidarity among members of a community. Sociocultural Anthropology Strength of cultural, social, or kinship ties that bind a community or group together. Social cohesion in traditional societies often stems from shared customs, rituals, and kinship structures that maintain group identity and solidarity. Linguistics Ways in which different parts of a text or discourse are connected to create meaning. It includes grammatical and lexical linking, such as pronouns, conjunctions, and repetitions, which help to unify a text. Work in organization: Social Cohesion
  15. Software Architecture: Structural Cohesion Chemistry Force of attraction between molecules

    of the same substance. This is related to intermolecular forces, such as hydrogen bonds in water or van der Waals forces in non-polar molecules. Soil Mechanics Attraction between particles within a soil, typically due to moisture or the presence of clays, which can hold the particles together. Cohesion helps determine the stability of soils and their ability to form aggregates, affecting erosion resistance and soil strength. Sociology and Psychology Degree of connection and unity within a group, often measured by how well members stick together, cooperate, or share a common identity. Social cohesion refers to the strength of relationships and the sense of solidarity among members of a community. Sociocultural Anthropology Strength of cultural, social, or kinship ties that bind a community or group together. Social cohesion in traditional societies often stems from shared customs, rituals, and kinship structures that maintain group identity and solidarity. Civil Engineering Ability of construction materials, like concrete or soil, to hold together. The cohesive forces in these materials contribute to their overall structural stability. Linguistics Ways in which different parts of a text or discourse are connected to create meaning. It includes grammatical and lexical linking, such as pronouns, conjunctions, and repetitions, which help to unify a text. Work in organization: Social Cohesion
  16. The mental model that in f luences the perspective on

    attraction of concepts and models is heavily driven by the organization which embodies the social ties and customs of the people talking to each other during the design and modeling work.
  17. Cohesion is only of a limited technical nature but let’s

    start with Cohesion in Software Architecture
  18. In computer programming, cohesion refers to the degree to which

    the elements inside a module belong together. In one sense, it is a measure of the strength of relationship between the methods and data of a class and some unifying purpose or concept served by that class. In another sense, it is a measure of the strength of relationship between the class's methods and data. https://en.wikipedia.org/wiki/Cohesion_(computer_science)
  19. Cohesion refers to what extent the parts of a module

    should be contained within the same module. In other words, it is a measure of how related the parts are to one another.
  20. Cohesion refers to what extent the parts of a module

    should be contained within the same module. In other words, it is a measure of how related the parts are to one another.
  21. Cohesion is about grouping related business capabilities together in a

    single module or Bounded Context, reducing unnecessary complexity and dependencies.
  22. 7 Levels of SMC Cohesion SMC stands for the authors

    of the Structured Design paper: Stevens, Myers, Constantine
  23. 7 Levels of SMC Cohesion Wayne P. Stevens, Glenford J.

    Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974. Coincidential Cohesion Logical Cohesion Temporal Cohesion Procedural Cohesion* Communicational Cohesion Sequential Cohesion Functional Cohesion The elements of the module have no meaningful relationship with each other. They are grouped together arbitrarily, often as a result of being developed at the same time. The elements of the module are related only by their category or type. A module might contain different functions that are logically related but perform different actions. The elements of the module are grouped because they are executed at the same time, such as initialization or cleanup operations. The elements of the module are grouped because they always follow a speci f ic sequence of execution, even if they are not closely related by purpose. The elements of the module are grouped because they operate on the same data or contribute to the same data structure. The elements of the module are grouped because the output from one element serves as input to another. This type of cohesion exists when functions are interdependent in a linear chain. The elements of the module are grouped because they all contribute to performing a single, well-de f ined task. Every part of the module is essential to its overall functionality. * was added later
  24. Level 1 of 7: Coincidential Cohesion The elements of the

    module have no meaningful relationship with each other. They are grouped together arbitrarily, often as a result of being developed at the same time. Example: A utility module that contains a collection of unrelated functions, like formatting text, calculating a sum, and reading a f ile. Trash Dump Utility Read XML File Timezone Handling Send Metrics Report E-Mail Perform Risk Calculation
  25. Level 2 of 7: Logical Cohesion The elements of the

    module are related only by their category or type. A module might contain different functions that are logically related but perform different actions. Example: A module containing multiple I/O operations such as reading from a f ile, reading from a database, and reading from a network, reading from a message broker, all grouped because they are “read” operations. Read Stuff Utility Read XML File Read HTTP Feed Read Event Stream Read Neo4J Data
  26. Level 3 of 7: Temporal Cohesion The elements of the

    module are grouped because they are executed at the same time but actually they are unrelated to each other. Characteristics of Logical Cohesion + relationship in time Example: Operations are performed at the end of the business day, though they serve different purposes (logging, reporting, and data backup). End Of Business Module Archive daily transaction logs Generate and send daily reports Backup database Close open f inancial positions
  27. Level 4 of 7: Procedural Cohesion The elements of the

    module are grouped because they always follow a speci f ic sequence of execution, even if they are not closely related by purpose. Example: Steps must be performed in a speci f ic order during payroll processing, but they cover different concerns such as f inancial calculations, tax management, and payment handling. Employee Payroll Calculation Module E-Mail payslips to employees Generate payslip Deposit salary into bank accounts Calculate gross and net salary Apply tax deductions Gather employee work hours
  28. Level 5 of 7: Communicational Cohesion The elements of the

    module are grouped because they operate on the same data or contribute to the same data structure. Stronger bond than lower levels because of reference to the same data. Example: All operations share the same inventory data, performing various tasks like updating, reporting, and saving the stock levels, but working on the same product inventory. Product Inventory Management Module Fetch product stock levels from the database. Update product quantity after a sale. Generate a restocking report if quantities are low. Save updated stock levels back to the database.
  29. Level 6 of 7: Sequential Cohesion Example: The loan eligibility

    calculation requires validated applicant details, and the approval decision is based on the eligibility result. The f inal step noti f ies the applicant of the decision, creating a clear sequential f low. The elements of the module are grouped because the output from one element serves as input to another. This type of cohesion exists when functions are interdependent in a linear chain. Loan Application Processing Module Notify the applicant of the decision. Validated Data Loan Eligibility Decision Approve or reject the loan application based on eligibility. Calculate the applicant’s loan eligibility based on validated data. Validate applicant details (identity, income, credit score).
  30. Level 7 of 7: Functional Cohesion The elements of the

    module are grouped because they all contribute to performing a single, well-de f ined task. Every part of the module is essential to its overall functionality. Real Estate Rating Module Evaluate debt-to-income ratio Assess loan-to-value (LTV) ratio Analyze credit score and history Score the applicant based on risk factors Generate mortgage loan score Evaluate Knock Out Criteria Example: All operations are centered on the single task of scoring a mortgage loan applicant. Every operation contributes directly to completing the goal of assessing the applicant’s eligibility and risk for a mortgage loan.
  31. Metrics for measuring cohesion Lack of Cohesion in Methods (LCOM

    1-4) Tight Class Cohesion (TCC) Loose Class Cohesion (LCC) Cohesion Among Methods of Class (CAMC) Degree of Cohesion (DC) Class Cohesion (CC) Information Flow-based Cohesion (ICH)
  32. Chidamber & Kemerer LCOM Family LCOM measures how disjointed the

    methods of a class are. A high LCOM value indicates that methods are not working on the same data, suggesting low cohesion. Variants: There are different versions of LCOM, such as LCOM1, LCOM2, LCOM3, etc., with slight variations in how they are calculated. Formula (LCOM1): Count pairs of methods that do not share instance variables and subtract from the pairs that do. A higher result indicates lower cohesion.
  33. LCOM Family Field Field Field Method Method Method Field Field

    Field Method Method Method Field Field Method Method Field Method Inspired by Richards, Ford. Visualization in Fundamentals of Software Architecture p. 43, O’Reilly 2020 Low LCOM score (0) High Cohesion Medium LCOM score (1) Moderate / Mixed Cohesion High LCOM score (3) Low Cohesion
  34. Tight Class Cohesion (TCC) TCC measures the ratio of pairs

    of methods that access at least one common attribute to the total number of method pairs. A higher TCC indicates higher cohesion. This metric provides a f ine-grained measure of how related the methods of a class are through shared data. Formula: TCC = (number of method pairs that share attributes) / (total number of method pairs). Range: TCC values range from 0 (low cohesion) to 1 (high cohesion).
  35. TCC Field Field Field Method Method Method Field Field Field

    Method Method Method Field Field Method Method Field Method Inspired by Richards, Ford. Visualization in Fundamentals of Software Architecture p. 43, O’Reilly 2020 1 (3 / 3) 0,67 (2 / 3) 0 (0 / 3)
  36. Don’t blindly believe in metrics! Context matters The evolution of

    their results is more interesting than a temporal snapshot
  37. Functional Cohesion is stronger than all of the others Logical

    on Coincidential Cohesion are weaker than all of the others Higher levels of binding often include characteristics of the lower ones and add relationships Non Linear Scale Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974. Coincidential Cohesion Logical Cohesion Temporal Cohesion Procedural Cohesion Communicational Cohesion Sequential Cohesion Functional Cohesion
  38. „A useful technique in determining whether a module is functionally

    bound is writing a sentence describing the function(purpose) of the module, and then examining the sentence. “ Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974.
  39. Purpose Speci f ic Functionality Clear Objectives Focussed Responsibility Boundary

    A module's purpose is to perform a speci f ic task or set of tasks without interfering with other modules unless necessary The purpose of a module should align with the overall system architecture and contribute to achieving the system's goals. Purpose fosters a clear, focused responsibility, which helps in reducing complexity and improving the system's overall architecture Purpose de f ines a boundary of what a module should do and ensures that each component within it serves that purpose
  40. Problem Space Solution Space WHAT HOW is the challenge we

    need to solve? do we solve the challenge?
  41. User Needs Business Challenge Value Proposition Business Model WHAT is

    the challenge we need to solve? Environment Problem Space
  42. This is the starting point, we need to break this

    down to smaller parts in order to manage the complexity of a system
  43. WHAT is the challenge we need to solve? Problem Space

    Manageable Challenge Manageable Challenge Manageable Challenge BIG COMPLEX Challenge
  44. Purpose Purpose Purpose Module Align Align Align De f ines

    De f ines De f ines Module Module Manageable Challenge Manageable Challenge Manageable Challenge
  45. A model in a Bounded Context should have high cohesion,

    meaning that it forms a coherent whole around a single, uni f ied purpose.
  46. WHAT is the challenge we need to solve? Problem Space

    Subdomain Subdomain Subdomain DOMAIN
  47. Purpose Purpose Purpose Bounded Context Solve Solve Solve De f

    ines De f ines De f ines Bounded Context Bounded Context Subdomain Subdomain Subdomain Bounded Context Bounded Context
  48. Purpose Purpose Purpose Bounded Context Solve Solve Solve De f

    ines De f ines De f ines Bounded Context Bounded Context Software Module Software Module Software Module Align Bounded Context Bounded Context Software Module Software Module Align Align
  49. The Structured Design paper describes heuristics for determining the level

    of cohesion based on the textual description of the purpose. Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974.
  50. Sequential or communicational Cohesion If you check at least one

    of the following criteria: ๏Sentence has to be a compound sentence ๏Contains a comma ๏Contains more than one verb Then the module is probably performing more than one function Therefore, it probably has sequential or communicational binding Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974.
  51. Sequential or temporal Cohesion If the sentence contains words relating

    to time such as: ๏ First ๏ Next ๏ Then ๏ After ๏ When ๏ Start Then the module probably has sequential or temporal binding Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974.
  52. Temporal Cohesion If the sentence contains words such as: ๏

    Initialize ๏ Clean-Up ๏ Ramp-Up ๏ Tear-Down Then the module probably has temporal binding Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974.
  53. Functional Cohesion If the predicate of the sentence doesn't contain

    a single speci f ic object following the verb Then the module is probably functional bound Example: •Edit All Data implies logical binding •Edit Credit Application may imply functional binding Wayne P. Stevens, Glenford J. Myers, Larry L. Constantine, Structured Design, IBM Systems Journal, 13(2):115-139, 1974.
  54. High cohesion is essential to Aggregate design. Each Aggregate should

    fully encapsulate a business concept, keeping its responsibilities focused and manageable. … When trying to discover the Aggregates in a Bounded Context we must understand the model’s true invariants. An invariant is a business rule that must always be consistent.
  55. Autonomy Desire to direct one’s own life and refers to

    the freedom to choose how, when, and what tasks to perform. Desire to improve continuously and become better at something. Mastery Motivation to do work that aligns with a greater cause or mission, beyond just personal gain. Purpose
  56. Teams are loosely coupled in organizational terms, cross-team coordination is

    greatly reduced. The members of a team can master the domain complexity of their area of responsibility and get better at it. The area of responsibility of a team has a designated and distinct functional purpose. Autonomy Desire to direct one’s own life and refers to the freedom to choose how, when, and what tasks to perform. Desire to improve continuously and become better at something. Mastery Motivation to do work that aligns with a greater cause or mission, beyond just personal gain. Purpose
  57. Autonomy Teams are loosely coupled in organizational terms, cross-team coordination

    is greatly reduced. The members of a team can master the domain complexity of their area of responsibility. Mastery The area of responsibility of a team has a designated and distinct functional purpose. Purpose We need (module) boundaries in software which enable teams to achieve these ideas
  58. Software Architecture: Structural Cohesion Chemistry Force of attraction between molecules

    of the same substance. This is related to intermolecular forces, such as hydrogen bonds in water or van der Waals forces in non-polar molecules. Soil Mechanics Attraction between particles within a soil, typically due to moisture or the presence of clays, which can hold the particles together. Cohesion helps determine the stability of soils and their ability to form aggregates, affecting erosion resistance and soil strength. Sociology and Psychology Degree of connection and unity within a group, often measured by how well members stick together, cooperate, or share a common identity. Social cohesion refers to the strength of relationships and the sense of solidarity among members of a community. Sociocultural Anthropology Strength of cultural, social, or kinship ties that bind a community or group together. Social cohesion in traditional societies often stems from shared customs, rituals, and kinship structures that maintain group identity and solidarity. Civil Engineering Ability of construction materials, like concrete or soil, to hold together. The cohesive forces in these materials contribute to their overall structural stability. Linguistics Ways in which different parts of a text or discourse are connected to create meaning. It includes grammatical and lexical linking, such as pronouns, conjunctions, and repetitions, which help to unify a text. Work in organization: Social Cohesion
  59. „It is not the domain experts knowledge that goes into

    production, it is the assumption of the developers that goes into production” 93 Alberto Brandolini Er f inder des EventStormings
  60. Let me tell you a story Michael as a young

    developer for a mortgage loan scoring engine
  61. So I built my scoring engine according to that structure

    which I assumed in my head which roughly looked like this
  62. I developed a bad gut feeling but go-live was f

    ine, just two minor bugs. But then came a new requirement…
  63. We want to see if a red scoring can become

    green with more own funds if yes: how much more money do the applicants need?
  64. The risk managers started to think that I do my

    surname justice (just replace the P in Plöd by a B)
  65. I refactored my code to their mental model and the

    new requirement was suddenly very easy to implement
  66. „the key to incremental architecture is to build on a

    framework that can accommodate change... that framework is the domain.... By modeling the domain, you can more easily handle changes to the domain“ Allen Holub https:/ /holub.com
  67. Sociology and Psychology Degree of connection and unity within a

    group, often measured by how well members stick together, cooperate, or share a common identity. Social cohesion refers to the strength of relationships and the sense of solidarity among members of a community. Sociocultural Anthropology Strength of cultural, social, or kinship ties that bind a community or group together. Social cohesion in traditional societies often stems from shared customs, rituals, and kinship structures that maintain group identity and solidarity. Linguistics Ways in which different parts of a text or discourse are connected to create meaning. It includes grammatical and lexical linking, such as pronouns, conjunctions, and repetitions, which help to unify a text. Work in organization: Social Cohesion
  68. If you only talk to your „highly cohesive“ group of

    people with „highly cohesive“ perspectives and „highly cohesive“ biases and „highly cohesive“ behaviors and „highly cohesive“ attitudes You run a fundamental risk of getting boundaries that LACK FUNCTIONAL COHESION
  69. Use collaborative modeling methods Image for example mapping taken from:

    https://openpracticelibrary.com/practice/example-mapping/ Image for user story mapping taken from: https://www.hanssamios.com/dokuwiki/how_do_we_build_and_maintain_context_when_all_we_have_is_a_backlog_list
  70. Krischerstr. 100 40789 Monheim +49 2173 3366-0 Ohlauer Str. 43

    10999 Berlin Ludwigstr. 180E 63067 Offenbach Kreuzstr. 16 80331 München Hermannstrasse 13 20095 Hamburg Erftstr. 15-17 50672 Köln Königstorgraben 11 90402 Nürnberg innoQ Deutschland GmbH www.innoq.com THANK YOU! Michael Plöd E-Mail: [email protected] Socials: @bitboss (@mastodon.social / .bsky.social) LinkedIn: https://www.linkedin.com/in/michael-ploed/