<?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>Software Configuration Management and Agile Software Development &#187; stream</title>
	<atom:link href="http://accurev.com/blog/tag/stream/feed/" rel="self" type="application/rss+xml" />
	<link>http://accurev.com/blog</link>
	<description>SCM and Agile Software Development Blog</description>
	<lastBuildDate>Fri, 03 Feb 2012 19:28:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Something&#8217;s A-Twitter in My Backing Stream</title>
		<link>http://accurev.com/blog/2010/06/22/twitter-backing-stream/</link>
		<comments>http://accurev.com/blog/2010/06/22/twitter-backing-stream/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 13:49:02 +0000</pubDate>
		<dc:creator>amonty</dc:creator>
				<category><![CDATA[AccuRev]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[agile team]]></category>
		<category><![CDATA[backing stream]]></category>
		<category><![CDATA[change packages]]></category>
		<category><![CDATA[issue tracking]]></category>
		<category><![CDATA[promote]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[stream]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[trigger]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://www.accurev.com/blog/?p=1917</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/22/twitter-backing-stream/' addthis:title='Something&#8217;s A-Twitter in My Backing Stream ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>One of the cornerstones of any successful organization is communication. On Agile teams, we often meet to share information, update one another on progress, to reflect on that progress and discuss how the process can be improved. These interactions, be they stand-up or retrospective meetings, provide this information at regular intervals. But what if you [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/22/twitter-backing-stream/' addthis:title='Something&#8217;s A-Twitter in My Backing Stream '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/22/twitter-backing-stream/' addthis:title='Something&#8217;s A-Twitter in My Backing Stream ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p>One of the cornerstones of any successful organization is communication. On Agile teams, we often meet to share information, update one another on progress, to reflect on that progress and discuss how the process can be improved. These interactions, be they stand-up or retrospective meetings, provide this information at regular intervals. But what if you need &#8220;real-time&#8221;  information sharing?</p>
<p>Consider the concept of &#8220;one piece flow&#8221;, often treated as the holy grail of engineering process purists. Lean/Kanban fan boys live to talk about this at conferences, and in the isle outside my cube. The idea is that a single &#8220;workpiece&#8221; at a time moves through the workflow. In the software development process, this is rarely limited to a single item, but instead is throttled by WIP limits to minimize the bottlenecks in the process. For example, the number of items worked on by developers is limited so that the count of items designated &#8220;ready for test&#8221; is kept at a manageable level. As a tester on an agile team, I&#8217;d like to know as soon as an item is moved from the &#8220;wip/development&#8221; phase to the &#8220;test/validation&#8221; phase.</p>
<p>Consider the following basic stream structure -</p>
<p style="text-align: center;"><img class="size-medium wp-image-1931 aligncenter" title="Simple stream structure" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-300x171.png" alt="Simple Stream Structure" width="300" height="171" /></p>
<p>In an ideal model, testers would be notified as soon as an issue is promoted from the <em>WIP</em> stream to the <em>Validation</em> stream. This model assumes that the project is utilizing <a href="http://www.accurev.com/" target="_blank">AccuRev</a> <em>change packages</em> to track work items as issues. Having a distinct stream for validation purposes simplifies the job of the tester. All issues that exist in this stream have been unit tested by developers, passed basic regression tests, and are ready to be explored, validated, and promoted to the next stage in the workflow.</p>
<p>So, how can this level of communication be achieved? <strong>AccuRev triggers!</strong> The rest of this post will demonstrate how the <em>server post-promote</em> trigger could be used to provide updates using arguably the king of &#8220;What&#8217;s Happening?&#8221; &#8211; <a href="http://twitter.com">Twitter</a>.</p>
<h2>Why use Twitter in your Backing Stream?</h2>
<p>Why not? Sure, you could use e-mail. But who wants more e-mail? Tweet it, and let them aggregate the information for you. Team members can follow the account, or not. Pointy-haired managers that dream of pie charts and love visibility can subscribe to an RSS feed, that you don&#8217;t have to manage. Lastly, if you&#8217;re an agilista, you&#8217;re already hip and trendy, (and let&#8217;s face it, you probably  already tweeted about the awesome presentation on Lean that you saw at the latest Agile conference).</p>
<h2>The Server Post-Promote Trigger</h2>
<p>I am not going to go into the gory details of the <a href="http://www.accurev.com/developer-training-advanced.html" target="_blank">AccuRev trigger system</a>. Here&#8217;s what you need to know.</p>
<ol>
<li>The trigger can be written in whatever language you like. In this example, I use Ruby.</li>
<li>The trigger needs to be registered with the AccuRev server, and associated with the depot for your software project.</li>
</ol>
<p>For this exercise, I wrote a quick script called <em>tweet_post_promote.rb</em>. The first step is to register this script with AccuRev.</p>
<p><em>&gt;accurev mktrig -p SoftwareProject server-post-promote-trig ~/dev/ruby/tweet_post_promote.rb</em></p>
<p>Once registered, the trigger will now fire for all promotes in the SoftwareProject depot. Let&#8217;s take a look at the contents of the script.</p>
<p><em>#!/usr/bin/env ruby</em></p>
<p><em>require &#8216;rubygems&#8217;</em></p>
<p><em>require &#8216;crack&#8217;</em></p>
<p><em>require &#8216;twitter&#8217;</em></p>
<p><em>ACCUREV_DIR = &#8220;/sandbox/amonty/accurev/&#8221;</em></p>
<p><em>ACCUREV_STORAGE = &#8220;#{ACCUREV_DIR}storage/&#8221;</em></p>
<p><em>ACCUREV_SITE_SLICE = &#8220;#{ACCUREV_STORAGE}site_slice/&#8221;</em></p>
<p><em>USER = &#8216;ValidationBot&#8217;</em></p>
<p><em>PASS = &#8216;password&#8217;</em></p>
<p><em><br />
</em></p>
<p><em>def load_trigger_data(file)</em></p>
<p style="padding-left: 30px;"><em>xml = &#8221;</em></p>
<p style="padding-left: 30px;"><em>File.open(&#8220;#{ACCUREV_SITE_SLICE}#{file}&#8221;) do |f|</em></p>
<p style="padding-left: 60px;"><em>xml = f.read</em></p>
<p style="padding-left: 30px;"><em>end</em></p>
<p style="padding-left: 30px;"><em>Crack::XML.parse(xml)</em></p>
<p><em>end</em></p>
<p><em><br />
</em></p>
<p><em>def twitter_get_auth(user, pass)</em></p>
<p style="padding-left: 30px;"><em>httpauth = Twitter::HTTPAuth.new(user, pass)</em></p>
<p style="padding-left: 30px;"><em>Twitter::Base.new(httpauth)</em></p>
<p><em>end</em></p>
<p><em><br />
</em></p>
<p><em>def main()</em></p>
<p style="padding-left: 30px;"><em>hash = load_trigger_data ARGV[1]</em></p>
<p style="padding-left: 30px;"><em>if hash["triggerInput"]["stream1"] == &#8220;Validation&#8221; then</em></p>
<p style="padding-left: 60px;"><em>changePackageIssue = hash["triggerInput"]["changePackages"]["changePackageID"]</em></p>
<p style="padding-left: 60px;"><em>update_string = &#8220;Issue #{changePackageIssue} just promoted to stream #{hash["triggerInput"]["stream1"]}&#8221;</em></p>
<p style="padding-left: 60px;"><em>twitter = twitter_get_auth(USER, PASS)</em></p>
<p style="padding-left: 60px;"><em>twitter.update update_string</em></p>
<p style="padding-left: 30px;"><em>end</em></p>
<p><em>end</em></p>
<p><em>main if __FILE__ == $0</em></p>
<p>This script is very simple. It makes use of the Ruby gems crack and Twitter. Essentially, the script takes the XML trigger file (provided as <em>ARGV[1]</em>) and loads it into a hash. Then the script checks to see if the stream being promoted to is our <em>Validation</em> stream. If so, it uses the twitter gem to update the status on our <em>ValidationBot</em> account.</p>
<p style="text-align: center;"><img class="size-medium wp-image-1945  aligncenter" title="Something's a-Twitter in my Backing Stream" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-2-300x43.png" alt="Something's a-Twitter in my backing stream" width="300" height="43" /></p>
<p>A more useful example is to provide a link to the AccuRev Web UI Issue screen.</p>
<p style="text-align: center;"><a href="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-3.png"><img class="size-medium wp-image-1949  aligncenter" title="Something's a-Twitter in my Backing Stream" src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-3-300x80.png" alt="Something's a-Twitter in My Backing Stream" width="300" height="80" /></a></p>
<p>This way, anyone subscribing to the feed can click on the link and open the issue in the AccuRev Web UI.</p>
<p style="text-align: center;"><a href="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-4.png"><img class="size-medium wp-image-1950  aligncenter" title="Something's a-Twitter in my Backing Stream- anyone subscribing to the feed can click on the link and open the issue in the AccuRev Web UI." src="http://www.accurev.com/blog/wp-content/uploads/2010/06/Screenshot-4-300x249.png" alt="Something's A-Twitter in My Backing Stream" width="300" height="249" /></a></p>
<p>This is a small example of how AccuRev triggers can be used to increase communication on your team. Testers can follow the <em>ValidationBot</em> account and be notified via their favorite Twitter client whenever an issue is promoted to the validation stream and they need to begin work on it. This could obviously be extended to include additional information (actual file changes, for example). That is, of course, if you can fit it into 140 characters. <img src='http://accurev.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' title="Somethings A Twitter in My Backing Stream" /> </p>
<p>For more information on AccuRev triggers, please see the <a href="http://www.accurev.com/download/docs/4.7.4b_books/AccuRev_4_7_Admin.pdf">Administrator&#8217;s Guide</a>.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2010/06/22/twitter-backing-stream/' addthis:title='Something&#8217;s A-Twitter in My Backing Stream '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2010/06/22/twitter-backing-stream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Whither branches?</title>
		<link>http://accurev.com/blog/2008/09/02/whither-branches/</link>
		<comments>http://accurev.com/blog/2008/09/02/whither-branches/#comments</comments>
		<pubDate>Tue, 02 Sep 2008 19:15:14 +0000</pubDate>
		<dc:creator>matthew d. laudato</dc:creator>
				<category><![CDATA[AccuRev]]></category>
		<category><![CDATA[branch]]></category>
		<category><![CDATA[branches vs streams]]></category>
		<category><![CDATA[code promotion]]></category>
		<category><![CDATA[developer workspace]]></category>
		<category><![CDATA[main line branch]]></category>
		<category><![CDATA[promoting code]]></category>
		<category><![CDATA[release management]]></category>
		<category><![CDATA[SCCM]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[software development process]]></category>
		<category><![CDATA[stream]]></category>

		<guid isPermaLink="false">http://accurev.wordpress.com/?p=325</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2008/09/02/whither-branches/' addthis:title='Whither branches? ' ><a href="//addthis.com/bookmark.php?v=250&#38;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">&#124;</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div>First, for all of you English majors out there, yes, the title is a deliberate play on words. My initial inclination was to use &#8216;wither&#8217; instead of &#8216;whither&#8217;, to imply that SCM systems that still used branches were dried up and rotting legacies of a less enlightened past. But since this post is a response [...]<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2008/09/02/whither-branches/' addthis:title='Whither branches? '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2008/09/02/whither-branches/' addthis:title='Whither branches? ' ><a href="//addthis.com/bookmark.php?v=250&amp;username=xa-4d2b47597ad291fb" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><p>First, for all of you English majors out there, yes, the title is a deliberate play on words. My initial inclination was to use &#8216;wither&#8217; instead of &#8216;whither&#8217;, to imply that <a href="http://www.accurev.com/scm_comparisons.html" target="_blank">SCM systems</a> that still used branches were dried up and rotting legacies of a less enlightened past. But since this post is a response to a blog I read about the limits of branches, I though &#8216;whither&#8217; was more appropriate, as I am really talking about the overall disposition of branches and how they should be used.</p>
<p>The author of &#8220;<a title="Is Branching the Answer?" href="http://www.fishandcross.com/blog/?p=231" target="_blank">Is branching the answer?&#8221;</a> poses several interesting and important observations about the <a href="http://www.accurev.com/private-versioning.html" target="_blank">limitations of branching</a> as a means to push source code through a development process. My goal in this post is to show the reader how AccuRev addresses those issues.</p>
<p>To begin with, the author correctly notes that branches are often used to identify stages in a development process, and that merges are then used to &#8216;promote&#8217; code through these branches as the code evolves. My first comment is on private branches, which AccuRev replaces with private developer workspaces. Private workspaces are essentially full SCM environments on a developer desktop, as opposed to the copies that private branches in, say, Subversion are. The practical difference is then when you promote from an AccuRev workspace, merges are required only for those changes that are in conflict with existing changes in the parent stream. The general case is that promotes are clean and do not require merges at all.</p>
<p>The author then lists four problems with the approach of using branches to &#8216;automate sharing of code changes within a team&#8217;. For most file and branch based systems, I tend to agree with the author, so my comments are on how AccuRev addresses these issues:</p>
<p>1. It encodes the team&#8217;s process into the file history of code making it difficult to quickly adjust the process as team conditions change.</p>
<p>With standard branches, that is true. With AccuRev, streams represent how code flows through the system. File histories reflect the individual ancestry of files. Since streams can be easily <a href="http://www.accurev.com/demonstration.html" target="_blank">reparented,</a> there is nothing difficult about changing the process.</p>
<p>2. Using a merge to promote changes introduces the possibiliy of an incomplete or bad merge that hides its effect, namely that the code isn&#8217;t promoted, or worse additional code is injected that doesn&#8217;t belong.</p>
<p>Promotion is a fundamental operation in AccuRev. Code changes are designed to be pushed up the stream hierarchy, from developers, to QA, all the way up to release. The only required merges are those that arise naturally from conflicts, and AccuRev&#8217;s merge tools make it straightforward to assure that merges when required are performed accurately. There are absolutely no &#8216;merges that are simply code promotions&#8217;. Also, it is impossible in AccuRev for anything &#8216;incomplete&#8217; to get promoted. AccuRev uses atomic transactions for all operations, so success or failure is binary.</p>
<p>3. It clouds the history of file changes with multiple merges that make it difficult to understand if changes have correctly been merged and makes it hard to understand what is in a build of the software.</p>
<p>See previous response. One additional comment &#8211; there is no magic bullet for merges. AccuRev helps you identify when a merge is required, but to my knowledge there are no tools that help you decide whether changes have been correctly merged from a semantic point of view. Put another way, AccuRev can tell you that lines 3 and 4 are in conflict and require a merge, but only a human being can know how to properly resolve the conflict. That&#8217;s why they pay us the big bucks! As for what is in a given build, atomic transactions in AccuRev and the <a href="http://www.accurev.com/timesafe.html" target="_blank">TimeSafe architecture</a> assure that the contents of a given stream are unambiguous at any point in time.</p>
<p>4. It makes it hard to promote code to software teams that don&#8217;t have a close common branch. For example, you want to merge a fix from one project to another but the only common branch is the main line and merging there will hit production before you want to.</p>
<p>Streams make it easy to isolate lines of development from each other, especially for this common case. There is no need for a &#8216;common branch&#8217; in order to do this. You simply place the changes of interest on the change palette and select the destination stream.</p>
<p>As to the author&#8217;s final point about Telelogic Synergy and change set routing, I will just say that AccuRev <a href="http://www.accurev.com/change-packages.html" target="_blank">change packages</a> provide a logical grouping of changes that can be promoted, reverted and routed in a similar fashion.</p>
<p>Overall, this was a very interesting post and I congratulate the author on identifying and commenting on the problems with branches in <a href="http://www.accurev.com/solutions.html" target="_blank">release management</a>.</p>
<div class="addthis_toolbox addthis_default_style " addthis:url='http://accurev.com/blog/2008/09/02/whither-branches/' addthis:title='Whither branches? '  ><a class="addthis_button_facebook_like" fb:like:layout="button_count"></a><a class="addthis_button_tweet"></a><a class="addthis_button_google_plusone" g:plusone:size="medium"></a><a class="addthis_counter addthis_pill_style"></a></div>]]></content:encoded>
			<wfw:commentRss>http://accurev.com/blog/2008/09/02/whither-branches/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

