<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Dr. Random - Practices</title>
    <link>http://www.drrandom.org/</link>
    <description>Random Thoughts for Random People</description>
    <language>en-us</language>
    <copyright>Casey Kramer</copyright>
    <lastBuildDate>Sun, 08 Feb 2009 00:31:31 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>casey.kramer@gmail.com</managingEditor>
    <webMaster>casey.kramer@gmail.com</webMaster>
    <item>
      <trackback:ping>http://www.drrandom.org/Trackback.aspx?guid=2e66da2d-0f2f-43b4-b7da-80f498300018</trackback:ping>
      <pingback:server>http://www.drrandom.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.drrandom.org/PermaLink,guid,2e66da2d-0f2f-43b4-b7da-80f498300018.aspx</pingback:target>
      <dc:creator>Casey Kramer</dc:creator>
      <wfw:comment>http://www.drrandom.org/CommentView,guid,2e66da2d-0f2f-43b4-b7da-80f498300018.aspx</wfw:comment>
      <wfw:commentRss>http://www.drrandom.org/SyndicationService.asmx/GetEntryCommentsRss?guid=2e66da2d-0f2f-43b4-b7da-80f498300018</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
So previously I posed a <a href="http://www.drrandom.org/PermaLink,guid,b5ed52fc-4fe4-43e2-a287-daa60a269cc0.aspx">question</a>,
which in it's simplest form is: Should you write code for the rest of your group (or
at their proficency level), or should you write code as advanced as you need. and
let it serve as an example for those on your team who are less advanced in their abilities. 
The practical answer I have come up with is, like most answers of this type, "It depends".
</p>
        <p>
I have decided to handle things this way:  
<br />
First, don't compromise.  If I feel something is a bad practice, or ultimately
going to restrain future development, then do what needs to be done.<br />
But Also: Try to avoid introducing advanced concepts and idioms until there is a compelling
example of what their benefit is.  This is probably something that applies more
to working with existing apps, then greenfield development, but it certainly has bearing
in both cases.  The big example for this that I ran into was IoC.  I am
a big fan of IoC, but it is hard to come up with a good, concise explanation of why
you need this additional tool.  I've been wanting to introduce IoC since I started
working at <a href="http://www.envisagenow.com/">Envisage</a>, but the explanation
"This will make things much easier later on" is not good enough...particularly when
you are trying to embrace YAGNI.  So the key is to wait until you can actually
demonstrate the advantage, and provide a before and after example of how things are
done.
</p>
        <p>
Lead by example, but make sure you have the examples.  To bring the food analogy
back into play, it isn't good enough to create a gourmet meal, and tell the people
who say they don't like it that, no, it really is better, and their just not sophisticated
enough to know it.  It is better to start smaller, and build their appreciation
up in increments.
</p>
        <img width="0" height="0" src="http://www.drrandom.org/aggbug.ashx?id=2e66da2d-0f2f-43b4-b7da-80f498300018" />
      </body>
      <title>Do I have the answer yet? Not really</title>
      <guid isPermaLink="false">http://www.drrandom.org/PermaLink,guid,2e66da2d-0f2f-43b4-b7da-80f498300018.aspx</guid>
      <link>http://www.drrandom.org/2009/02/08/DoIHaveTheAnswerYetNotReally.aspx</link>
      <pubDate>Sun, 08 Feb 2009 00:31:31 GMT</pubDate>
      <description>&lt;p&gt;
So previously I posed a &lt;a href="http://www.drrandom.org/PermaLink,guid,b5ed52fc-4fe4-43e2-a287-daa60a269cc0.aspx"&gt;question&lt;/a&gt;,
which in it's simplest form is: Should you write code for the rest of your group (or
at their proficency level), or should you write code as advanced as you need. and
let it serve as an example for those on your team who are less advanced in their abilities.&amp;nbsp;
The practical answer I have come up with is, like most answers of this type, "It depends".
&lt;/p&gt;
&lt;p&gt;
I have decided to handle things this way:&amp;nbsp; 
&lt;br&gt;
First, don't compromise.&amp;nbsp; If I feel something is a bad practice, or ultimately
going to restrain future development, then do what needs to be done.&lt;br&gt;
But Also: Try to avoid introducing advanced concepts and idioms until there is a compelling
example of what their benefit is.&amp;nbsp; This is probably something that applies more
to working with existing apps, then greenfield development, but it certainly has bearing
in both cases.&amp;nbsp; The big example for this that I ran into was IoC.&amp;nbsp; I am
a big fan of IoC, but it is hard to come up with a good, concise explanation of why
you need this additional tool.&amp;nbsp; I've been wanting to introduce IoC since I started
working at &lt;a href="http://www.envisagenow.com/"&gt;Envisage&lt;/a&gt;, but the explanation
"This will make things much easier later on" is not good enough...particularly when
you are trying to embrace YAGNI.&amp;nbsp; So the key is to wait until you can actually
demonstrate the advantage, and provide a before and after example of how things are
done.
&lt;/p&gt;
&lt;p&gt;
Lead by example, but make sure you have the examples.&amp;nbsp; To bring the food analogy
back into play, it isn't good enough to create a gourmet meal, and tell the people
who say they don't like it that, no, it really is better, and their just not sophisticated
enough to know it.&amp;nbsp; It is better to start smaller, and build their appreciation
up in increments.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.drrandom.org/aggbug.ashx?id=2e66da2d-0f2f-43b4-b7da-80f498300018" /&gt;</description>
      <comments>http://www.drrandom.org/CommentView,guid,2e66da2d-0f2f-43b4-b7da-80f498300018.aspx</comments>
      <category>Practices</category>
    </item>
    <item>
      <trackback:ping>http://www.drrandom.org/Trackback.aspx?guid=af366215-2454-4d54-bad7-463d5222f547</trackback:ping>
      <pingback:server>http://www.drrandom.org/pingback.aspx</pingback:server>
      <pingback:target>http://www.drrandom.org/PermaLink,guid,af366215-2454-4d54-bad7-463d5222f547.aspx</pingback:target>
      <dc:creator>Casey Kramer</dc:creator>
      <wfw:comment>http://www.drrandom.org/CommentView,guid,af366215-2454-4d54-bad7-463d5222f547.aspx</wfw:comment>
      <wfw:commentRss>http://www.drrandom.org/SyndicationService.asmx/GetEntryCommentsRss?guid=af366215-2454-4d54-bad7-463d5222f547</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
At <a href="http://www.envisagenow.com">Envisage</a>, we have a 1 week iteration. 
This means that we typically don't want a single story to go longer than one week. 
We also change up the pair rotation once per week.  The estimation process is
not perfect, though, and we have a lot of support from management to choose doing
things right, rather than doing things now, which leads to stories going beyond a
single iteration.  So when this happens, there is usually a small rock/paper/scissors
session with the developers involved to determine who will be taking the story. 
More often then not, the story goes with the machine (and the developer) that was
used to do the work, since it is usually not practical to check in changes at the
end of the week (also, our QA builds on Fri for a demo, so a green build is needed
on Fri).
</p>
        <p>
One approach to this, which occurred to myself, and one of our other developers at
close to the same time, was to utilize the concept of a personal branch.  This
is something that I believe is supported transparently in TFS, though I'm not 100%
sure.  We are using Subversion, so the process is somewhat manual, but overall
pretty easy to get started.  Once a branch was created, I found it extremely
liberating.  I have apparently been making decisions about how much to change
while I'm refactoring code at least partly based on how much work it will be to integrate
directly back into the trunk.  Having a private, protected area for me to work
made it much easier to change things in the way they needed to be changed.  It
also meant that I could check in more often, including checking in changes which would
leave the app in a non-functional state.  Having those commit points meant that
I could more easily undo changes, and gave me a nice warm and fuzzy feeling about
the changes I was making.  There was also another interesting advantage, and
that was when another developer was asking me about how the API would look on some
of the objects I was working on, and I was able to point him directly to my branch
to see the changes.
</p>
        <p>
There were a few issues, however.  The biggest was that, though we are running
the Subversion 1.5 server, our repository has not been updated, so the <a href="http://subversion.tigris.org/merge-tracking/">automatic
merge tracking</a> was not working.  This meant that I had to keep track of the
revision numbers myself whenever I needed to merge updates to the trunk into my branch. 
And this also made the "Reintegrate Branch" merge function impossible when I was ready
to check my changes in.  Despite these issues, I think in this particular case
(the story lasted about 3 weeks) I was worth the extra effort, and made the overall
process much easier.  We will be updating our repository this week, which may
make having a personal branch a viable solution for normal day-to-day work, but as
it is the effort involved was a bit more than what I would want to deal with on a
regular basis.  I will certainly not hesitate to break out this tool whenever
I've got either a long running, or a large scope (meaning either large numbers of
files effected, or a large change to parts of the API) story.  I certainly recommend
giving it a try.
</p>
        <img width="0" height="0" src="http://www.drrandom.org/aggbug.ashx?id=af366215-2454-4d54-bad7-463d5222f547" />
      </body>
      <title>Use of a &amp;quot;Personal Branch&amp;quot; for long-running stories</title>
      <guid isPermaLink="false">http://www.drrandom.org/PermaLink,guid,af366215-2454-4d54-bad7-463d5222f547.aspx</guid>
      <link>http://www.drrandom.org/2009/02/08/UseOfAQuotPersonalBranchquotForLongrunningStories.aspx</link>
      <pubDate>Sun, 08 Feb 2009 00:09:21 GMT</pubDate>
      <description>&lt;p&gt;
At &lt;a href="http://www.envisagenow.com"&gt;Envisage&lt;/a&gt;, we have a 1 week iteration.&amp;nbsp;
This means that we typically don't want a single story to go longer than one week.&amp;nbsp;
We also change up the pair rotation once per week.&amp;nbsp; The estimation process is
not perfect, though, and we have a lot of support from management to choose doing
things right, rather than doing things now, which leads to stories going beyond a
single iteration.&amp;nbsp; So when this happens, there is usually a small rock/paper/scissors
session with the developers involved to determine who will be taking the story.&amp;nbsp;
More often then not, the story goes with the machine (and the developer) that was
used to do the work, since it is usually not practical to check in changes at the
end of the week (also, our QA builds on Fri for a demo, so a green build is needed
on Fri).
&lt;/p&gt;
&lt;p&gt;
One approach to this, which occurred to myself, and one of our other developers at
close to the same time, was to utilize the concept of a personal branch.&amp;nbsp; This
is something that I believe is supported transparently in TFS, though I'm not 100%
sure.&amp;nbsp; We are using Subversion, so the process is somewhat manual, but overall
pretty easy to get started.&amp;nbsp; Once a branch was created, I found it extremely
liberating.&amp;nbsp; I have apparently been making decisions about how much to change
while I'm refactoring code at least partly based on how much work it will be to integrate
directly back into the trunk.&amp;nbsp; Having a private, protected area for me to work
made it much easier to change things in the way they needed to be changed.&amp;nbsp; It
also meant that I could check in more often, including checking in changes which would
leave the app in a non-functional state.&amp;nbsp; Having those commit points meant that
I could more easily undo changes, and gave me a nice warm and fuzzy feeling about
the changes I was making.&amp;nbsp; There was also another interesting advantage, and
that was when another developer was asking me about how the API would look on some
of the objects I was working on, and I was able to point him directly to my branch
to see the changes.
&lt;/p&gt;
&lt;p&gt;
There were a few issues, however.&amp;nbsp; The biggest was that, though we are running
the Subversion 1.5 server, our repository has not been updated, so the &lt;a href="http://subversion.tigris.org/merge-tracking/"&gt;automatic
merge tracking&lt;/a&gt; was not working.&amp;nbsp; This meant that I had to keep track of the
revision numbers myself whenever I needed to merge updates to the trunk into my branch.&amp;nbsp;
And this also made the "Reintegrate Branch" merge function impossible when I was ready
to check my changes in.&amp;nbsp; Despite these issues, I think in this particular case
(the story lasted about 3 weeks) I was worth the extra effort, and made the overall
process much easier.&amp;nbsp; We will be updating our repository this week, which may
make having a personal branch a viable solution for normal day-to-day work, but as
it is the effort involved was a bit more than what I would want to deal with on a
regular basis.&amp;nbsp; I will certainly not hesitate to break out this tool whenever
I've got either a long running, or a large scope (meaning either large numbers of
files effected, or a large change to parts of the API) story.&amp;nbsp; I certainly recommend
giving it a try.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.drrandom.org/aggbug.ashx?id=af366215-2454-4d54-bad7-463d5222f547" /&gt;</description>
      <comments>http://www.drrandom.org/CommentView,guid,af366215-2454-4d54-bad7-463d5222f547.aspx</comments>
      <category>Practices</category>
      <category>Version Control</category>
    </item>
  </channel>
</rss>