{"id":7962,"date":"2025-11-29T08:28:06","date_gmt":"2025-11-29T07:28:06","guid":{"rendered":"https:\/\/web-dev-weissblau.de\/microconsult\/?p=7962"},"modified":"2026-02-12T08:48:10","modified_gmt":"2026-02-12T07:48:10","slug":"always-one-thing-at-a-time","status":"publish","type":"post","link":"https:\/\/www.microconsult.de\/en\/immer-schoen-der-reihe-nach\/","title":{"rendered":"One thing at a time!"},"content":{"rendered":"<h2>Constructive and analytical methods for preventing race conditions<\/h2>\n<p style=\"text-align: left;\" align=\"center\">Authors: Gunther Vogel, Robert Bosch GmbH, and Dr. Daniel Simon, Axivion GmbH<\/p>\n<h3>Contribution \u2013 Embedded Software Engineering Congress 2016<\/h3>\n<p><strong>Interrupts are frequently used to control embedded systems, and these require thorough planning and monitoring beyond a certain level of complexity. Simultaneously, multicore processors are becoming increasingly prevalent in otherwise resource-constrained environments, making concurrent programming a new paradigm for many (embedded) programmers ever more important. With the increasing concurrency of software, the risk of race conditions and, consequently, obscure and difficult-to-understand runtime errors in the systems also rises.<\/strong><\/p>\n<p>This paper presents a methodological framework for combating race conditions through constructive measures in design and coding. To ensure that the product is free of race conditions upon delivery, measures supported by analytical tools should also be employed. The constructive and analytical measures are explained, and the paper demonstrates how the results can be efficiently managed throughout a development project.<\/p>\n<h2>Content outline<\/h2>\n<ul>\n<li>What are Race Conditions?<\/li>\n<li>Objective<\/li>\n<li>Framework conditions<\/li>\n<li>Constructive avoidance of race conditions<\/li>\n<li>Why are design\/coding rules insufficient?<\/li>\n<li>Analytical methods and experience with their use<\/li>\n<li>Solutions for continuous use<\/li>\n<li>Summary<\/li>\n<\/ul>\n<h2>Benefits and special features<\/h2>\n<p>This article is aimed at development managers and developers of embedded systems in C\/C++ who work with interrupts or multicore hardware. The problem of race conditions is briefly explained. Then, constructive measures for avoiding race conditions are presented, along with their limitations. The article explains which additional analytical measures are necessary and how you can use these measures, supported by tools, in your daily project work to identify and resolve potential software malfunctions early on.<\/p>\n<h2>What are Race Conditions?<\/h2>\n<p>While in purely sequential programming the order in which individual instructions are executed is precisely defined, concurrent software systems consist of multiple threads, such as tasks or interrupts, which are executed logically in parallel. Although the order of instructions within a thread is still defined, this is no longer possible relative to other threads. As long as the threads are executed independently and their results cannot influence each other through the use of shared resources (e.g., CPU or memory), this parallelism is unproblematic. However, a race condition arises as soon as the order of execution between threads has an impact on the system&#039;s outcome.<\/p>\n<p>An important and frequently occurring pattern for race conditions is the data race. Here, concurrent processes compete simultaneously for a resource in the form of a shared variable or memory area, and at least one of the processes modifies the state of this resource. If different outcomes result from each overlap of the processes, then this constitutes a race condition.<\/p>\n<p>To illustrate a data race, consider two threads that each increment the same counter variable (see figure below).,\u00a0<a title=\"One thing at a time! (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/12\/multicore_immer_schoen_der_reihe_nach_boschaxivion_vogelsimon.pdf\" target=\"_blank\" rel=\"noopener\">PDF<\/a>Each thread first loads the value of the variable into a register, increments it, and then saves the calculated value back. If the execution of the two threads overlaps, one overwrites the result of the other. The effect would be that the variable is incremented only once, instead of twice as expected.<\/p>\n<h2>Objective<\/h2>\n<p>Each software system must be guaranteed upon delivery to be free of functional errors in the form of race conditions.<\/p>\n<h2>Framework conditions<\/h2>\n<p>The experiences we have reported are based on the following framework conditions:<\/p>\n<ul>\n<li>Software development is component-based, with later integration of the components into a complete system.<\/li>\n<li>The geographically distributed development of in-house components is partially supplemented by off-the-shelf components and third-party components.<\/li>\n<li>The source code for all essential components, in C\/C++ format, is available.<\/li>\n<li>The development process is implemented with high discipline and process maturity.<\/li>\n<li>Compliance with the process-defined specifications and rules is thoroughly checked.<\/li>\n<li>Best practices are documented in the form of guidelines, which are regularly updated and used for training.<\/li>\n<li>All work products are reviewed through semi-formal review processes.<\/li>\n<li>Before delivery, the components and the entire system undergo extensive testing required by safety standards.<\/li>\n<\/ul>\n<h2>How can race conditions be constructively avoided?<\/h2>\n<p>Race conditions should be avoided as much as possible from the outset through design. Here are some best practices that can be applied:<\/p>\n<ol>\n<li>Avoiding shared global variables: On the one hand, global variables are often the only way to exchange data between tasks and interrupts; on the other hand, they are also one of the main causes of race conditions. Completely eliminating them, as in pure functional programming, is not yet conceivable for embedded systems. However, it is advisable to clearly structure the interactions between the processes and thus reduce the variables used to a minimum.<\/li>\n<li>Grouping related variables into a data structure: Relationships between variables should be adequately and sufficiently documented or indicated by programming language constructs. For example, if one variable indicates whether the value of another is valid or invalid, both elements should be combined into a common data structure, and their relationship should be precisely documented. If one process stream provides this data structure, it is clear that another may only process it after it is fully available.<\/li>\n<li>Protection against misuse: To prevent race conditions arising from the use of variables or functions outside their intended context, restrictions on how and from which context a use may occur should be among the standard properties that must be documented. Documentation templates are useful here, ensuring that the descriptions are consistent and complete. Furthermore, in embedded systems with few tasks and interrupts, defining a naming convention that indicates the context (e.g., interrupt or background task) from which the function or variable may be used has proven effective. In addition, the necessary restrictions can also be represented in detail in architectural models. This is now state of the art for safety-critical systems, especially since automated methods for checking the architectural models against the implementation are available, allowing the relationships to be verified for correctness during development.<\/li>\n<li>Guideline with design and anti-patterns to avoid race conditions: Using proven design patterns helps prevent errors and can also facilitate manual checks by recognizing familiar patterns. Examples from our guidelines include mutual exclusion patterns through interrupt disabling or binary semaphores, mutual exclusion via state variables, the use of atomic variables, or the use of the volatile qualifier.<\/li>\n<\/ol>\n<h2>Why are design\/coding rules insufficient?<\/h2>\n<p>Experience shows that even comprehensive rule sets and processes cannot prevent all errors. This is fundamentally due to the ever-increasing complexity of embedded systems and the inherent risk of introducing further and additional errors. For example, composition problems, even with proven and safe components, can lead to new problems arising in combination. Within hybrid software systems, it cannot always be assumed that the specific design and coding rules for in-house developed components have been applied to off-the-shelf and third-party components. Technical and business processes have become so complex that even experienced developers cannot always know or consider all the details. Furthermore, software must be constantly adapted and revised to meet changing needs, which in turn makes the interrelationships even more complex and further increases the risk of additional errors.<\/p>\n<h2>Analytical methods and experience with their use<\/h2>\n<p>Since race conditions still occur despite the described constructive measures, and these cannot be adequately captured by testing, analytical methods must be employed for further verification. A complete and exclusively manual review of today&#039;s embedded systems is practically impossible \u2013 not only due to the limited availability of human reviewers, but also, and above all, due to the complexity of these systems. Accordingly, to increase efficiency and effectiveness, static code analysis methods are used, which conservatively overestimate the number of problems. This means, on the one hand, that all possible problems are indeed reported, but on the other hand, that a high number of false positives also occur. As a result, the findings then have to be manually evaluated again. This manual review is still time-consuming, even though it is already &quot;cheaper&quot; than the complete manual review mentioned above.<\/p>\n<p>In a research collaboration with the University of Stuttgart, attempts were therefore made to improve the precision of code analysis methods. The results showed that, despite increasingly complex (and computationally intensive) analysis methods, the precision could not ultimately be increased satisfactorily. This was also due to the complex synchronization patterns of the analyzed embedded systems, which could not be fully captured by the tool developed in the research group.<\/p>\n<p>As a consequence, we now rely more on simpler analysis methods with clearly comprehensible results. Currently, we use a tool from the Axivion Bauhaus Suite, which incorporates the findings from our research collaboration. This tool allows us to analyze a single software version, including reading the source code, in just under an hour.<\/p>\n<p>The aforementioned constructive measures and improvements in the design of the current software generation have also made the subsequent evaluation of the results simpler and more efficient. As a result, the evaluation effort has been reduced to a third of its previous level and now falls to approximately 40 hours for a complete evaluation. Depending on the software&#039;s maturity level, between 21 and 301 of the reported variables were revised after the analysis. In about half of the cases, actual functional errors were corrected, ranging from relatively harmless to safety-critical. In the other half, the evaluation revealed design deficiencies that, while not currently critical, were nevertheless improved to eliminate future risks or to facilitate software maintainability.<\/p>\n<p>It was striking, however, that even after the functional changes, the analysis still reported mostly the same variables, as it was still unable to consistently identify the synchronization patterns used. This leads to a decrease in the precision of the analysis results as the analyzed software matures. In general, the biggest challenge for the continued use of the analysis lies in efficiently managing the high number of false positives. Improvements to these aspects are high on the agenda for the further development of code analysis.<\/p>\n<h2>Solutions for continuous use<\/h2>\n<p>When the analysis is used continuously alongside development, it becomes apparent that large portions of the tool&#039;s reports remain stable over time. While changes during development can create new race conditions and resolve old ones, our experience shows that resolved race conditions very often persist in the results as false positives, and the number of new race conditions arising within a short period is typically small. This raises the question of how the results can be processed more efficiently without overlooking critical errors. To address this, it is first necessary to determine which of the old assessments for reported variables are still valid and can be transferred to a new software version, and which results require re-examination.<\/p>\n<p>As a compromise, the following heuristics are therefore proposed for selecting the variables to be tested:<\/p>\n<ol>\n<li>Variables that have not yet been reported \u2013 No evaluation results are available for these. They must therefore be fully reviewed.<\/li>\n<li>Variables for which new accesses have been added \u2013 These new accesses may create new race conditions. The variables must therefore be reviewed again based on the previous evaluations.<\/li>\n<li>Variables whose accesses are reached from new thread contexts \u2013 The evaluation must determine whether new race conditions were created by calls to existing functions from new threads.<\/li>\n<\/ol>\n<p>Based on our experience comparing complete reviews, these heuristics can address all critical errors discovered so far with significantly less effort. Nevertheless, we still recommend at least randomly re-running previous reviews intended for adoption to mitigate the risk of inaccurate assessments.<\/p>\n<h2>Summary<\/h2>\n<p>In this article, we reported on our experiences with constructive and analytical methods for preventing race conditions. It became clear that only static tools are capable of achieving complete coverage. Despite the significant evaluation effort, the use of this tool has proven beneficial for safeguarding against race conditions and, in our view, is a recommended addition to existing quality measures.<\/p>\n<p><a title=\"One thing at a time! (PDF)\" href=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/12\/multicore_immer_schoen_der_reihe_nach_boschaxivion_vogelsimon.pdf\" target=\"_blank\" rel=\"noopener\"><strong>Download the article as a PDF<\/strong><\/a><\/p>\n<hr \/>\n<h2>Multicore \u2013 our training &amp; coaching<\/h2>\n<p><strong>Do you want to bring yourself up to date with the latest technology?<\/strong><\/p>\n<p>Then find out more\u00a0<a title=\"Training and Dates - Microcontrollers\" href=\"https:\/\/www.microconsult.de\/en\/all-training-dates-complete-overview\/\" target=\"_blank\" rel=\"noopener\"><strong>here<\/strong>\u00a0<\/a>MircoConsult offers training courses\/seminars\/workshops and individual coaching on the topic of multicore\/microcontrollers.<\/p>\n<p><strong>Training &amp; coaching on the other topics in our portfolio can be found here.\u00a0<a title=\"Training &amp; Consulting - all topics\" href=\"https:\/\/www.microconsult.de\/en\/training-beratung\/\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/strong><\/p>\n<hr \/>\n<h2>Multicore \u2013 Expertise<\/h2>\n<p>Valuable expertise on the topic of multicore\/microcontrollers is available.\u00a0<a title=\"Multicore expertise\" href=\"https:\/\/www.microconsult.de\/en\/embedded-multicore\/\" target=\"_blank\" rel=\"noopener\">here\u00a0<\/a>Available for you to download free of charge.<\/p>\n<p><a title=\"Multicore expertise\" href=\"https:\/\/www.microconsult.de\/en\/embedded-multicore\/\" target=\"_blank\" rel=\"noopener\"><strong>To the specialist information<\/strong><\/a><\/p>\n<p><strong>You can find expertise on other topics in our portfolio here. <a title=\"Technical information\" href=\"https:\/\/www.microconsult.de\/en\/specialist-knowledge\/\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>Konstruktive und analytische Verfahren zum Verhindern von Race Conditions Autoren: Gunther Vogel, Robert Bosch GmbH, und Dr. Daniel Simon, Axivion GmbH Beitrag &#8211; Embedded Software Engineering Kongress 2016 Zur Steuerung eingebetteter Systemen werden h\u00e4ufig Interrupts eingesetzt, die ab einer gewissen Komplexit\u00e4t gr\u00fcndlich geplant und \u00fcberwacht werden m\u00fcssen. Gleichzeitig finden auch Multicore-Prozessoren immer weitere Verbreitung in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-7962","post","type-post","status-publish","format-standard","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Immer sch\u00f6n der Reihe nach! - MicroConsult Academy GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.microconsult.de\/en\/always-one-thing-at-a-time\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Immer sch\u00f6n der Reihe nach! - MicroConsult Academy GmbH\" \/>\n<meta property=\"og:description\" content=\"Konstruktive und analytische Verfahren zum Verhindern von Race Conditions Autoren: Gunther Vogel, Robert Bosch GmbH, und Dr. Daniel Simon, Axivion GmbH Beitrag &#8211; Embedded Software Engineering Kongress 2016 Zur Steuerung eingebetteter Systemen werden h\u00e4ufig Interrupts eingesetzt, die ab einer gewissen Komplexit\u00e4t gr\u00fcndlich geplant und \u00fcberwacht werden m\u00fcssen. Gleichzeitig finden auch Multicore-Prozessoren immer weitere Verbreitung in [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microconsult.de\/en\/always-one-thing-at-a-time\/\" \/>\n<meta property=\"og:site_name\" content=\"MicroConsult Academy GmbH\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-29T07:28:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-12T07:48:10+00:00\" \/>\n<meta name=\"author\" content=\"weissblau media\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"weissblau media\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/\"},\"author\":{\"name\":\"weissblau media\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\"},\"headline\":\"Immer sch\u00f6n der Reihe nach!\",\"datePublished\":\"2025-11-29T07:28:06+00:00\",\"dateModified\":\"2026-02-12T07:48:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/\"},\"wordCount\":2195,\"commentCount\":0,\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/\",\"name\":\"Immer sch\u00f6n der Reihe nach! - MicroConsult Academy GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\"},\"datePublished\":\"2025-11-29T07:28:06+00:00\",\"dateModified\":\"2026-02-12T07:48:10+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/immer-schoen-der-reihe-nach\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.microconsult.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Immer sch\u00f6n der Reihe nach!\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/\",\"name\":\"MicroConsult Academy GmbH\",\"description\":\"Professionelle Schulungen, Beratung und Projektunterst\u00fctzung\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.microconsult.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/b6d4c4ae959b068fbe8d9416ed019a0a\",\"name\":\"weissblau media\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g\",\"caption\":\"weissblau media\"},\"sameAs\":[\"https:\\\/\\\/www.microconsult.de\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"One thing at a time! - MicroConsult Academy GmbH","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.microconsult.de\/en\/always-one-thing-at-a-time\/","og_locale":"en_GB","og_type":"article","og_title":"Immer sch\u00f6n der Reihe nach! - MicroConsult Academy GmbH","og_description":"Konstruktive und analytische Verfahren zum Verhindern von Race Conditions Autoren: Gunther Vogel, Robert Bosch GmbH, und Dr. Daniel Simon, Axivion GmbH Beitrag &#8211; Embedded Software Engineering Kongress 2016 Zur Steuerung eingebetteter Systemen werden h\u00e4ufig Interrupts eingesetzt, die ab einer gewissen Komplexit\u00e4t gr\u00fcndlich geplant und \u00fcberwacht werden m\u00fcssen. Gleichzeitig finden auch Multicore-Prozessoren immer weitere Verbreitung in [&hellip;]","og_url":"https:\/\/www.microconsult.de\/en\/always-one-thing-at-a-time\/","og_site_name":"MicroConsult Academy GmbH","article_published_time":"2025-11-29T07:28:06+00:00","article_modified_time":"2026-02-12T07:48:10+00:00","author":"weissblau media","twitter_card":"summary_large_image","twitter_misc":{"Written by":"weissblau media","Estimated reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/#article","isPartOf":{"@id":"https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/"},"author":{"name":"weissblau media","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a"},"headline":"Immer sch\u00f6n der Reihe nach!","datePublished":"2025-11-29T07:28:06+00:00","dateModified":"2026-02-12T07:48:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/"},"wordCount":2195,"commentCount":0,"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/","url":"https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/","name":"One thing at a time! - MicroConsult Academy GmbH","isPartOf":{"@id":"https:\/\/www.microconsult.de\/#website"},"datePublished":"2025-11-29T07:28:06+00:00","dateModified":"2026-02-12T07:48:10+00:00","author":{"@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a"},"breadcrumb":{"@id":"https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.microconsult.de\/immer-schoen-der-reihe-nach\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microconsult.de\/"},{"@type":"ListItem","position":2,"name":"Immer sch\u00f6n der Reihe nach!"}]},{"@type":"WebSite","@id":"https:\/\/www.microconsult.de\/#website","url":"https:\/\/www.microconsult.de\/","name":"MicroConsult Academy GmbH","description":"Professional training, consulting and project support","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microconsult.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/b6d4c4ae959b068fbe8d9416ed019a0a","name":"weissblau media","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bbb409da4970da9446f6c49465d453cb8a0dae301e4d4f465b5c4e62408daa2e?s=96&d=mm&r=g","caption":"weissblau media"},"sameAs":["https:\/\/www.microconsult.de"]}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/7962","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/comments?post=7962"}],"version-history":[{"count":5,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/7962\/revisions"}],"predecessor-version":[{"id":11646,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/7962\/revisions\/11646"}],"wp:attachment":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/media?parent=7962"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/categories?post=7962"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/tags?post=7962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}