{"id":29959,"date":"2018-09-17T10:00:52","date_gmt":"2018-09-17T14:00:52","guid":{"rendered":"https:\/\/simpleprogrammer.com\/?p=29959"},"modified":"2018-09-16T21:26:59","modified_gmt":"2018-09-17T01:26:59","slug":"software-architecture-decisions","status":"publish","type":"post","link":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/","title":{"rendered":"Architecture Decisions in a Software Development Team"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-30105 alignright\" src=\"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/architecture-square-300x300.png\" alt=\"\" width=\"280\" height=\"280\" \/>Every type of work needs some structure for things to go smoothly. In software development projects, an important part of this structure is the architecture of the software we\u2019re building.<\/p>\n<p>Architecture describes the building blocks of our software and how they work with each other. If every team member builds the blocks as he or she thinks best, it may work, but it will lead to different styles and concepts used throughout the code base. Chances are that this will quickly lead to unmaintainable code.<\/p>\n<p>If, instead, we have an agreed-upon set of architecture rules, the building blocks will be shaped to fit together and be much easier to extend, test, and maintain.<\/p>\n<p>In my experience as a senior member\/architect of a development team, I found it necessary to define a set of architecture rules from the start (yes, even when doing Scrum), but then to get into a mode of continuous decision making together with the team.<\/p>\n<p>This way, there\u2019s no danger of becoming <a href=\"https:\/\/martinfowler.com\/articles\/architect-elevator.html\" target=\"_blank\" rel=\"noopener\">an ivory tower architect<\/a> who decides everything <em>for<\/em> the team but who is not respected <em>by<\/em> the team. You want the team to participate in important decisions, and not feel left behind.<\/p>\n<p>Here\u2019s how I drive architecture decisions in my projects by <a href=\"https:\/\/simpleprogrammer.com\/working-on-a-team\/\">taking responsibility<\/a> while working <em>with<\/em> the team.<\/p>\n<h2>Collect Issues and Ideas<\/h2>\n<p>First of all, we need a place to collect architecture issues and ideas. This is usually a structured list in form of table with these columns:<\/p>\n<ul>\n<li>the <strong>date<\/strong> the issue was raised<\/li>\n<li>the <strong>name of the person<\/strong> who raised the issue<\/li>\n<li>a <strong>keyword<\/strong> describing the context of the issue in a single word, for ease of indexing<\/li>\n<li>a <strong>short text description<\/strong> of the issue, potentially with links to other material<\/li>\n<li>the <strong>name of the person<\/strong> who will take responsibility for the issue (initially empty)<\/li>\n<li>a <strong>status flag<\/strong>, e.g., \u201copen,\u201d \u201cin progress,\u201d or \u201cdone\u201d<\/li>\n<\/ul>\n<p>This list is the repository of architecture issues, and every person on the project should know it. It\u2019s accessible to all and editable by all. Everyone is invited to add their issues and ideas concerning the architecture to this list.<\/p>\n<p>Usually, not everybody on a team will contribute to this list. Some are content to let others discuss and make decisions, which is totally fine. Often, these are the more junior developers who still lack confidence in their own skills, but they\u2019ll get there.<\/p>\n<p>There are always some developers, however, who will gladly take the chance to contribute ideas about how to do things better and point out the issues they have with the current state of the architecture. Those ideas and issues are what\u2019s going to drive the evolution of our software\u2019s architecture.<\/p>\n<p>Don\u2019t forget to contribute to this list yourself in your role as a senior developer or architect. You want to bring in your experience, after all.<\/p>\n<p>Actually, you should even maintain an architecture issue list if you\u2019re the only person contributing to it or if you\u2019re doing a project on your own. If the list is only in your head, chances are that it will feel like a burden because you\u2019re afraid you\u2019ll forget something. Or you will actually forget something. Your future self will thank you for everything you write down.<\/p>\n<h2>Establish a Community of Practice<\/h2>\n<p>Collecting issues and ideas alone doesn\u2019t cut it, though. We need to talk about them and make decisions based on them in a structured manner.<\/p>\n<p>In our role as senior developer \/ architect, we could take the list, withdraw into the penthouse of our ivory tower, and decide on a course of action for each item. However, top-down decisions like that don\u2019t sit well with everyone (and, to be honest, are probably not the best decisions all the time), so we should try to involve the team.<\/p>\n<p>What I\u2019ve successfully done in the past is to establish a community of practice (CoP) for architecture topics. The term \u201ccommunity of practice\u201d is often used in agile projects to describe sub-teams that each drive a certain topic within the project, but it\u00a0<a href=\"https:\/\/www.amazon.com\/Communities-Practice-Cognitive-Computational-Perspectives\/dp\/0521663636\/ref=sr_1_1?ie=UTF8&amp;qid=1534440713&amp;sr=8-1&amp;keywords=communities+of+practice\" target=\"_blank\" rel=\"noopener\">originates from even before agile became a buzzword<\/a>.<\/p>\n<p>A community of practice in the sense of this article is a group of team members who are interested in software architecture and are actively practicing software development. The \u201cactively practicing\u201d part is important because if they\u2019re not developing software, they won\u2019t know the consequences of any architecture decisions.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-30104 alignright\" src=\"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/community-of-practice-300x300.png\" alt=\"\" width=\"280\" height=\"280\" \/>Once every two weeks or so, I schedule a meeting for this community of practice. I have a look at the issues and ideas on the list. Usually, a day before the meeting, I talk to everyone who\u2019s contributed issues, so I can gain a better understanding of the issues. Then I decide which topics should be part of the meeting agenda.<\/p>\n<p>It\u2019s important to select the issues to discuss <em>before the meeting<\/em>. Otherwise, the meeting will likely degrade into an unproductive mob prioritization session.<\/p>\n<p>The meeting is timeboxed, usually not more than an hour or one and a half. Also, each item to discuss is timeboxed so we have a clear-cut agenda.<\/p>\n<p>Each item is then discussed in the group, and if all goes well, a decision is made for the benefit of all. Some items are settled then and there; others may require someone to follow up by evaluating something or talking to some other people. In this case, the item is assigned to a caretaker who follows up. The caretaker and status columns in the issue list are updated accordingly.<\/p>\n<p>One point on the agenda should be to go through all items currently \u201cin progress\u201d to follow up on them.<\/p>\n<p>Having decided on something usually feels rather good. No matter if everyone supports the decision or not, <em>we\u2019re making progress.<\/em><\/p>\n<h2>Document Your Decisions<\/h2>\n<p>This progress must be documented. We must be able to come back in a year and say, \u201cAh, yes, that\u2019s why we\u2019re doing this the way we\u2019re doing it.\u201d<\/p>\n<p>There are few things as frustrating as discussing something and having to say \u201cI remember we talked about this a couple of months ago, but I don\u2019t remember what we decided back then.\u201d<\/p>\n<p>And let me tell you, this happens a lot to me. I have a chronically bad memory (or perhaps a chronically selective one).<\/p>\n<p>Let\u2019s call the documentation of our decision an \u201cArchitecture Decision Record\u201d (ADR). That\u2019s a term that has gained some traction since it was included in ThoughtWorks\u2019 <a href=\"https:\/\/www.thoughtworks.com\/de\/radar\/techniques\/lightweight-architecture-decision-records\" target=\"_blank\" rel=\"noopener\">technology radar<\/a> in 2016.<\/p>\n<p>Essentially, an ADR is a structured document that describes why we have made a decision and what we hope to achieve with it. For example, an ADR may consist of these attributes (adapt this list to your needs as necessary):<\/p>\n<ul>\n<li>a unique number for easier reference<\/li>\n<li>a title<\/li>\n<li>the decision<\/li>\n<li>the reasons for the decision<\/li>\n<li>the goals we hope to achieve with it<\/li>\n<\/ul>\n<p>The ADRs should be kept as close to the code base as possible so that they can be maintained in sync with the code and be part of our code review rituals.<\/p>\n<p>With a well-kept list of ADRs available, we can easily travel back in time when we know we have discussed some topic already and re-evaluate our decision from back then.<\/p>\n<p>Maybe the reasons for a past decision still hold. Sometimes, however, the reasons are not valid anymore because the context has changed or the goals we wanted to achieve with the decision have not been reached. In this case, we can decide on a different way of doing things.<\/p>\n<p>Being able to refer to an ADR also allows us to quickly smother unproductive discussions in our CoP meetings. Just pointing at an ADR and saying \u201cWe have talked about this already\u201d works wonders.<\/p>\n<h2>And When There Is No Consensus?<\/h2>\n<p>There are times when we keep discussing an architecture issue in our CoP meeting and we cannot agree on a course of action for dealing with it.<\/p>\n<p>In this case, we still have a couple of options.<\/p>\n<p><strong>We can postpone the issue to the next meeting<\/strong>. This gives us and the rest of the team some time to think about it. Often, this will be enough to give us or our debating partner some inspiration as to how proceed with the issue. Perhaps we learn something new in the meantime that will help us.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-30103 alignright\" src=\"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/team-consensus-300x300.png\" alt=\"\" width=\"280\" height=\"280\" \/>If the matter is urgent and needs to be decided quickly, <strong>we can give in to our debating partner\u2019s opinion and do it his or her way<\/strong>. Even if we think this is not the best way to do things, it might be better to do <em>something<\/em> than to do nothing. Just be sure to document the decision in the ADRs so we can get back to it should it become necessary.<\/p>\n<p>If we really feel that our way is the way to go and disaster will strike if we do it differently, <strong>we can overrule the team with our experience<\/strong>. This obviously only works if we are respected enough within the team (or we have a role that gives us the needed authority). And even then, this might offend some people, but sometimes <a href=\"https:\/\/simpleprogrammer.com\/when-scrum-hurts-mob-achitecture\/\" target=\"_blank\" rel=\"noopener\">the decision must be made by an architect<\/a>.<\/p>\n<p>It\u2019s nice if we reach consensus on architecture decisions as a team, but consensus isn\u2019t necessary to successfully work together as a team. If we treat each other with respect while standing strong for some decisions and yielding for others, we can still deliver a well-architected piece of software.<\/p>\n<h2>Deliver Great Architecture<\/h2>\n<p>Life as an architect or senior developer in a software development team is a lot easier when you involve the team members in the process of making architecture decisions. The team members will feel their opinions are honored, and you spread the architecture knowledge through the team, avoiding architectural messes you would have to clean up later.<\/p>\n<p>The steps of collecting issues, discussing them in a community of practice, and then documenting the decisions take only very little effort, so there\u2019s practically nothing stopping you.<\/p>\n<p>Once this workflow is incorporated into the every-day-life of a project, it will relieve you of the burden of having to decide everything on your own while helping the team to grow and to deliver architecturally sound software.<\/p>\n<p>Start today.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every type of work needs some structure for things to go smoothly. In software development projects, an important part of this structure is the architecture of the software we\u2019re building. Architecture describes the building blocks of our software and how they work with each other. If every team member builds the blocks as he or&#8230;<\/p>\n","protected":false},"author":1142,"featured_media":30106,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[2290,14560,415,162229112,162229823],"tags":[],"class_list":["post-29959","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-architecture","category-career","category-guest-post","category-people-2","category-software"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Architecture Decisions in a Software Development Team - Simple Programmer<\/title>\n<meta name=\"description\" content=\"Learn how to drive software architecture decisions as a senior member or architect that involves engaging other team members for a sound development stage.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Architecture Decisions in a Software Development Team - Simple Programmer\" \/>\n<meta property=\"og:description\" content=\"Learn how to drive software architecture decisions as a senior member or architect that involves engaging other team members for a sound development stage.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/\" \/>\n<meta property=\"og:site_name\" content=\"Simple Programmer\" \/>\n<meta property=\"article:published_time\" content=\"2018-09-17T14:00:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/architecture.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Architecture Decisions in a Software Development Team\",\"datePublished\":\"2018-09-17T14:00:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/\"},\"wordCount\":1734,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/simpleprogrammer.com\\\/wp-content\\\/uploads\\\/2018\\\/09\\\/architecture.png\",\"articleSection\":[\"Architecture\",\"Career\",\"Guest Post\",\"People\",\"Software\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/\",\"url\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/\",\"name\":\"Architecture Decisions in a Software Development Team - Simple Programmer\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/simpleprogrammer.com\\\/wp-content\\\/uploads\\\/2018\\\/09\\\/architecture.png\",\"datePublished\":\"2018-09-17T14:00:52+00:00\",\"author\":{\"@id\":\"\"},\"description\":\"Learn how to drive software architecture decisions as a senior member or architect that involves engaging other team members for a sound development stage.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/simpleprogrammer.com\\\/wp-content\\\/uploads\\\/2018\\\/09\\\/architecture.png\",\"contentUrl\":\"https:\\\/\\\/simpleprogrammer.com\\\/wp-content\\\/uploads\\\/2018\\\/09\\\/architecture.png\",\"width\":1280,\"height\":720},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/software-architecture-decisions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/simpleprogrammer.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Architecture Decisions in a Software Development Team\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/#website\",\"url\":\"https:\\\/\\\/simpleprogrammer.com\\\/\",\"name\":\"Simple Programmer\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/simpleprogrammer.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"\",\"url\":\"https:\\\/\\\/simpleprogrammer.com\\\/author\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Architecture Decisions in a Software Development Team - Simple Programmer","description":"Learn how to drive software architecture decisions as a senior member or architect that involves engaging other team members for a sound development stage.","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:\/\/simpleprogrammer.com\/software-architecture-decisions\/","og_locale":"en_US","og_type":"article","og_title":"Architecture Decisions in a Software Development Team - Simple Programmer","og_description":"Learn how to drive software architecture decisions as a senior member or architect that involves engaging other team members for a sound development stage.","og_url":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/","og_site_name":"Simple Programmer","article_published_time":"2018-09-17T14:00:52+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/architecture.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Written by":"","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/#article","isPartOf":{"@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/"},"author":{"name":"","@id":""},"headline":"Architecture Decisions in a Software Development Team","datePublished":"2018-09-17T14:00:52+00:00","mainEntityOfPage":{"@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/"},"wordCount":1734,"commentCount":0,"image":{"@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/#primaryimage"},"thumbnailUrl":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/architecture.png","articleSection":["Architecture","Career","Guest Post","People","Software"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/simpleprogrammer.com\/software-architecture-decisions\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/","url":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/","name":"Architecture Decisions in a Software Development Team - Simple Programmer","isPartOf":{"@id":"https:\/\/simpleprogrammer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/#primaryimage"},"image":{"@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/#primaryimage"},"thumbnailUrl":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/architecture.png","datePublished":"2018-09-17T14:00:52+00:00","author":{"@id":""},"description":"Learn how to drive software architecture decisions as a senior member or architect that involves engaging other team members for a sound development stage.","breadcrumb":{"@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/simpleprogrammer.com\/software-architecture-decisions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/#primaryimage","url":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/architecture.png","contentUrl":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2018\/09\/architecture.png","width":1280,"height":720},{"@type":"BreadcrumbList","@id":"https:\/\/simpleprogrammer.com\/software-architecture-decisions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/simpleprogrammer.com\/"},{"@type":"ListItem","position":2,"name":"Architecture Decisions in a Software Development Team"}]},{"@type":"WebSite","@id":"https:\/\/simpleprogrammer.com\/#website","url":"https:\/\/simpleprogrammer.com\/","name":"Simple Programmer","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/simpleprogrammer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"","url":"https:\/\/simpleprogrammer.com\/author\/"}]}},"_links":{"self":[{"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/posts\/29959","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/users\/1142"}],"replies":[{"embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/comments?post=29959"}],"version-history":[{"count":0,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/posts\/29959\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/media\/30106"}],"wp:attachment":[{"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/media?parent=29959"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/categories?post=29959"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/tags?post=29959"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}