<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" >

<channel><title><![CDATA[Minimum Viable Architecture - Big Ideas]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas]]></link><description><![CDATA[Big Ideas]]></description><pubDate>Wed, 04 May 2022 13:35:26 -0700</pubDate><generator>Weebly</generator><item><title><![CDATA[Forrester BI Sandboxes (est. 2014)]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/forrester-bi-sandboxes-est-2014]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/forrester-bi-sandboxes-est-2014#comments]]></comments><pubDate>Wed, 04 May 2022 16:20:27 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/forrester-bi-sandboxes-est-2014</guid><description><![CDATA[ [...] ]]></description><content:encoded><![CDATA[<div><div id="934755031115008890" align="left" style="width: 100%; overflow-y: hidden;" class="wcustomhtml"><iframe src="https://www.linkedin.com/embed/feed/update/urn:li:share:6927652291768451074" height="1424" width="504" frameborder="0" allowfullscreen="" title="Embedded post"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[20 Questions]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/20-questions]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/20-questions#comments]]></comments><pubDate>Fri, 18 Mar 2022 22:50:27 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/20-questions</guid><description><![CDATA[There are an infinite number of questions you could ask about any business. How many actually provide the answers you need, in a way you can easily understand? The answer is 20. Obviously, there may be more and there may be less. If you can easy answer these questions, you will have a great understanding of how your business is operating.&nbsp;&#8203;One thing to note, these questions are roughly broken into three categories. First, companies (or profit centers) who are not yet profitable. The s [...] ]]></description><content:encoded><![CDATA[<div class="paragraph"><span>There are an infinite number of questions you could ask about any business. How many actually provide the answers you need, in a way you can easily understand? The answer is 20. Obviously, there may be more and there may be less. If you can easy answer these questions, you will have a great understanding of how your business is operating.&nbsp;<br />&#8203;</span><br /><span>One thing to note, these questions are roughly broken into three categories. First, companies (or profit centers) who are not yet profitable. The second group represents most companies. You are making a profit, but it fluctuates from period to period or is starting to reliably grow. The final group represents companies who are in the enviable position to be able to consider significant expansion and investment in new opportunities.<br /><br />If you are currently creating metrics, reports, and dashboards, how many of these questions are you answering? It might be time &nbsp;to reassess the value of your current&nbsp;reporting. In my experience, we develop the metrics we can derive from the data we can easily access not the metrics that reflect the value we bring to our customers.</span><br /><br /><span><strong><font size="5">Can you quickly answer and act on these 20 questions?</font></strong><br /><br /><em><strong>For a new company or profit center:</strong></em></span><ul><li style="color:rgb(36, 41, 46)">How quickly are we turning the money we spend into cash?</li><li style="color:rgb(36, 41, 46)">How long is our cash runway?</li><li style="color:rgb(36, 41, 46)">Are we being paid on time?</li><li style="color:rgb(36, 41, 46)">Are we paying our suppliers on time?</li><li style="color:rgb(36, 41, 46)">Are we delivering late or incomplete orders because we can not afford the raw materials?&nbsp;</li></ul><br /><em><strong><span>For a growing company or profit center:</span></strong></em><ul><li style="color:rgb(36, 41, 46)">Are we making money (profitable)?</li><li style="color:rgb(36, 41, 46)">Are we meeting our customer commitments?</li><li style="color:rgb(36, 41, 46)">Where is our greatest return on current operations?</li><li style="color:rgb(36, 41, 46)">Are we making the right thing, at the right time, with the right quality?</li><li style="color:rgb(36, 41, 46)">Could we take on 20% more business without affecting on-time delivery, lead-time, or quality?</li><li style="color:rgb(36, 41, 46)">Where could we make dramatic price reductions?</li><li style="color:rgb(36, 41, 46)">Where could we make dramatic delivery time reductions?</li><li style="color:rgb(36, 41, 46)">Which team is over worked?</li><li style="color:rgb(36, 41, 46)">Which decision takes the longest to make?</li><li style="color:rgb(36, 41, 46)">Who is our most important supplier?</li><li style="color:rgb(36, 41, 46)">Who is our most important competitor?</li><li style="color:rgb(36, 41, 46)">What is our largest externality?&nbsp;</li></ul><br /><em><strong><span>For an established company or profit center:</span></strong></em><ul><li style="color:rgb(36, 41, 46)">Where is our greatest return on new investment?</li><li style="color:rgb(36, 41, 46)">Where should we be investing next?</li><li style="color:rgb(36, 41, 46)">What is our greatest competitive risk?</li></ul><br /><font color="#24292e">How did you score? I'm going to guess&nbsp;poorly.&nbsp;If you are not an executive in the company, or your company has adopted an "open book" policy, the answers to most of these questions are hidden. Feel free to share these with the Executives you know and have them <a href="https://www.minimumviablearchitecture.com/contact.html" target="_blank">reach out to me</a> for additional questions.&nbsp;</font></div>]]></content:encoded></item><item><title><![CDATA[Data Mesh Radio podcast]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/data-mesh-radio-podcast]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/data-mesh-radio-podcast#comments]]></comments><pubDate>Fri, 11 Feb 2022 15:36:07 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/data-mesh-radio-podcast</guid><description><![CDATA[I had the opportunity to talk with Scott Hirleman at Data Mesh Radio. We discussed identifying potential domain data team members and leveling up their skills by starting them out, building, and using an exploratory data platform.​We discussed some of the broad features of the platform and if you would like a full walkthrough, look at the recorded demo. [...] ]]></description><content:encoded><![CDATA[<div class="paragraph">I had the opportunity to talk with Scott Hirleman at Data Mesh Radio. We discussed identifying potential domain data team members and leveling up their skills by starting them out, building, and using an exploratory data platform.<br><br>&#8203;We discussed some of the broad features of the platform and if you would like a full walkthrough, look at the <a href="https://youtu.be/xLjQhz1KJoQ" target="_blank">recorded demo</a>.</div><div><div id="858927638675818610" align="left" style="width: 100%; overflow-y: hidden;" class="wcustomhtml"><div style="width: 100%; height: 200px; margin-bottom: 20px; border-radius: 6px; overflow:hidden;"><iframe style="width: 100%; height: 200px;" frameborder="no" scrolling="no" seamless="" src="https://player.captivate.fm/episode/300720fe-b9e6-4393-8cac-8287a4e48bb9"></iframe></div></div></div>]]></content:encoded></item><item><title><![CDATA[The Engineering Side of Data]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/the-engineering-side-of-data]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/the-engineering-side-of-data#comments]]></comments><pubDate>Tue, 01 Feb 2022 20:14:01 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/the-engineering-side-of-data</guid><description><![CDATA[This week I had the opportunity to talk with Bob Haffner about Data Engineering for Data Discovery. Give it a listen and subscribe to his podcast / YouTube channel. [...] ]]></description><content:encoded><![CDATA[<div class="paragraph">This week I had the opportunity to talk with Bob Haffner about Data Engineering for Data Discovery. Give it a listen and subscribe to his podcast / YouTube channel.</div><div><div id="652183163744695010" align="left" style="width: 100%; overflow-y: hidden;" class="wcustomhtml"><iframe width="560" height="315" src="https://www.youtube.com/embed/RYb67qrn_I0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[Full walk through video]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/full-walk-through-video]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/full-walk-through-video#comments]]></comments><pubDate>Sun, 30 Jan 2022 15:55:04 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/full-walk-through-video</guid><description><![CDATA[Sit back with your favorite snack -- It's a long one!The data product we are building in the book is&nbsp;truly a "full stack" development experience.&nbsp;&nbsp;We start with an Excel file and end up with a totally automated serverless application. Yes, it looks like a lot of code, but most of it is replying the same basic patterns again and again.&nbsp; [...] ]]></description><content:encoded><![CDATA[<h2 class="wsite-content-title"><font size="4">Sit back with your favorite snack -- It's a long one!<br><br>The data product we are building in the book is&nbsp;truly a "full stack" development experience.&nbsp;&nbsp;We start with an Excel file and end up with a totally automated serverless application. Yes, it looks like a lot of code, but most of it is replying the same basic patterns again and again.&nbsp;</font></h2><div><div id="714798382146843161" align="left" style="width: 100%; overflow-y: hidden;" class="wcustomhtml"><iframe width="560" height="315" src="https://www.youtube.com/embed/xLjQhz1KJoQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[Data Engineering Podcast]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/data-engineering-podcast]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/data-engineering-podcast#comments]]></comments><pubDate>Tue, 18 Jan 2022 19:24:21 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/data-engineering-podcast</guid><description><![CDATA[January 15, 2022 I had the opportunity to appear on the Data Engineering Podcast with Tobias Macey.&#8203;An Introduction To Data And Analytics Engineering For Non-Programmers - Episode 255  Applications of data have grown well beyond the venerable business intelligence dashboards that organizations have relied on for decades. Now it is being used to power consumer facing services, influence organizational behaviors, and build sophisticated machine learning systems. Given this increased level of [...] ]]></description><content:encoded><![CDATA[<div class="paragraph"><font size="3"><strong><font color="#2a2a2a">January 15, 2022 I had the opportunity to appear on the Data Engineering Podcast with Tobias Macey.</font><br />&#8203;</strong><a href="https://www.dataengineeringpodcast.com/building-data-products-book-episode-255/" target="_blank">An Introduction To Data And Analytics Engineering For Non-Programmers - Episode 255</a></font></div>  <h2 class="wsite-content-title" style="text-align:left;"><em><font color="#3f3f3f" size="2">Applications of data have grown well beyond the venerable business intelligence dashboards that organizations have relied on for decades. Now it is being used to power consumer facing services, influence organizational behaviors, and build sophisticated machine learning systems. Given this increased level of importance it has become necessary for everyone in the business to treat data as a product in the same way that software applications have driven the early 2000s. In this episode Brian McMillan shares his work on the book "Building Data Products" and how he is working to educate business users and data professionals about the combination of technical, economical, and business considerations that need to be blended for these projects to succeed.</font></em></h2>]]></content:encoded></item><item><title><![CDATA[How to estimate and prioritize]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/how-to-estimate-and-prioritize]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/how-to-estimate-and-prioritize#comments]]></comments><pubDate>Tue, 26 Oct 2021 16:01:25 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/how-to-estimate-and-prioritize</guid><description><![CDATA[This&nbsp;is an excerpt from the last chapter of&nbsp;my Building Data Products Book. At this point we've completed a number of iterations building up to a solid first pass at a sales analytics system. Borrowing from SAFe (don't @ me. I've also got plenty to say!) the next step is to take a break, continue to refactor, and think about what comes next.&nbsp;This is a good time to introduce some suggestions on how to prioritize what to work on when&nbsp;you have many possibilities.&nbsp;&#8203;SAF [...] ]]></description><content:encoded><![CDATA[<div class="paragraph"><font color="#39393a"><span>This</span>&nbsp;is an excerpt from the last chapter of&nbsp;my <a href="https://www.minimumviablearchitecture.com/" target="_blank">Building Data Products Book</a>. At this point we've completed a number of iterations building up to a solid first pass at a sales analytics system. Borrowing from SAFe <em>(don't @ me. I've also got plenty to say!)</em> the next step is to take a break, continue to refactor, and think about what comes next.&nbsp;This is a good time to introduce some suggestions on how to prioritize what to work on when&nbsp;you have many possibilities.&nbsp;<br /><br />&#8203;SAFe <em>(and many others)</em> recommend the Weighted Shortest Job First (WSJF) method described on the <a href="https://blackswanfarming.com/cost-of-delay/" target="_blank">blackswanfarming.com</a> website as Cost of Delay. Good luck getting a group of people with their own priorities to agree on using actual dollar values to define value! You need to ease them into it by making the people who can assess the&nbsp;business value and urgency story point them, just like they made the developers use story points to determine the value of their work. (/snark)</font></div>  <div>  <!--BLOG_SUMMARY_END--></div>  <div class="paragraph"><strong><font size="5" style="color:rgb(194, 116, 59)">Chapter 9: Final iteration - Innovation and Planning</font></strong><br /><br /><font color="#2a2a2a">With the completion of these stories, it&rsquo;s tempting to declare success and start with the next development round. Don&rsquo;t do it! Take time to step away for a while. Take the afternoon off, relax, and give yourself time to let all this work settle in. Let things run for at least a few cycles to look for issues you might have missed.<br /><span>After the quick break, this time should be focused on these activities:</span></font><ol><li><font color="#2a2a2a">Note any bugs and possible solutions.</font></li><li><font color="#2a2a2a">Identify potential support refactoring opportunities. These are true refactors. They don&rsquo;t add new features. They make the code easier to support.</font></li><li><font color="#2a2a2a">Identify potential performance issues and possible improvements.</font></li><li><font color="#2a2a2a">Add to and update the documentation.</font></li><li><font color="#2a2a2a">Identify feature enhancements.</font></li></ol><br /><font color="#2a2a2a"><span>In this Innovation and Planning phase, focus on the technical side of the product rather than the customer or business side. By establishing a dedicated block of time to work through these issues, you make it easier to keep ahead of them. Over time, it becomes easier to integrate these activities into the day-to-day development flow. Early on, as the team establishes itself, having this dedicated time is critically important. Without it, it is too easy to plow ahead building user features while technical debt piles up and eventually overwhelms the product. It is a delicate balancing act, but establishing clear boundaries early goes a long way to keeping the amount of work manageable.</span></font><br /><br /><font color="#2a2a2a">Start this process by brainstorming stories for each of these five categories and assign them rough priorities and values. Then from this list, create a few separate stories to work on in this iteration and a few to backlog for future iterations.</font><br /><font color="#2a2a2a">Determine the priority of a task by ranking them by their cost of delay.&nbsp; In this process, assign each story or desired outcome, three values. If you cannot assign actual monetary values, use proportional values across the set of deliverables. Good proportional scales could be a limited range (1&ndash;5, 1, 3, 5, 8, 13) or order of magnitude (1, 10, 100, 1000).</font><ol><li><font color="#2a2a2a">Urgency - How critical is it that this be done immediately?</font></li><li><font color="#2a2a2a">Value - Is there hard or soft business value?</font></li><li><font color="#2a2a2a">Duration - How long will this take? How confident are we in this estimate?</font></li></ol><br /><font color="#2a2a2a">Bubble sort each deliverable by category. Based on the order, assign a value number (the modified Fibonacci sequence works well to break up any groupings) (1,2,3,5,8,13,21,34,55,89).<br /><br />The individual scores don&rsquo;t matter beyond prioritization.&nbsp;With this methodology, the highest value activities which can be completed in the shortest time receive the highest Cost of Delay divided by Duration scores ((Urgency * Value) / Duration).</font></div>  <div id="679554378889669295"><div><style type="text/css">	#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table-wrapper {  padding: 20px 0;}#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table {  width: 100%;  border: 1px solid #C9CDCF;  border-spacing: 0;}#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table td.cell {  border-right: 1px solid #C9CDCF;  border-bottom: 1px solid #C9CDCF;  word-break: break-word;  background-color: #FFFFFF;  width: 20%;}#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table td.cell .paragraph {  width: 90%;  margin: 0 5%;  padding-bottom: 10px;  padding-top: 10px;  text-align: center;}#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table.style-top tr:first-child td,#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table.style-side td:first-of-type {  background-color: #F8F8F8;}#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table.style-top tr:first-child td .paragraph,#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table.style-side td:first-of-type .paragraph {  font-weight: 700;}#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table tr:last-child td {  border-bottom: none;}#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table td:last-of-type {  border-right: none;}#element-2c275e07-0cf1-42ae-97ba-ac74272b7200 .simple-table .empty-content-area-element {  padding-left: 0px !important;}</style><div id="element-2c275e07-0cf1-42ae-97ba-ac74272b7200" data-platform-element-id="702688850553606843-1.4.3" class="platform-element-contents">	<div class="simple-table-wrapper">  <table class="simple-table style-top">      <tr>          <td class="cell"><div class="paragraph">Description</div></td>          <td class="cell"><div class="paragraph">Urgency</div></td>          <td class="cell"><div class="paragraph">Value</div></td>          <td class="cell"><div class="paragraph">Duration</div></td>          <td class="cell"><div class="paragraph">Score</div></td>      </tr>      <tr>          <td class="cell"><div class="paragraph"><font size="2">Dynamic command to shut down local server before restarting.</font></div></td>          <td class="cell"><div class="paragraph">1</div></td>          <td class="cell"><div class="paragraph">1</div></td>          <td class="cell"><div class="paragraph">13</div></td>          <td class="cell"><div class="paragraph">1</div></td>      </tr>      <tr>          <td class="cell"><div class="paragraph"><font size="2">Add metadata table to the db.</font></div></td>          <td class="cell"><div class="paragraph">8</div></td>          <td class="cell"><div class="paragraph">8</div></td>          <td class="cell"><div class="paragraph">5</div></td>          <td class="cell"><div class="paragraph">13</div></td>      </tr>      <tr>          <td class="cell"><div class="paragraph"><font size="2">Add Entity relationship diagrams to the documentation.</font><br /><span></span></div></td>          <td class="cell"><div class="paragraph">13</div></td>          <td class="cell"><div class="paragraph">13</div></td>          <td class="cell"><div class="paragraph">8</div></td>          <td class="cell"><div class="paragraph">21</div></td>      </tr>      <tr>          <td class="cell"><div class="paragraph"><font size="2">Remove unused targets from the makefile.</font><br /><span></span></div></td>          <td class="cell"><div class="paragraph">3</div></td>          <td class="cell"><div class="paragraph">3</div></td>          <td class="cell"><div class="paragraph">1</div></td>          <td class="cell"><div class="paragraph">9</div></td>      </tr>      <tr>          <td class="cell"><div class="paragraph"><font size="2">Remove unnecessary tables from the deployed database.</font><br /><span></span></div></td>          <td class="cell"><div class="paragraph">5</div></td>          <td class="cell"><div class="paragraph">5</div></td>          <td class="cell"><div class="paragraph">3</div></td>          <td class="cell"><div class="paragraph">8</div></td>      </tr>      <tr>          <td class="cell"><div class="paragraph"><font size="2">Research / POC access to product cost API.</font><br /><span></span></div></td>          <td class="cell"><div class="paragraph">34</div></td>          <td class="cell"><div class="paragraph">21</div></td>          <td class="cell"><div class="paragraph">21</div></td>          <td class="cell"><div class="paragraph">34</div></td>      </tr>      <tr>          <td class="cell"><div class="paragraph"><font size="2">Research non-conformance query.</font><br /><span></span></div></td>          <td class="cell"><div class="paragraph">21</div></td>          <td class="cell"><div class="paragraph">34</div></td>          <td class="cell"><div class="paragraph">34</div></td>          <td class="cell"><div class="paragraph">21</div></td>      </tr>  </table></div></div><div style="clear:both;"></div></div></div>  <div class="paragraph">Based on the Cost of Delay scoring, the prioritization looks like this:<ol><li style="color:rgb(0, 0, 0)">Research / POC access to product cost API.</li><li style="color:rgb(0, 0, 0)">Research non-conformance query.</li><li style="color:rgb(0, 0, 0)">Add Entity relationship diagrams to the documentation.</li><li style="color:rgb(0, 0, 0)">Add metadata table to the db.</li><li style="color:rgb(0, 0, 0)">Remove unused targets from the makefile.</li><li style="color:rgb(0, 0, 0)">Remove unnecessary tables from the deployed database.</li><li style="color:rgb(0, 0, 0)">Dynamic command to shut down local server before restarting.</li></ol><br /><font color="#2a2a2a"><strong>Executing technical improvements</strong><br />This iteration is shorter and less formal. If the team feels like a basic task list sufficiently communicates progress, then this is a good time to experiment with less formality. Another strategy is executing a portion of the prioritized stories. This creates a smaller and more focused queue. In this example, focus on completing the first few tasks as quickly as possible. Once complete, start planning for future iterations.<br />The first two look like good candidates for a future development iteration. They have long durations, and most likely, many unknowns and potential issues. Therefore we should push these toward the bottom of the list for this short planning iteration.<br />The rest of the list look like good candidates. We&rsquo;ll pick the first three to start. Once complete, we start the planning process for future iterations.<br /></font><br /><a href="https://www.minimumviablearchitecture.com/">Read More...</a></div>]]></content:encoded></item><item><title><![CDATA[Data and Analytics Engineering]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/data-and-analytics-engineering]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/data-and-analytics-engineering#comments]]></comments><pubDate>Fri, 10 Sep 2021 19:52:57 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/data-and-analytics-engineering</guid><description><![CDATA[As far back as 2014, ThoughtWorks proposed the concept of an&nbsp;Inverse Conway Maneuver&nbsp;as a way to use team structure to drive the adoption of a desired architectural state. As discussed above, small independent development teams go hand in hand with the Microservices Architecture pattern.   	 		 			 				 					 						     					 								 					 						  Conway's Law asserts that organizations are constrained to produce application designs which are copies of their&nbsp;communication structu [...] ]]></description><content:encoded><![CDATA[<div class="paragraph"><span>As far back as 2014, ThoughtWorks proposed the concept of an&nbsp;</span><em>Inverse Conway Maneuver</em><span>&nbsp;as a way to use team structure to drive the adoption of a desired architectural state. As discussed above, small independent development teams go hand in hand with the Microservices Architecture pattern.</span></div>  <div><div class="wsite-multicol"><div class="wsite-multicol-table-wrap" style="margin:0 -15px;"> 	<table class="wsite-multicol-table"> 		<tbody class="wsite-multicol-tbody"> 			<tr class="wsite-multicol-tr"> 				<td class="wsite-multicol-col" style="width:13.869801375803%; padding:0 15px;"> 					 						  <div class="wsite-spacer" style="height:50px;"></div>   					 				</td>				<td class="wsite-multicol-col" style="width:71.573408986453%; padding:0 15px;"> 					 						  <div class="paragraph" style="text-align:center;"><strong><em><font color="#e0915c"><font size="4">Conway's Law asserts that organizations are constrained to produce application designs which are copies of their</font>&nbsp;<font size="4">communication structures. This often leads to unintended</font>&nbsp;<font size="4">friction points. The 'Inverse Conway Maneuver' recommends</font>&nbsp;<font size="4">evolving your team and organizational structure to promote your desired architecture. Ideally, your technology architecture will display isomorphism with your business</font>&nbsp;<font size="4">architecture.&nbsp;</font><font size="2">[1]</font></font></em></strong></div>   					 				</td>				<td class="wsite-multicol-col" style="width:14.556789637745%; padding:0 15px;"> 					 						  <div class="wsite-spacer" style="height:50px;"></div>   					 				</td>			</tr> 		</tbody> 	</table> </div></div></div>  <div class="paragraph"><span>Like application developers went from front end, back end, UX, testing, and production support roles to DevOps and full-stack developer roles, the traditional data roles of business analyst, ETL developer, data modeler, and production support can be transitioned into data engineering and analytics engineering roles.&nbsp;</span>&#8203;</div>  <div>  <!--BLOG_SUMMARY_END--></div>  <div class="paragraph">This happens in concert with a move to transition the traditional business intelligence stack into the equivalent of a microservices stack. The transition to a microservices<span>-</span>based analytics platform requires reorganizing the team into more general-purpose roles. Both have a shared focus on data, but because the implementation is different, it will be helpful to initially identify two different roles.<br /><br /><strong>Data Engineer</strong><br />The first role is Data Engineer. This is a software engineer role focused on building the data infrastructure and moving the data from sources to targets. Data infrastructure includes all the application infrastructure required to support the team&rsquo;s analytics requirements<span>.</span><br /><br />In smaller companies, this role has a lot of infrastructure requirements, and it requires recruiting someone with server management experience. If this isn't possible, keeping the infrastructure requirements to a bare minimum will be a necessary. Fortunately, if done properly, this minimum viable infrastructure can meet a surprising range of requirements. In larger companies with more established IT departments, much of the existing infrastructure can be leveraged, be it local or provided as a service. In either case, data engineers work toward building an automation framework that can be shared across multiple analytics products.<br /><br />The data engineer is also responsible for moving data from various sources to targets as part of product development. This is traditionally the extract and load portion of the ETL flow. This may include performing basic data profiling and implementing the storage of historical data sets in preparation for later analytics. This ensures that the data engineer understands, and has visibility to the data, up to and including the base data sets used by the analytics engineer.<br /><br /><strong>Analytics Engineer</strong><br />Analytics Engineering combines the traditional BI roles of analyst, ETL developer, DBA, dashboard/report developer, and web developer. The analytics engineer works closely with the data engineer and customer to establish the data and analytic features required for a product. While the data engineering role acquires (extract and load) data from the source systems and people, the analytics engineer manipulates the data into the required form. This includes data modeling, transformation, and building basic analytic models.<br /><br />The joint responsibilities of these roles include performance monitoring and tuning, as well as developing data services that other products consume. It is important to understand that these roles are fluid and are intended to help structure and expose the types of work being done by the team.&nbsp;<br /><font size="2">[1]&nbsp;<span style="color:rgb(0, 0, 0)">Inverse Conway Maneuver (</span><a href="https://www.thoughtworks.com/radar/techniques/inverse-conway-maneuver">https://www.thoughtworks.com/radar/techniques/inverse-conway-maneuver</a><span style="color:rgb(0, 0, 0)">).</span></font></div>  <div><div class="wsite-image wsite-image-border-medium " style="padding-top:0px;padding-bottom:0px;margin-left:0px;margin-right:0px;text-align:left"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/editor/d-a-eng-ven.png?1631303981" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%">Data and Analytics Engineering Roles</div> </div></div>]]></content:encoded></item><item><title><![CDATA[If you have Shadow IT in your world, you have already failed.  - Part 3]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/if-you-have-shadow-it-in-your-world-you-have-already-failed-part-3]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/if-you-have-shadow-it-in-your-world-you-have-already-failed-part-3#comments]]></comments><pubDate>Wed, 28 Oct 2015 14:50:08 GMT</pubDate><category><![CDATA[Uncategorized]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/if-you-have-shadow-it-in-your-world-you-have-already-failed-part-3</guid><description><![CDATA[There is nothing I find more exciting than finding a small team who has build something great for their customers without the official blessing of some corporate team. Unfortunately, rolling it out to the larger company can be a disaster.      In the first post in this series, I discussed how a team of developers can protect and isolate themselves from the corporate IT team and it's oppressive standards. In Part 2, I discussed a cultural shift IT could adopt to provide some structure and light g [...] ]]></description><content:encoded><![CDATA[<div class="paragraph" style="text-align:left;">There is nothing I find more exciting than finding a small team who has build something great for their customers without the official blessing of some corporate team. Unfortunately, rolling it out to the larger company can be a disaster.</div>  <div>  <!--BLOG_SUMMARY_END--></div>  <div class="paragraph" style="text-align:left;">In the first post in this series, I discussed how a team of developers can protect and isolate themselves from the corporate IT team and it's oppressive standards. In Part 2, I discussed a cultural shift IT could adopt to provide some structure and light governance to Shadow IT. The final piece of the puzzle is for the development team to adopt some basic standards that make it easy to integrate with the larger organization and take their small app. to the entire company.<br /><br /><font size="5"><strong>First Principle</strong></font><br />Even if no one provides a set of big rules for you to follow when you are designing an application, it's helpful to be able to articulate *"how"* you build something. The first principle should always be that at some time, someone else will need to use what I (we) have just made. Even if this thing is a small one-off to solve a very specific problem.</div>  <blockquote style="text-align:left;">&#8203;Someone else will need to use what I have just made.</blockquote>  <div class="paragraph" style="text-align:left;">&nbsp;This applies even if what you are developing is only for your use. At some point, you will want to look at it again to help solve another problem and having clear documentation will be invaluable. These rules don't apply only to traditional code either. Being able to understand the data and business logic in an Excel spreadsheet can be extremely difficult. I can't begin to count up the hours I've spent trying to find an old spreadsheet only to spend more time trying to decipher a bunch of nested links.<br /><br />So, let's assume you are a developer for a large global IT shop building a great product for a small set of users in some regional data center. Your managers have done a great job convincing their managers that everyone in the company should be using your application. As a developer, what could you be doing to help move this project along?<br /><br />I think the following list is a good set of guidelines for building anything you (or someone else) might need later.&nbsp;<br /><br /><font size="5"><strong>At some point &hellip;</strong></font><br /><strong>1. Someone else will need to access your data</strong><br /><em>You need both a GUI and an API.</em><br /><br /><strong>2. Someone else will need to see your documentation</strong><br /><em>The GUI and API must be obvious.<br />The API must be self documenting.</em><br /><br /><strong>3. Someone else will need to reverse engineer part or all of your application</strong><br /><em>The code must be easy to figure out.</em><br /><br /><strong>4. The incoming data will change</strong><br /><em>Validate everything coming in.<br />Validate everything going out.</em><br />&nbsp;&nbsp; &nbsp;<br /><strong>5. The outgoing data will need to be changed</strong><br /><em>The code must be easy to change.</em><br /><br /><strong>6. The business logic will change</strong><br /><em>Make configuration changes not code changes.&nbsp;<br />Test everything based on the outcomes of the business logic.</em><br /><br />The bottom line is simple. Make it as easy as possible for someone else to use what you've made. -<a href="http://ctt.ec/Lov77" target="_blank">Click to Tweet</a></div>]]></content:encoded></item><item><title><![CDATA[Ten self-reinforcing technologies - Part 2]]></title><link><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/ten-self-reinforcing-technologies-part-2]]></link><comments><![CDATA[https://www.minimumviablearchitecture.com/big-ideas/ten-self-reinforcing-technologies-part-2#comments]]></comments><pubDate>Tue, 27 Oct 2015 20:10:24 GMT</pubDate><category><![CDATA[development]]></category><category><![CDATA[devops]]></category><category><![CDATA[docker]]></category><category><![CDATA[hardware]]></category><category><![CDATA[lean startup]]></category><category><![CDATA[micro services]]></category><category><![CDATA[noSQL]]></category><guid isPermaLink="false">https://www.minimumviablearchitecture.com/big-ideas/ten-self-reinforcing-technologies-part-2</guid><description><![CDATA[Continued from - Part 1Previously published October, 21 2015There are currently ten top contenders for the most important technologies leading businesses are using to provide a competitive edge. All of these evolved from the need to creatively solve the significant issues faced by small teams trying to quickly deliver great products. Summarized simply as: "How do we build and deliver a product customers love and are willing to pay for as quickly as possible?"&#8203;      &#8203;1) Lean startupTh [...] ]]></description><content:encoded><![CDATA[<div class="paragraph" style="text-align:justify;">Continued from - <a target="_blank" href="http://www.minimumviablearchitecture.com/blog/ten-self-reinforcing-technologies-part-1">Part 1</a><br /><span>Previously published October, 21 2015</span><br /><br />There are currently ten top contenders for the most important technologies leading businesses are using to provide a competitive edge. All of these evolved from the need to creatively solve the significant issues faced by small teams trying to quickly deliver great products. Summarized simply as: "How do we build and deliver a product customers love and are willing to pay for as quickly as possible?"&#8203;</div>  <div>  <!--BLOG_SUMMARY_END--></div>  <div class="paragraph" style="text-align:left;"><font size="5">&#8203;</font><strong><font size="5">1) Lean startup</font></strong><br />The traditional route to starting a business is to have a good idea, write a business plan, use the plan to acquire funding, and then implement the plan. Sounds simple, but in practice, things rarely go according to plan. The number one failure point is that your great idea isn't something that enough people will buy to sustain your business model. The answer is simple, focus on finding a customer who will buy the simplest version of the product you can possibly make and then iteratively develop as quickly as possible. The core of this idea was first defined by Steve Blank simply described in the seminal Harvard Business Review article,&nbsp;<a target="_blank" href="https://hbr.org/2013/05/why-the-lean-start-up-changes-everything">Why the Lean Start-Up Changes Everything</a>.</div>  <blockquote style="text-align:left;">&#8203;One of the critical differences is that while existing companies execute a business model, start-ups look for one. - Steve Blank<br></blockquote>  <div class="paragraph" style="text-align:left;">The basis of this model is the continual testing of the business ideas through a process he refers to as &nbsp;Customer Development in which the entire founding team is directly engaged with potential customers to discover the combination of product, price, and delivery model customers are willing to buy.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0px;margin-right:0px;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/843632_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;There have been a number of tools developed to assist in the process and while these may look like the sections in a traditional business plan, the way they are executed is dramatically different and reflects the collaborative underpinnings of all the other technologies. This is a truly iterative and interactive process. Typically, the various canvases and worksheets <strong>[1]</strong> are printed out, hung on a wall and completed by the entire team as they gain feedback from potential customers. As the team continuously makes decisions, they ripple through each of the canvasses until a coherent business model is arrived at.&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/5748055_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;"><strong>The MVP</strong><br />In some cases, the creation of an actual sellable product may be delayed as multiple low fidelity versions are tried out. An example might be an iPhone application produced entirely in <a target="_blank" href="http://keynotopia.com">Keynote</a>, an Arduino driven <a target="_blank" href="http://openenergymonitor.org/emon/buildingblocks/how-to-build-an-arduino-energy-monitor">hardware prototype</a>, or a more finished <a target="_blank" href="http://www.surveybat.com">sellable prototype</a>&nbsp;<strong>[2]</strong>. These low fidelity products are referred to as Minimum Viable Products (MVP) because they represent an experiment to learn something about what a customer needs or wants, not necessarily a complete product. This concept of continuous experimentation and focus on delivering small units of targeted functionality is a core driving concept in these ten key technologies.&nbsp;<br /><br />What is the best way to size the MVPs? Stick with orders of magnitude. Build a product for your first paying customer, then ten customers, then your first hundred, nothing more. In practice, you want to build for two orders of magnitude (e.g., 1-10 customers, then 100-1000). Unfortunately, this important rule of thumb hides a nasty truth. The product you build for your tenth customer will be significantly different from the one you built for the thousandth. If it is software, understand this means a complete rewrite. If it is hardware, it will require significant process and or tooling changes. In both cases, it is effectively a complete redesign. The obvious solution is to build in extra capacity, be it process automation, bigger servers, or better software. However, this frequently leads to a situation where it is more difficult to quickly modify the product to meet not only the scaling needs but the inevitable feature changes. Alternatively, build products that are easy to modularize or dispose of from the start.</div>  <div class="paragraph" style="text-align:left;"><strong>&#8203;<font size="5">2) Micro services</font></strong><br />Micro services, Web Services, and Service Oriented Architectures (SOA) are ways of addressing the modularity problem. On the surface, it is easy to confuse these technology patterns because of their panacea status at various times over the last two decades. &nbsp;</div>  <blockquote style="text-align:left;">&#8203;A service-oriented architecture is a style of multi-tier computing that helps organizations share logic and data among multiple applications and usage modes. -Gardner, 1996 <strong>[3]</strong></blockquote>  <div class="paragraph" style="text-align:left;">&#8203;The basic idea is this: Clearly define a specific business domain <strong>[4]</strong> and expose needed data in a way that is easy for other systems to consume. The different flavors simply reflect interface details and vendor marketing. By and large, SOA and Web Services have been coopted by software vendors to sell an entire class of software called Middleware.&nbsp;<br /><br />In a large company, you typically find suites of vendor specific applications designed to integrate well with each other but little to no capability to integrate with systems from other companies. Hence, the need for large and complex middleware.<br /><br />Middleware comes in many flavors. Generally, it can be grouped into three classes. Enterprise Information Integration (EII) promises to make all of your data seamlessly available, in realtime, regardless of original format. Enterprise Application Integration (EAI) promises to weave data together with complex business logic in a way that applications can subscribe to just the data they need. Not to be left out, Extract, Transform, and Load (ETL) is frequently added to the mix to address the issue of bulk data transfer. &nbsp;Collectively, these are referred to as an Enterprise Service Bus (ESB). As you can guess from their names, the intended audience for these applications are large enterprises with complex systems.&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/5736688_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;There are many problems with this middleware integration model. First it is costly and complex, not; typically requiring a separate Integration Services Organization just to manage the infrastructure, service definitions, and development. This centralization requires project requests to be prioritized and driven by external organizations resulting in unnecessarily extended delivery timelines. Secondly, this centralization reduces the resiliency of the system in such a way that any outage or a reduction in service of the Service Bus can inadvertently affect every system in the company. Finally, a centralized and single vendor service bus makes it nearly impossible to change vendors or make large scale infrastructure changes possible. Taken together, the Enterprise Service Bus exposes a company to significant competitive risks that far outweigh any benefits.<br /><br />Micro services are a better answer because they offer faster delivery, developer independence, system resiliency, and potentially lower costs. What is a micro service (microservice / micro-service)? Simply put, it is a way of creating applications which are purposeful, small, flexible, composable, and compostable. Think of micro services as big iPhone apps that are built to scale, be shared, and be swapped out as needed.<br /><br />Martin Fowler has a longer more technically accurate definition:</div>  <blockquote style="text-align:left;">&#8203;In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often a HTTP. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. <strong>[5]</strong></blockquote>  <div class="paragraph" style="text-align:left;">Traditionally, big applications (and even smaller ones) are built to be self contained and deliver broad functionality. They typically have a user interface, an application tier, and a database tier. If they integrate with other systems, it is either within a suite from the same vendor (e.g., SAP) or unofficially through an ESB or direct database connections. These applications can be referred to as *Monoliths*. From a deployment perspective, the monolithic application is typically treated as a single entity and very seldom does an upgrade to the application not affect the database and user interface. In smaller applications, this is not a problem but as applications and organizations scale, this becomes a significant constraint on the ability to deliver changes quickly.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/8634224_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;Managing monolithic applications in large companies is further complicated by the fact that the support and development teams are grouped by the tiers of the application. In the most dramatic example, entire development teams may support multiple, unrelated applications. &nbsp;<br /><br />This was previously mentioned in the ESB example but also applies to Business Intelligence and Infrastructure functions as well. The default organizational response to complexity and size is to group people by <em>jobs</em>&nbsp;and then split applications up by those same jobs. Shared applications become <em>Common Services&nbsp;</em>and even within application teams, you have such things as <em>front-end</em>&nbsp;and <em>back-end</em>&nbsp;developers. This organizational structure is not necessarily a problem but it can significantly impair flexibility and delivery. This propensity is referred to as Conway's Law <strong>[6]&nbsp;</strong></div>  <blockquote style="text-align:left;">&#8203;Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization's communication structure. - Mel Conway</blockquote>  <div class="paragraph" style="text-align:left;"><strong>Breaking the Monolith</strong><br />What then is an alternative structure? Align developers to customers and have them focus on delivering purposeful, small, flexible, composable, and compostable applications. One team, One service, Total responsibility.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/1149146_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;Small team size is the key. Small teams are better able to communicate with the customer and each other. The increased communication directly translates into agility to respond to changes; it also instills ownership in the end product. The catch is that small teams may be limited in the complexity of product they can produce. However, in an organization developing micro services, this is an advantage.<br /><br />Consider the situation where a company wants to migrate from a dedicated local HR Application to a hosted HR suite. It is highly likely that there will be missing functionality in the new application and as a result, hard cut-over will be impossible. How can this be addressed? First, look at the required functionality. Perhaps the new application doesn't offer time recording as a feature. Acknowledgement of this fact and the prioritization of Attendance as an important business service should be easy. Second, dedicate a small team to the problem and have them focus on creating the best Attendance system they can, as quickly as possible.</div>  <blockquote style="text-align:left;">"If you can't feed a team with two pizzas, it's too large" - Jeff Bezos <strong>[7]</strong></blockquote>  <div class="paragraph" style="text-align:left;">This team has complete ownership for the solution and the authority to work with any and all customers they identify as key. Most importantly, they own this service going forward. Whether they choose to utilize another hosted service or write their own is their decision. <strong>[8]</strong></div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/7149832_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">One of the key attributes of the micro services architecture is that every service be composable. This means that a service exposes key functionality to other services in a way that is stable, well documented, and easy to interface with. This legibility makes it possible to leverage the functionality in other services in a consistent manner. This ease of use means that it is simple to build up new services. For instance, it may now be trivial for a team to build a "Find a back-up service" by integrating multiple services into something completely new.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/8514147_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;The final attribute, compostability, refers to the fact that these small, discrete services are under constant revision and when they are no longer needed, they are shut down entirely. It also refers to the ability to dynamically scale to meet consumer demand, increasing and decreasing the number of nodes as needed.<br /><br />Unfortunately, micro services are not the answer to every problem. The added complexity is definitely not appropriate for the initial versions of a product. Typically, it is much easier to build initial versions as monoliths. &nbsp;It is hard to imagine that Amazon started out this way.</div>  <blockquote style="text-align:left;">&#8203;Amazon.com started 10 years ago as a monolithic application, running on a Web server, talking to a database on the back end. This application, dubbed Obidos, evolved to hold all the business logic, all the display logic, and all the functionality that Amazon eventually became famous for: similarities, recommendations, Listmania, reviews, etc. ... This went on until 2001 when it became clear that the front-end application couldn&rsquo;t scale anymore. <strong>[9]</strong></blockquote>  <div class="paragraph" style="text-align:left;">However, there are key design decisions that can comfortably be made in early versions which can make breaking up the monolith much easier in the future. Fortunately, the remaining eight &nbsp;technologies all provide this level of flexibility. <strong>[10]</strong><br /><br /><font size="5"><strong>3) DevOps</strong></font></div>  <blockquote style="text-align:left;"><span>... Giving developers operational responsibilities has greatly enhanced the quality of the services, both from a customer and a technology point of view. The traditional model is that you take your software to the wall that separates development and operations, and throw it over and then forget about it. Not at Amazon. You build it, you run it. This brings developers into contact with the day-to-day operation of their software. It also brings them into day-to-day contact with the customer. This customer feedback loop is essential for improving the quality of the service. <strong>[9]</strong></span><br /><br />You build it, you run it. - Werner Vogles</blockquote>  <div class="paragraph" style="text-align:left;">&#8203;This is the key motivation behind the DevOps movement. In practice though it isn't enough to tell a development team that they are free to build the best service, using any tool they want, and that support is up to them. Successful implementation of a Continuous Deployment pipeline requires a large number of integrated tools and processes to be successful. Furthermore, these systems must be as automated as possible. If successfully implemented, the cycle time for a release can be brought down from months, as is typical in monolithic corporate systems, to hours or less. <strong>[11]</strong><br /><br />Common Services definitely have a place in a DevOps environment. However, they should supply not only the core server, networking, security, and management infrastructure, but the tooling to support the Continuous Build and Integration processes. The list of these required additional services is overwhelming but the DevOps centric development frameworks typically pre-integrate with a number of the more common support tools such as GitHub for the Code Repository or AWS AMI or Docker Hub for the Image Repository. The more mature frameworks have easy to use Build, Integration, and Testing pipelines as well. <strong>[12]</strong> &nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/5578000_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;One word of caution. If you are in the experimentation phase, many of these integration tasks can and should be done manually. The goal is to improve the product to the point where you will need the underlying automation. Until then, you don't need to solve these problems. &nbsp;Fortunately, most of the more common supporting applications scale up well and support a high degree of interoperability. As a result, changing a monitoring and logging framework at a later date may have little impact on an application.</div>  <blockquote style="text-align:left;">"You don't have that problem yet." - Anonymous<br></blockquote>  <div class="paragraph" style="text-align:left;">Creating a DevOps environment from scratch is a daunting task requiring many people with a wide ranging set of skills, and a significant investment. Fortunately, at early stages of a product, particularly with monolithic early versions, developers can easily handle these tasks given the right development strategy and tools.<br /><br /><font size="5"><strong>4) Full Stack development</strong></font><br />When we looked at the monolithic HR application previously, it was noted that the various tiers of the application were supported by different development organizations. One of the drivers for this differentiation is the fact that each tier of the application is written in a different and unrelated language. While it is possible that a senior developer may be fluent in more than one language it is unlikely that a junior will be.&nbsp;<br></div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/9824192_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">This presents two issues. One, this specialization severely limits the ability of a developer to assist another group in the event they are understaffed. More importantly, it limits the ability of a developer to understand the full scope and intention of the application. In the event the application must integrate with other services (e.g., reporting), it may be extremely difficult understand the logic between the database and the web interface.&nbsp;<br /><br />There is a better solution to this issue. Due to advances in the Javascript language, most notably <a target="_blank" href="https://nodejs.org/en/">Node.js</a>, it is now possible to write an entire application in one language, Javascript. When this is coupled with a database that provides a native Javascript interface, any developer can now participate in the delivery of new features within any portion of the application, at any time, with minimal disruption to the team. The benefit of this cannot be over emphasized. Having one central language means that you have one unified development team who can truly and easily &nbsp;take full responsibility for the application they have built.&nbsp;<br /><br />Having &nbsp;a unified development stack means that support is also greatly simplified as well. Node applications are inherently scalable and most Full Stack frameworks like&nbsp;<a target="_blank" href="https://angularjs.org/">AngularJS</a>, <a target="_blank" href="http://emberjs.com">Ember</a>,&nbsp;<a target="_blank" href="http://hapijs.com">Hapi</a>, and <a target="_blank" href="https://www.meteor.com">Meteor</a>&nbsp;support the development of functional MVP web applications up to world class consumer e-commerce sites. <strong>[13]</strong> There is even a framework for building cross platform desktop applications (<a target="_blank" href="https://github.com/nwjs/nw.js">nwjs.io</a>) and for converting these applications to native mobile apps (<a target="_blank" href="http://phonegap.com/">PhoneGap</a>).&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/4423358_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;Under the covers, the web interface is traditional HTML, CSS, and Javascript. The data being exchanged with the server is in the standard Javascript Object Notation (JSON) format . On the server side, all code is written in Javascript. This provides an interesting advantage for a developer. It is not only possible, but it is a best practice to reuse server side code on the client and vice versa.&nbsp;<br /><br />Consider validation. It is now possible to write one validation function and execute it on the client to pre-validate form input, then use the same code to validate the data before it is written to the server, and then again when the data is read from the server and sent to the user's browser or to another application through an Application Programming Interface (API).&nbsp;<br />&nbsp;<br />If you are used to traditional web applications, you might be wondering where the web server is. In a Node based application, Node is the web server. Part of your application will include writing the server, yet another simplification to speed development and improve supportability.&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/9697223_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">Some of the frameworks, notably hapi.js, even support advanced web server features like proxying &nbsp;to allow you to seamlessly redirect traffic. This can be useful to redirect legacy web traffic to a new application. This technique is critical to being able to successfully break up monolithic applications. Another traditional web server feature built into hapi.js is caching. This allows a developer to easily manage complex caching behavior directly within the application without having to manage the configuration on an external web server, this greatly simplifies the application architecture. <strong>[14]</strong><br /><br /><font size="5"><strong>5) Reactive applications</strong></font><br />Web applications have always been slower than native applications. Think Microsoft Word running on your laptop versus Word running in a web browser. Reactive web applications are not only an answer to the issue of latency but also a way to provide applications with real time interactivity.<br /><br />In a Full Stack framework, the web application is typically a Single Page Web Application (SPA). This means that the entire web GUI is sent to the user's web page only once and it contains all of the application and presentation logic. Because all of the application code is in the users web browser, and there are no browser requests back to the server for new web pages, any changes to the interface occur instantaneously. That is assuming no new data needs to be sent to and from the server. Solving the latency for data transfers has been a significant area of development recently and has led to the creation of Reactive Web Frameworks and Reactive Databases. <strong>[15]</strong></div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/7655420_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">In a Single Page Application, application latency is largely attributable to the transfer of data. One method of solving this in the past has been to use Asynchronous Javascript and XML (AJAX) to progressively retrieve data from the web application server. Reactive web frameworks like Meteor extend this approach by implementing a client side data cache. In effect, there is a mini version the noSQL database back end running in the web browser. When a user sends a request to the database, it is first written to the mini database and the client interface is instantly updated. In the background, the client code updates the database and if the results happen to be different, the webpage is re-updated. To the user, all of this is invisible and instantaneous, even if there is a significant delay in the back-end application.<br /><br />Similar to the validation example, the code used to interface with the in-browser database and the actual database is identical. No need to implement a cache with a different API. From a client perspective, database updates appear nearly instantaneous because of this local data cache. On the server side, Meteor leverages the <a target="_blank" href="http://socket.io/">Socket.IO</a>&nbsp;package to create a real-time connection to the database so that it appears that any changes on the database are automatically pushed to the client and the web page is automatically updated without having to refresh the page. This means that it is possible to create multi-user applications which automatically reflect the real-time status of all of the other users of the application. Furthermore, Meteor supports a feature they call Hot Code Push. Hot Code Push allows a developer to push code changes to production and Meteor will seamlessly update the client code on all connected application users. This ensures that every user instantly has the most recent version of the application running on their browser or iPhone.<br /><br />Meteor's reactive extensions to MongoDB and Redis provide a quasi-realtime interface between the database and the application. <a target="_blank" href="https://www.rethinkdb.com">RethinkDB</a>&nbsp;provides a native realtime interface by bi-directionally streaming data between the application and database. This allows developers using other web frameworks supporting Socket.IO to also build true realtime applications.<br /><br /><font size="5"><strong>6) Keys, values, and JSON</strong></font><br />As previously mentioned, in the past, web applications exchanged data with other systems using a variety of formats. Applications and browsers exchanged URLs and HTML. Applications and databases communicated through native database software, and if an application exchanged data with another system the data format could be plain text, raw XML, SOAP XML, or JSON. &nbsp;Modern web frameworks have settled the debate. The default data interchange format is now JSON. <strong>[16]</strong><br /><br />The trick to understanding JSON is to understand Key : Value pairs. A Key : Value pair is a way of describing a thing (e.g., name) and an attribute of that thing (e.g., Bob). This can be written as "name" : "Bob". In Javascript, this is called an Object, hence the name Javascript Object Notation or JSON. The Javascript specification extends this simple structure to support arrays, which are groupings of things like "color": ["red","blue", "green"]. &nbsp;&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/8118293_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">These two primitives can be combined in a multitude of ways to describe many types of complex relationships and because they are native Javascript structures, it is easy to query, read, and manipulate them. An added advantage is that a JSON object represents a complete aggregation of the data for that object. This can include complex nesting of objects. No need to join multiple sets of data together or ensure that every object attribute is present. In this way JSON is a more natural way to model something. As a result, it is typically much faster to model data in JSON format.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/2408336_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;"><font size="5"><strong>7) Document databases</strong></font><br />While there have always been many different types of databases (e.g., Relational, Object, XML, etc.) the relational database has been the dominant type for at least the last thirty years. The key concept of a relational database is that it takes a complex issue like how many &nbsp;phone numbers a person has and decomposes this data into separate tables in the interest of saving space. This process is called normalization and it minimizes the redundancy of data within the database which makes the database smaller.&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/8932267_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">The primary advantage of Relational Database Management Systems (RDBMS) is that they are typically very fast and ensure a single point of truth for the data at any point in time. However, having a very efficient complex but complex data model makes it difficult for a developer to consume the data because they need to understand how many different but related tables need to be combined together in a query. In order to relieve this problem, it is common practice to recombine the data &nbsp;into easy to consume views (denormalization)&nbsp;in order to simplify the use of the data.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/8015899_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;Relational databases also require a database application. This seems obvious but it is not actually a given. Javascript based applications can be, and frequently are written with the JSON object (the database) simply embedded in the Javascript as a variable or written to a file. As a result, when it comes time to migrate to an actual database, few changes are required in the application. While it is possible to mock up data from a relational database as a flat file for an application, moving to the actual database requires a significant refactoring of the data. This becomes even more difficult if the data is to be written to multiple tables.<br /><br />Document databases are a response to this complication. Document databases store their data in JSON format, return data to applications in JSON format, and typically are queried using JSON format. As a result, it is very natural for a developer to use a document database. <strong>[17]</strong><br /><br />The JSON syntax also offers sufficient flexibility to model most relational data and while the Key: Value structure may have some inefficiencies, it is much more efficient than storing both normalized and denormalized views of the data. Furthermore, because a query against a document does not require joins, document databases are typically much more responsive. &nbsp;<strong>[18]</strong></div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/4148399_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">Document databases are still relatively young and there are a number of prominent variations. Together these are referred to as noSQL Databases.</div>  <blockquote style="text-align:left;">&#8203;noSQL is a hashtag and nothing more. <strong>[19]</strong></blockquote>  <div class="paragraph" style="text-align:left;">There are many variants of noSQL database structures, all appropriate for specific use cases. Selecting the right one depends on the specific requirements you have. The most popular solution for development at this time is to use MongoDB as the document store and Redis as the caching store. However, there are many other options to choose from, including dedicated proprietary databases from Amazon, Google, and Microsoft.<br /><br /><strong>Pure Document databases -</strong>&nbsp;These databases store document in some form of JSON structure and typically offer a great deal of flexibility and scalability. They frequently support special indices on specific data types: single, compound, and multi-field indices like in a relational database, full text indeces allowing an application to support freeform search on text fields, and geospatial indices to support proximity based searches. &nbsp;<br /><strong>Examples:</strong>&nbsp;<a target="_blank" href="https://www.mongodb.org">MongoDB</a>,&nbsp;<a target="_blank" href="http://couchdb.apache.org">CouchDB / PouchDB</a>, <a target="_blank" href="https://www.rethinkdb.com">RethinkDB</a>, &nbsp;<a target="_blank" href="https://crate.io">Crate.io</a><br /><br /><strong>Key / Value databases -</strong>&nbsp;These special purpose databases support a very simple document structure of a single indexed key and an associated value. The value can be any type of data imaginable. This provides a great deal of flexibility when you need data based on one and only one key. &nbsp;These systems are typically used in high volume / low latency situations and the data is generally stored in memory not on disk. &nbsp;<br /><strong>Examples:</strong>&nbsp;<a target="_blank" href="http://redis.io">Redis</a>, <a target="_blank" href="http://memcached.org">Memcached</a>, <a target="_blank" href="https://github.com/nathanmarz/elephantdb">ElephantDB</a>, <a target="_blank" href="https://aws.amazon.com/dynamodb/">DynamoDB</a><br /><br /><strong>Columnar databases -</strong>&nbsp;These databases are more similar to relational databases and some variants even support joins and SQL. However, because the basic data structure is a single table, they avoid a number of the scaling issues of relational databases. &nbsp;<br /><strong>Examples:</strong>&nbsp;<a target="_blank" href="http://cassandra.apache.org">Cassandra</a>, <a target="_blank" href="http://hbase.apache.org">HBase</a>, <a target="_blank" href="https://www.vertica.com">Vertica</a>, <a target="_blank" href="https://aws.amazon.com/simpledb/">SimpleDB</a><br /><br /><strong>Graph databases -</strong>&nbsp;These databases are designed to store the relationships between objects. These systems typically support special analytics queries like shortest path, nearest neighbor, and clustering. &nbsp; &nbsp;<br /><strong>Examples:</strong>&nbsp;<a target="_blank" href="http://neo4j.com/">Neo4j</a><br /><br /><strong>Multi-Modal databases -</strong>&nbsp;These are noSQL databases supporting multiple types of documents. They offer a great deal of flexibility, typically supporting Key : Value, Document, and Graph modes within the same database. &nbsp;<br /><strong>Examples:</strong>&nbsp;<a target="_blank" href="https://www.arangodb.com/">ArangoDB</a>,&nbsp;<a target="_blank" href="http://orientdb.com/orientdb/">OrientDB</a><br /><br />As you can see, there are many options within the noSQL database world and each database has its own strengths and weaknesses. The best rule of thumb is to start with the simplest system possible that meets the requirements and nothing more. Only as data volumes and complexity grow, should the focus turn to scalability.<br /><br /><font size="5"><strong>8) Database scalability</strong></font><br />Improving database scalability requires a number of factors to be balanced and different techniques can be combined to achieve numerous results. Some combinations maximize sheer scale, some maximize availability, some maximize capacity and utilization. There isn't one right way to scale a system and it's an art to balance the needs and constraints of a particular database at any given time.&nbsp;<br /><br /><strong>1. Scale up the hardware -</strong>&nbsp;This is the obvious first line of defense but it suffers from the limitation that hardware can only scale to a certain size. Intentionally under provisioning it to meet some future need is an extremely inefficient use of resources. A better solution would be to keep to the order of magnitude rule of thumb and size the system as appropriately as possible but with a 10x capacity buffer. Remember, by the time you need the extra capacity, you will probably need a new architecture. &nbsp;<br /><br /><strong>2. Mirroring with failover (Hot / Cold standby) -</strong>&nbsp;Mirroring can help to address the availability issue by providing an alternate system in the event the primary system is offline. This is an expensive alternative, but for smaller databases, it may be acceptable, particularly in virtual environments where there is shared data (e.g., NAS) and no cost to maintain offline system images. &nbsp;<br /><br /><strong>3. Clustering -</strong>&nbsp;The next step up in functionality and complexity is to cluster multiple systems together so that they appear as one. There are multiple ways to accomplish this: clustered servers with shared data storage, or clustered servers with dedicated copies of the data. One complication with clustering schemes is that you begin to run into concurrency issues when multiple users write to multiple systems at the same time. The simplest option is to designate a single server to accept writes and all of the other servers are read only. This is referred to as a single master cluster. The more sophisticated option is to accept database writes to any server. This is referred to as a multi master cluster. Obviously, a multi master cluster is superior, but it is also more complex. There are also situations, like reporting, where you would want to maintain tight control over the nodes that can be elected to accept writes. You would never want a read only reporting replica to become the master except in cases of extreme fail over.<br /><strong>NOTE:</strong> For non-database systems, clustering behind a load balancer is the typical method for simultaneously improving availability and capacity.<br /><br />In parallel with the first three options, the data needs to be carefully analyzed to determine if there are ways to optimize data organization to improve query latency and data scalability. This typically involves grouping or splitting up the data in different ways.<br /><br /><strong>4. Horizontal Partitioning -</strong>&nbsp;If the constraint is storage, then aggressively normalizing the data can have significant benefits because the data is no longer being duplicated in multiple tables (e.g., 3rd Normal Form). This leads to a significant increase in the complexity of the tables but paradoxically, it can increase the flexibility of the system because disparate data can now be flexibly linked together to answer a wide variety of business questions not explicitly modeled in the database. Compromises to this in relational systems are possible, with the most popular being the Star Schema wherein the measurable (quantitative) data is placed in the fact tables and the descriptive (qualitative) data is placed into dimension tables. This structure is ideal for reporting purposes but sub-optimal for transactional systems requiring low write latency because of the volume of data in the fact table.<br /><br /><strong>5. Vertical Partitioning -</strong>&nbsp;At some point, the data volumes in a table can not be effectively queried or even written to. The last remaining option is to split the data into logical groups and to store some of the data in another location, typically another table but it could also be another server. This is referred to as vertical partitioning. Managing data in another table is not particularity complicated, but when the data is split across multiple server nodes, knowing what server the data is on presents a difficult query problem. In a relational database system, this issue is drastically compounded because you also need to maintain the joins to related tables that may be on multiple nodes.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/612097_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">The complexity of maintaining the referential integrity across large volumes of data in a relational database system severely limits the scalability and potential cost of these systems. Taken together, clustering and partitioning are known as horizontal scalability. Fortunately, noSQL databases are built from the ground up with horizontal scalability in mind.&nbsp;<br /><br /><font size="4"><strong>noSQL scaling</strong></font><br />In noSQL systems, the two basic methods of scaling using clustering and partitioning apply. In the most basic form, you replicate data across multiple servers, with each server holding identical copies of the same data. In some systems, you have fine grained control of the replication scheme. Some examples are: allowing for delayed replication in the case that a database change needs to be rolled back, regional replication across continents to provide robust disaster recovery, low latency read only replication, and memory only replicas for extremely low latency caching of data within the cluster.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/9501539_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;The second clustering option is to horizontally partition the data across multiple cluster nodes. In noSQL systems, this partitioning is trivial because a single document contains all of the data pertinent to that document. There are no data relationships to manage like in a relational database. Because documents are never split across nodes in the cluster, the query router only needs to manage how the collections of documents are split and where they are located. In most cases, it is possible to <em>shard</em>&nbsp;the data in such a way that completely avoids querying multiple servers. This provides both scale and speed. Furthermore, horizontal partitioning is combined with replication to achieve the impossible: a database system that is very large, very fast, highly available, easy to support, and easy to modify.</div>  <blockquote style="text-align:left;">Scale, Speed, Availability, Supportability, and Flexibility. Pick all five.</blockquote>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/7854510.jpg?428" alt="Picture" style="width:428;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">While it seems like noSQL databases are the answer to every data management problem, there are two areas where traditional relational databases still maintain distinct advantages. First, the ability to freely join many tables of data provides a great deal of flexibility when it comes time to answer ad-hoc questions across multiple types of data. The document centric focus of noSQL systems means that if you do not have the data in a document you need, or if it is not structured in the way you need it, you may need to run background processes to create new documents with the form you need. For most noSQL databases, this is provided by a Map / Reduce aggregation batch process. But, if you need to support ad-hoc reporting, relational data warehouses and data marts still have a place. A second issue with noSQL databases is that they typically take an <em>eventual consistency</em>&nbsp;attitude to the replication of data across nodes. This means that the data you write to the database will <em>eventually</em>&nbsp;be written to every node. Unfortunately, it may be possible for a query to return stale data. The tradeoff is speed and scalability with timeliness. Relational systems go to great lengths to avoid this problem and this feature accounts for the cost and complexity differences between these two database architectures.<br /><br /><font size="5"><strong>9) Open Hardware</strong></font><br />Given the fact that Full Stack web development platforms and noSQL databases are built to scale from one server to thousands, companies have started to critically assess their hardware requirements. If you have data needs requiring large clusters of dedicated servers coupled with application software providing flexible scalability and resilience to failure rather than a reliance on hardware resiliency, you may be able to deploy servers without all of the <em>Enterprise Grade</em>&nbsp;features like Registered Error correcting RAM (ECC RDIMM), redundant power supplies, hot swappable disks, and complex SAN and RAID controllers.<br /><br />The problem was so significant at Facebook that they have championed the idea of building their own custom servers and open sourcing the hardware so that other companies can benefit and improve upon their designs. <strong>[20] </strong>As a result, server hardware has become completely commoditized and there is little incentive for a company to purchase anything other than <a target="_blank" href="http://www.opencompute.org">Open Compute Project</a>&nbsp;(OCP) compliant hardware in many situations. <strong>[21]</strong></div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/6711792_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;What about scaling way down? Open Hardware projects like <a target="_blank" href="https://www.raspberrypi.org">Raspberry Pi</a>&nbsp;enable the creation of micro-clusters at prices well below traditional servers. These small computers have severely limited capacity but at $40.00 a node, for the price of one Amazon t2.micro instance <strong>[22]</strong> you could have a three node cluster of Raspberry Pi servers running Node or Docker. What kind of interesting applications could be developed specifically for this platform? <strong>[23]</strong></div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/6886593.jpg?71" alt="Picture" style="width:71;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">Realistically, you would never use a computer as limited as a Raspberry Pi as a server, but there are situations where it would be beneficial to have dedicated hardware, and a full size server would be too much. An alternative may be to turn to Micro-Servers. Advanced Micro-Servers are designed to provide dedicated hardware within a high density enclosure (e.g., <a target="_blank" href="http://www8.hp.com/us/en/products/servers/moonshot/">HP Moonshot</a>). This highly proprietary server comes with significant capacity, power, cooling, and networking advantages over traditional servers for certain workloads.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/5543352_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;Along with massive integration, these Micro-Servers forego the traditional server CPUs (e.g., Intel Xenon) for very low power CPUs&nbsp;(e.g., Intel Atom based Avaton / Xenon D). The sacrifice in raw computing performance is made up for in power and thermal efficiencies. <strong>[24]</strong><br /><br />The price, performance, and power of these CPUs makes them the ideal choice for most workloads and definitely the preferred choice for development and pre-production servers. Fortunately, these CPUs are available in more traditional server chassis and motherboard configurations from most of the commodity motherboard manufacturers. This second class of general Micro-Servers, while not technically OCP compliant, offer a compelling alternative to higher end enterprise class machines from HP, Lenovo, Cisco, and Dell.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/1978608_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;"><font size="5"><strong>10) Containers</strong></font><br /><strong><font size="4">Hypervisors</font></strong><br />We have long been at a point in time where servers are more powerful than the applications we can write. This presents a problem. How can we subdivide a server into smaller portions more properly matched to our capacity requirements? The answer is server virtualization. Virtualization offers the ability to locate many *Guest* servers onto a single *Host* server.&nbsp;<br /><br />There are two ways to implement this. In Type 2 virtualization there is a host operating system running virtualization software generically referred to as a Hypervisor. The Hypervisor is responsible for all of the resources (CPU, memory, and disk) assigned to the Virtual Machine (VM). Inside of this Virtual Machine, we have an Operating System and associated applications. &nbsp;&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/4539114_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">In Type 1 virtualization, the Hypervisor runs directly on the server hardware. In effect it is a specialized operating system designed to manage Virtual Machines (VM). The advantage of this type of virtualization is that it provides more resources to the VM and hence, greater server density.</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/4073045_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">From an operations standpoint, Virtual Machines offer huge benefits: better capacity utilization, easier server provisioning, application isolation, and a familiar support interface because a virtual server looks like a physical server to operations. If the applications are written for it, and the hypervisor management systems support it, provisioning of a new virtual server can be done in a matter of minutes.&nbsp;<br /><br />For a developer, this is a huge benefit. Developers gain the ability to provision a server, deploy their code, and then test in a matter of hours. If there is a great deal of consistency between the development, staging, and testing environments, as well as extensive automation, this can be cut down to minutes. The same goes for environments that can be dynamically scaled. Properly configured VM Images can be brought on line to meet additional demand in minutes. This is the way Amazon Web Services Elastic Beanstalk works.&nbsp;However, there is room for dramatic improvement.<br /><br /><font size="4"><strong>Docker</strong></font><br />The UNIX based operating systems have offered the ability to isolate system processes for years. What if you created isolated system processes capable of running a Guest Operating System, like a VM but without all the overhead of a Hypervisor? What if rather than having dedicated and isolated system libraries, you could share dependencies and make the system images much smaller. Finally, what if you could completely isolate system dependencies in such a way that a container could run on any system? &nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/4959150_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;If you accomplished all of these things, you would have <a href="https://www.docker.com" target="_blank">Docker</a>. Docker is a system that exposes Linux containers in an incredibly easy to use way. A Docker based development workflow looks like this:&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/3173298.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;"><strong>1.</strong> The developer downloads a container image from the image repository. &nbsp;<br /><strong>2.</strong> The developer writes their application code and commits it to the source code repository.<br /><strong>3.</strong> The developer writes a container *build script* to combine the source image, which is typically a very small bare bones Linux image, with the application code from the source code repository and any system libraries required by the application.<br /><strong>4. </strong>Once this build script is run, a completely self-contained container is created. This can now be uploaded into the Image Repository for promotion to any other Docker server or used as the basis for other applications.<br /><strong>5.</strong> If the application is to be composed of multiple applications, then another *composition script* can be written to define how application components are to be grouped together. This can even include resource utilization, scaling, networking, and host placement rules. The developers manage both the build and composition scripts in the same source code control application as the application code, therefore, making it easy for them to manage the entire application life cycle. &nbsp;<br /><strong>6.</strong> When it comes time to deploy the application code, all that is required is for the build and composition scripts to be executed and for the build pipeline to deploy the containers to the appropriate servers.<br /><br />It is at this point that the magic of containers comes into play. Rather than take minutes to deploy on a host server, containers take seconds or less. <strong>[25] </strong>As a result, it is now very feasible to enable fined grained elastic scaling for every application.&nbsp;<br /><br />Containers are so small and completely self contained, it is possible to create an application container on a developer laptop and run that exact same container in staging and production with no configuration changes. As a result, the Continuous Deployment process is greatly simplified because you no longer need to accomodate for different server configurations. This is a miracle for production support because even slight differences in deployment environments can be a nightmare to troubleshoot. Not to mention, you now have the ability to easily roll out or roll back different versions of an application in seconds.&nbsp;</div>  <div><div class="wsite-image wsite-image-border-none " style="padding-top:10px;padding-bottom:10px;margin-left:0;margin-right:0;text-align:center"> <a> <img src="https://www.minimumviablearchitecture.com/uploads/4/9/2/3/49236487/6177724_orig.jpg" alt="Picture" style="width:auto;max-width:100%" /> </a> <div style="display:block;font-size:90%"></div> </div></div>  <div class="paragraph" style="text-align:left;">&#8203;This deployment flexibility even extends to running containers in multiple container engines simultaneously. You could have containers at Amazon, Google, RackSpace, and a local ISP all running seamlessly! This a Hybrid Cloud that actually works. &nbsp;<br /><br />Of all of the technologies outlined above containers are the youngest. The 1.0 version of Docker was released in June 2014 and there have been constant improvements every month. It's young technology but this is how all applications will be managed and deployed in the future. As for production readiness of Linux containers, here is what Google has to say:</div>  <blockquote style="text-align:left;">Everything at Google, from Search to Gmail, is packaged and run in a Linux container. Each week we launch more than 2 billion container instances across our global data centers. <strong>[26]</strong></blockquote>  <div class="paragraph" style="text-align:left;"><font size="6"><strong>Summary</strong></font><br />Fortunately, all of these technologies are openly shared and are being aggressively implemented in companies of all sizes. One of the key reasons for this is the default adoption of Open Source software licensing and large scale adoption of code collaboration sites like <a href="https://github.com/" target="_blank">GitHub</a>&nbsp;and <a href="https://www.npmjs.com" target="_blank">NPM</a>. This significantly lowers the barrier to entry and provides a way for developers in multiple companies to collaborate transparently for the benefit of everyone who participates.&nbsp;<br /><br />Transparent participation is the cornerstone of this new way of doing business and an example of how you can take the seemingly gross disadvantage of perfect competition and turn it into an advantage. Companies who were founded on the idea that patents would protect you from competition have now discovered that patenting ideas actually decreases the rate of innovation.</div>  <blockquote style="text-align:left;">We find evidence that software patents substitute for R&amp;D at the firm level; they are associated with lower R&amp;D intensity. <strong>[27]</strong></blockquote>  <div class="paragraph" style="text-align:left;">Increasing the rate of innovation at the lowest possible cost is a major component of the first two values previously discussed. In fact, five of the ten innovations above would have been impossible without this level of openness. The other half fall under the category of shared or common practices designed to increase agility and collaboration. They all work together to provide a significant advantage to those who have adopted them. <strong>[28]</strong><br /><br /><font size="5"><strong>Missing pieces</strong></font><br />There are three noticeable absences from this list because they don't come into play until you have established a significant customer base, which is a result of creating a wildly successful and ambitious product. Collectively, these are referred to as <em>Big Data</em>&nbsp;and individually they are Hadoop, stream processing, and machine learning. The reason they are not included is that, for a young, small company, they violate the Fiscal Responsibility value.<br />They all require a significant initial capital investment as well as specialized skills. However, if you are a large, well established company with a significant volume of data to exploit, adopting these technologies can reduce licensing costs, improve the availability of the data, and provide new insights. Different problems require different solutions.</div>  <div><div style="height: 20px; overflow: hidden; width: 100%;"></div> <hr class="styled-hr" style="width:100%;"></hr> <div style="height: 20px; overflow: hidden; width: 100%;"></div></div>  <div class="paragraph" style="text-align:left;"><strong>[1]</strong>&nbsp;Best books on Lean Start-up: &nbsp;<br />Business Model Generation: A Handbook for Visionaries, Game Changers, and Challengers<br />(<a target="_blank" href="http://www.amazon.com/Business-Model-Generation-Visionaries-Challengers-ebook/dp/B00BD6RFFS/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1443573162&amp;sr=1-1&amp;keywords=business+model+canvas">http://www.amazon.com/Business-Model-Generation-Visionaries-Challengers-ebook/dp/B00BD6RFFS/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1443573162&amp;sr=1-1&amp;keywords=business+model+canvas</a>) &nbsp;<br /><br />The Startup Owner's Manual: The Step-by-Step Guide for Building a Great Company<br />(<a target="_blank" href="http://www.amazon.com/Startup-Owners-Manual-Step-Step-ebook/dp/B009UMTMKS/ref=pd_sim_351_2?ie=UTF8&amp;refRID=1MEA67NDFVD8MYJTJKH4&amp;dpID=51ZWp2QGZvL&amp;dpSrc=sims&amp;preST=_AC_UL160_SR124%2C160_">http://www.amazon.com/Startup-Owners-Manual-Step-Step-ebook/dp/B009UMTMKS/ref=pd_sim_351_2?ie=UTF8&amp;refRID=1MEA67NDFVD8MYJTJKH4&amp;dpID=51ZWp2QGZvL&amp;dpSrc=sims&amp;preST=_AC_UL160_SR124%2C160_</a>) &nbsp;&nbsp;<br /><br />The Lean Startup: How Today's Entrepreneurs Use Continuous Innovation to Create Radically Successful Businesses<br />(<a target="_blank" href="http://www.amazon.com/The-Lean-Startup-Entrepreneurs-Continuous-ebook/dp/B004J4XGN6/ref=pd_sim_351_3?ie=UTF8&amp;refRID=1691QV9XANAQ3QNNB2ND&amp;dpID=51gn6AuFkNL&amp;dpSrc=sims&amp;preST=_AC_UL160_SR106%2C160_">http://www.amazon.com/The-Lean-Startup-Entrepreneurs-Continuous-ebook/dp/B004J4XGN6/ref=pd_sim_351_3?ie=UTF8&amp;refRID=1691QV9XANAQ3QNNB2ND&amp;dpID=51gn6AuFkNL&amp;dpSrc=sims&amp;preST=_AC_UL160_SR106%2C160_</a>) &nbsp;<br /><br /><strong>[2]</strong>&nbsp;It is hard to underestimate the impact the role that "Maker" focused companies like:&nbsp;<a target="_blank" href="https://www.arduino.cc">Arduino</a>, <a target="_blank" href="http://fritzing.org/">Fritzing</a>, <a target="_blank" href="http://www.makerbot.com">Makerbot</a>, <a target="_blank" href="https://www.kickstarter.com">Kickstarter</a>, and <a target="_blank" href="https://www.etsy.com">Easy</a>&nbsp;have had on the rate of innovation in the hardware space.&nbsp;<br /><br /><font color="#2a2a2a"><strong>[3]</strong>&nbsp;It's hard to believe that one of the first uses of the term Service Oriented Architecture dates back to 1996 in a Gartner white paper "Service Oriented" Architectures, Part 1<br />(<a target="_blank" href="https://www.gartner.com/doc/302868?ref=ddisp">https://www.gartner.com/doc/302868?ref=ddisp</a>)<br />See: Service-Oriented Architecture Scenario<br />(<a target="_blank" href="https://www.gartner.com/doc/391595/serviceoriented-architecture-scenario">https://www.gartner.com/doc/391595/serviceoriented-architecture-scenario</a>) for a non pay-wall overview.</font><br /><br /><strong>[4]&nbsp;</strong>The seminal book on this subject is:<br />Domain-Driven Design: Tackling Complexity in the Heart of Software<br />(<a target="_blank" href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software-ebook/dp/B00794TAUG/ref=mt_kindle?_encoding=UTF8&amp;me=">http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software-ebook/dp/B00794TAUG/ref=mt_kindle?_encoding=UTF8&amp;me=</a>)<br /><br /><strong>[5]</strong>&nbsp;Microservices<br />(<a target="_blank" href="http://martinfowler.com/articles/microservices.html">http://martinfowler.com/articles/microservices.html</a>)<br /><br /><strong>[6]</strong>&nbsp;Conway's Law<br />(<a target="_blank" href="http://www.melconway.com/Home/Conways_Law.html">http://www.melconway.com/Home/Conways_Law.html</a>)<br /><br /><strong>[7]</strong>&nbsp;Inside the Mind of Jeff Bezos | Fast Company (<a target="_blank" href="http://www.fastcompany.com/50106/inside-mind-jeff-bezos">http://www.fastcompany.com/50106/inside-mind-jeff-bezos</a>)<br />&nbsp;<br />Jeff Bezos' 2 Pizza Rule: Why Small Teams Work More Productively (<a target="_blank" href="https://blog.bufferapp.com/small-teams-why-startups-often-win-against-google-and-facebook-the-science-behind-why-smaller-teams-get-more-done">https://blog.bufferapp.com/small-teams-why-startups-often-win-against-google-and-facebook-the-science-behind-why-smaller-teams-get-more-done</a>)<br /><br /><strong>[8]</strong>&nbsp;One of the Open Source tenets is that healthy discussion, debate, and competition are to be encouraged. In the short run, this may lead to duplicate effort but in the long run, a better system will evolve out of the struggle to best address the customer's needs.<br /><br /><strong>[9]</strong>&nbsp;This is well worth the read, both as a history and as guidance. In fact, if you only read one paper, this interview with Amazon CTO Werner Vogels is the one to read.<br />A Conversation with Werner Vogels - ACM Queue<br />(<a target="_blank" href="http://queue.acm.org/detail.cfm?id=1142065">http://queue.acm.org/detail.cfm?id=1142065</a>)<br /><br /><strong>[10]&nbsp;</strong>Building Microservices&nbsp;provides a thorough overview of micro services and the secondary infrastructure needed to support them in production.<br />(<a target="_blank" href="http://www.amazon.com/Building-Microservices-Sam-Newman-ebook/dp/B00T3N7XB4/ref=mt_kindle?_encoding=UTF8&amp;me=">http://www.amazon.com/Building-Microservices-Sam-Newman-ebook/dp/B00T3N7XB4/ref=mt_kindle?_encoding=UTF8&amp;me=</a>)&nbsp;<br /><br /><strong>[11]</strong>&nbsp;Challenges in Implementing MicroServices by Fred George<br />(<a target="_blank" href="https://www.youtube.com/watch?v=yPf5MfOZPY0">https://www.youtube.com/watch?v=yPf5MfOZPY0</a>)<br /><br /><strong>[12]</strong>&nbsp;Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation&nbsp;is the foundational book on the DevOps process.<br />(<a target="_blank" href="http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley-ebook/dp/B003YMNVC0/ref=pd_sim_351_3?ie=UTF8&amp;refRID=02BEQJ5WCAG9E7DXDPWX&amp;dpID=51yF2SYUi7L&amp;dpSrc=sims&amp;preST=_AC_UL160_SR121%2C160_">http://www.amazon.com/Continuous-Delivery-Deployment-Automation-Addison-Wesley-ebook/dp/B003YMNVC0/ref=pd_sim_351_3?ie=UTF8&amp;refRID=02BEQJ5WCAG9E7DXDPWX&amp;dpID=51yF2SYUi7L&amp;dpSrc=sims&amp;preST=_AC_UL160_SR121%2C160_</a>)<br /><br /><strong>[13]</strong>&nbsp;Hapi Thanksgiving; It is about systems of nodes scaling, not node scaling<br />(<a target="_blank" href="https://medium.com/ben-and-dion/hapi-thanksgiving-it-is-about-systems-of-nodes-scaling-not-node-scaling-5d96d900d904">https://medium.com/ben-and-dion/hapi-thanksgiving-it-is-about-systems-of-nodes-scaling-not-node-scaling-5d96d900d904</a>)<br /><br /><strong>[14]&nbsp;</strong>Proxying Services With Hapi.js<br />(<a target="_blank" href="http://tech.opentable.co.uk/blog/2014/11/28/proxying-with-hapi/">http://tech.opentable.co.uk/blog/2014/11/28/proxying-with-hapi/</a>) &nbsp;<br /><br />Dismantling the monolith - Microsites at Opentable - OpenTable Tech UK Blog<br />(<a target="_blank" href="http://tech.opentable.co.uk/blog/2015/02/09/dismantling-the-monolith-microsites-at-opentable/">http://tech.opentable.co.uk/blog/2015/02/09/dismantling-the-monolith-microsites-at-opentable/</a>) &nbsp;&nbsp;<br /><br />Caching (<a target="_blank" href="http://hapijs.com/tutorials/caching">http://hapijs.com/tutorials/caching</a>)<br /><br /><strong>[15]&nbsp;</strong>Reactive Design should not to be confused with Responsive web design which try to provide a web interface optimized for the device being used. This web design technique leverages CSS and Javascript to allow one code base to be seamlessly usable across multiple browsers and devices. This greatly simplifies the codebase and can even eliminate the need for the creation of dedicated applications for phones and tablets.<br /><br /><strong>[16]</strong>&nbsp;While this may be debatable, in the context of Full Stack development, applications should only support JSON. If a conversion is required do this through a separate gateway function (e.g., XML to JSON converter).<br /><br /><strong>[17]</strong>&nbsp;To be honest, the same can be said for relational databases supporting ANSI SQL. Unfortunately, both relational and document database vendors offer their own variants of the "standard" query language. Hopefully, the noSQL vendors will settle on their own equivalent to ANSI SQL for querying JSON.<br /><br /><strong>[18]</strong>&nbsp;Take performance benchmarks with a grain of salt, but I happen to like this one because of its openness and reflection of real world use cases.<br /><br />Benchmark: PostgreSQL, MongoDB, Neo4j, OrientDB and ArangoDB<br />(<a target="_blank" href="https://www.arangodb.com/2015/10/benchmark-postgresql-mongodb-arangodb/#more-8721">https://www.arangodb.com/2015/10/benchmark-postgresql-mongodb-arangodb/#more-8721</a>)<br /><br /><strong>[19]</strong>&nbsp;noSQL 2009<br />(<a target="_blank" href="http://blog.sym-link.com/2009/05/12/noSQL_2009.html">http://blog.sym-link.com/2009/05/12/noSQL_2009.html</a>)<br /><br /><strong>[20]&nbsp;</strong>How Facebook flipped the data centre hardware market<br />(<a target="_blank" href="http://www.theregister.co.uk/2014/02/20/facebook_hardware_feature/">http://www.theregister.co.uk/2014/02/20/facebook_hardware_feature/</a>) &nbsp;<br /><br /><strong>[21]&nbsp;</strong>Open Compute Project Server and Storage Solutions - Penguin Computing<br />(<a target="_blank" href="http://www.penguincomputing.com/products/open-compute-project/">http://www.penguincomputing.com/products/open-compute-project/</a>)<br /><br /><strong>[22]</strong>&nbsp;Amazon t2.micro - $.013 / hr. ($ 113.88 / yr.)<br />(<a target="_blank" href="https://aws.amazon.com/ec2/pricing/">https://aws.amazon.com/ec2/pricing/</a>) &nbsp;<br /><br />Google f1-small - .021 / hr. ($ 183.96 / yr.)<br />(<a target="_blank" href="https://cloud.google.com/compute/#pricing">https://cloud.google.com/compute/#pricing</a>) &nbsp;<br /><br />Microsoft A0 - $.018 / hr. ($ 157.68 / yr.)<br />(<a target="_blank" href="https://azure.microsoft.com/en-us/pricing/details/virtual-machines/#Linux">https://azure.microsoft.com/en-us/pricing/details/virtual-machines/#Linux</a>).<br /><br />Also look at the UnixBench table in&nbsp;<strong>[23]</strong>&nbsp;and notice the performance of the Raspberry Pi against the AWS t1.micro and m1.small.&nbsp;<br /><br /><strong>[23]</strong>&nbsp;Hypriot - Demo and challenge at DockerCon 2015<br />(<a target="_blank" href="http://blog.hypriot.com/post/dockercon2015/">http://blog.hypriot.com/post/dockercon2015/</a>)&nbsp;<br /><br /><strong>[24]</strong>&nbsp;Intel Atom c2750 &ndash; 8 core Avoton / Rangeley benchmarks &ndash; fast and low power<br />(<a target="_blank" href="http://www.servethehome.com/intel-atom-c2750-8-core-avoton-rangeley-benchmarks-fast-power/">http://www.servethehome.com/intel-atom-c2750-8-core-avoton-rangeley-benchmarks-fast-power/</a>).<br /><br />If you look at the charts, it is interesting to note that The Intel C2750 servers outperform all of the AWS servers. Perhaps it is time to seriously reconsider co-location. &nbsp;<br /><br />The Intel Xenon D Review: Performance Per Watt Server SoC Champion?(<a target="_blank" href="http://www.anandtech.com/show/9185/intel-xeon-d-review-performance-per-watt-server-soc-champion">http://www.anandtech.com/show/9185/intel-xeon-d-review-performance-per-watt-server-soc-champion</a>)<br /><br /><strong>[25]</strong>&nbsp;Depending on the image size, a container can be spun up and removed in milliseconds. In fact, for certain workloads, it is actually preferable to spin up a container, run a process, and kill the container each time it is run rather than keep a container running. See: AWS Lambda (<a target="_blank" href="https://aws.amazon.com/lambda/">https://aws.amazon.com/lambda/</a>)<br /><br /><strong>[26]</strong>&nbsp;Google Container Engine is Generally Available<br />(<a target="_blank" href="http://googlecloudplatform.blogspot.com/2015/08/Google-Container-Engine-is-Generally-Available.html">http://googlecloudplatform.blogspot.com/2015/08/Google-Container-Engine-is-Generally-Available.html</a>)<br /><br /><strong>[27]</strong>&nbsp;AN EMPIRICAL LOOK AT SOFTWARE PATENTS (<a target="_blank" href="http://www.researchoninnovation.org/swpat.pdf">http://www.researchoninnovation.org/swpat.pdf</a>)<br /><br /><strong>[28]</strong>&nbsp;In particular, refer to the previous chart showing the stock price of Netflix. They have been at the forefront of aggressively adopting these technologies and the results speak for themselves; both for investors and consumers. &nbsp;<br /><br />Here's Why Consumers Love Netflix More Than Amazon and Hulu (<a target="_blank" href="http://www.adweek.com/news/television/here-s-why-consumers-love-netflix-more-amazon-and-hulu-165547">http://www.adweek.com/news/television/here-s-why-consumers-love-netflix-more-amazon-and-hulu-165547</a>) &nbsp;<br /><br />The Netflix Tech Blog<br />(<a target="_blank" href="http://techblog.netflix.com">http://techblog.netflix.com</a>)<br /><br /><font color="#2a2a2a">Wufoo exited with $35M on a $118K finding with 10 employees!<br />SurveyMonkey to buy Wufoo<br />(<a target="_blank" href="http://allthingsd.com/20110425/surveymonkey-buys-online-forms-start-up-wufoo-for-35-million/">http://allthingsd.com/20110425/surveymonkey-buys-online-forms-start-up-wufoo-for-35-million/</a>) &nbsp; &nbsp;<br />Hacker News discussion<br />(<a target="_blank" href="https://news.ycombinator.com/item?id=2481576">https://news.ycombinator.com/item?id=2481576</a>) &nbsp; &nbsp;<br />How to build products users love]<br />(<a target="_blank" href="http://startupclass.samaltman.com/courses/lec07/">http://startupclass.samaltman.com/courses/lec07/</a>)&nbsp;</font></div>]]></content:encoded></item></channel></rss>