{"id":131,"date":"2018-05-01T10:17:48","date_gmt":"2018-05-01T17:17:48","guid":{"rendered":"https:\/\/blog.kineteque.com\/?p=131"},"modified":"2018-05-01T10:17:48","modified_gmt":"2018-05-01T17:17:48","slug":"steal-this-architecture-attribute-drive-design","status":"publish","type":"post","link":"https:\/\/blog.kineteque.com\/?p=131","title":{"rendered":"Steal this Architecture &#8211; Attribute Drive Design"},"content":{"rendered":"<p class=\"p1\"><span class=\"s1\">I often ask myself, &#8220;What is software architecture?&#8221; I asked this same question to all of my co-workers. I struggled defining what is software architecture, and what is it that a software architect actually delivers.<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">A typical answer to that question is that a software architect designs the interfaces of a software system and the important decisions made to complete it. They will understand the how and the why.<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">This definition makes perfect sense during a conversation, but I find that definition has less impact when written down, although there is some truth to the above definition.<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Is a software architect just a bad ass developer that is good at making sketches on a white board?<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">I have walked away from many meetings that had architectural sketches in it thinking that although it was a step in the right direction, it was useless as a software architecture deliverable. Quite often, that informal sketch was often the only software architecture guidance.<\/span><\/p>\n<p>In this post, I&#8217;ll do a deep deep-dive into\u00a0<span class=\"s1\">software architecture in order answer &#8220;What is software architecture?&#8221;<\/span><\/p>\n<p><!--more--><\/p>\n<p class=\"p1\"><span class=\"s1\">The answer is multifaceted, and my next sentence is very dense.<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">Software architecture creates an abstraction of the structures within a software system that can realize the primary functionality of that system. This abstraction, as a deliverable, documents the design decisions, and contains abstract diagrams that represent it. After all, a diagram is an abstraction, isn&#8217;t it?<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">I was searching for a means of being a software architect that was more concrete, repeatable, and iterative than the above definition.<\/span><\/p>\n<p class=\"p1\"><span class=\"s1\">In my research, I discovered that the Software Engineering Institute from Carnegie Melon University had already worked on this problem. They created an iterative process called Attribute Driven Design version 3.0. It goes as follows.<\/span><\/p>\n<h2 class=\"p1\"><span class=\"s1\">Pre-Software Architecture Steps<\/span><\/h2>\n<p class=\"p1\"><span class=\"s1\">Collect the Use Cases or Stories for the given software system.<\/span><\/p>\n<h2>Software Architecture Attribute Driven Design Steps<\/h2>\n<ol class=\"ol1\">\n<li class=\"li2\"><span class=\"s1\">Determine the Design Objectives.<br \/>\n<em>Explain why you are designing. Remember, all of the concepts within a system do not require abstraction\u00a0<\/em><\/span><i>because many will be obvious.<\/i><\/li>\n<li class=\"li2\"><span class=\"s1\">Identify the Primary Functional Requirements.<\/span><\/li>\n<li class=\"li2\"><span class=\"s1\">Synthesize and catalog Quality Attribute Scenarios.<br \/>\n<em>Each scenario will identify a quality attribute, source, stimulus, artifact, environment, response, and response measure. A standard list of quality attributes is: Availability; Interoperability; Modifiability; Performance; Security; Testability; Usability. For example, given the quality attribute, &#8220;performance&#8221;, a quality attribute scenario might state, &#8220;When an exchange performs a bid request to the bidding engine under normal operating conditions the bidding engine should respond with a bid response within 100 milliseconds.&#8221;<\/em><\/span><\/li>\n<li class=\"li2\"><span class=\"s1\">Identify which Use Cases or Stories are related to each Quality Attribute Scenario.<\/span><\/li>\n<li class=\"li2\"><span class=\"s1\">Prioritize each quality scenario by stakeholders according to importance to the success of the system (H, M, L) and by the the architect according to the technical risk (H, M, L).<\/span><\/li>\n<li class=\"li2\"><span class=\"s1\">Identify the constraints or restrictions.<br \/>\n<em>For example, these can be technical, organizational, or provided by the customer.<\/em><\/span><\/li>\n<li class=\"li2\"><span class=\"s1\">Identify the concerns.<br \/>\n<em>Concerns represent design decisions that should be made whether or not they are stated explicitly\u00a0 as part of the goals or the requirements.<\/em><\/span><\/li>\n<\/ol>\n<p class=\"p1\"><span class=\"s1\">At this point, the following artifacts exists:<\/span><\/p>\n<p><a href=\"https:\/\/blog.kineteque.com\/wp-content\/uploads\/2018\/05\/attribute-driven-design-inputs.svg\"><img decoding=\"async\" class=\"alignnone size-medium wp-image-148\" src=\"https:\/\/blog.kineteque.com\/wp-content\/uploads\/2018\/05\/attribute-driven-design-input.svg\" alt=\"Design Objectives; Primary Functional Requirements; Quality Attribute Scenarios; Use Cases or Stories; Constraints; Concerns.\" \/><\/a><\/p>\n<p class=\"p1\"><span class=\"s1\">These are the inputs.<\/span><\/p>\n<ol>\n<li>Review the inputs.<br \/>\n<em><span class=\"s1\">Ensure that there is clarity on the overall design problem that needs to be solved.<\/span><\/em><\/li>\n<li>Establish iteration goal and select inputs to be considered in the iteration.<br \/>\n<em>Divide the design problem into several sub-problems. An iteration starts by deciding which sub-problem to address.<\/em><\/li>\n<li>Choose one or more elements of the system to decompose.<\/li>\n<li>Choose one or more design concepts that satisfy the inputs considered in the iteration.<br \/>\n<em>Identify a tactic, architect pattern, reference architecture, deployment pattern, design patterns, algorithms, frameworks, or existing software component, that satisfies the the inputs considered in the iteration<\/em>.<\/li>\n<li>Instantiate architectural elements, allocate responsibilities and define interfaces.<br \/>\n<em>Catalog your design decisions. Provide a table that lists the Design Decision and Location, and Rationale. The Rationale should also include a table that lists the Alternative, and Reason for Discarding.<\/em><\/li>\n<li>Sketch views and record design decisions.<br \/>\n<em>Catalog the elements in your design. Provide a table that lists the Element, and Responsibility. Then provide a diagram with these elements. Sketches may include Module Views, Component and Connector Views, Allocation Views, and other views that address Quality Attributes.<\/em><\/li>\n<li>Perform analysis of current design and review iteration goal and design objectives.<br \/>\n<em>Create a table that lists Not Addressed, Partially Addressed, Completely Addressed, Design Decisions Made During the Iteration. The columns Not Addressed, Partially Addressed, and Completely Addressed have Quality Attribute Scenario, Constraint, or Concern listed. The Design Decisions Made During the Iteration column provides a brief description of the design decision.<\/em><\/li>\n<li>Iterate over the next set of inputs if necessary.<\/li>\n<\/ol>\n<p><a href=\"https:\/\/blog.kineteque.com\/wp-content\/uploads\/2018\/05\/attribute-driven-design-flow.svg\"><img decoding=\"async\" class=\"alignnone size-medium wp-image-143\" src=\"https:\/\/blog.kineteque.com\/wp-content\/uploads\/2018\/05\/attribute-driven-design-flow.svg\" alt=\"Attribute Driven Design Flow\" \/><\/a><\/p>\n<p>After following ADD 3.0 in my own personal project, I can attest that ADD 3.0 provides a repeatable process that leads to high quality deliverables. However, after speaking to several colleagues, I realized there is a need to break down the process into an agile methodology.<\/p>\n<p>Although I would deeply appreciate the chance to use this process in delivering an architecture, I think most organizations will find it too formal for their culture. Unfortunately, this means they might end up with no architecture.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I often ask myself, &#8220;What is software architecture?&#8221; I asked this same question to all of my co-workers. I struggled defining what is software architecture, and what is it that a software architect actually delivers. A typical answer to that question is that a software architect designs the interfaces of a software system and the [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-131","post","type-post","status-publish","format-standard","hentry","category-architecture"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=\/wp\/v2\/posts\/131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=131"}],"version-history":[{"count":0,"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=\/wp\/v2\/posts\/131\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kineteque.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}