<?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-1070107431352346596</id><updated>2011-11-30T12:55:52.800-07:00</updated><category term='LINQ'/><category term='MVC'/><category term='tools'/><category term='Unit Test'/><category term='Acceptance Test'/><category term='Team City'/><category term='XP Practices'/><category term='Windows'/><category term='Cowboy Coding'/><category term='Apple'/><category term='Software Architecture'/><category term='sql server'/><category term='Xp'/><category term='Testing'/><category term='code ownership'/><category term='iPhone'/><category term='TDD'/><category term='Git'/><category term='Agile'/><category term='BDD'/><category term='FxCop'/><category term='Scrum'/><category term='Architectural Patterns'/><category term='iOS'/><category term='Object Oriented Design'/><category term='Pair Programming'/><category term='Design Patterns'/><category term='Team Morale'/><category term='TortoiseGit'/><category term='subversion'/><category term='Mock Data'/><title type='text'>Code Slinging</title><subtitle type='html'>throwing text at a problem in hope of solving it</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-4307543195827610913</id><published>2011-10-13T13:29:00.000-06:00</published><updated>2011-10-13T13:29:54.607-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>iOS 5 upgrade issues</title><content type='html'>I updated my iPhone 4 yesterday to iOS 5. I just wanted to say, what a frustrating experience. I first did a system update on my mac to get the latest iTunes. I synced my phone to get all the photos and recent purchases off of it. Then when iOS 5 became available I went ahead with the update. iTunes took a backup of my phone and away it went. iOS 5 downloaded without any issue and once complete I went ahead with updating my phone. It seemed to be proceeding without any problems, it wiped out my phone and attempted installing iOS 5. During the "Verifying restore with apple" stage it failed to connect to the apple update servers and it took a turn for the worse. It seems apple was unprepared for the number of people trying to update on day one and the update servers were timing out. Because the update had started, I was left with a blank iOS-less phone, basically a pretty black paperweight. It took several attempts over several hours to finally get iOS 5 installed but the fun didn't end there. &amp;nbsp;Next was the restore of the backup that was taken just before the update process began. &amp;nbsp;This too failed (with error -34). &amp;nbsp;Several attempts seemed to solidify to me that the restore option was not going to work. &amp;nbsp;Fortunately I had synced and imported everything before I began so I wasn't really worried about losing any data. My phone was in a usable state, it just wanted me to do some preliminary setup. &amp;nbsp;So I went ahead with the setup but because it had only partially restored things all of my apps that were not bundled with the OS would crash. &amp;nbsp;I had already set up iCloud on my Mac and&amp;nbsp;so I decided to just set up the phone and re-sync it from iTunes. &amp;nbsp;I had to reconfigure all my sync rules but after syncing everything seems to be working fine again. &amp;nbsp;The only complaint so far is that it doesn't let me sync contacts,etc. with both iCloud and Google. &amp;nbsp;I can see possible conflicts arising if trying to sync with multiple sources but it would be nice to have both...&lt;br /&gt;&lt;br /&gt;A little frustrated and I still haven't had much time to appreciate having iOS 5. &amp;nbsp;So far all I can say is the new notification centre is nice and I'm not yet convinced having music and videos separated into two separate apps is the better way to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-4307543195827610913?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/4307543195827610913/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2011/10/ios-5-upgrade-issues.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/4307543195827610913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/4307543195827610913'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2011/10/ios-5-upgrade-issues.html' title='iOS 5 upgrade issues'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-8963101463529247467</id><published>2011-10-07T01:37:00.000-06:00</published><updated>2011-10-13T13:36:21.402-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XP Practices'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Pair Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Xp'/><title type='text'>Teacup Programming</title><content type='html'>Teacup Programming is a variation on pair programming.&lt;br /&gt;&lt;br /&gt;Why teacups? While sitting around a round table during a team retrospective where we had mentioned pair programming the conversation drifted a little when someone said it felt like we were sitting in a teacup ride or something. &amp;nbsp;Naturally, this led to combining the two ideas and teacup programming was born.&lt;br /&gt;&lt;br /&gt;The idea is based on amusement park rides where the rider spins a wheel in the centre of the ride to increase the spinning velocity of the rider's individual car. &amp;nbsp;The most widely known example of this is the Teacup ride at Disneyland.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Requirements&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An even number of programmers&amp;nbsp;&lt;/li&gt;&lt;li&gt;a table (round is preferred but not necessary and a rotating table is even better)&lt;/li&gt;&lt;li&gt;one computer for every two programmers&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Steps&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;1. Sit the programmers around the table with a computer in front of every other programmer.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ebhX4BOt8ag/To6o9Zhl9iI/AAAAAAAAAWo/S1d4BP8x2gU/s1600/teacup-setup.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-ebhX4BOt8ag/To6o9Zhl9iI/AAAAAAAAAWo/S1d4BP8x2gU/s200/teacup-setup.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;table setup&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;2. Each programmer with a computer begins working with the programmer on his or her right.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cE8fPDaW1pQ/To6pShCbBVI/AAAAAAAAAWs/56CJ_F2RQ4A/s1600/teacup-pairs.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-cE8fPDaW1pQ/To6pShCbBVI/AAAAAAAAAWs/56CJ_F2RQ4A/s200/teacup-pairs.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;pairs with person to the right&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;3. After a designated period of time, say 30 minutes, the pairs switch. &amp;nbsp;This is done by either rotating the table one spot to the right or having everyone move left one spot so the programmer on the right from each previous pair is now sitting in front of a computer. &lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PcZCt5SXRFI/To6pT_gRTWI/AAAAAAAAAW4/JKI0IwVN8jI/s1600/teacup-rotation.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-PcZCt5SXRFI/To6pT_gRTWI/AAAAAAAAAW4/JKI0IwVN8jI/s200/teacup-rotation.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;rotate the table one spot&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vS8A3LaGR8s/To6pTXhx0uI/AAAAAAAAAW0/wnr8qSgCpRU/s1600/teacup-rotated.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-vS8A3LaGR8s/To6pTXhx0uI/AAAAAAAAAW0/wnr8qSgCpRU/s200/teacup-rotated.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;after rotation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;4. Again, each programmer with a computer then begins pairing with the programmer on their right (this is a consistent rule for creating pairs) and the timer is reset for another 30 minutes. &lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wZC77Nugo_s/To6pTOW2dhI/AAAAAAAAAWw/GGtYXrfrEe4/s1600/teacup-pairs2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-wZC77Nugo_s/To6pTOW2dhI/AAAAAAAAAWw/GGtYXrfrEe4/s200/teacup-pairs2.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;again pair with person to the right&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;5. Goto 3. &lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The key point in this rotation system is to always have the one programmer from a previous pair remain working on the same computer and thus on the same problem to help reduce lost time due to context switching. &amp;nbsp;Also, everyone at the table gets a look at each problem which means more eyes looking at the code. &amp;nbsp;The drawback is that one programmer only ever works with two others at most. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Variant&lt;/b&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-SBdWWyXqoF0/To6pUlQ1rdI/AAAAAAAAAW8/cslUFzKnRfk/s1600/teacup-rotationwithvariation.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-SBdWWyXqoF0/To6pUlQ1rdI/AAAAAAAAAW8/cslUFzKnRfk/s200/teacup-rotationwithvariation.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;programmers "leap-frog"&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;A variation to increase the number of pairing combinations is to have the person relinquishing control of a computer get up and "leap frog" positions one direction or another. &amp;nbsp;This adds more complication to the rotations but allows an individual to pair with more people in the group.&lt;br /&gt;&lt;br /&gt;We have yet to actually try this out and so cannot say whether it is a viable technique or not but I think it does have some merit and there may even be some specific situations where it might be best applied such as at a hack-a-thon where there is a long list of problems or bugs trying to be solved none of which are too lengthy or difficult or for practicing for a programming contest where people are just trying to solve as many problems as possible.&lt;br /&gt;&lt;br /&gt;If anyone gets around to actually attempting this please post a comment with the results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-8963101463529247467?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/8963101463529247467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2011/10/teacup-programming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/8963101463529247467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/8963101463529247467'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2011/10/teacup-programming.html' title='Teacup Programming'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ebhX4BOt8ag/To6o9Zhl9iI/AAAAAAAAAWo/S1d4BP8x2gU/s72-c/teacup-setup.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-4959768044711416416</id><published>2011-10-07T00:19:00.000-06:00</published><updated>2011-10-07T00:19:48.954-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unit Test'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Remaking the bed...</title><content type='html'>I follow @unclebobmartin on twitter and was also getting caught up with his blog posts and have been enjoying his rant-like video posts. &amp;nbsp;I particularly liked this one about &lt;a href="http://cleancoder.posterous.com/architecture-deference"&gt;Architecture Deference&lt;/a&gt;&amp;nbsp;and even tweeted saying so. &amp;nbsp;I found it to be a good pre-cursor to&amp;nbsp;&lt;a href="http://blog.8thlight.com/uncle-bob/2011/09/30/Screaming-Architecture.html"&gt;this post&lt;/a&gt;&amp;nbsp;on Screaming Architecture which I'm sure came partly as a result of the first. &lt;br /&gt;&lt;br /&gt;I've been dealing with issues in some of our apps and haven't been able to put my finger on where they stem from and these posts really seemed to highlight for me what it likely was in the approach that caused these issues. &amp;nbsp;From the running of tests taking too long to too much focus on the aspects that don't really matter and should be deferred, I think I know where many of the issues lie. &amp;nbsp;The only problem now is figuring out how to fix it once it's been done... or is it too late? &amp;nbsp;Would it be too much to decouple the model, or the architecture, from the frameworks and tools to make it not worth the effort? &amp;nbsp;Do we just say lesson learned and take a more correct approach the next time around? &lt;br /&gt;&lt;br /&gt;How tired am I? &amp;nbsp;Do I just want to go to sleep in the bed that's made or do I remake it? &amp;nbsp;Can it be remade?&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-4959768044711416416?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/4959768044711416416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2011/10/remaking-bed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/4959768044711416416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/4959768044711416416'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2011/10/remaking-bed.html' title='Remaking the bed...'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-4009056603544740948</id><published>2011-01-21T10:36:00.000-07:00</published><updated>2011-01-21T10:36:11.918-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mock Data'/><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='Team Morale'/><title type='text'>Making Mock Data Fun</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;While looking at documention for&amp;nbsp;&lt;a href="http://www.pivotaltracker.com/help/integrations#activity_web_hook"&gt;Pivotal Tracker's Activity Web Hook&lt;/a&gt;&amp;nbsp;we were looking at the following piece of XML they provide as sample data:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;activity&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;id type="integer"&amp;gt;1031&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;version type="integer"&amp;gt;175&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;event_type&amp;gt;story_update&amp;lt;/event_type&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;occurred_at type="datetime"&amp;gt;2009/12/14 14:12:09 PST&amp;lt;/occurred_at&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;author&amp;gt;James Kirk&amp;lt;/author&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;project_id type="integer"&amp;gt;26&amp;lt;/project_id&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;description&amp;gt;James Kirk accepted &amp;amp;quot;More power to shields&amp;amp;quot;&amp;lt;/description&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;stories&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;story&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;id type="integer"&amp;gt;109&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;url&amp;gt;https:///projects/26/stories/109&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;accepted_at type="datetime"&amp;gt;2009/12/14 22:12:09 UTC&amp;lt;/accepted_at&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;current_state&amp;gt;accepted&amp;lt;/current_state&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;/story&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;/stories&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&amp;lt;/activity&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;They also show the following example for creating a new user:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;e.g. Name, email, or James T. Kirk (JTK) &amp;lt;kirk@starfleet.edu&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;We couldn't help but laugh and think that pivotal must be a fun place to work. &amp;nbsp;While discussing other types of funny mock data we'd seen both in our own office and elsewhere we had the thought that having fun mock data could help get developers more involved with testing. &amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;In my experience most developers dislike creating data to test with. I'm not talking about making&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Mock_object"&gt;mock objects&lt;/a&gt;&amp;nbsp;but making actual test data that mirrors what you'd expect to have in a real system.&amp;nbsp;It's tedious and not very fun.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Nothing beats real data of course, however, a good set of mock data makes it much easier to test an application either manually or in some automated CI system so it is definitely something you want to have when developing an application. &amp;nbsp;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-4009056603544740948?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/4009056603544740948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2011/01/making-mock-data-fun.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/4009056603544740948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/4009056603544740948'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2011/01/making-mock-data-fun.html' title='Making Mock Data Fun'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-1863000434374363031</id><published>2010-07-06T12:45:00.000-06:00</published><updated>2010-07-07T15:18:50.151-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Switching to PivotalTracker</title><content type='html'>For our SCRUM development we have used a variety of tools to plan and track our work.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Mingle&lt;/span&gt;&lt;br /&gt;We used Mingle for a long time but found that because it is so customizable it makes it very easy to overcomplicate your project and process.&amp;nbsp; We also spent a large amount of time configuring, setting up and tweaking mingle to create the ideal project template.&amp;nbsp; Mingle is also very slow and seems to require a server with a huge amount of resources to run smoothly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Scrum Ninja&lt;/span&gt;&lt;br /&gt;Scrum Ninja has a lot of nice features and seems to be going in the right direction but it was very glitchy and we even lost some data at one point.&amp;nbsp; We were able to get most of it back through their support but it was definitely a hassle.&amp;nbsp; Searching didn't work very well and although the card wall view is a nice idea it can be hard to read.&amp;nbsp; The export format is relatively useless leaving out important data like dates.&amp;nbsp; It wasn't even worth trying to parse the exported text with a script to extract what we wanted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Pivotal Tracker&lt;/span&gt;&lt;br /&gt;Pivotal has done a very nice job with their Tracker product. &amp;nbsp;We first tried at the same time as ScrumNinja and first impressions left us feeling it was more restricted or had fewer features in some areas. &amp;nbsp;We gave it another go and now realize it has a much simpler interface that we've found frees us up to just work on the project rather than spending time setting it up in the tool.&amp;nbsp; It has several integrations with other projects and an open API for custom integrations. &amp;nbsp;We've also made suggestions and bug reports and had very quick responses and fixes. &amp;nbsp;It also&amp;nbsp;uses csv as an export format. &amp;nbsp;All in all we're very happy with Tracker so far.&amp;nbsp; Plus, it's free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-1863000434374363031?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/1863000434374363031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2010/07/switching-to-pivotaltracker.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/1863000434374363031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/1863000434374363031'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2010/07/switching-to-pivotaltracker.html' title='Switching to PivotalTracker'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-8517034266977433054</id><published>2010-07-06T11:47:00.000-06:00</published><updated>2010-07-07T05:59:11.541-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>overcomplicating things with the repository pattern</title><content type='html'>The Repository pattern was used in a project by some team members 6 or so months ago and it's being mentioned again along with concepts of an Aggregate Root in discussions on refactoring another project.&amp;nbsp; Both of these projects were C# projects using LINQ to SQL. &amp;nbsp; While working on the first project I kept thinking that the repository pattern seemed to just over complicate things and I couldn't see what real benefit it brought to a fairly simple application.&amp;nbsp; Now, I've done some further reading on Aggregate Roots and found ties to the repository pattern again.&amp;nbsp; As I read through several definitions I kept thinking that the main benefits are already provided via LINQ and implementing it on top seemed to only add another abstraction layer.&amp;nbsp; I did some more searching on the subject and found this article: &lt;a href="http://ayende.com/Blog/archive/2009/04/17/repository-is-the-new-singleton.aspx"&gt;Repository is the new Singleton&lt;/a&gt; and it just echoed everything I was thinking.&lt;br /&gt;&lt;br /&gt;Creating a repository for data that is already in your DB  is overkill when you are using LINQ (and likely any modern ORM) for accessing that data since the data access provided by LINQ is itself making use of the repository pattern .&amp;nbsp; A  good place where the repository pattern would be useful is where you may  have different sources of data.&lt;br /&gt;&lt;br /&gt;Here is another interesting article about the &lt;a href="http://weblogs.asp.net/fredriknormen/archive/2008/04/24/what-purpose-does-the-repository-pattern-have.aspx"&gt;Purpose of the Repository Pattern&lt;/a&gt; that talks about some of the issues when using this pattern along with LINQ.&amp;nbsp; The DataContext issues he mentions exist generally in a Web Application built on LINQ and not just when using repositories.&amp;nbsp; Our team got around some of the DataContext issues by using a &lt;a href="http://www.west-wind.com/weblog/posts/246222.aspx"&gt;DataContext Factory&lt;/a&gt; that we found that creates a scoped DataContext within the HttpContext and while within the scope of the HttpContext it always returns the same DataContext.&amp;nbsp; This helps keep anything within the HttpRequest in the same Unit of Work.&amp;nbsp; It was also written to work within the current thread if a HttpRequest is not available (a non-web app).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-8517034266977433054?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/8517034266977433054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2010/07/overcomplicating-things-with-repository.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/8517034266977433054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/8517034266977433054'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2010/07/overcomplicating-things-with-repository.html' title='overcomplicating things with the repository pattern'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-351541500827584310</id><published>2010-02-09T11:31:00.000-07:00</published><updated>2010-07-06T15:52:49.826-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Xp'/><title type='text'>Is the industry moving away from Agile?</title><content type='html'>&lt;div&gt;I don't think so.   &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm writing this in response to a link to &lt;a href="http://games.slashdot.org/story/10/02/09/0551202/Game-Development-In-a-Post-Agile-World"&gt;this article on slashdot&lt;/a&gt; that a friend sent me asking the question which I've used as the title for this post.  (The slashdot article references &lt;a href="http://gwaredd.blogspot.com/2010/02/game-development-in-post-agile-world.html"&gt;this blog post&lt;/a&gt; which is a good and informative read in itself and I found I agreed with many of his points. What starts as an emotional rant turns into a very well presented article.)  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There isn't just one way of doing development or just one way of doing agile; hence the name agile.  I thought the first poster on slashdot hit it on the head especially with his comments about having the right people and making adaptations to your business.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The author leads into the article complaining about agile but later talks about how many other methodologies can also be successful.  The important thing in my mind is picking the right approach for the job (or team even; some methodologies only work with a certain type of people) and also understanding that methodology properly.  In fact, the understanding must come first to be sure that you do pick the right approach for your team/project.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The author made a good point about how some people use the words "agile" and "scrum" interchangeably.  It is my opinion that these are the teams that fail at agile.  It could be that some see agile as being less structured and as a result end up thinking there are fewer rules and less accountability.   An agile approach may give the developers more leeway and freedom but with that comes more responsibility.  My experience has shown that a junior team usually cannot succeed in these circumstances.  They typically will not have the experience required to make the design and implementation decisions that are usually made by someone else in a different model.  It's been a challenge to overcome with some of our teams.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We use SCRUM outwardly but also take the XP approach mentioned by Kent Beck in "Extreme Programming Explained" and implement changes slowly.  We reflect each week in our sprint retrospective on how those changes helped/hindered us and we also talk about new ideas and ways to improve our process.  Yes, we follow a scrum model but one that we have adapted to our needs.  We also know that it is more than just doing this list of things and then we'll have it right.  We know that the business needs change, the business itself changes and that we need to be able to change and adapt in order to keep pace. I feel that with the right mix of people and support from management agile can be very effective.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Although we don't do game development where I work, I had previously found &lt;a href="http://www.wizardbyte.ca/scrum-lessons-learned-at-bioware-agile-edmonton.pdf"&gt;this pdf about lessons learned implementing SCRUM at Bioware&lt;/a&gt; and one of the key things I took from that was that they also ended up adapting SCRUM to their own needs.  I think this is key to success with any methodology; being able to take what works and adapt where you need to.  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-351541500827584310?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/351541500827584310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2010/02/is-industry-moving-away-from-agile.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/351541500827584310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/351541500827584310'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2010/02/is-industry-moving-away-from-agile.html' title='Is the industry moving away from Agile?'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-6112547156379602786</id><published>2010-01-21T13:51:00.000-07:00</published><updated>2010-07-07T15:20:51.738-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Git'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='TortoiseGit'/><title type='text'>Setting up TortoiseGit to work with SSH on a different port (not port 22)</title><content type='html'>So recently we've had some headaches giving users on Windows machines access to our git repository (me being one of them but not the first).  In searching for a solution to this problem I found several people with the same issue but having to use various workarounds or actually change their ssh port back to 22.  All of the workarounds were out of the question for me but I knew there had to be a way to do it.  Basically I just followed some of the better posts about using Git on Windows out there with a couple minor changes.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here are links to a few of the posts I looked at while trying to figure this out:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.lostechies.com/blogs/jason_meridth/archive/2009/06/01/git-for-windows-developers-git-series-part-1.aspx"&gt;http://www.lostechies.com/blogs/jason_meridth/archive/2009/06/01/git-for-windows-developers-git-series-part-1.aspx&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;a href="http://nathanj.github.com/gitguide/tour.html"&gt;http://nathanj.github.com/gitguide/tour.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://kylecordes.com/2008/04/30/git-windows-go/"&gt;http://kylecordes.com/2008/04/30/git-windows-go/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The important pieces to make sure you get it working are these:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Be sure you choose the OpenSSH option when installing msysgit&lt;/li&gt;&lt;li&gt;Be sure you choose the OpenSSH option when installing TortoiseGit&lt;/li&gt;&lt;li&gt;create a .ssh/config file and enter something like the following&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;code&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Host name_of_host_where_your_git_repo_is&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;User git&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Hostname name_of_host_where_your_git_repo_is&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Port port_number&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;PreferredAuthentications publickey&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;IdentityFile &lt;span class="Apple-tab-span" style="white-space: pre; "&gt;"/&lt;/span&gt;path&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;/&lt;/span&gt;to&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;/&lt;/span&gt;your&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;/&lt;/span&gt;openssh/private/key&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;"&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;A&lt;/span&gt;nd you should be good to go.  I actually set up msysgit and my ssh config file first, then I made sure that I could connect and then I installed TortoiseGit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tips: &lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;If you created your private key using puttygen then you'll need to export it (using puttygen) as an OpenSSH key.&lt;/li&gt;&lt;li&gt;While testing your connection you can use &lt;i&gt;ssh -v git@github.com&lt;/i&gt; (or @ your own host even) to see what ssh is doing and to make sure it is finding your key correctly.&lt;/li&gt;&lt;li&gt;If your openssh key is located at C:\users\myuser\keys\key.ssh then the path to your IdentityFile should be like this: /c/users/myuser/keys/key.ssh&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-6112547156379602786?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/6112547156379602786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2010/01/setting-up-tortoisegit-to-work-with-ssh.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/6112547156379602786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/6112547156379602786'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2010/01/setting-up-tortoisegit-to-work-with-ssh.html' title='Setting up TortoiseGit to work with SSH on a different port (not port 22)'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-566365534281638675</id><published>2009-10-09T14:11:00.000-06:00</published><updated>2009-10-09T14:19:38.920-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><title type='text'>SQL Server 2008 express</title><content type='html'>I spent the better part of today attempting to get my (Windows Vista Business :/ ) system to a state where I was able to run the installer for SQL Server Management Studio 2008 so that I could access a 2008 sqlexpress instance running on another machine.  It's finally running the installer as I type this and the annoying thing is that my friend was able to access the DB using RazorSQL (usign the jtds driver) on his Mac without a problem.  It's infuriating that I have to go through all this hassle when I could have just used a non-Microsoft tool to do the job.  I don't see why SQL Server Management Studio 2005 can't access the database at the same level as jtds.  I suppose if I added an odbc connection on my computer to the db then I could have accessed it that way...&lt;br /&gt;&lt;br /&gt;The install is now finished...  Hopefully I can at least get some work done now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-566365534281638675?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/566365534281638675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/10/sql-server-2008-express.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/566365534281638675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/566365534281638675'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/10/sql-server-2008-express.html' title='SQL Server 2008 express'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-2631770569278522997</id><published>2009-09-29T15:03:00.000-06:00</published><updated>2009-09-29T15:07:48.634-06:00</updated><title type='text'>Errors with an Upgraded Rails version</title><content type='html'>&lt;pre class="code"&gt;NameError: uninitialized constant ApplicationController&lt;/pre&gt;I've had to take a shelved project written for rails 2.1.1 and try to get it running again and ran into an issue getting it to work with the version I have on my machine; namely rails 2.3.4.  Thanks to &lt;a href="http://www.42.mach7x.com/2009/03/30/upgrading-to-232-uninitialized-constant-applicationcontroller/"&gt;this post&lt;/a&gt; I was able to quickly overcome the most obscure error rather quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-2631770569278522997?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/2631770569278522997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/09/errors-with-upgraded-rails-version.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/2631770569278522997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/2631770569278522997'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/09/errors-with-upgraded-rails-version.html' title='Errors with an Upgraded Rails version'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-6854146504081025267</id><published>2009-07-07T13:15:00.000-06:00</published><updated>2010-07-07T15:20:01.733-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='FxCop'/><category scheme='http://www.blogger.com/atom/ns#' term='Team City'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Team City's FxCop Runner</title><content type='html'>Team City has a number of built in runners to use on your project that provide some pretty nice reports right within Team City.  Some of those we're using are the Duplicates Finder (.Net) and the FxCop runner.  The Duplicates was pretty easy to set up but I had a little more difficulty with FxCop.  Nothing serious but I thought I'd reproduce what we did here.&lt;br /&gt;&lt;span class="vote-count-post"&gt;&lt;/span&gt;&lt;br /&gt;First, of course, we had to make sure that FxCop was installed on our Build Agents.  Then I added the following to the buildAgent.properties file&lt;div class="post-text"&gt;&lt;p style="font-family: courier new; color: rgb(0, 153, 0);"&gt;system.FxCopRoot=c\:\\Program Files (x86)\\Microsoft FxCop 1.36&lt;/p&gt;&lt;p&gt;Make sure to escape the colon and backslashes. &lt;/p&gt;&lt;p&gt;Then I had to create an artifact from my compile build configuration that was the bin folder containing the assemblies I wanted FxCop to look at.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Then I had to create an artifact dependency on that artifact in the FxCop build configuration; otherwise there were not any assemblies available for FxCop to operate on.&lt;/p&gt;&lt;p&gt;That did the trick for me.&lt;/p&gt;&lt;/div&gt;The next step is to create a Dashboard type page that will have a script that will grab all the different metrics created from FxCop, Duplicate Detection, NCover, our burndown chart, etc. and display them in easy to view way (graphs and what not).  We'd have all developers set this to be their home page (or ideally have it displayed on a wall somewhere) so all this can be viewed at a glance and you can get a quick overview of the project.  I think this will be really valuable as a tool while trying to take TDD to the next step.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-6854146504081025267?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/6854146504081025267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/07/team-citys-fxcop-runner.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/6854146504081025267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/6854146504081025267'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/07/team-citys-fxcop-runner.html' title='Team City&apos;s FxCop Runner'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-3535778614376951486</id><published>2009-05-07T12:20:00.000-06:00</published><updated>2009-05-07T12:32:10.623-06:00</updated><title type='text'>Continuous Integration Wash Cycle</title><content type='html'>This &lt;a href="http://www.alexooi.com/blog/tech/entry/daily_routine_with_continuous_integration"&gt;post&lt;/a&gt; about a developer's daily routine when using Continuous Integration is a nice breakdown that can be used when introducing people to CI.  Following the links through the posts brings you eventually to &lt;a href="http://notdennisbyrne.blogspot.com/2007/09/top-5-signs-of-discontinuous.html"&gt;this post about Discontinuous Integration&lt;/a&gt; which reinforces the practice of committing often.  Following a daily routine as described in the first post will help prevent &lt;span style="font-style: italic;"&gt;discontinuous integration&lt;/span&gt;.  We've switched to using Team City after having used both CruiseControl.Net and Cruise for our CI.  Team City is by far the most usable and makes following a daily routine much easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-3535778614376951486?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/3535778614376951486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/05/continuous-integration-wash-cycle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/3535778614376951486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/3535778614376951486'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/05/continuous-integration-wash-cycle.html' title='Continuous Integration Wash Cycle'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-8344002253757781555</id><published>2009-03-25T06:42:00.000-06:00</published><updated>2009-03-25T07:16:55.321-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Unit Test'/><category scheme='http://www.blogger.com/atom/ns#' term='Acceptance Test'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>TDD in MVC applications</title><content type='html'>When developing a web application using MVC there are some components of the application that are not easily tested and can't be tested using automated unit tests.  Since automated unit tests are the TDD bread and butter it follows that you can't use Test Driven Development for every aspect of your application.  Our team has mentioned that it is difficult to know when to use TDD so I'm hoping to provide some guidance to help in this area.  Any comments or suggestions about other methods are welcome.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Libraries:&lt;/span&gt; &lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;"That code should be in the Model!"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I think it's pretty simple really.  Basically anything that will be used as a library function should have a unit test written for it and anything that should have a unit test written could be developed using TDD.  In MVC, you would use TDD to develop Model code.  If there is any code in the controller that contains some business logic that could be pulled out and made into a library function then that code should be in the model.&lt;br /&gt;&lt;br /&gt;Any other aspect of the application would need to be tested using acceptance testing methods.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-8344002253757781555?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/8344002253757781555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/03/tdd-in-mvc-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/8344002253757781555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/8344002253757781555'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/03/tdd-in-mvc-applications.html' title='TDD in MVC applications'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-950352397660972533</id><published>2009-03-23T23:44:00.001-06:00</published><updated>2009-03-24T00:37:11.553-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='code ownership'/><title type='text'>Are You Invested?</title><content type='html'>We use Scrum and have weekly sprints.  I had someone asking me about a piece of the application that had been developed in a sprint a couple weeks prior.  The developer asking the question had not worked on that piece during that previous sprint and was now working on something that involved refactoring a portion of that code.  During the discussion, when asked about how certain pieces of it worked, the developer brought up the fact that the piece of code was not written by him, as if to say, "&lt;span style="font-style: italic;"&gt;Well, that's not MY piece of code&lt;/span&gt;".  I was more than a little surprised by this comment and not only because in Agile development there is &lt;span style="font-style: italic;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming_Practices#Collective_code_ownership"&gt;collective code ownership&lt;/a&gt; &lt;/span&gt;but also because it shows a lack of investment in the project.  These obviously go hand in hand.  The more invested a developer feels in a project the greater his sense of ownership. &lt;br /&gt;&lt;br /&gt;Even so, the concept of collective code ownership means that all team members are responsible for the code that is developed.  That doesn't mean that you have to know every detail about the application or about what your team members are working on but it does mean that you should at least know what they are working on and how it impacts the rest of the application.  If they are applying a new technology you should at the very least have an idea of some of the issues that can come up while doing so simply from the daily stand up meetings.  The point of collective code ownership is that any member of the team can work on any piece of it.  A single piece of the code is not dependant on a single developer.  This is also a benefit of occasional pair programming and having other team members test your code/tasks because it allows for another pair of eyes to look at the problem even if it is done as more of an overview.&lt;br /&gt;&lt;br /&gt;So if a developer comes across a task that requires them to work on a piece of the code that they haven't worked on before they should be doing all they can to learn what they can about this piece of code.  Whether they turn around and talk to the developer who first wrote it, read through the code (which would probably be my first step) or start researching on their own by looking online, in books or other documentation, they should be invested enough that the fact that they did not write it in the first place should never even come up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-950352397660972533?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/950352397660972533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/03/are-you-invested.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/950352397660972533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/950352397660972533'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/03/are-you-invested.html' title='Are You Invested?'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-1320596903480323630</id><published>2009-03-20T01:08:00.000-06:00</published><updated>2011-10-13T13:37:06.386-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XP Practices'/><category scheme='http://www.blogger.com/atom/ns#' term='BDD'/><category scheme='http://www.blogger.com/atom/ns#' term='Xp'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>TDD Adoption</title><content type='html'>I've been doing a lot of reading about Test Driven Development and how to use and apply it and found some of the most revealing material while reading about Behaviour Driven Development.  I was reading this &lt;a href="http://behaviour-driven.org/Introduction"&gt;Introduction to BDD&lt;/a&gt; and the &lt;a href="http://behaviour-driven.org/TDDAdoptionProfile"&gt;TDD Adoption Profile&lt;/a&gt; mentioned at the top of the article was the catalyst for this post.  This will make sense to anyone who knows anything about BDD since BDD is basically an attempt to relabel TDD to help people use it more appropriately.&lt;br /&gt;&lt;br /&gt;What I hope to do here is highlight some of the key areas that seem to cause developers to fail while using TDD or fail to adopt TDD.  I get the impression that development teams attempting TDD often end up not using it properly or consistently or else quitting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Developer Buy In&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This could be a failing point of any development technique but I think it affects TDD more so because of the requirement to write tests first.  If the developers don't buy in, they won't write tests and will continue to just develop in whatever way they are accustomed to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Focus on Testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Of course there is a focus on testing in TDD!  The T stands for Test, doesn't it?&lt;/span&gt;  This was one of the biggest realizations for me while reading the BDD Introduction mentioned above.  They mentioned that most developers get to step 4 in the TDD adoption profile and stop there missing the benefits of steps 5-7.  I think this was a big realization for me since I was probably still at step 4 in my own acceptance of TDD.  After reading steps 5, 6 and 7 and reading about how BDD is basically TDD with less focus on testing and instead a focus on behaviour I began to see the real benefits of TDD.  So to oversimplify things, the BDD folks are basically rebranding TDD to focus attention where the the real gains in TDD can be made.  This leads me to wonder then if a developer would gain more by first being taught about TDD with this emphasis in mind rather than having to get there on his own, making these realizations as he goes.  I can see how the personal realizations would carry more weight than just being told about these things in advance but wouldn't foreknowledge at least increase the likelihood of the realizations occurring?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Learning TDD on the Wrong Project&lt;/span&gt;&lt;br /&gt;I don't mean to suggest that TDD only works with certain types of projects but I'm convinced that there will be a greater chance of adoption if the selected project is a new one or has had very little work done on it.  The reason I say this is because the first step in TDD is to write tests first and not to write code you don't have to.  So writing tests for existing code can at times seem pointless or at least more work than it's worth when you already have a working application (although there is merit in having thorough unit test coverage) and writing tests for new code requires the team to develop using new techniques on an application they've likely already spent a lot of time on and are fairly adept at debugging.  I'm not suggesting Unit tests shouldn't be written or that TDD can't be used on an existing project, I'm just pointing out areas where I have seen resistance to TDD adoption.   For a team new to TDD it may be better to start fresh.  Starting fresh may also help the team feel more inclined to experiment with this new method whereas an existing project will already have set expectations the team is accustomed to.  I appreciate that step 1 in the TDD adoption profile is about starting by writing unit tests around their code so perhaps a first foray into TDD is best done on an existing project but I would argue that it would be better to not refer to it as TDD at this point in time because it is actually not yet TDD.  Instead I would call it what it is and that is writing unit tests to help improve the quality of the code being tested.  It is not yet TDD because TDD requires that you first add a test for the feature you want to add&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;and then after seeing the test fail you implement the feature.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Poorly Designed Code is Hard to Test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the &lt;span style="font-style: italic;"&gt;realizations&lt;/span&gt; while learning TDD occurs when the developer discovers that TDD is in fact a design process that helps them define the application's API.  Developing in this way will likely produce better code than was previously being produced and of course have tests written for but my point here is that if attention is also given to applying best practices like proper object oriented techniques and design patterns then TDD adoption is smoother and the TDD process itself becomes easier.  Take MVC for example.  When followed correctly all business logic should end up in the Model which makes things much easier to test, especially if the model was created using object oriented design principles.&lt;br /&gt;&lt;br /&gt;I know some of what I've said are problems that are addressed by using TDD and in realizing that it hopefully increases the value of TDD in the eyes of those trying to use it.&lt;br /&gt;&lt;br /&gt;Kent Beck has written a great book called &lt;a href="http://www.google.ca/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=4&amp;amp;url=http%3A%2F%2Fbooks.google.ca%2Fbooks%3Fid%3DgFgnde_vwMAC%26dq%3Dtest%2Bdriven%2Bdevelopment%2Bby%2Bexample%26printsec%3Dfrontcover%26source%3Dbn%26hl%3Den%26ei%3Du0nHSdq7MIzyMvbn1Qk%26sa%3DX%26oi%3Dbook_result%26resnum%3D4%26ct%3Dresult&amp;amp;ei=u0nHSdq7MIzyMvbn1Qk&amp;amp;usg=AFQjCNFzvqmkgfBRQzbjd4bkD83sDkoRNA&amp;amp;sig2=dNXtZxOUEihHz2R5FwKooA"&gt;Test-Driven Development: by Example&lt;/a&gt; that I would recommend as a great starting point for anyone trying to learn TDD.&lt;br /&gt;&lt;br /&gt;Some might ask, why not just use BDD?  My response at this point would be, I don't know, why not?  Perhaps frameworks for BDD are not yet as established as those used in TDD.   Maybe we &lt;span style="font-style: italic;"&gt;should &lt;/span&gt;all switch to BDD.  Or maybe, TDD works just fine provided we shed light on more than just the testing aspect of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-1320596903480323630?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/1320596903480323630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/03/tdd-adoption.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/1320596903480323630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/1320596903480323630'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/03/tdd-adoption.html' title='TDD Adoption'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-6682263090811796800</id><published>2009-03-04T01:38:00.000-07:00</published><updated>2009-03-04T02:38:46.156-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><category scheme='http://www.blogger.com/atom/ns#' term='Object Oriented Design'/><category scheme='http://www.blogger.com/atom/ns#' term='Architectural Patterns'/><title type='text'>Design Patterns vs. Architectural Patterns</title><content type='html'>After discussing &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;MVC&lt;/a&gt; and it's use (or non-use, actually) in some of our apps it became apparent that a bigger problem existed in the design of these applications.  Now most of our apps are used in house and were developed initially by a group of bygone developers and as part of the ongoing task of trying to enhance and adapt them we are reminded of the benefits of a strong attention and adherence to good design.&lt;br /&gt;&lt;br /&gt;Despite being written in an Object Oriented language, much of the functionality in these applications is accessed through static methods and the model classes are nothing more than containers.   When model objects tend to be simple containers we get this confusion about what the controller actually is.  If all appropriate code were actually in the model classes the division would be a little clearer.  LINQ makes things a little easier because it creates a bunch of your model for you and you can build on it using partial classes and such.  The problem persists in LINQ apps though where if developers don't follw good OO design we can have all these static methods adding another layer of complexity to everything.&lt;br /&gt;&lt;br /&gt;There is an article on &lt;a href="http://msdn.microsoft.com/en-us/library/ms998540.aspx"&gt;implementing MVC in ASP.Net&lt;/a&gt; that outlines it pretty well.  The part I don't like  is that the model is not object oriented but uses static methods.  It is still a  good reference though.   So in the context of ASP.NET, the way I see it is that the code behind is the  controller and basically everything else that is not an aspx page is the model.&lt;br /&gt;&lt;br /&gt;Both &lt;a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29"&gt;Design Patterns&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Architectural_pattern_%28computer_science%29"&gt;Architectural Patterns&lt;/a&gt; will improve the quality of code when applied.  It follows that using them together will yield even better results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-6682263090811796800?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/6682263090811796800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/03/design-patterns-vs-architectural.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/6682263090811796800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/6682263090811796800'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/03/design-patterns-vs-architectural.html' title='Design Patterns vs. Architectural Patterns'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-2965996729273173606</id><published>2009-03-04T00:45:00.001-07:00</published><updated>2009-03-04T01:33:27.057-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>Subversion Best Practices: Branching and Merging (because we've been doing it wrong all along)</title><content type='html'>Despite having read the chapter on branching and merging in the &lt;a href="http://svnbook.red-bean.com/"&gt;svn book&lt;/a&gt;, and spent a lot of time thinking about how it should be done, the subversion repository structure at both my current job as well as my previous one have left something to be desired. Branching and Merging never quite worked as nicely or smoothly as it was supposed to.  Eventually we just looked at how &lt;a href="http://httpd.apache.org/dev/devnotes.html"&gt;the Apache project&lt;/a&gt; did it and the correct method became clear to us and although we are not suggesting exactly what they're doing (they have active development happening in several branches) it took looking at their project to make the light go on.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;The Old Way&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;      Trunk was supposed to mirror what was in production, although we were never actually able to achieve this which sparked the many discussions about how else we could do it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;      All Development happened in a numbered branch and a new branch was created for development every time we wanted to push to testing in preparation for staging (which made for messy SVN logs and much difficulty with Merging caused by confusing ancestry).&lt;/li&gt;&lt;li&gt;      Bug fixes would be made to the old development branch which would then require us to either make the same bug fix to the new branch or merge the old branch up and then back down into the new branch or even a merge directly across between the 2 branches, all of which added to the mess in some way causing conflicts or ambiguous ancestry.&lt;/li&gt;&lt;li&gt;      Tags were made when something was pushed to staging/production but it was unclear how/when these tags should be created.&lt;/li&gt;&lt;li&gt;It was confusing to explain the branching procedures to new people and difficult to enforce/maintain.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The New Way&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;      Development occurs in the trunk. Trunk is ultimately the development branch itself. The majority of development will occur in the trunk.&lt;/li&gt;&lt;li&gt;      Branching occurs when:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We want to create a release of current feature set.  This can be done as a Tag, or a branch and a Tag.  The latter method would create a branch for doing bug fixes and new tags would need to be created for that branch every time a set of bug fixes are pushed as a release.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;            Development of a new feature would seriously disrupt normal development&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;      Release branches will be pushed to Testing, then to Staging and finally production. Bug fixes to these branches will be done within the branch and then merged up into the trunk. This way bug fixes are always included in the trunk (dev) and there is no messy merging across or down from trunk into a current dev branch.&lt;/li&gt;&lt;li&gt;      Every set of fixes/changes made to the old branch are tagged so we know which version contains which set of fixes.&lt;/li&gt;&lt;li&gt;      Easy to explain to new people.&lt;/li&gt;&lt;li&gt;      Easy to maintain.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-2965996729273173606?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/2965996729273173606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/03/subversion-best-practices-branching-and.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/2965996729273173606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/2965996729273173606'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/03/subversion-best-practices-branching-and.html' title='Subversion Best Practices: Branching and Merging (because we&apos;ve been doing it wrong all along)'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1070107431352346596.post-365629054444652384</id><published>2009-03-04T00:07:00.001-07:00</published><updated>2009-03-04T00:42:59.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Cowboy Coding'/><title type='text'>Code Slinging</title><content type='html'>I've thought for a while that I should start a development related blog where I can drop bits of development related goodness.  The name Code Slinging came to me while reading the &lt;span style="font-style: italic;"&gt;Contrasted with "cowboy coding"&lt;/span&gt; section in the wikipedia article on &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile Software Development&lt;/a&gt;.  It was the first time I'd heard the term but thought it very apt and it prompted me to go ahead with creating this blog. &lt;br /&gt;&lt;br /&gt;The interesting thing is that anyone who has ever written code would more or less have had experience with the &lt;a href="http://en.wikipedia.org/wiki/Cowboy_coding"&gt;Cowboy Coding&lt;/a&gt; methodology, if we can really call it a methodology since it lacks structured methods and procedures. &lt;br /&gt;&lt;br /&gt;Like I said, it was the first time I had heard the term but as I read it's definition it all seemed very reminiscent of anything I had done on my own or even most group work while at university.   The initial reaction is that it has a negative connotation (especially after having worked on an agile team for the past year and on a &lt;a href="http://en.wikipedia.org/wiki/IBM_Rational_Unified_Process"&gt;modified RUP&lt;/a&gt; team previous to that) but on further thought I can see merit in actually choosing it as a development methodology in certain circumstances.  These circumstance, rare as they may be, would require a small, skilled team of individuals who trust one another and their abilities and who have near complete autonomy in the decision making process.  However, I think these circumstances are so rare and the conditions for successful execution so difficult to achieve that it renders Cowboy Coding a viable option only when the decision maker is the sole developer on a project.  Basically one man jobs or personal projects.&lt;br /&gt;&lt;br /&gt;Cowboy Coding can in many cases very much resemble agile methods because they both have working software as a measure of success, they are both adaptive methods and they both require trust between developers (to be successful).   However, without a focus on some integral agile principles (like specific timeblocks that are in themselves complete development cycles) it cannot be classified as such.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1070107431352346596-365629054444652384?l=codeslinging.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codeslinging.blogspot.com/feeds/365629054444652384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://codeslinging.blogspot.com/2009/03/code-slinging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/365629054444652384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1070107431352346596/posts/default/365629054444652384'/><link rel='alternate' type='text/html' href='http://codeslinging.blogspot.com/2009/03/code-slinging.html' title='Code Slinging'/><author><name>wizardbyte</name><uri>http://www.blogger.com/profile/13891102187417081167</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_udQvjKRP908/SsTfZY410PI/AAAAAAAAAOY/lS0L1ZYfIP4/S220/AshHDR.jpg'/></author><thr:total>0</thr:total></entry></feed>
