<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-53393032769473559</id><updated>2011-04-21T13:43:01.937-07:00</updated><category term='technology'/><category term='accurev'/><title type='text'>Dave on SCM</title><subtitle type='html'>A Programmer's Thoughts on Software Configuration Management&lt;br&gt; and Software Development Best Practices</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-53393032769473559.post-3794206552557470649</id><published>2007-09-26T13:23:00.000-07:00</published><updated>2007-09-26T18:22:23.686-07:00</updated><title type='text'>Agile: Branches vs. Streams</title><content type='html'>Today I watched a &lt;a href="http://subversion.tigris.org/"&gt;subversion &lt;/a&gt;webinar where the presenter from a popular hosting/services company described three general branching strategies: &lt;span style="font-weight: bold;"&gt;unstable trunk&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;stable trunk&lt;/span&gt;, and &lt;span style="font-weight: bold;"&gt;agile&lt;/span&gt;.   After seeing their "solution" for managing agile development with branches, I thought "I agree with the goal but what a complete merge mess using branches!  Streams are significantly more natural and just plain easier." I'll explain by comparing to &lt;a href="http://www.accurev.com/"&gt;AccuRev&lt;/a&gt;'s implementation of streams...&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);font-size:100%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);font-size:100%;" &gt;"Agile" Branching&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Quick review...&lt;/span&gt; We've all used the &lt;span style="font-style: italic;"&gt;unstable trunk&lt;/span&gt; pattern. You know... everyone commits to trunk and it's stability is not guaranteed; it only works well for a small team. The more pragmatic &lt;span style="font-style: italic;"&gt;stable trunk &lt;/span&gt;pattern attempts to isolate projects/fixes on branches and control merging of only completed, stable changes to the trunk.  The advantage here is that new projects or release lines can guarantee to start from a stable trunk configuration. Though, without locking trunk to fully test the merges, there is still a window of potential instability especially for those nasty runtime bugs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Now to the point... &lt;/span&gt;Their &lt;span style="font-style: italic;"&gt;agile branch&lt;/span&gt; pattern uses a branch-per-task strategy where tasks are eventually merged into target release branches.  &lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_eu8I42x_suU/RvrwamFZOQI/AAAAAAAAA48/BqRz6zJK070/s1600-h/agile_branching_strategy.jpg"&gt;&lt;img style="border: 1px dotted rgb(0, 0, 0); margin: 5pt 0pt 5px 5px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_eu8I42x_suU/RvrwamFZOQI/AAAAAAAAA48/BqRz6zJK070/s200/agile_branching_strategy.jpg" alt="" id="BLOGGER_PHOTO_ID_5114664666523056386" border="0" /&gt;&lt;/a&gt;At various milestones, the release branches are merged into both trunk and ongoing task branches to keep them up-to-date.  I've added the picture that was used during the presentation (though, I added the red 'merge' wording).  See where I'm going with this?  Notice how many merges are present for a trivial 4-task, single major/minor release scenario.  I've used this exact type of pattern in a 250+ enterprise web development group with 40-50 parallel tasks contributed by local and remote teams on a 2 week release cycle -- it becomes completely and utterly unmanageable especially when you have to consider security concerns of who has visibility and control of branches and merge targets.  It's a nightmare at best even with branch naming conventions and is exactly how most of the file/branch based SCM systems will work, fancy graphics or not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);font-size:100%;" &gt;Agile Streaming&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Quick review...&lt;/span&gt; a stream represents a single configuration of source code.  So you might have an "integration" stream, a "Tuesday night" build stream, or "3.0" official release stream.   Any project will have a 'tree' of streams describing mainline development, previous releases, and maintenance work.  The trick with streams is that they have a unique property where they automatically inherit changes from their parent.  But it doesn't stop there.  Any newer versions of files along the entire parent path of streams is inherited.  If you're familiar with the OO programming model, it works very similar -- In the same way that adding a new method in a super class is automatically visible to all sub-classes, newer versions of files and directories in parent streams are visible to all child streams.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Now to the point... &lt;/span&gt;unlike using branches, streams don't require massive merging all over the place.  Why?  Built-in inheritance.  Lets say you have 4 tasks as streams all working off of a mainline &lt;code&gt;Integration&lt;/code&gt; stream (see pic of AccuRev stream browser client).  &lt;a target="_blank" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_eu8I42x_suU/Rvr9FmFZOSI/AAAAAAAAA5M/I00CoNbA-8Y/s1600-h/agile_streaming_strategy.jpg"&gt;&lt;img style="border: 1px dotted rgb(0, 0, 0); margin: 5pt 5pt 5px 0px; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_eu8I42x_suU/Rvr9FmFZOSI/AAAAAAAAA5M/I00CoNbA-8Y/s200/agile_streaming_strategy.jpg" alt="" id="BLOGGER_PHOTO_ID_5114678599396964642" border="0" /&gt;&lt;/a&gt;If you promote a single task (&lt;span style="font-style: italic;"&gt;i.e. bunch-o-files&lt;/span&gt;) to &lt;code&gt;Integration&lt;/code&gt;, the other 3 task streams -automatically- have visibility to the newer versions! This allows you to merge-early, merge-often &lt;span style="color: rgb(204, 0, 0);"&gt;not &lt;/span&gt;by manual error-prone practice but accurately and predictably by stream technology.  Translated to branch-speak, only a single merge is required to give complete visibility to newer versions to every other task.    Furthermore, this example shows only 4 tasks.  Lets say you have 40 or 400 concurrent tasks -- you still only need a single promote of a given task to have it automatic delivered to every other task in-progress.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;In summary.... &lt;/span&gt;Comparing the two pictures, you're probably saying, "How can it be that simple?" Well... this is what a contemporary stream-based architecture gives you.  Gone are the days of merge here, merge there... oops, we forgot to merge way over there.   In addition, we-the-workhorse-developer don't have to be SCM tool merge experts struggling to determine which of our 9 branches need to be merged into the release candidate branch on Friday night.  If your task is on the mainline stream path, you are absolutely guaranteed to have been up-to-date with anything you need.  No more guesswork!  Finally, the best part about inheritance is if you have a long-lived task, simply stay put and automatic inheritance will implicitly keep you up-to-date with the rest of the world!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/53393032769473559-3794206552557470649?l=daveonscm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/3794206552557470649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=53393032769473559&amp;postID=3794206552557470649' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/3794206552557470649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/3794206552557470649'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/2007/09/agile-branches-vs-streams.html' title='Agile: Branches vs. Streams'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_eu8I42x_suU/RvrwamFZOQI/AAAAAAAAA48/BqRz6zJK070/s72-c/agile_branching_strategy.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-53393032769473559.post-294835354681491795</id><published>2007-06-07T22:26:00.000-07:00</published><updated>2007-07-18T05:36:39.488-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><title type='text'>Air Gap Development</title><content type='html'>Lately I've been working with companies doing classified software development.  Individual access to source code depends on each person's clearance level (&lt;a href="http://en.wikipedia.org/wiki/Q_clearance" target="_blank"&gt;e.g. Q clearance&lt;/a&gt;).  To separate access between "sensitive" and "unsensitive" source code, development occurs on unclassified (low) and classified (high) networks, respectively. Physically, this means there is an impenetrable barrier between the computers/networks.  Thus, gaining access to source code means gaining access to the appropriate network.&lt;br /&gt;&lt;br /&gt;Transfer of file changes can sometimes occur &lt;span style="font-style:italic;"&gt;from &lt;/span&gt;the low network &lt;span style="font-style:italic;"&gt;to &lt;/span&gt;the high network but &lt;span style="font-weight:bold;"&gt;never &lt;/span&gt;vice versa.  Traditionally, this has been implemented by a "&lt;a href="http://en.wikipedia.org/wiki/Sneakernet" target="_blank"&gt;sneaker net&lt;/a&gt;" where files are transferred between two computers by disk or tape and requires "walking" to each computer.  I recently came across a clever data transmission technology that physically guarantees unidirectional transfer of data over a TCP/IP network including handshake protocols!  Take a look at Owl Technologies' &lt;a href="http://www.owlcti.com/index.htm" target="_blank"&gt;dual-diode technology&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/53393032769473559-294835354681491795?l=daveonscm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/294835354681491795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=53393032769473559&amp;postID=294835354681491795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/294835354681491795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/294835354681491795'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/2007/06/air-gap-development.html' title='Air Gap Development'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-53393032769473559.post-3899627578782463518</id><published>2007-04-21T16:33:00.000-07:00</published><updated>2007-05-14T09:42:36.202-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='accurev'/><title type='text'>Agile Programmable Completion - AccuRev + GNU Bash</title><content type='html'>When at the &lt;a href="http://en.wikipedia.org/wiki/Command_line_interface"&gt;command line&lt;/a&gt; (CLI),  productivity means keeping your hands on the keyboard.   But once your fingers have memorized all the commands, flags, static arguments, and common usage patterns -- can you still get faster?   &lt;span style="font-weight: bold;"&gt;Yes&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Programmable completion is a shell facility that allows for customizing the command line in real-time as it is typed.  Also referred to as "TAB Completion", may shells in both Linux and Windows have a default implementation that support completion on filenames and directories.  If you're lucky, you'll even get environment variables and functions.&lt;br /&gt;&lt;br /&gt;Lets move to SCM.  Various branch-based SCM systems like CVS, SVN, and P4 have basic tab completion of commands and flags.  Thats a good start.  But an &lt;span style="font-style: italic;"&gt;agile &lt;/span&gt;user needs a context-sensitive, custom-data completion facility.   What you ~really~ want is completion on your own data -- branch names, labels, usernames, etc.  Users of stream-based AccuRev are in luck.&lt;br /&gt;&lt;br /&gt;Do you use AccuRev on Linux?  If so, &lt;a href="http://www.fepus.net/software/accurev-tools/accurev-bash-completion-3.1.tar.gz"&gt;download &lt;/a&gt;the latest GNU Bash (2.05+) completion for AccuRev 4.5.x.  Here is the &lt;a href="http://www.fepus.net/software/accurev-tools/accurev-bash-completion-3_0/README"&gt;README&lt;/a&gt;.   You'll never have to memorize flags or type stream names again.&lt;br /&gt;&lt;br /&gt;Coming in Part 2 -- Support for Windows users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/53393032769473559-3899627578782463518?l=daveonscm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/3899627578782463518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=53393032769473559&amp;postID=3899627578782463518' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/3899627578782463518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/3899627578782463518'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/2007/04/agile-programmable-completion-part-1.html' title='Agile Programmable Completion - AccuRev + GNU Bash'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-53393032769473559.post-497135136247170383</id><published>2007-02-23T20:42:00.000-08:00</published><updated>2007-04-21T15:53:22.676-07:00</updated><title type='text'>SCM Video Humor</title><content type='html'>I recently did a YouTube search for the popular SCM tools on the market.   Results presented In alphabetical order.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;AccuRev&lt;/strong&gt;&lt;br /&gt;  - much easier to &lt;a href="http://www.youtube.com/watch?v=msDuQoKqysw"&gt;install &lt;/a&gt;than clearcase.&lt;br /&gt;  - with a &lt;a href="http://www.youtube.com/watch?v=d-Ny2zYowVM"&gt;single &lt;/a&gt;user interface.&lt;br /&gt;  - and &lt;a href="http://www.youtube.com/watch?v=BmOYEe9JqAI"&gt;flexible &lt;/a&gt;stream-based software development models.&lt;br /&gt;  - this one is just &lt;a href="http://www.youtube.com/watch?v=qrKceAK0IL0"&gt;neurotic&lt;/a&gt;.&lt;br /&gt;  - no wrappers or scripts &lt;a href="http://www.youtube.com/watch?v=ycg_OfwzEpQ"&gt;here&lt;/a&gt;.&lt;br /&gt;  - and especially developer &lt;a href="http://www.youtube.com/watch?v=vpILRv_tZy4"&gt;friendly&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Bitkeeper&lt;/strong&gt;&lt;br /&gt;  - &lt;em&gt;no match.&lt;/em&gt;   Apparently all related videos are in the attic.&lt;br /&gt;  &lt;br /&gt;&lt;strong&gt;ClearCase&lt;/strong&gt;&lt;br /&gt;  - better than CVS but &lt;a href="http://www.youtube.com/watch?v=SSdmlg6cClw"&gt;requires &lt;/a&gt;a super hero to use.&lt;br /&gt;  - unrelated, ironic &lt;a href="http://www.youtube.com/watch?v=s_OhjZI9JWM"&gt;video &lt;/a&gt;on not being able to escape.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CVS&lt;/strong&gt;&lt;br /&gt;  - &lt;em&gt;no match.&lt;/em&gt;  Unrelated video about &lt;a href="http://www.youtube.com/watch?v=0XUZsvTkEnw"&gt;extracting &lt;/a&gt;an alien from a human womb.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Perforce&lt;/strong&gt;&lt;br /&gt;  - &lt;em&gt;no match.&lt;/em&gt;  Unrelated "talent" &lt;a href="http://www.youtube.com/watch?v=jpjvjr3I1xc"&gt;show&lt;/a&gt; with a singer wearing shades to hide his identity.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Subversion&lt;/strong&gt;&lt;br /&gt;  - &lt;em&gt;no match.&lt;/em&gt;  Unrelated video &lt;a href="http://www.youtube.com/watch?v=NiloKOqTZKA"&gt;game&lt;/a&gt;.  Great for up to 4 players.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/53393032769473559-497135136247170383?l=daveonscm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/497135136247170383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=53393032769473559&amp;postID=497135136247170383' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/497135136247170383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/497135136247170383'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/2007/02/scm-video-humor.html' title='SCM Video Humor'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-53393032769473559.post-8204712921404410040</id><published>2007-02-23T16:27:00.000-08:00</published><updated>2007-02-26T12:16:15.021-08:00</updated><title type='text'>In SCM We Trust</title><content type='html'>Consider the following SCM tool-agnostic sequence of events:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;codefreeze.&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;fix, fix. label RC1 --&gt; build. package. deploy. test.&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;fix, fix. label RC2 --&gt; build. package. deploy. test.&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;fix, fix. label RC3 --&gt; build. package. deploy. test.&lt;/span&gt;  &lt;span style="font-weight: bold;"&gt;Verified!&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;Now what?   Do you....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[A] &lt;/span&gt;Declare RC3 the official release label and "copy" the verified package to production?  &lt;span style="font-style: italic;"&gt;The actual verified code is in production but how does someone really know from SCM that RC3 is in production?  maybe RC3 was rolled back and RC2 is in production.  How does someone know that RC4 isn't being worked on?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[B]&lt;/span&gt; Subsequently create a new release label with an official "event describing" name like "Release_X.Y" then rebuild, repackage and deploy to production?  &lt;span style="font-style: italic;"&gt;The new label accurately describes the official release and demarcates the end of release candidates but the rebuild and repackage were not verified.  Do you trust your build system? (topic for a separate post)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[C]&lt;/span&gt; Deploy the verified code but subsequently create a new "event describing" label like "Release_X.Y" and trust that the configuration for the new label is &lt;span style="font-style: italic;"&gt;identical &lt;/span&gt;to that of deployed RC3 configuration?  &lt;span style="font-style: italic;"&gt;Developers may fix bugs using the new release label but technically it wasn't used to generate the actual production code.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I advise doing &lt;span style="font-weight: bold;"&gt;[C]&lt;/span&gt;.   Though, it helps to have a transaction-based SCM system (like AccuRev) where the label operation simply marks the transaction # rather than each-and-every file in the configuration - afterall, tainted files are untested files.   This way, as long as two labels refer to the same transaction, they will refer to the same configuration.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/53393032769473559-8204712921404410040?l=daveonscm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/8204712921404410040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=53393032769473559&amp;postID=8204712921404410040' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/8204712921404410040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/8204712921404410040'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/2007/02/in-scm-we-trust.html' title='In SCM We Trust'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-53393032769473559.post-7507036735523931213</id><published>2007-02-22T17:00:00.000-08:00</published><updated>2007-08-14T08:04:55.788-07:00</updated><title type='text'>Vendor Code Management.... with Streams</title><content type='html'>Lets say you've just obtained someone else's source code.&lt;br /&gt;&lt;br /&gt;Maybe you've obtained this code from an opensource project, a mutual business partner, or a department in your own company.   The source code in-hand is nifty indeed and you have mentally crafted some grand new features you'd like to add -- after all, you have the source! But there's one small problem....you don't "own" the code.   The original authors continue to develop &lt;span style="font-style: italic;"&gt;their&lt;/span&gt; new features and bugfixes and have a future roadmap that plans to offer subsequent major, minor, and patch releases.&lt;br /&gt;&lt;br /&gt;We can call that "someone else" the "vendor" and their source code the "vendor code."  It's that simple.&lt;br /&gt;&lt;br /&gt;So vendor code management deals with tracking &lt;span style="font-style: italic;"&gt;your&lt;/span&gt; changes to someone else's code, tracking their new releases, and tracking the merges between your customizations with theirs.     In more technical terms, we'll use the following definition.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight:bold;"&gt;Vendor Code Management&lt;/span&gt; -- The process of tracking and propagating custom changes to external, evolving 3rd party codelines.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Managing all these moving parts can be tricky indeed unless you have the right tools. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Old School.&lt;/span&gt;  The solution used by traditional branch-based SCM systems is to use yet-another-branch called a "vendor branch" [&lt;a href="http://www.cmcrossroads.com/bradapp/acme/clearcase/"&gt;clearcase&lt;/a&gt;, &lt;a href="http://www.perforce.com/perforce/technotes/note015.html"&gt;perforce&lt;/a&gt;, &lt;a href="http://svnbook.red-bean.com/en/1.1/ch07s05.html"&gt;subversion&lt;/a&gt;, &lt;a href="http://www.thathost.com/wincvs-howto/cvsdoc/cvs_13.html"&gt;cvs&lt;/a&gt;]. The vendor branch was nothing more than a branch off of mainline (typically) where you committed raw vendor code and had the wildly laborious and error prone task of committing new vendor code releases and merging their changes, with your changes, all on... other branches.  Without private workspaces you absolutely need a new branch in order to test fragile merges in isolation and commit them for savepoints in event a partial rollback is required.  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_eu8I42x_suU/Rd5lnwHSd6I/AAAAAAAAAbE/Q8MSdIiSQRk/s1600-h/branches-second-half.jpg" target="_blank"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_eu8I42x_suU/Rd5lnwHSd6I/AAAAAAAAAbE/Q8MSdIiSQRk/s320/branches-second-half.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5034573167051569058" /&gt;&lt;/a&gt; And then at some point merging all your feature branches to mainline, cutting a release candidate branch (branch late, right!) and procuring a stable release.   Oh, and then merge the release candidate branch to mainline to share last minute bugfixes.  Did you save the whiteboard diagram of all your merges?  What diagram?  exactly.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Enter Streams-based SCM. &lt;/span&gt;   We all read books and articles and continue to preach about software development best practices such as continuous integration, private workspaces, reproducible configurations, promotion levels, named stable baselines, etc.    A stream-based SCM system (like &lt;a href="http://www.accurev.com"&gt;AccuRev&lt;/a&gt;) introduces a fresh new paradigm for managing the development and maturation of software changes.  With a promotion-based workflow model, best practices can be implemented simply using the single, basic building block -- streams.  Lets say we wanted to solve a problem like... oh, say managing vendor code... &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_eu8I42x_suU/Rd5l8gHSd7I/AAAAAAAAAbM/j_OVHhfVIL0/s1600-h/streams-final-view.jpg" target="_blank"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_eu8I42x_suU/Rd5l8gHSd7I/AAAAAAAAAbM/j_OVHhfVIL0/s320/streams-final-view.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5034573523533854642" /&gt;&lt;/a&gt; The adjacent picture is a labelled screenshot of the AccuRev StreamBrowser and shows 3 primary stream motifs that can be applied to achieve an intuitive development model.   First, with vendor code rooted in the repository, snapshots that represent successive, raw vendor code imports serve as roots for custom, named stable base development.  Second, Each codeline can adopt its own promotion-based workflow -- in this case, both visible codelines employ Integration -&gt; QA -&gt; Release.   Third, each custom release (represented as snapshots) can further serve as new roots of development for release-specific patch or feature development.    Creating a tree of streams helps tell a story -- some stories are told from the top to bottom, while others start at snapshots representing new roots of development.&lt;br /&gt;&lt;br /&gt;Thankfully, a &lt;a href="http://www.accurev.com/whitepaper/pdf/vendor_code.pdf"&gt;whitepaper &lt;/a&gt;has been written all about the subject thus keeping this blog post to a few paragraphs.   It talks in gory detail about the pitfalls of the branch-based solution and the benefits the Stream-based solution.  Do you have further questions about merging custom changes across codelines using change packages?  It's in the whitepaper ;)  I'd be interested to hear from folks who currently use a traditional branch-based solution and want to know more about Streams. I've used the old branch-based technique myself in a past life tracking custom, business-rule changes to Bugzilla -- oh the dreaded horror.  If you have questions about the blog post or the whitepaper, feel free to drop me a line!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/53393032769473559-7507036735523931213?l=daveonscm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/7507036735523931213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=53393032769473559&amp;postID=7507036735523931213' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/7507036735523931213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/7507036735523931213'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/2007/02/vendor-code-management-with-streams.html' title='Vendor Code Management.... with Streams'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_eu8I42x_suU/Rd5lnwHSd6I/AAAAAAAAAbE/Q8MSdIiSQRk/s72-c/branches-second-half.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-53393032769473559.post-841762803386507333</id><published>2007-01-24T14:08:00.000-08:00</published><updated>2007-01-24T16:13:30.626-08:00</updated><title type='text'>Danger0us Pr0xim!ty</title><content type='html'>I recently returned from a consulting engagement in Seattle and traded banter with release engineers about "nightmare builds." I've had these same discussions with other companies and it's interesting how keyboard proximity is notorious for wrecking havoc during various software release situations. At a previous job, I personally recall a failed production deployment caused by mispeling "prod" as "pr0d" (zero) in a config file. That little midnight gem resulted in a 4-hour, 20+ person conf call that lasted until 4am. And, yes, I happened to be on vacation when I received that critical page. ugh.&lt;br /&gt;&lt;br /&gt;Here are some pairings of keystrokes with close proximity that can easily become problematic:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;0 / o &lt;/span&gt;-- Setting variable to 'pr0d instead of 'prod'&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;1 / !&lt;/span&gt; -- Meant the bang but shift-key didn't depress&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;E / 3&lt;/span&gt; -- dislexia at 2am&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;= / ==&lt;/span&gt; -- Testing a runtime condition only to "set" it&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;- / =&lt;/span&gt; -- dislexia at 2am&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;l / |&lt;/span&gt; -- meant pipe, got 'el' on return to homerow&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;: / ;&lt;/span&gt; -- shift didn't depress&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/53393032769473559-841762803386507333?l=daveonscm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/841762803386507333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=53393032769473559&amp;postID=841762803386507333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/841762803386507333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/841762803386507333'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/2007/01/i-recently-returned-from-consulting.html' title='Danger0us Pr0xim!ty'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-53393032769473559.post-4539739246374696379</id><published>2007-01-20T07:41:00.000-08:00</published><updated>2007-01-20T18:06:48.168-08:00</updated><title type='text'>Welcome!</title><content type='html'>This seems like a good place to talk about topics in software configuration management (&lt;a href="http://en.wikipedia.org/wiki/Software_configuration_management"&gt;SCM&lt;/a&gt;) and software development best practices.&lt;br /&gt;&lt;br /&gt;I've been a programmer for 10 years having spent the last 5 years at &lt;a href="http://www.orbitz.com/"&gt;Orbitz.com&lt;/a&gt;.   At Orbitz, I was  part of an agile 50-person engineering team that grew to 500+ and was eventually &lt;a href="http://www.informationweek.com/showArticle.jhtml?articleID=48800113"&gt;bought &lt;/a&gt;for $1.25B.  It was an invaluable in-the-trenches, firsthand experience evolving from "shoot-from-the-hip" to "process-driven" development.  I now have a cool job working for &lt;a href="http://www.accurev.com/"&gt;Accu&lt;span style="font-style: italic;"&gt;Rev&lt;/span&gt;&lt;/a&gt; creator of the most contemporary (and fun!) configuration management system to-date.&lt;br /&gt;&lt;br /&gt;I hope you'll enjoy the thoughts and discussions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Disclaimer: This is my personal weblog. The opinions expressed here represent my own and not those of my employer AccuRev.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/53393032769473559-4539739246374696379?l=daveonscm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://daveonscm.blogspot.com/feeds/4539739246374696379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=53393032769473559&amp;postID=4539739246374696379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/4539739246374696379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/53393032769473559/posts/default/4539739246374696379'/><link rel='alternate' type='text/html' href='http://daveonscm.blogspot.com/2007/01/welcome.html' title='Welcome!'/><author><name>fepus</name><uri>http://www.blogger.com/profile/16489761502515879640</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
