<?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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Asynchrony Solutions Blog</title>
	<atom:link href="http://blog.asolutions.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.asolutions.com</link>
	<description>Design &#38; Development</description>
	<lastBuildDate>Wed, 11 Apr 2012 12:58:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Faster Cucumber Tests</title>
		<link>http://blog.asolutions.com/2012/04/faster-cucumber-tests/</link>
		<comments>http://blog.asolutions.com/2012/04/faster-cucumber-tests/#comments</comments>
		<pubDate>Wed, 11 Apr 2012 12:58:51 +0000</pubDate>
		<dc:creator>John Sextro</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Asynchrony]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[Cukes]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[Test-driven development]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1136</guid>
		<description><![CDATA[Let’s face it you can never have enough money and your tests never run fast enough.  I can’t help you with your money, but if you follow the steps in this post I can help you speed up your Cucumber tests. The improvement process that I’ll walk you through is known commonly as DMAIC (Define, [...]]]></description>
			<content:encoded><![CDATA[<p>Let’s face it you can never have enough money and your tests never run fast enough.  I can’t help you with your money, but if you follow the steps in this post I can help you speed up your Cucumber tests.</p>
<p>The improvement process that I’ll walk you through is known commonly as DMAIC (Define, Measure, Analyze, Improve, Control).  For those not familiar with DMAIC, Google can tell you everything you need to know.  But, basically DMAIC is an improvement cycle commonly used in Six Sigma to improve and optimise business processes.  We’ll use DMAIC in this post to improve the speed of your Cucumber tests.</p>
<h3>Define</h3>
<p>You’ve probably already defined the problem, your tests are too slow.  What you haven’t done is define success.  You will define success in terms of execution time.  For instance, if your Cukes are taking 30 mins you might define success as, “Make all Cukes run in 20 mins or less”, others might define success as, “Cukes running in 5 mins or less”.  This is up to you and your team to decide.  Just remember, the amount of time it takes to run your tests will be inversely proportional to number of times you will run them.  So the faster they are the more often you will run them.</p>
<h3>Measure</h3>
<p>You know how long it takes to run the suite.  You might even know how long it takes to run each scenario or sets of scenarios.  What you need to know now is how long it takes each step to run.  Wait! Before you go diving back into your steps to instrument them with timers and such, let’s see what Cucumber can do to help us.<br />
Fortunately for us Cucumber offers a number of helpful options for formatting the output of our test runs.  One of those options is <code>--format usage</code>. Using the ‘usage’ format will show us which steps take the longest to run, how many times each step executed and if any steps are unused.  I’ve slightly modified some of the example feature files provided with the Cucumber source to generate the following output.</p>
<div id="attachment_1139" class="wp-caption aligncenter" style="width: 593px"><a href="http://blog.asolutions.com/wp-content/uploads/2012/04/cukeUsageReport.png"><img class=" wp-image-1139 " src="http://blog.asolutions.com/wp-content/uploads/2012/04/cukeUsageReport.png" alt="Usage Report" width="583" height="282" /></a><p class="wp-caption-text">Cucumber Output using --format usage</p></div>
<h3>Analyze</h3>
<p>With our new data in hand we can begin to zero in on the trouble spots.  The usage report displays the steps ordered from slowest to fastest.  The report also shows the number of times each step executed.  Your slowest step might not be the biggest problem.  You should focus on the steps that run the slowest and the most often.  Also, consider why the step executed so often.  If you wrote the scenarios following a behavior driven development (BDD) cycle then the scenario was written to define behavior in the system. As a result you may find many scenarios exercising the same part of the system in only slightly different ways.  Viewing the scenarios in hindsight you should consider if you can consolidate or eliminate some of the scenarios.</p>
<h3>Improve</h3>
<p>Now that we know where to focus our efforts it’s time to make our improvements.</p>
<h4>Consolidate</h4>
<p>In the ‘Analyze’ phase you considered if you could remove or consolidate scenarios.  Now is the time to do that work.  Deleting scenarios is fun and easy.  Consolidating scenarios takes more effort and thought.  Look for recurring patterns such as screen navigation and data setup.  If you notice that you repeatedly setup the same data to run different scenarios, it’s a good bet that those scenarios are ripe for consolidation.  From the regression testing perspective, you want to maximize the amount of testing performed while minimizing the amount of work you have to do in the system to prepare for the testing while maintaining the ability to independently execute the scenario.</p>
<h4>Learn to wait</h4>
<p>One of the most common causes of slow downs in cukes is ‘sleep’ing.  People often use sleep to wait for AJAX activity to complete.  This is the most unpredictable and wasteful way to control test execution.  Imagine that an AJAX action normally takes between .5 and 2 seconds to complete.  If we sleep to wait for the action to complete how long should we sleep?  Let’s say we decide to sleep for 3 seconds.  If that action ever takes more than 3 seconds the test fails.  Also, every time the action takes less than 3 seconds the difference is wasted doing nothing and if this is one of your most executed steps those seconds quickly turn into minutes.</p>
<p>Instead of sleeping you must learn to ‘wait’.  The Selenium client includes a number of ‘wait_for’ methods that will improve the predictability of your steps and will remove the waste caused by sleeping.</p>
<ul>
<li><code>wait_for_text(value)</code> &#8212; Simply waits for the text you specify to appear in the DOM.  Should this value already exist, execution will continue without waiting, so carefully select a value that you know won’t exist until the AJAX action completes.</li>
<li><code>wait_for_element(xpathLocator)</code> &#8212; Allows you to specify an exact xpath locator to wait for before continuing.</li>
<li><code>wait_for_no_element(xpathLocator)</code> and <code>wait_for_no_text(value)</code>&#8211; Allows you to wait for the removal of an xpath locator or text value from the DOM before continuing.</li>
</ul>
<div>You can learn more about xpath and selenium from my Cucumber Pro Tips presentation, <a href="http://blip.tv/this-minute-in-programming/cucumber-pro-tips-the-secret-sauce-6078421">http://blip.tv/this-minute-in-programming/cucumber-pro-tips-the-secret-sauce-6078421</a></div>
<h4>Good Software Engineering</h4>
<p>Once you’ve ‘picked’ all the ‘low hanging fruit’, you’re left with your software engineering skills and training to profile, tune and tweak the last bits of improvement from your steps.</p>
<h4>Scenario Tagging</h4>
<p>Cucumber provides a simple yet powerful ability to add tags to scenarios using the @tagname. If you’ve made all the improvements that you can reasonably make but your tests still aren’t fast enough, then you can use tags to define a subset of scenarios to execute.  For instance, you could tag the scenarios with @smokeTest tag and run them by specifying ‘ &#8211;tag @smokeTest’ at the end of your cucumber command.  Don’t forget to run your full suite of Cukes nightly, or better yet schedule them to run more frequently via your continuous integration server.  Checkout the Tags page on the Cucumber wiki for more details on tags, <a href="https://github.com/cucumber/cucumber/wiki/Tags">https://github.com/cucumber/cucumber/wiki/Tags</a></p>
<h3>Control</h3>
<p>Congratulations.  Give yourself a pat on the back.  Hopefully you’ve met and surpassed your success criteria.  Wait a second though, we’re not done. You need to keep an eye on things.  Don’t let your test times creep up. That’s what the ‘Control’ phase is all about and it goes on for as long as you care about the amount of time required to run the scenarios. Make the ‘care and feeding’ of your cukes a regular part of your development cycle and they will provide your application with benefits for years to come.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2012/04/faster-cucumber-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s not always about technology</title>
		<link>http://blog.asolutions.com/2012/02/its-not-always-about-technology/</link>
		<comments>http://blog.asolutions.com/2012/02/its-not-always-about-technology/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 23:16:51 +0000</pubDate>
		<dc:creator>jruzicka</dc:creator>
				<category><![CDATA[Asynchrony]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1127</guid>
		<description><![CDATA[At Asynchrony, we like to give back. We like to support causes and support each other. Danny Shoemaker, a member of our Business Development team, is on a mission to climb Mount Kilimanjaro this summer in honor of his loved ones who have dealt with cancer and to support the mission of LIVESTRONG. There are [...]]]></description>
			<content:encoded><![CDATA[<p>At Asynchrony, we like to give back. We like to support causes and support each other. Danny Shoemaker, a member of our Business Development team, is on a mission to climb Mount Kilimanjaro this summer in honor of his loved ones who have dealt with cancer and to support the mission of LIVESTRONG. There are very few of us who haven&#8217;t been touched by cancer in one way or another. For more information about how you can support Danny and to learn more about the participants and their goals, follow the links below.</p>
<p>LIVESTRONG.org blog: <a href="http://bit.ly/zwK2AQ">http://bit.ly/zwK2AQ</a></p>
<p>Danny&#8217;s Survivor Summit page: <a href="http://bit.ly/wiev8B">http://bit.ly/wiev8B</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2012/02/its-not-always-about-technology/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Agile Architect: Deadline Ahead: Will Your Team Make It?</title>
		<link>http://blog.asolutions.com/2012/02/the-agile-architect-deadline-ahead-will-your-team-make-it/</link>
		<comments>http://blog.asolutions.com/2012/02/the-agile-architect-deadline-ahead-will-your-team-make-it/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 23:12:28 +0000</pubDate>
		<dc:creator>mbalbes</dc:creator>
				<category><![CDATA[Asynchrony]]></category>
		<category><![CDATA[agile architect]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1124</guid>
		<description><![CDATA[My new Agile Architect article, &#8220;Agile Deadline Ahead: Will Your Team Make It?&#8221; is online at ADT Magazine at http://adtmag.com/articles/2012/02/16/agile-deadline-ahead.aspx You can read all of my Agile Architect columns at http://adtmag.com/Articles/List/Agile-Architect.aspx]]></description>
			<content:encoded><![CDATA[<p>My new Agile Architect article, &#8220;Agile Deadline Ahead: Will Your Team Make It?&#8221; is online at ADT Magazine at http://adtmag.com/articles/2012/02/16/agile-deadline-ahead.aspx</p>
<p>You can read all of my Agile Architect columns at http://adtmag.com/Articles/List/Agile-Architect.aspx</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2012/02/the-agile-architect-deadline-ahead-will-your-team-make-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kanban: It Changed My Life</title>
		<link>http://blog.asolutions.com/2012/02/kanban-it-changed-my-life/</link>
		<comments>http://blog.asolutions.com/2012/02/kanban-it-changed-my-life/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 23:52:44 +0000</pubDate>
		<dc:creator>railsgrammer</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[risk management]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1116</guid>
		<description><![CDATA[Well, maybe not my life, but my project’s life.  A bit reading and patience will allow me to explain.  But first, a definition of the word: Kanban. kanban &#124;ˈkänˌbän&#124; &#8211; noun a Japanese manufacturing system in which the supply of components is regulated through the use of a card displaying a sequence of specifications and [...]]]></description>
			<content:encoded><![CDATA[<p>Well, maybe not my life, but my project’s life.  A bit reading and patience will allow me to explain.  But first, a definition of the word: <em>Kanban.</em></p>
<blockquote><p><strong>kanban</strong> |ˈkänˌbän| &#8211; noun</p>
<p>a Japanese manufacturing system in which the supply of components is regulated through the use of a card displaying a sequence of specifications and instructions, sent along the production line.</p></blockquote>
<p>“Now wait.  We are not in Japan, and we are definitely not a production line.” Understood, however we can take this system and apply it to our practice.</p>
<p>Kanban in practical terms is best described with a picture.</p>
<div><a href="http://blog.asolutions.com/wp-content/uploads/2012/02/kanban_example.jpg"><img class="aligncenter  wp-image-1117" src="http://blog.asolutions.com/wp-content/uploads/2012/02/kanban_example.jpg" alt="" width="509" height="509" /></a></div>
<div>
<p>We have multiple queues drawn by string, or marker on a whiteboard, or imaginary (it <strong>depends on the project</strong>).  Each queue represents a phase of our development process.  A new project, for example, may have the following queues: <strong>Waiting</strong>, <strong>Code In Process</strong>, <strong>Code Complete</strong>, <strong>Acceptance Testing In process</strong>, <strong>Acceptance Testing Complete</strong>, <strong>Ready for Customer Review</strong>, <strong>Ready for Production</strong>.</p>
<p>As requirements, from our client or customer, are recorded, they are written onto story cards and placed into the Waiting queue.  When someone begins working, that person picks up the first card and moves it over to the next queue to begin Coding.  When the story has been completely coded, it goes to Code Complete so that the person who provides acceptance testing can pick it up and begin working on that story.  This process continues to happen until it reaches the end.</p>
<p>Stories get worked on from the right side first, so that it can reach completion as fast as possible.  This provides the most efficient and focused flow of progress.</p>
<div> Just in that brief description, I have covered a bunch of topics we deal with when working on a project:</p>
<ul>
<li>Recording, prioritizing, and tracking customer requirements.</li>
<li>Showing progress of work in progress.</li>
<li>Communicating when something is complete and ready for the next phase of the development process (Acceptance Testing).</li>
<li>Providing visibility for when work is running out and new requirements are needed from the customer or client.</li>
</ul>
<p>Kanban provides a ton of invaluable assets, as a system, to your project.  Such as: efficiency, focus, communication, limit work in process, prioritization, visibility on status.</p>
<div>
<p>We also limit work in process (WIP), because work in process is considered waste.  It is considered waste because it, at the state of being work in process, is unusable code.  If at any point in time the customer says “Let’s change priorities completely” or if for some reason the project finished prematurely, the incomplete code is wasted.</p>
<div>
<p>We apply WIP limits by restricting the number of stories that can be in a particular queue.  If you can’t move a queue forward because the WIP limit is already full, you are forced to either clear the queue ahead or find someone who can.  This is very important because it prevents the project from consuming a block in flow of progress.</p>
<p>Our primary Kanban consists of the following queues.  Feel free to use the exact same queues for your project but beware that every project is different and requires a different kanban.  Pay attention to the pain of your project, start simple and adjust based on that pain.</p>
<div>
<ul>
<li>Backlog</li>
<li>Waiting (limit 3 features)</li>
<li>Code In Process (limit 3 stories)</li>
<li>Code Review Ready (optional, limit 1 story)</li>
<li>Code Review In Process (optional, limit 1 story)</li>
<li>Quality Acceptance Ready</li>
<li>Quality Acceptance In Process</li>
<li>Quality Acceptance Complete</li>
<li>Feature Waiting for Stories (limit 3 features)</li>
<li>Feature Ready for Customer Review</li>
<li>Release Waiting for Features</li>
<li>Release Ready to be tested on Staging</li>
<li>Release Ready for Production</li>
<li>Released to Production</li>
</ul>
</div>
<div>When building your Kanban, remember the definition.</div>
</div>
<blockquote>
<div>
<p>a Japanese manufacturing system in which the supply of components is regulated through the use of a card displaying a sequence of specifications and instructions, sent along the production line.</p>
</div>
</blockquote>
<div>
<div>
<p>Your project’s development cycle is a production line.  In order to get the most quality and the most work completed think about work in process, notice where stories have the longest cycle time (time a story spends in a given queue), which queue fills up too fast (perhaps you need more resources to satisfy that queue, or you need a greater WIP limit).</p>
<div>
<p>If you are developing cars, you want as many completed, high quality cars as you can build.  You don’t want 500 windows, 200 doors, 6 handles, 3 mirrors and 1 car.  Same goes for developing an application.  You don’t want 10 features in process and 1 feature completed; you aren’t guaranteed time to finish the work in process.</p>
<div>
<p>I hope this post was useful to you. I would love to get some feedback.</p>
<div>
<p>This post is the first in a series I plan on publishing about how Kanban changed my life.  Check in to see the additional posts. I will also update this post with links.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2012/02/kanban-it-changed-my-life/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Rule 5: What they want isn&#8217;t always what they want.</title>
		<link>http://blog.asolutions.com/2011/11/design-rule-5-what-they-want-isnt-always-what-they-want/</link>
		<comments>http://blog.asolutions.com/2011/11/design-rule-5-what-they-want-isnt-always-what-they-want/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 21:10:09 +0000</pubDate>
		<dc:creator>James McKie</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[comics]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1102</guid>
		<description><![CDATA[Be careful what the client wishes for.]]></description>
			<content:encoded><![CDATA[<p>Be careful what the client wishes for.</p>
<p><a title="Click for big" href="http://blog.asolutions.com/wp-content/uploads/2011/10/2011-October-big.png"><img class="alignnone size-full wp-image-1103" src="http://blog.asolutions.com/wp-content/uploads/2011/10/2011-October.png" alt="Yellow is in this season" width="505" height="1488" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2011/11/design-rule-5-what-they-want-isnt-always-what-they-want/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Establishing a Baseline for Organizations’ Enterprise Architecture, Portfolio Management, and Enterprise Governance</title>
		<link>http://blog.asolutions.com/2011/09/establishing-a-baseline-for-organizations%e2%80%99-enterprise-architecture-portfolio-management-and-enterprise-governance/</link>
		<comments>http://blog.asolutions.com/2011/09/establishing-a-baseline-for-organizations%e2%80%99-enterprise-architecture-portfolio-management-and-enterprise-governance/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 16:24:59 +0000</pubDate>
		<dc:creator>Myles Bogner</dc:creator>
				<category><![CDATA[Asynchrony]]></category>
		<category><![CDATA[Enteprise Governance]]></category>
		<category><![CDATA[Enterprise Architecture]]></category>
		<category><![CDATA[Portfolio Management]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1088</guid>
		<description><![CDATA[Myles Bogner, Ph.D, VP Research and Development with Special Asynchrony Guest Jason Carter, President of Aegis Strategies As organizations embark on improving their Enterprise Architecture, Portfolio Management, and Enterprise Governance efforts, a frequent question tends to be, where are we now?  Below we offer a set of questions to guide the creation of an “as-is” [...]]]></description>
			<content:encoded><![CDATA[<div>
<p align="center"><em>Myles Bogner, Ph.D, VP Research and Development</em><em><br />
with Special Asynchrony Guest Jason Carter, President of Aegis Strategies</em></p>
<p>As organizations embark on improving their Enterprise Architecture, Portfolio Management, and Enterprise Governance efforts, a frequent question tends to be, where are we now?  Below we offer a set of questions to guide the creation of an “as-is” assessment around these three areas.  We’ve categorized these questions into seven broad categories.</p>
<p><strong>Governance</strong></p>
<ul>
<li>What are your governance bodies, documents, and processes?</li>
<li>How are IT investments prioritized and funded across your enterprise?</li>
<li>What are the guiding principles that you would like to achieve through enterprise governance?</li>
<li>Are your governance organizations formally chartered; where are they?</li>
<li>Is there an IT governance process for routine requirements different from a strategic IT governance process?</li>
<li>Does your community of lead architects come together regularly in a forum; is this forum chartered?</li>
<li>Is there a formal tie between the enterprise architecture and engineering communities; if so, what is the concept of operations?</li>
<li>Is there a formal tie between your organization and any external communities of interest; if so, what are the governance charters?</li>
<li>Is there a formal enterprise architecture configuration and control board; if so, is it chartered and executing?</li>
<li>Is there a prescribed methodology for software development across the organization to ensure secure, timely delivery?</li>
<li>Are the organization’s architectural rules succinctly captured?</li>
<li>Is there a configuration control board around a common computing environment; is this chartered?</li>
<li>Specifically for government organizations, what are the governance procedures for ensuring Clinger-Cohen Act compliance?</li>
</ul>
<p><strong>Information</strong></p>
</div>
<div>
<ul>
<li>Is there an enterprise data group established; if so, is there a common vocabulary and a prescribed way for sharing information?</li>
<li>How is data quality being addressed as an enterprise-wide focus?</li>
<li>How are system information needs and data flows categorized?</li>
<li>Are there any standard message templates in use; how are these governed?</li>
<li>Is there common reference data; if so, which system(s) provide it and how is it governed?</li>
</ul>
<p><strong>Business</strong></p>
</div>
<div>
<ul>
<li>Does the enterprise share the same vision; is this captured in an easy to understand graphic?</li>
<li>What are enterprise’s defined capabilities, and have they been decomposed into tasks, conditions, and standards that have broad organizational agreement?</li>
<li>Are the lines of business defined; is there enterprise consensus on this?</li>
<li>What are the activities performed that support the enterprise capabilities and lines of business?</li>
<li>Are there clearly identified enterprise functions that cross lines of business?</li>
<li>What are the enterprise architecture touch-points to external architectures?</li>
<li>Is there a formal way to capture business processes in a consistent, industry standard manner; are any captured?  How are these business processes linked to information flows, performance metrics, and governance bodies?</li>
</ul>
<p><strong>Performance</strong></p>
<ul>
<li>What are the enterprise performance categories and metrics from both operational and technical aspects; which organizations have authority for these metrics?</li>
<li>Is performance actually measured and used to drive improvements?</li>
</ul>
<p><strong>Enterprise Initiatives and Enabling IT Systems</strong></p>
<ul>
<li>How does the CIO office convey user and architectural needs to project managers and how are these managers held accountable for delivery?</li>
<li>How do project managers know that they are in alignment with the enterprise architecture?</li>
<li>What redundancies exist across systems from functional and technical perspectives in the enterprise; how are these being addressed?</li>
<li>How are projects assessed from an operational, technical, and financial perspective; what are the results?</li>
</ul>
<p><strong>Service</strong></p>
<ul>
<li>How are enterprise web services implemented and governed; is there a roadmap for the upcoming enterprise services?</li>
<li>What are the enterprise web service management tools and processes; how many systems are utilizing these today?</li>
<li>What standards guide web service development?</li>
<li>Is there an enterprise service-oriented architecture infrastructure established; what are the tools and selection criteria utilized for these tools</li>
</ul>
</div>
<div><strong>Technical</strong></div>
<div>
<ul>
<li>What are the enterprise standards for technical refresh and software selection; are these governed enterprise-wide?</li>
<li>Is there a plan to move each of the systems to a shared platform such as a common user interface; what platform has been selected and what is the transition schedule?</li>
<li>What is the vision for the enterprise to move toward cloud computing; how is this vision conveyed to others?</li>
<li>How are enterprise user authentication and account management solution(s) implemented and governed in the portfolio?</li>
</ul>
<p>Once an enterprise establishes its baseline, these same set of questions can be prioritized and utilized by the organization as a spring-board to implementing a robust enterprise architecture and portfolio management practice.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2011/09/establishing-a-baseline-for-organizations%e2%80%99-enterprise-architecture-portfolio-management-and-enterprise-governance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What Does an Architect Do in an Agile Shop? An Agile Architect Explains All&#8230;</title>
		<link>http://blog.asolutions.com/2011/08/what-does-an-architect-do-in-an-agile-shop-an-agile-architect-explains-all/</link>
		<comments>http://blog.asolutions.com/2011/08/what-does-an-architect-do-in-an-agile-shop-an-agile-architect-explains-all/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 14:35:17 +0000</pubDate>
		<dc:creator>jruzicka</dc:creator>
				<category><![CDATA[Asynchrony]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1077</guid>
		<description><![CDATA[If you&#8217;re wondering what a software architect does in an agile development environment, you&#8217;re not alone. Asynchrony&#8217;s Vice President of Architecture, Mark J. Balbes, Ph.D., shares what he does and how it all comes together in better code in an article published in Application Development Trends. To read the article, click here.]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re wondering what a software architect does in an agile development environment, you&#8217;re not alone. Asynchrony&#8217;s Vice President of Architecture, Mark J. Balbes, Ph.D., shares what he does and how it all comes together in better code in an article published in <em>Application Development Trends</em>. To read the article, click<a title="here." href="http://adtmag.com/articles/2011/08/12/role-of-an-architect-in-agile-dev-shop.aspx" target="_blank"> here.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2011/08/what-does-an-architect-do-in-an-agile-shop-an-agile-architect-explains-all/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Agile Design Article Posted at UX Magazine</title>
		<link>http://blog.asolutions.com/2011/08/new-agile-design-article-posted-at-ux-magazine/</link>
		<comments>http://blog.asolutions.com/2011/08/new-agile-design-article-posted-at-ux-magazine/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 18:18:00 +0000</pubDate>
		<dc:creator>janderson</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1054</guid>
		<description><![CDATA[Curious about how UX design works in an agile world? Check out our latest article at UX Magazine to find out: Change on a Dime: Agile Design]]></description>
			<content:encoded><![CDATA[<p>Curious about how UX design works in an agile world? Check out our latest article at UX Magazine to find out: <a title="http://www.uxmag.com/strategy/change-on-a-dime-agile-design" href="http://www.uxmag.com/strategy/change-on-a-dime-agile-design">Change on a Dime: Agile Design</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2011/08/new-agile-design-article-posted-at-ux-magazine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Rule 4: The Difference Between Design and Art</title>
		<link>http://blog.asolutions.com/2011/07/design-rule-4-the-difference-between-design-and-art/</link>
		<comments>http://blog.asolutions.com/2011/07/design-rule-4-the-difference-between-design-and-art/#comments</comments>
		<pubDate>Wed, 13 Jul 2011 15:24:24 +0000</pubDate>
		<dc:creator>James McKie</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[comics]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1042</guid>
		<description><![CDATA[If you&#8217;re not sure, then it&#8217;s probably design.]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re not sure, then it&#8217;s probably design.</p>
<p><a href="http://blog.asolutions.com/wp-content/uploads/2011/07/2011-July-big.png"><img class="alignnone size-full wp-image-1044" src="http://blog.asolutions.com/wp-content/uploads/2011/07/2011-July.png" alt="The Difference Between Design and Art" width="505" height="1488" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2011/07/design-rule-4-the-difference-between-design-and-art/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Going Faster With a Back-Seat (Web) Driver</title>
		<link>http://blog.asolutions.com/2011/06/going-faster-with-a-back-seat-webdriver/</link>
		<comments>http://blog.asolutions.com/2011/06/going-faster-with-a-back-seat-webdriver/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 16:42:33 +0000</pubDate>
		<dc:creator>Matt Campbell</dc:creator>
				<category><![CDATA[Asynchrony]]></category>
		<category><![CDATA[acceptance]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://blog.asolutions.com/?p=1013</guid>
		<description><![CDATA[Slow, long running test suites can be almost as dangerous to a project&#8217;s health as not having tests at all. The presence of tests gives developers, managers and customers a sense of security about the stability of the code base, but that sense of security is only valid if those tests are running (and passing) [...]]]></description>
			<content:encoded><![CDATA[<p>Slow, long running test suites can be almost as dangerous to a project&#8217;s health as not having tests at all.  The presence of tests gives developers, managers and customers a sense of security about the stability of the code base, but that sense of security is only valid if those tests are running (and passing) frequently – preferably continuously.  When test suites take too long to run, they cause a productivity drain to the developers, costing us and our customers money.  When this productivity drain gets bad enough, developers tend to react to it by avoiding running the test suites, eliminating much of their value.  That&#8217;s why it&#8217;s very important for project teams to keep their test suites performing quickly.</p>
<p><span id="more-1013"></span></p>
<p>Like several Asynchrony projects, our team uses Cucumber to automate our acceptance tests.  Since our project&#8217;s product is a website, our Cucumber steps use Selenium Webdriver (via the Capybara ruby gem) to automate browser interactions.  As our project&#8217;s code base and feature set has grown, the amount of time it takes to run our entire acceptance test suite has likewise grown.  By late spring of this year, this cost of time grew to a totally unacceptable 45 minutes per run, and we found ourselves no longer running all the tests before pushing code to our repository.  Unsurprisingly, we started to encounter significant rework as stories inadvertently broke each others&#8217; tests.  We experimented with a number of different and creative approaches to try to ease the pain of the long test times, like running the tests in a “headless” browser, splitting the test run in parallel across multiple CPUs and cores, and marking some tests as “stable” and running those less frequently.  All these approaches had their own benefits and drawbacks, and we eventually had to fall back to the tried and true technique of profiling our tests to find the performance bottlenecks.</p>
<pre>7.3349736 /^I have completed registration as a proxy user$/
  6.7926899 And I have completed registration as a  proxy user
  7.8772572 And I have completed registration as a proxy user
6.6970380 /^I have completed registration as a basic user$/
  6.1421517 And I have completed registration as a basic user
  7.2519242 And I have completed registration as a basic user
5.4250364 /^I finish my enrollment$/
  5.4250364 And I finish my enrollment</pre>
<p>Cucumber has some built-in support for this in the form of its “usage” output formatter.  The data provided by this formatter is very valuable, but there are a few issues that are helpful to understand up front.  Most importantly, it doesn&#8217;t recursively capture data when steps call other steps, so some steps may appear to be called very few times even though they might be called frequently by other steps.  Also, while the output shows the average running time for each different step along with the actual running time for each call, it doesn&#8217;t show either the total number of calls or the total accumulated time for all calls to the same step.  As a result, to get the real “big picture” of which steps have the most impact, one needs to count lines of output and multiply by the average time.</p>
<pre>3.5672804 /^(?:|I )log in as "([^"]*)"$/
  3.4786973 And I log in as "john8"
  3.3762024 And I log in as "joe_the_great"
  3.2333490 And I log in as "MyUser"
  0.0000773 And I log in as "MyUser"
  3.7173720 And I log in as "MyUser"
  3.2421371 And I log in as "friendlyjoe"</pre>
<p>We had 321 Cucumber scenarios which took a total of 39½ minutes to run on our fastest workstation.  Even using the parallel_test gem to leverage the machine&#8217;s 8 cores, this test suite still took nearly 20 minutes to complete.   After analyzing the output of profiling, we found that in any given run we were logging into our application 248 times.  Since each login step took an average of 3.6 seconds to run, that meant our test run was spending almost 15 minutes just logging in, so this step was an obvious candidate to try to improve.  Let&#8217;s take a look at what the original version of that step looked like:</p>
<pre>Given /^(?:|I )log in as "([^"]*)"$/ do |nickname|
  visit logout_path
  visit login_path
  fill_in "username", :with =&gt; nickname
  fill_in "password", :with =&gt; "pass1234"
  click_button "Log in"
end</pre>
<p>This step uses Capybara/Webdriver to tell the browser to go to the logout page (in case we were already logged in), go to the login page, fill in the username and password fields, and click the submit button.  This approach is perfect for “When” steps – times when our scenario is testing the user&#8217;s login interaction itself.  All other times, this is actually a “Given” – a precondition for a scenario, and not the actual functionality being tested directly.  For comparison, here are two example scenarios, one for each case.</p>
<pre>Scenario: Enrolled users should be able to log in.
  Given an enrolled user with nickname “joe_user”
  When I log in as “joe_user”
  Then I should see “Welcome, joe_user!”

Scenario: Logged-in users should be able to see their own profile.
  Given I am logged in as “joe_user”
  When I go to the “my profile” page
  Then I should see “edit your profile”</pre>
<p>Most of the time, any “Given” step should not need to directly drive a browser to do its work.  (The most obvious big exception to this rule is the case of “Given I am on ”.)  In this case, we modified the step for “Given I log in as &#8230;” so that it could log in to the application without needing to use the browser.  Our new version of this step looks like this:</p>
<pre>Given /^(?:|I )log in as "([^"]*)"$/ do |nickname|
  browser = Capybara.current_session.driver.browser
  browser.manage.delete_all_cookies
  http_response = post_to(login_path, { 'user[nickname]' =&gt; nickname,
                                        'user[password]' =&gt; 'pass1234' })
  visit login_path unless current_path
  browser.manage.add_cookie parse_set_cookie_header(http_response['set-cookie'])
end</pre>
<p>First, we “log out” of the application by deleting all cookies from the browser.  Next we send an HTTP POST to the login controller directly from the cucumber code.  Then we tell the browser to load a page if it hasn&#8217;t already, because setting cookies without having loaded a page is an error in all browsers.  Finally we parse the session cookie from the response and set it in the browser directly.</p>
<pre>0.1478878 /^(?:|I )log in as "([^"]*)"$/
  0.1518410 And I log in as "john8"
  0.1560398 And I log in as "joe_the_great"
  0.1462007 And I log in as "MyUser"
  0.0001179 And I log in as "MyUser"
  0.1591520 And I log in as "MyUser"
  0.1520781 And I log in as "friendlyjoe"</pre>
<p>The resulting change in performance was dramatic, dropping the total time for the test suite to 12 minutes, 44 seconds.  The average running time for this version of the “Given I log in as&#8230;” step is now 0.15 seconds.  Combining this improvement with our use of the parallel_test gem means we can now run our entire acceptance test suite on an 8-core workstation in under 5 minutes, making it much less painful for us to run the entire test suite each time we are ready to push code to our repository.</p>
<p>There was another issue that we encountered on the way to this improvement – in the current version of Selenium Webdriver, the only browser for which this technique works out of the box is Chrome.  There is a bug in the firefox driver that raises exceptions when calling addCookie while testing against localhost (the very scenario we most needed).  We have created <a href="https://github.com/asynchrony/Selenium2/tree/fix-add-cookie">a Github fork</a> of the Selenium2 code and fixed this bug, and will work with the Selenium development team in the near future to see this fix applied to the core Selenium project.  There is also an open bug in the Selenium driver for Internet Explorer, where addCookie silently fails, forcing us to fall back to the slower browser-driven login approach on our IE testing.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.asolutions.com/2011/06/going-faster-with-a-back-seat-webdriver/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

