<?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-7757566786700790763</id><updated>2011-07-30T16:07:47.241-07:00</updated><category term='exercise'/><category term='discussion'/><category term='alt.net'/><category term='activerecord'/><category term='Domain Driven Design'/><category term='conference agile vancouver yvr fowler evans feathers poppendieck'/><category term='development'/><category term='programming'/><category term='time machine example cqs ocp git hooks'/><category term='MSMQ'/><category term='altnet'/><category term='map'/><category term='ideas architecture experiment write-once temporal-objects event-sourcing'/><category term='puzzle'/><category term='book'/><category term='C#'/><category term='troubleshooting'/><category term='members'/><category term='locations'/><category term='pub/sub'/><category term='newsgroup'/><category term='GIT SVN review'/><category term='TDD'/><category term='agile'/><category term='conference agile vancouver books resources offer'/><category term='ORM'/><category term='Presentation Architecture ORM UI Patterns Practices Scalability'/><category term='dsl'/><category term='GIT alias help'/><category term='altdotnet'/><category term='design'/><category term='Presentation SCM GIT funny'/><category term='CSharp'/><category term='project management'/><category term='group'/><category term='git agile presentation vantechfest slides links'/><category term='DDD'/><category term='community speaking learning teaching conference'/><category term='code'/><category term='architecture'/><category term='vancouver'/><category term='xp'/><category term='presentation architecture'/><category term='alt.net vancouver open spaces agile vancouvre'/><category term='notes'/><category term='presentations'/><title type='text'>Adventures in Agile</title><subtitle type='html'>This blog is about programming in general and some other topics here and there. Currently the focus is on a lot of Agile practices such as CI, BDD/TDD and other tools/practices that help companies turn out high quality software fast.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-8558692480873870992</id><published>2010-08-19T11:19:00.000-07:00</published><updated>2010-08-19T11:49:43.410-07:00</updated><title type='text'>Do I Need Yet Another Reason to Justify "Agility"?</title><content type='html'>I haven't blogged in a while, but an email from someone triggered me to put up some Agile thoughts.&lt;br /&gt;&lt;br /&gt;Someone emailed me an issue today. I thought I would share it with you and include my response:&lt;br /&gt;&lt;br /&gt;"... due to an entirely unnecessary international conference call with a brand new manager-type of a big International customer who suddenly thrust himself into a long-running discussion with their Indian subsidiary. Of course, we now have to dance around and kiss HIS culo, so I have to be in the office at an ungodly hour.&lt;br /&gt;&lt;br /&gt;I find that the profitability of successful companies disguises a lot of fatty tissue (i.e. not-very-busy Manager-types). So we get a "suddenly self-appointed stake-holder" who is high enough in the mucky-muck list so you can do nothing about it. Of course, after spending all this time and effort to get him/her involved, they fade away, leaving a giant hole in the team's productivity. Anybody have ideas on how to handle these? Suggestions appreciated."&lt;br /&gt;&lt;br /&gt;No solution comes to mind except simply supporting an Agile and transparent process should do the trick. Here is some background on the type of attitude that is at work here:&lt;br /&gt;&lt;br /&gt;Eventually, these people end up quitting on their own if it becomes  impossible for them to hide their antics. Reasons given for quitting  usually are "I've outgrown the company", "I need new challenges", etc.&lt;br /&gt;&lt;br /&gt;Watch for behaviours such as forcing themselves to be the point of  contact for major customers and purposely leaving people in the dark wrt  to these customers so they appear to be more knowledgeable. After the  useful people have been fired for ineffectiveness (because now they look  like they are the fatty parts of the company that can be trimmed), this  person ends up with a raise and higher title due to the amount of  responsibility. And because they are the ones in contact with clients,  they appear to be the only one to have the tools to calm an irate  client. They've now become a bottle neck and productivity starts to  crawl as the idea of delegating anything wrt requirements is not  possible.&lt;br /&gt;&lt;br /&gt;Once they quit because the found a better job, productivity goes through  the roof! The higher ups instantly know that the joke was on them for  the last 2-4 years since this person was hired. They were able to find a  better job because on paper it looks like they were doing so well -  including a promotion in a relatively short amount of time.&lt;br /&gt;&lt;br /&gt;I've seen this at least a couple of times during my consulting days. I  call these people "professional ladder climbers". To them, the only goal  is to get promoted, get a raise and has nothing to do with making the  organization effective. As long as they satisfy the optics, no one is  the wiser until it's too late to do anything about it and they've gone  to greener pastures.&lt;br /&gt;&lt;br /&gt;This is why I support a transparent process. Agile stuff makes this  possible. Now to implement some of these processes in government offices  so our tax dollars can go to teachers and charities instead of these  narcissistic leaches. I suspect most are not self-aware enough or don't  care to know their impact on society or those immediately around them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-8558692480873870992?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/8558692480873870992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=8558692480873870992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8558692480873870992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8558692480873870992'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2010/08/do-i-need-yet-another-reason-to-justify.html' title='Do I Need Yet Another Reason to Justify &quot;Agility&quot;?'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-8812392180245191715</id><published>2009-11-21T14:08:00.000-08:00</published><updated>2009-11-23T10:35:04.020-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git agile presentation vantechfest slides links'/><title type='text'>Vancouver Tech Fest  GIT Presentation</title><content type='html'>I did a presentation on GIT for Agility at Vancouver Tech Fest today. Here are the slides for those who wanted them! Let me know if you want more info.&lt;br /&gt;&lt;br /&gt;http://drop.io/vantechfest&lt;br /&gt;&lt;br /&gt;Here are some links to good GIT sites:&lt;br /&gt;&lt;br /&gt;Linus Torvalds on GIT: http://www.youtube.com/watch?v=4XpnKHJAok8&lt;br /&gt;GIT magic book: http://www-cs-students.stanford.edu/~blynn/gitmagic/book.html&lt;br /&gt;MSysGIT: http://code.google.com/p/msysgit/&lt;br /&gt;GIT Extensions project for VS: http://code.google.com/p/gitextensions/&lt;br /&gt;&lt;br /&gt;I'm glad people liked the presentation. The organizers will post the actual screen capture and audio later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-8812392180245191715?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/8812392180245191715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=8812392180245191715' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8812392180245191715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8812392180245191715'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/11/vancouver-tech-fest-git-presentation.html' title='Vancouver Tech Fest  GIT Presentation'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-8128961728337106879</id><published>2009-11-02T15:59:00.000-08:00</published><updated>2009-11-02T16:18:02.269-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='alt.net vancouver open spaces agile vancouvre'/><title type='text'>ALT.NET Vancouver is on!</title><content type='html'>We will have a &lt;span style="font-weight: bold;"&gt;FREE&lt;/span&gt; open spaces event held at the 500 Plaza Hotel (Cambie and 12th) starting at 5:30 pm Thursday, Nov. 5th! Participants will include:&lt;br /&gt;&lt;br /&gt;Eric Evans&lt;br /&gt;Michael Feathers&lt;br /&gt;and possibly Martin Fowler and others!&lt;br /&gt;&lt;br /&gt;This is your chance to participate in an interactive setting with a lot of the presenters from Agile Vancouver.&lt;br /&gt;&lt;br /&gt;Please go and sign up at altnetvancouver.ning.com. Please message Stefan Moser or Scott Muc through that site regarding any details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-8128961728337106879?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/8128961728337106879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=8128961728337106879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8128961728337106879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8128961728337106879'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/11/altnet-vancouver-is-on.html' title='ALT.NET Vancouver is on!'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-2546954657121665242</id><published>2009-11-02T15:21:00.000-08:00</published><updated>2009-11-02T15:28:49.269-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference agile vancouver books resources offer'/><title type='text'>Books at Agile Vancouvre Conference</title><content type='html'>Since some people couldn't get the time off work or couldn't afford to attend the conference, they won't be able to get the great discount we have on some books that we have at 20% off the cover price. Please look them up online for the price and subtract 20%. We also include the tax in that price. Let me know through twitter:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Refactoring: Ruby Edition&lt;/span&gt;    Jay Fields / Shane Harvie / Martin Fowler / Kent Beck&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fearless Change: Patterns for Introducing New Ideas&lt;/span&gt;    Mary Lynn Manns Ph.D./Linda Rising Ph.D.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Working Effectively with Legacy Code&lt;/span&gt;    Michael Feathers&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UML Distilled: A Brief Guide to the Standard Object Modeling Language, 3E&lt;/span&gt;    Martin Fowler&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/span&gt;    Eric Evans&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lean Software Development: An Agile Toolkit&lt;/span&gt;    Mary Poppendieck / Tom Poppendieck&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Patterns of Enterprise Application Architecture&lt;/span&gt;    Martin Fowler&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Planning Extreme Programming&lt;/span&gt;    Kent Beck / Martin Fowler&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Refactoring: Improving the Design of Existing Code&lt;/span&gt;    Martin Fowler / Kent Beck / John Brant / William Opdyke / Don Roberts&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Analysis Patterns: Reusable Object Models&lt;/span&gt;    Martin Fowler&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Leading Lean Software Development&lt;/span&gt;    Mary Poppendieck / Tom Poppendieck&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-2546954657121665242?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/2546954657121665242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=2546954657121665242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2546954657121665242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2546954657121665242'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/11/books-at-agile-vancouvre-conference.html' title='Books at Agile Vancouvre Conference'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-4118882443816310244</id><published>2009-09-22T11:00:00.000-07:00</published><updated>2009-09-22T14:19:48.751-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference agile vancouver yvr fowler evans feathers poppendieck'/><title type='text'>Much Ado About Agile 2009 Conference Registration is Open!</title><content type='html'>This is the line up:&lt;br /&gt;&lt;br /&gt;Martin Fowler,&lt;br /&gt;Eric Evans,&lt;br /&gt;Michael Feathers,&lt;br /&gt;Mary Poppendieck,&lt;br /&gt;and others&lt;br /&gt;&lt;br /&gt;The conference is going to sell out quickly as it is a small venue.&lt;br /&gt;&lt;br /&gt;To register please visit &lt;a href="http://www.agilevancouver.ca/"&gt;www.agilevancouver.ca&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-4118882443816310244?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/4118882443816310244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=4118882443816310244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4118882443816310244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4118882443816310244'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/09/much-ado-about-agile-2009-conference.html' title='Much Ado About Agile 2009 Conference Registration is Open!'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-6956151211137958232</id><published>2009-09-20T21:31:00.000-07:00</published><updated>2009-09-20T22:04:39.163-07:00</updated><title type='text'>Event Sourcing and CQS part 1</title><content type='html'>Lets start by getting the transaction side of the application going. We're going to have a customer class that will have some simple properties at first.&lt;br /&gt;&lt;br /&gt;Here is the project setup:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dymitruk.com/projectsetupesexample.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 245px; height: 367px;" src="http://www.dymitruk.com/projectsetupesexample.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This is a pretty easy start. We have the test project that will exercise anything that we write. The messages project is where all our messages will reside. The Transaction Service will house our coordination of receiving commands to the Domain. We'll worry about the event publishing in a little bit. The Domain project will house our entities.&lt;br /&gt;&lt;br /&gt;Time to get some sleep. More on this tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-6956151211137958232?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/6956151211137958232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=6956151211137958232' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/6956151211137958232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/6956151211137958232'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/09/event-sourcing-and-cqs.html' title='Event Sourcing and CQS part 1'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-2506865357567025845</id><published>2009-09-20T21:07:00.001-07:00</published><updated>2009-09-20T22:04:11.295-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='time machine example cqs ocp git hooks'/><title type='text'>Time Machine Example Implementation</title><content type='html'>A little while ago I &lt;a href="http://adventuresinagile.blogspot.com/2009/09/rewind-button-for-your-application.html"&gt;wrote&lt;/a&gt; about a time machine for your application. This based on &lt;a href="http://codebetter.com/blogs/gregyoung/"&gt;Greg Young&lt;/a&gt;'s infamous Event Sourcing strategy. It's time to get a sample application going with this approach. I'll also take it one step further and apply the same strategy to the reporting side of the application. A lot of this hinges on the &lt;a href="http://en.wikipedia.org/wiki/Open/closed_principle"&gt;Open Closed Principle&lt;/a&gt; (OCP)  so I'll try and enforce that through &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/githooks.html"&gt;GIT hooks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is a recap of the steps I'll be taking:&lt;br /&gt;&lt;br /&gt;1. &lt;a href="http://adventuresinagile.blogspot.com/2009/09/event-sourcing-and-cqs.html"&gt;Event Sourcing and CQS to the extreme as prescribed by Greg&lt;/a&gt;.&lt;br /&gt;2. Event Sourcing for reporting schema changes.&lt;br /&gt;3. OCP application to the versioning of the dB instead of version scripts.&lt;br /&gt;4. Enforcement of the OCP to the pub/sub of the reporting dB.&lt;br /&gt;5. OCP application to the reporting services side through GIT hooks.&lt;br /&gt;&lt;br /&gt;This will be hyperlinked as I complete the blog posts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-2506865357567025845?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/2506865357567025845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=2506865357567025845' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2506865357567025845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2506865357567025845'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/09/time-machine-example-implementation.html' title='Time Machine Example Implementation'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-8794623601276145302</id><published>2009-09-18T11:56:00.000-07:00</published><updated>2009-09-18T12:14:03.854-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='community speaking learning teaching conference'/><title type='text'>The Best Certification</title><content type='html'>The best "certification" is still community recognition by putting&lt;br /&gt;yourself out there and learning/teaching publicly:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Blogging:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You put up your ideas in front of many eyes. Teach people. They will be better because of you. Learn from people. You will be better because of them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Twittering:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An optimal conversation is hard to find within your geographical confines. Get the room full of conversations experience on the global scale. What you want to talk about right now is something that others out there want to talk about as well.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Participating in Forums:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To explain something in more than a 140 character-at-a-time conversation, you need a forum. People on forums are there to teach and learn. Participate!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Presenting at User Groups:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sometimes you just need to talk to people in person and get your ideas out in that manner. Local user groups are great as the attendees are people that you can find common ground with, teach and learn from their critique of what you present.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Presenting at Conferences:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is an extension of the user group but will connect with a larger group and geographical reach. It will help you develop as a presenter which will make you a better teacher and better learner. The evaluation forms will let you know where you can improve.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reaching Out to Other User Groups:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Get involved in other user groups. Present there. See what the gap is between the groups. This new dialogue will be very important to learn why the groups exist and why the technologies/methodologies/etc behind each exists.&lt;br /&gt;&lt;br /&gt;I resisted that for a long time and only recently bit the bullet to do all of the&lt;br /&gt;above. Your "certification" is the recognition your peers give you.&lt;br /&gt;&lt;br /&gt;People right out of school are having a hard time getting work. The&lt;br /&gt;ones that are passionate are the ones that I see getting their career&lt;br /&gt;going in the right direction. They are the ones that are still there&lt;br /&gt;participating in the community. We started an Alt.Net Vancouver group&lt;br /&gt;which is tiny compared to most user groups. But I have a hard time&lt;br /&gt;finding more dedicated people. The inexperienced people are getting&lt;br /&gt;their best "certification".&lt;br /&gt;&lt;br /&gt;Hope this will save some people from memorizing index cards and put their time to good use instead!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-8794623601276145302?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/8794623601276145302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=8794623601276145302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8794623601276145302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8794623601276145302'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/09/best-certification.html' title='The Best Certification'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-8528246258071828934</id><published>2009-09-17T12:46:00.000-07:00</published><updated>2009-09-18T11:44:17.004-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentation architecture'/><title type='text'>Layers Talk</title><content type='html'>I put together a talk on layers for TechDays. This is part of a new track that Microsoft is piloting in Vancouver and Toronto. Due to the constraints of time, I had to eliminate some of the subjects that I was originally going to cover. One of them was scalability. I've included the original layout at the end here and hopefully I will be going back to this post and adding some links to subsequent posts. Design by Contract was added as the replacement subject.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dymitruk.com/layers.jpeg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 873px; height: 1514px;" src="http://www.dymitruk.com/layers.jpeg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-8528246258071828934?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/8528246258071828934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=8528246258071828934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8528246258071828934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8528246258071828934'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/09/layers-talk.html' title='Layers Talk'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-4282619336025228220</id><published>2009-09-10T03:03:00.001-07:00</published><updated>2009-09-10T03:57:06.948-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation Architecture ORM UI Patterns Practices Scalability'/><title type='text'>Cake Please</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KQ92vS7TrFg/SqjQvW1JEqI/AAAAAAAAACE/WJSeKdfl2PM/s1600-h/3layercake.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 145px; height: 137px;" src="http://1.bp.blogspot.com/_KQ92vS7TrFg/SqjQvW1JEqI/AAAAAAAAACE/WJSeKdfl2PM/s400/3layercake.jpg" alt="" id="BLOGGER_PHOTO_ID_5379779266894959266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I spent the last week and then some preparing a "Layers" presentation. The focus was to try and get away from what's been taught 20 years ago and the 3-tier UI-BL-DL structure.&lt;br /&gt;&lt;br /&gt;My first attempt was to concentrate on why software was organized at all. It's to manage growth. You don't need any structure if you have a very simple system. With growth comes a demand that goes beyond the organization of the logic. Most modern architecture topics deal with the growth of data that companies need to manage. On top of that is the other -ilities.&lt;br /&gt;&lt;br /&gt;So, scalability and the layers was going to be it. I guess it fell too much on the database at first. The other layers got the raw end of the deal. But wait. That would have been irresponsible.&lt;br /&gt;&lt;br /&gt;The truth is that the structure of such companies is really now a system of systems. Each system may be a cake or a few. The trick is now looking at what sits on top of the shards, document dbs, object dbs, etc.&lt;br /&gt;&lt;br /&gt;So the presentation really turned into an SOA talk with some Domain Driven Design. By diving deeper, the Domain Driven Design turned out to be a vortex with one idea relying on the other - not unlike mathematics: If you want to learn calculus, you better know basic algebra.&lt;br /&gt;&lt;br /&gt;So back to the basics it was: MVP, MVC, MVVM, Transaction Script, Active Record, Domain Model, Data Access and ORM - touching on DbC, DDD and SOA for the second half. I'm happy that I got to use napkin doodles for my diagrams - UML belongs on those things. An MVP diagram looks better next to a coffee cup stain anyway. MS will probably clean all this up :-/&lt;br /&gt;&lt;br /&gt;I don't know. Maybe I'm too tired at this point in the night. I didn't manage to work GIT in to the presentation. Next time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-4282619336025228220?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/4282619336025228220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=4282619336025228220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4282619336025228220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4282619336025228220'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/09/cake-please.html' title='Cake Please'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KQ92vS7TrFg/SqjQvW1JEqI/AAAAAAAAACE/WJSeKdfl2PM/s72-c/3layercake.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-8376188685127945156</id><published>2009-09-07T19:28:00.000-07:00</published><updated>2009-09-16T12:23:43.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ideas architecture experiment write-once temporal-objects event-sourcing'/><title type='text'>A Rewind Button For Your Application Without the Temporal Object Pattern</title><content type='html'>In &lt;a href="http://www.ayende.com/"&gt;Ayende&lt;/a&gt;'s style, I will blog as soon as a thought comes to me.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_KQ92vS7TrFg/SqnUbmoz_kI/AAAAAAAAACM/Qskpdqs9O7g/s1600-h/dali-clock-500x500.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 180px; height: 180px;" src="http://1.bp.blogspot.com/_KQ92vS7TrFg/SqnUbmoz_kI/AAAAAAAAACM/Qskpdqs9O7g/s400/dali-clock-500x500.jpg" alt="" id="BLOGGER_PHOTO_ID_5380064800564051522" border="0" /&gt;&lt;/a&gt;In the last year or so, I have been working on applying the &lt;a href="http://martinfowler.com/eaaDev/EventSourcing.html"&gt;Event Sourcing&lt;/a&gt; pattern. This led to some interesting thoughts. With the fact that the state of any object will be "rewindable", you can do a true audit. Audit logs don't cut it as &lt;a href="http://codebetter.com/blogs/gregyoung/"&gt;Greg Young&lt;/a&gt; has put forth in his presentations.&lt;br /&gt;&lt;br /&gt;That's great for the state of each of the objects. With a bit of work, you can work out anything that might have happened on any reporting that you may need or needed. This may be quite a task to merge your structure and lookup data changes in the reporting db and the actual events that update that data.&lt;br /&gt;&lt;br /&gt;To add, the more difficult task is to have the reporting service changes merged as well. This would not be so bad if the &lt;a href="http://en.wikipedia.org/wiki/Open_Closed_Principle"&gt;Open Closed Principle&lt;/a&gt; (OCP) was adhered to - but only for when new events were added. If the reporting service started to act differently as of some arbitrary version, a careful replay of the system through time would be needed with binaries ready for each timespan that they were around for to receive those events.&lt;br /&gt;&lt;br /&gt;There is the very explicit &lt;a href="http://martinfowler.com/eaaDev/TemporalObject.html"&gt;Temporal Object Pattern&lt;/a&gt; that seems tempting to use. However unless the domain is clearly responsible for knowing it's own contracts, this looks like a very complex solution to put forth as we will want all our objects to be temporal - and our reporting data as well. This is just a wish to have a rewind button on my app to have a truly representative audit.&lt;br /&gt;&lt;br /&gt;So now that we've described the problem, let's take a look at a possible solution: &lt;a href="http://martinfowler.com/eaaDev/EventSourcing.html"&gt;Event Sourcing&lt;/a&gt;. As stated earlier, this allows us to capture events that the domain publishes and add the ability to reconstruct an objects state using just what has been published in the past. A very good implementation of this pattern was thought up by Greg Young. Martin Fowler writes about it &lt;a href="http://www.martinfowler.com/bliki/EagerReadDerivation.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That solves the problem of the rewind button working on the objects themselves. How can we do the same for the rest: reporting services and the reporting schema? The trick is that the state of the objects is write-only via the events they have published so far. To have the same effect for the Reporting Service, we need to adhere to the OCP and publish an event called "CustomerReportService2 will now listen to all CustomerEvents from now on". We keep both versions of the service alive. We can also say that another message is now going to be consumed by the second version from now on at a later point in time.&lt;br /&gt;&lt;br /&gt;This simple fact that we are closing the old service functionality from that point on in the event stream is key. It also gives us the same thing for the dB schema. When we add a table or column or lookup item, etc., we publish the schema change as an event. When rewinding the clock, we drop all the tables from the dB and simply replay all events from the beginning of time through the latest binaries. This may take some time, so some snap shot concept can be introduced as is with Greg's Aggregate Root object snapshot idea.&lt;br /&gt;&lt;br /&gt;If we adhered to the OCP, the reporting service and schema will have been used as it has before. The slight overhead is the management of which version of the reporting logic is used when. It listens for when to switch directing of the messages to a particular version of the service. Sounds like a job for an &lt;a href="http://www.castleproject.org/container/index.html"&gt;Inversion of Control (IoC) Contianer&lt;/a&gt;?!&lt;br /&gt;&lt;br /&gt;So.. It always comes back to this: GIT hooks that prevent you from changing certain files in certain ways! The db script can only be added to! The reporting service cannot be changed - just ammended! OCP insurance from your source code management is a cool concept.&lt;br /&gt;&lt;br /&gt;That's the best accounting system for software I can think of.&lt;br /&gt;&lt;br /&gt;Looking forward to critiques of this and questions for clarification since I offered no diagrams. I probably will update this with that info later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-8376188685127945156?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/8376188685127945156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=8376188685127945156' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8376188685127945156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8376188685127945156'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/09/rewind-button-for-your-application.html' title='A Rewind Button For Your Application Without the Temporal Object Pattern'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_KQ92vS7TrFg/SqnUbmoz_kI/AAAAAAAAACM/Qskpdqs9O7g/s72-c/dali-clock-500x500.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-2996571254406017234</id><published>2009-09-02T17:50:00.000-07:00</published><updated>2009-09-10T03:58:51.065-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentation SCM GIT funny'/><title type='text'>GIT for fun and profit presentation application</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-family:'Times New Roman';font-size:16px;"  &gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; white-space: pre-wrap;font-family:arial;font-size:13px;"  &gt;Tired of unreliable source code management? Do you save your source code in 6 different places and put a hard copy of the work you did today under your mattress when you get home? ... then you need to see how GIT's design will allow you to throw off those shackles and become a free person again!&lt;br /&gt;&lt;br /&gt;... but wait..&lt;br /&gt;&lt;br /&gt;Are you scared of switching to a different source code management tool because the last time it took 3 developers, 2 project managers and all of Accenture's employees in western Canada to deploy your barely functional current one? Well not this time! If you are better at copying a file than your technically challenged mother, you can deploy a git repository! You will be shown how.&lt;br /&gt;&lt;br /&gt;and then...&lt;br /&gt;&lt;br /&gt;Did you avoid work today because you feared missing your lunch hour break? Because getting the latest version of your solution would take so much time over your 14.4 kB modem? Thinking of switching to AOL? GIT will compress and send only the changes that you need. Take a look at why even on your beautiful dial-up connection, GIT will enable you to contribute to that open source z-modem implementation you're working on.&lt;br /&gt;&lt;br /&gt;.. but what about this:&lt;br /&gt;&lt;br /&gt;Constantly forgetting to check things in because you're preoccupied by those Britney Spears albums in your iPod? Did your last checkin encapsulate the project from beginning to end? Well wait! With GIT it's not too late to save yourself the horrible embarrassment of this gigantic checkin! Come discover how!&lt;br /&gt;&lt;br /&gt;... if you're not convinced yet:&lt;br /&gt;&lt;br /&gt;But my mom keeps tripping on and unplugging the interweb cord out of the wall when I'm working on my Dungeons and Dragons program - so I can't checkin my changes! ... And I need the new elf package to be implemented before my D&amp;amp;D Saturday night party! Well, don't fret my nerdy friend. GIT works without a connection too! Find out what else is possible!&lt;br /&gt;&lt;br /&gt;.. I'll try to convince you with just one more..&lt;br /&gt;&lt;br /&gt;The evil developer from across the office is committing changes to the files I'm working on! He types way faster than me because he uses a Dvorak keyboard and beats me in the check-in race! He gets work done and I spend my day resolving conflicts. GIT, can you help me here as well? Of course GIT can. With 9 different merging strategies to help you, your evil foe will quickly fall to the wayside and you can laugh at him when he's layed off.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-2996571254406017234?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/2996571254406017234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=2996571254406017234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2996571254406017234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2996571254406017234'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/09/git-for-fun-and-profit-presentation.html' title='GIT for fun and profit presentation application'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-5741387355600400062</id><published>2009-08-27T08:49:00.000-07:00</published><updated>2009-08-27T09:17:24.238-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GIT SVN review'/><title type='text'>Some Reasons I Love GIT</title><content type='html'>It's no secret by now that I'm at a "won't turn back" point in terms of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SCM&lt;/span&gt;&lt;/span&gt;. The fundamental ideas that GIT is based on come through in the use of the system:&lt;br /&gt;&lt;br /&gt;1. Reliability: Every change is keyed on a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SHA&lt;/span&gt;&lt;/span&gt; of it's contents. You quickly know if there are any integrity issues.&lt;br /&gt;2. Simplicity: It's just a bunch of files organized by a directories comprised of the first 2 characters of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SHA&lt;/span&gt;&lt;/span&gt;. In those directories exist the serialized blobs of deltas and other items (trees, commits, tags and branches). The files are named by the remainder of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SHA&lt;/span&gt;. It's also snapshot-based as opposed to file-based. Moving a method tracks that as exactly that - not 2 separate changes in 2 different files. It's easy to fix a repository if there was some &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;hard disk&lt;/span&gt; corruption.&lt;br /&gt;3. Speed: Everything is compressed so the repositories are 1/10&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;th&lt;/span&gt;&lt;/span&gt; the size of an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SVN&lt;/span&gt;&lt;/span&gt; repository and hence faster. You have a local copy so looking at the log or doing diffs is almost instantaneous.&lt;br /&gt;4. Power: Forgot to add that other little change in your last commit? No problem just &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;amend&lt;/span&gt;. Committed 2 changes at once? No problem, tease &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;apart&lt;/span&gt; that last commit into 2+ separate ones.&lt;br /&gt;5. Off-line: never need a server. Even at the current gig, no server software installed anywhere for the centralized repositories. It's just some folders on a mapped drive.&lt;br /&gt;6. Merging: It's built for it. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;SVN's&lt;/span&gt;&lt;/span&gt; merge tracking is put in as an afterthought. GIT was designed for it.&lt;br /&gt;&lt;br /&gt;There's more and more detail, but I needed to answer the question for Steve &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Bohlen&lt;/span&gt;&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-5741387355600400062?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/5741387355600400062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=5741387355600400062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5741387355600400062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5741387355600400062'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/08/some-reasons-i-love-git.html' title='Some Reasons I Love GIT'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-3764460806047806259</id><published>2009-08-18T15:57:00.001-07:00</published><updated>2009-09-10T03:59:12.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GIT alias help'/><title type='text'>GIT shortcuts</title><content type='html'>Time to revise the GIT short cuts. I've added these in ~/.bashrc:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="font-family:courier new;"&gt;alias ls='ls -lAXh --color'&lt;br /&gt;alias gup='git push'&lt;br /&gt;alias gdl='git pull'&lt;br /&gt;alias gc='git commit'&lt;br /&gt;alias gl='git log'&lt;br /&gt;alias gd='git diff'&lt;br /&gt;alias gdc='git diff --cached'&lt;br /&gt;alias gdh='git diff HEAD'&lt;br /&gt;alias gb='git branch'&lt;br /&gt;alias gt='git tag'&lt;br /&gt;alias gm='git merge'&lt;br /&gt;alias gs='git status'&lt;br /&gt;alias gco='git checkout'&lt;br /&gt;alias gcl='git clean'&lt;br /&gt;alias grs='git reset'&lt;br /&gt;alias grb='git rebase'&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-3764460806047806259?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/3764460806047806259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=3764460806047806259' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3764460806047806259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3764460806047806259'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/08/git-shortcuts.html' title='GIT shortcuts'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-5507174380903628985</id><published>2009-07-06T20:27:00.000-07:00</published><updated>2009-07-06T20:34:15.382-07:00</updated><title type='text'>Get Windows Live Messenger 9.0 Working on 64bit XP and Server 2003</title><content type='html'>Microsoft says that these are not supported. But they actually are.&lt;br /&gt;&lt;br /&gt;You need to download the MSI version of the installer. It's available here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.softpedia.com/progDownload/Windows-Live-Messenger-9-Download-89148.html"&gt;http://www.softpedia.com/progDownload/Windows-Live-Messenger-9-Download-89148.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You may then get the "cannot connect to server" message. In that case, upgrade the communication plumbing by installing this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.microsoft.com/download/0/F/4/0F4D43A7-8D47-4312-BC35-EC1F888AC156/en/Contacts-ship-neutral.cab"&gt;http://download.microsoft.com/download/0/F/4/0F4D43A7-8D47-4312-BC35-EC1F888AC156/en/Contacts-ship-neutral.cab&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You should be able to connect at that point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-5507174380903628985?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/5507174380903628985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=5507174380903628985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5507174380903628985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5507174380903628985'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/07/get-windows-live-messenger-90-working.html' title='Get Windows Live Messenger 9.0 Working on 64bit XP and Server 2003'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-3213074581358761235</id><published>2009-04-23T16:14:00.000-07:00</published><updated>2009-04-23T16:36:35.084-07:00</updated><title type='text'>An Interesting Discussion with Robert</title><content type='html'>I seem to always get into good conversations with Robert. We thought we should share it and perhaps it will start some more meaningful discussions.&lt;br /&gt;&lt;br /&gt;Adam said:&lt;br /&gt;BTW, thanks again for the invite yesterday. Good presentation. I liked the mind map way of displaying the ideas&lt;br /&gt;  &lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Thanks Adam.    And thanks for the input and clarifications; It was very interesting to see people's reactions to the ideas. Good discussions.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;It seems that there is a considerable level of comfort with the idea that the status quo is broken.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;yes.. please pass along my contact info to them.. they sound like a bunch of smart guys&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;I will. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;sometime next month we'll have a geek beers again.. I like the presentation idea&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;I'll try and think of something like that for the next one&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Nothing too excessive, I hope   . Excessive presentation, I mean - shouldn't distract from the beer too much ...?  &lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Just kidding - good idea.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;no.. for sure.. but it's good to give some food for thought to the people&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Indeed. If for no other reason than getting a better feel for how jaded, exactly, everybody is. That notion that building apps is broken, but that's just the way it is / will be / makes money....  Eerie. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;ya&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Not that I'm advocating revolution or anything, but I wonder to what extent that's a self-fulfilling promise and to what extent we actually have the answers and are just not implementing them .....&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;.... because of resignation - "it'll never work in any other way."?&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;there are multiple answers&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;it takes time to implement them all&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;what's needed is better tools&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;or larger adoption of good tools&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;there a few combinations of answers that don't work together&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;but the people that know the answers, know that anyway&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Not sure about that. There seem to be more better tools about than you can shake a stick at.  Adoption seems to be key, and it's linked to culture and language, just as was alluded to yesterday. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;how many developers do you know practice DRY by using the built in templates in Resharper, for example&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;or better yet&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;how many develop their own templates&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;or macros in VS?&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Very few. The interesting question is why that is so. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;There is no reason, for example, that developing an ORM w/ MVC app in .NET should be as be as fast as developing in Ruby on Rails&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;"Insufficiently experienced" is the pat answer, but that doesn't capture it.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;I think it has nothing whatsoever to do with tools, frankly.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;I think softwareshops are too shortsighted that devoting just 1/2 an hour a day to sharpening the saw would make the difference&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Yes, undoubtedly, but why?&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;Fire those who refuse to learn&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;Fire those who don't learn for whatever reaso&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;n&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Learn what? Fired by whom? (as in, who makes the decision that they aren't learning) Replace them by whom?&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;it has to come from the top&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;The factors which cause the entropy are deep - human nature, culture, etc.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;yes&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Jawohl mein Fuhrer.   Not to be facetious, but if it could be imposed just like this, we'd be as good at it as we are at digging ditches in no time.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;but if actively the organization fights entropy, you have a better than the rest scenario. At this point it's worth fighting for&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;All organizations are actively fighting entropy. That's what an organization IS - a means of shaping reality and staving off entropy.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;There was a good saying. "Look at that tractor there. If we got rid of it we could have 50 people shoveling the dirt."&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;It seems that the problem is agreement on exactly what constitutes order and chaos, and to what end.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;The other guy says: "Why not use spoons, you could employ 500 people"&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;And why not, if the 500 would otherwise turn into antisocial drunks without purpose and happyness in life.    Perspective has a lot to do with it.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;.. happiness, of course....&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;yes.. I feel a rush of communism coming over me  &lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;How come it's about ideological correctness in software development and not in electrical engineering? What is the difference? That's what I don't understand. &lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Everybody seems to know what needs to be done whilst at the same time conceeding that it'll never work. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;I'll tell you the difference between software and any other engineering&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;The "fire everybody who won't learn" / "don't work with anyone who isn't competent" theme was fervently supported by one of the guys last night, you, Greg Y, myself in darker moments. &lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;All that knowing full well that that can't be done either.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt; yup.. so the current concensus now is architectural segregation via SOA done properly, ie, under the guidence of DDD&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;That's like the current political consensus that it's better to be free than slaves.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;it's too easy to build software&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;mistakes have no harsh consequences&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;... what does "free" mean, whose "slave", etc.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;"mistakes have no harsh" (especially near-term) consequences - that may be closer to the mark .... &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;if you burnt the wrong circuit on the board, it's toast&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Curious that everybody either goes commie (extreme programming, etc.) or totalitarian when looking at the problems....&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;if you made a syntax error, you type something and recompile&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;lol&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;I love that comment&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Yes, but that's not the true picture. You just recompile, but .....&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;.... as we both know the true consequences of a series of suboptimal decisions when building software can ruin companies.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;That's why patterns and antipatterns seem like such a good idea.   They make consequences more obvious and help to prevent bad choices.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;The problem is that that's fairly well understood by now by technicians, but I know of a good number of  entrepreneur and PM types who are blissfully unaware of the chain of events which made their stuff unmaintainable/useless/very costly even after everything folded.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;It's as if our nice little patterns should each have case studies attached to them which attempt to quantify the effect of the pattern / antipattern in financial terms, for better or worse.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;I wonder if that's possible. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;too many variables&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Not if one could classify the organisations and "cultures" which attempt to apply the pattern/antipattern in some way.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;For example, patterns would have a different effect when used in an open source project,  a dotcom style entrepreneur shop and Telus.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;still lots of variables.. but you're getting closer&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;We should toss this thread into a blog post.  &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;perhaps it's the quantification of the things we have not been quantifying that's the problem here&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Yes. That sounds likely.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;So we can explore that..&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;I'll post this on my blog when we're done&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;OK.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;so, let's have "transiency" as a variable worth measuring&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;what is the percentage of consultants here&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;..... "transiency" .... ?&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;how many do short stints?&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;how likely is it for a person to leave if they don't like it&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;No idea, or even particular opinion on what metrics may make sense. I feel that it would need a lot more discussion before touching that one. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;"relative compensation" - do the people get paid the average that is out there in town, more, less, by how much?&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;related to the previous, but imortant&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;.. to be looked at separately&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;"implied incentive" - is this a 9-5er or someone that fell in love with the art?&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;"personality type" &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;- do we have a bunch of type A personalities comprising the team&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;It sounds to me as if that's too focussed on the techies who do the coding and not enough on the "culture" of the organization in question. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;ok.. you name a few&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;we'll need combinations of these matrix to throw methodologies and patterns at to see what happens&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;As I said, I'd have to think about that and would like to hear more opinions.  For example: .....&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Staff turnover probably plays a role, but do we need to look at it or those factors of which it is a symptom?   &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;yes&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;I really don't have an opinion about that yet.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;I think propensity to leave tied to that rate itself&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;it's not an easy equasion&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Absolutely. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;looks more like a y=y`` + y` differencial equation thing&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Dave made an interesting observation yesterday, to the effect that the "shared language" would require a culture built in a stable organization with long-term folks who know the shop and each other for years, etc. as a prerequisite and that the perspective of "hired gun" outside consultant architects (or folks with that kind of mindset - admit it - he was describing us.....?) would be entirely...&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;different from these folks.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;That one also had the ring of truth, somewhere. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;I don't buy it&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;There's a lot of stuff here which smells of needing more input from people. It seems too early to narrow down the questions to ask.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;The notion that an ubiquitous language has to be embedded into a culture in order to work has a very strong possibility of being true.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Look at languages: They cannot survive without a living culture around it. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;yes&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;In short, a culture must be there which buys into the need to speak the language....&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;but all you need is a domain expert role and you're good&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;perhaps one for each context if you're going down the DDD path&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;... which brings us right back to the crux of the matter: Selling the notion that all this stuff about developers and domain experts need to work together on the ubiquitous language thing and therefore need time, no waterfalls, etc. &lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;It seems to be about acceptance in the "culture" of the company. Otherwise, no management support, etc.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;If it weren't so, agile would rule the world.  &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;not sure about that.. agile can't rule the world because of the personality types out ther&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;there are planners that will, by nature, go against agile&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;not even intentionally&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;it's not about "getting it"&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;No. It' can't rule the world because the principles which make it successful can only be applied by a small percentage of the best and brightest.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;it's simply human nature&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;not even best or brightest&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;.... whereas a culture needs to include all participants in order to flourish.&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;yes&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;so agile is dead in the water&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Heck, the stuff is too complicated.&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;No, not really. Whatever comes will have a lot to do with it. &lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;it's achilie's heel is the way that it forces companies to work&lt;br /&gt;&lt;b&gt;Adam says:&lt;/b&gt;&lt;br /&gt;hence lean is a more palatable way of working&lt;br /&gt;&lt;b&gt;Robert says:&lt;/b&gt;&lt;br /&gt;Maybe. It's as if we are missing a way of doing things which follows the "natural contours" of how people and companies actually operate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-3213074581358761235?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/3213074581358761235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=3213074581358761235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3213074581358761235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3213074581358761235'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/04/interesting-discussion-with-robert.html' title='An Interesting Discussion with Robert'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-1024526109115102763</id><published>2009-02-09T15:58:00.000-08:00</published><updated>2009-02-09T16:04:44.104-08:00</updated><title type='text'>New Developers Are Just Over-Confident Children</title><content type='html'>Having a little one to look after has shed some light into how we get the software in most shops today. This quote is quite good in how it relates to our educational systems:&lt;br /&gt;&lt;br /&gt;"For the true significance of Disneyland is that it reflects our notions of children - what they are, what is good for them, and what will please them. Children are a special class of human beings which came into existence with the industrial revolution, at which time we began to invent a closed world for them, a nursery society, wherein their participation in adult life could be delayed increasingly - to keep them off the labor market. Children are, in fact, small adults who want to take part in the adult world as quickly as possible, and to learn by doing. But in the closed nursery society they are supposed to learn by pretending, for which insult to their feelings and intelligence they are propitiated with toys and hypnotized with baby talk. They are thus beguiled into the fantasy of that happy, carefree childhood with its long sunny days through which one may go on “playing” - in the peculiar sense of not working - for always and always." - Alan Watts&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-1024526109115102763?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/1024526109115102763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=1024526109115102763' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/1024526109115102763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/1024526109115102763'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2009/02/new-developers-are-just-over-confident.html' title='New Developers Are Just Over-Confident Children'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-5068851873580404293</id><published>2008-11-28T12:45:00.000-08:00</published><updated>2008-11-28T13:04:45.699-08:00</updated><title type='text'>QCon's DDD Track Gets an Shot in the Arm</title><content type='html'>While I did not formally attend QCon, I was invited to a couple of presentations by Greg Young. I saw some familiar faces there like Martin Fowler, Matthew Podwysocki, Jeff Brown, Jeremy Miller, Rod Paddock and others.&lt;br /&gt;&lt;br /&gt;Eric Evans was very happy to see the Domain Driven Design track get some scalability/performance issues addressed. Greg's (at first glance) militant emphasis on Command/Query separation gave a clear and simple answer to avoid scaling issues when concentrating on designing and refactoring to a strong core domain. One key point to take away was the fact that our applications usually have 10X more read operations than write. This distinction is usually haphazardly represented in most designs we see today - and why we have so much money to make helping organizations scale up.&lt;br /&gt;&lt;br /&gt;The one point I got from Greg some time earlier this year was to look at the business that you are trying to automate with an IT-free mind. That is, how would this be done (or how was it done long ago) with no computers and, instead, paper, pencils and people? They key information that is gathered out of that is the SLAs. Does that sales report need to have up to the millisecond information?&lt;br /&gt;&lt;br /&gt;Greg has a link on his blog to the same presentation. I feel this one was more polished and was made more pleasing to the eye by incorporating some of David Laribee's use of images in stead of words. I'm hoping that the videos to the presentations get published soon. InfoQ, from what I hear, likes to spread out the release of videos over time to keep the site flowing with new material on a consistent basis.&lt;br /&gt;&lt;br /&gt;On Saturday, Eric was kind enough to meet up with a handful of us and talk about DDD and life in general. He also toured around with us for a little bit. We saw some great views of San Francisco and a bit of the ocean shore. &lt;br /&gt;&lt;br /&gt;It was a San-Fran-tastic trip!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-5068851873580404293?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/5068851873580404293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=5068851873580404293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5068851873580404293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5068851873580404293'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/11/qcons-ddd-track-gets-shot-in-arm.html' title='QCon&apos;s DDD Track Gets an Shot in the Arm'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-9116272767566077739</id><published>2008-09-16T16:10:00.000-07:00</published><updated>2008-09-16T17:09:31.663-07:00</updated><title type='text'>GITting Around</title><content type='html'>I've been very busy for the last 3 months or so, but now can start to blog again.&lt;br /&gt;&lt;br /&gt;A few things have changed. One of them is source control. GIT is working out really well. I highly recommend people drop SVN in favour of it. You can get an overview and tutorial from many places, so I won't bother repeating any of that. For folks developing in a windows environment, I can help a bit with some specific issues one might run into with the switch.&lt;br /&gt;&lt;br /&gt;1. Upon installing MSysGIT, the &lt;span style="font-weight: bold;"&gt;AutoCRLF&lt;/span&gt; setting should be set to &lt;span style="font-weight: bold;"&gt;false&lt;/span&gt; before you do anything unless you are writing a multi-platform app. If you don't, you run into the danger of having your CRLFs changed to LFs in the repository. Then GIT will report file changes where there are none.&lt;br /&gt;&lt;br /&gt;2. Stop all that typing (unless you want to strictly use the GUI via git gui):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.st status&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.co checkout&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.ci commit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.br branch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.me merge&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.cl clean&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.ps push&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.pl pull&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.rt reset&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(51, 51, 255);"&gt;git config --global alias.rb rebase&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you want to configure bash on your machine, you could make aliases at that level - such as gci for "git commit".&lt;br /&gt;&lt;br /&gt;3. Unless your SVN repo followed a strick trunk, branch, tag structure, don't bother with the standard layout option for cloning SVN with git svn. This leads to more headaches in the end. It's a long running process, so get it right the first time. Use &lt;span style="font-weight: bold;"&gt;--follow-parent&lt;/span&gt; to track moves, copies and renames.&lt;br /&gt;&lt;br /&gt;4. Get hosting. Unfuddle is great as a free host environment. Don't get scared about the 200MB limit on the repository. GIT is very efficient and will take &lt;span style="font-weight: bold;"&gt;1/30th&lt;/span&gt; the space that a SVN repo took. Unfuddle will email you when there are commits. It parses commit messages as well, so you can close an issue (tracked in unfuddle) with something like "closes #435". A commit with that message will close issue 435 in unfuddle. For $9/month you can get more users, 500MB limit and file attachments. The file attachment is a waste. I use www.drop.io to host files.&lt;br /&gt;&lt;br /&gt;5. Setup your remote branches so you can simply "git ps" and "git pl" to send commits and receive commits from the remote repo. If you have a remote repo for the remote team over in India, you could set up something like this in the .git/config file for an "india" branch:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;" &gt;[remote "india"]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;" &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url = git@mycompany.unfuddle.com:mycompany/outsourced.git&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;" &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fetch = +refs/heads/india:refs/remotes/india/master&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;" &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;push = india:master&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;" &gt;[branch "india"]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;" &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remote = india&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-family:courier new;" &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merge = refs/heads/master&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;6. Read up on GIT. It's quite different from SVN.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-9116272767566077739?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/9116272767566077739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=9116272767566077739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/9116272767566077739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/9116272767566077739'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/09/gitting-around.html' title='GITting Around'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-2163321018409686710</id><published>2008-08-19T19:25:00.000-07:00</published><updated>2008-09-16T17:47:56.516-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='puzzle'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Messaging Update</title><content type='html'>Seems more multithreading was the culprit.&lt;br /&gt;&lt;br /&gt;with on thread one:&lt;br /&gt;  lock (dictionary) { dictionary.Add("bum", "a homeless person");} &lt;br /&gt;&lt;br /&gt;and seven seconds later on another thread:&lt;br /&gt;  lock (dictionary) { if (dictionary.Contains("bum")) C.Out("defined"); }&lt;br /&gt;&lt;br /&gt;... Contains returned false!&lt;br /&gt;&lt;br /&gt;FTW??&lt;br /&gt;&lt;br /&gt;... or was it IIS.&lt;br /&gt;&lt;br /&gt;*** UPDATE Sept 16 ***&lt;br /&gt;&lt;br /&gt;It was IIS. After adding tons of logging and tracking thread IDs, app domain IDs and process IDs, it was apparent that IIS would load up more than 1 either app domain or process for the app.&lt;br /&gt;&lt;br /&gt;The long term solution was to house the app in a windows service that communicated over WCF. It was a quick refactor and opens the door for using WCF to push to clients. The new question is, does WCF hold threads? Or can you have 100,000 seldomly active clients for, say, a chat application?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-2163321018409686710?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/2163321018409686710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=2163321018409686710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2163321018409686710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2163321018409686710'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/08/messaging-update.html' title='Messaging Update'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-558506606779864571</id><published>2008-08-19T01:58:00.000-07:00</published><updated>2008-08-19T02:08:08.220-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='pub/sub'/><category scheme='http://www.blogger.com/atom/ns#' term='MSMQ'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Don't Give Up on Messaging</title><content type='html'>Today at work the dreaded words were uttered: "Well if it's not working by the end of the day lets just go for the pull every 1 second solution."&lt;br /&gt;&lt;br /&gt;After implementing all of the long running processes to a pub/sub model, it was not pleasant to hear that. I wasn't going to just give up on that much energy poured into the current (and best) approach.&lt;br /&gt;&lt;br /&gt;After adding tons of logging and hammering the server to see where the leaks sprung up, I cornered the culprit. If you are pulling from MSMQ ad nauseum, and you are in a multithreaded environment, you need to protect yourself from the thread unsafe methods "Send" and "Receive" on your MSMQ object - usually done by creating the MSMQ object for just long enough to do 1 operation. &lt;br /&gt;&lt;br /&gt;The place where this was being done was not a multithreaded scenario, so I got rid of the creation and disposal of the MSMQ object between receives.&lt;br /&gt;&lt;br /&gt;That did it.&lt;br /&gt;&lt;br /&gt;The other lesson here is to be careful when you do have a multithreaded app pulling from MSMQ. You may see same messages go missing. I know there are other MSMQ features that guarantee delivery, etc, but I expect this integrity out-of-the-box.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-558506606779864571?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/558506606779864571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=558506606779864571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/558506606779864571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/558506606779864571'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/08/dont-give-up-on-messaging.html' title='Don&apos;t Give Up on Messaging'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-4822431091796603986</id><published>2008-08-17T21:33:00.000-07:00</published><updated>2008-08-17T21:34:10.867-07:00</updated><title type='text'>Alt.NET Canada</title><content type='html'>Too bad I had to miss this due to work. Here is Greg Young's Domain Driven Design presentation:&lt;br /&gt;&lt;br /&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="437" height="370" id="viddler"&gt;&lt;param name="movie" value="http://www.viddler.com/player/e95369d6/2102.901/" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="wmode" value="transparent"/&gt;&lt;embed src="http://www.viddler.com/player/e95369d6/2102.901/" width="437" height="370" type="application/x-shockwave-flash" allowScriptAccess="always" allowFullScreen="true" wmode="transparent" name="viddler" &gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-4822431091796603986?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/4822431091796603986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=4822431091796603986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4822431091796603986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4822431091796603986'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/08/altnet-canada.html' title='Alt.NET Canada'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-1549848858459677159</id><published>2008-08-12T20:15:00.000-07:00</published><updated>2008-08-19T22:14:35.345-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Project Management and Command/Query Separation</title><content type='html'>Just like we have issues mixing command and query when writing software, we run into similar issues when it comes to project management.&lt;br /&gt;&lt;br /&gt;Say you have a project manager that is very technical. You would think that you could do no better. But alas, you will have bottlenecked his potential by requiring him to service the "queries" he has to provide for management (such as status reports, etc).&lt;br /&gt;&lt;br /&gt;In the opposite corner, you can have a non-technical PM giving "commands" to the developers without the proper knowledge of the consequences of his actions.&lt;br /&gt;&lt;br /&gt;Even in the well balanced scenario, you can overload a PM with a week or more worth of "queries"... or ask for too much direction.&lt;br /&gt;&lt;br /&gt;So, can you scale your PM? If the role is clearly defined and we have a separation of command and query, yes you can.&lt;br /&gt;&lt;br /&gt;Thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-1549848858459677159?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/1549848858459677159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=1549848858459677159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/1549848858459677159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/1549848858459677159'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/08/project-management-and-commandquery.html' title='Project Management and Command/Query Separation'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-6548379567490095609</id><published>2008-08-11T21:51:00.001-07:00</published><updated>2008-08-11T21:53:48.740-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Domain Driven Design'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>DDD and the Too Many Aggregate Roots Design Smell</title><content type='html'>This usually comes about from forcing a DDD solution where one would really needs a simple forms over data type app with ORM thrown in for speed.&lt;br /&gt;&lt;br /&gt;Don't even bother with TDD for the most part.&lt;br /&gt;&lt;br /&gt;Thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-6548379567490095609?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/6548379567490095609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=6548379567490095609' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/6548379567490095609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/6548379567490095609'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/08/ddd-and-too-many-aggregate-roots-design.html' title='DDD and the Too Many Aggregate Roots Design Smell'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-4076278559359959782</id><published>2008-04-28T23:24:00.000-07:00</published><updated>2008-04-28T23:32:59.250-07:00</updated><title type='text'>Spec# Needs a lot of Love form Microsoft</title><content type='html'>I was disappointed at how little $$ was being thrown at something as good as Spec# by Microsoft. Considering the millions that have been flushed down the toilet trying to make drag and drop do what it was not meant to do, it's a crying shame. Hopefully the tide is slowly turning and great endeavors like this will be supported properly by Microsoft in the future.&lt;br /&gt;&lt;br /&gt;As a token, I'm adding a little I &lt;3 Spec# on my blog.&lt;br /&gt;&lt;br /&gt;Do check out spec#!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-4076278559359959782?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/4076278559359959782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=4076278559359959782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4076278559359959782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4076278559359959782'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/04/spec-needs-lot-of-love-form-microsoft.html' title='Spec# Needs a lot of Love form Microsoft'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-3762860373113928598</id><published>2008-04-27T22:52:00.000-07:00</published><updated>2008-04-27T23:15:32.120-07:00</updated><title type='text'>Graphical vs Textual DSLs</title><content type='html'>At ALT.NET there was a good talk about the merits of graphical DSLs. BizTalk and SSIS come to mind when talking about this. Say we have some data work to do and we do it in SSIS. Once we have constructed our migration or data manipulation, we can save the project.&lt;br /&gt;&lt;br /&gt;What we have done in actual fact is saved the graphical representation of what we made. Once this solution is checked into our source repository, it is saved in a non-deterministic fashion. If we modify our solution and commit our changes again, there is no guarantee that everything that was not changed will be in the same place.&lt;br /&gt;&lt;br /&gt;To see this directly, you can do a diff on the two versions. Since there is no way to visualize the differences, this information does not tell you anything. One is forced to probe over the details of each property to see what has changed. The best hope is that the person that made the modifications had left some good comments to go on.&lt;br /&gt;&lt;br /&gt;So it seems like textual DSLs are the way to go. Once we have changed what we want, the diff between two versions will be very easy to analyze. This is good, but I believe there is a point in between. This is a hybrid solution that will use a textual DSL and a visualization tool to make a graph of what the text describes.&lt;br /&gt;&lt;br /&gt;How this can work is the way Visio can make a class diagram for you. If you use the reverse engineering tool to do this, it will place classes in places it's algorithm thinks is best. This of course will not be the ideal most of the time. One will want to move things around so that the information is better conveyed.&lt;br /&gt;&lt;br /&gt;These adjustments are what can be cast aside into a secondary file. One would not care what changes this file went through in the repository. The real information is still stored in the textual representation. Hopefully, with more attention to the preference file (storing changes only in an additive way) can help version this too.&lt;br /&gt;&lt;br /&gt;A quick analogy can be drawn up to the .suo files that Visual Studio creates. Your solution has the same projects and settings. But the windows that you had open and a  number of other preferences are stored in the suo file. These generally do not make it to the source repository.&lt;br /&gt;&lt;br /&gt;If there was a way to use a textual DSL to describe your SSIS work, a lot of responsible programmers would be happy. Maintaining an SSIS project would be far easier - or any other drag and drop ridden solution.&lt;br /&gt;&lt;br /&gt;Thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-3762860373113928598?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/3762860373113928598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=3762860373113928598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3762860373113928598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3762860373113928598'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/04/graphical-vs-textual-dsls.html' title='Graphical vs Textual DSLs'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-6581844004921149816</id><published>2008-04-23T00:21:00.001-07:00</published><updated>2008-04-23T00:21:22.390-07:00</updated><title type='text'>Twittering as well</title><content type='html'>For those of you using twitter, you can &lt;a href="http://twitter.com/adymitruk"&gt;follow me&lt;/a&gt; if you like.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-6581844004921149816?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/6581844004921149816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=6581844004921149816' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/6581844004921149816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/6581844004921149816'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/04/twittering-as-well.html' title='Twittering as well'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-5393429613180786384</id><published>2008-04-22T23:00:00.000-07:00</published><updated>2008-04-23T00:23:47.381-07:00</updated><title type='text'>Back from the dead - and back from ALT.NET Seattle!</title><content type='html'>I'm finally getting the nerve to blog again. This is probably due to how immersed in work I have been lately. The work I'm doing now is not the same old contract stuff - it's new and therefore exciting. Part of the challenge is seeing how Agile, Scrum and XP play a role in DDD, Messaging Architectures etc.&lt;br /&gt;&lt;br /&gt;The tipping point was ALT.NET Seattle. My head is now sufficiently filled to nearly overflowing with information.  Not putting "pen to paper" would be a great loss to me. If this helps others along the way then great! But the company at ALT.NET Seattle eclipses most of what I will say. I'll have to update my blog roll soon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The Conference&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The format was open spaces. This was a new experience for me. I was very pleased with it. The participation is something that is missing from the traditional format. There was a lot of &lt;a href="http://www.youtube.com/v/YuCGaBxjJhI"&gt;video&lt;/a&gt; taken. &lt;a href="http://codebetter.com/blogs/david_laribee/"&gt;David Laribee&lt;/a&gt; posted some as did &lt;a href="http://www.jeffreypalermo.com/"&gt;Jeffery Palermo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had a good chat with &lt;a href="http://www.hanselman.com/blog/"&gt;Scott Hanselman&lt;/a&gt; and &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; in between sessions about being a polyglot programmer. Scott was making the point that "if you want to learn French you start reading books written in French" to draw a parallel of learning a new programming language. Unfortunately the real analogy in the ALT.Net space for some things such as NHibernate and the Castle implementation of Active Record which does your XML mapping via attributes, the analogy is more along the lines of "if you want to learn &lt;a href="http://en.wikipedia.org/wiki/Romansh"&gt;Rumantsch&lt;/a&gt; you should read books written in Rumantsch". I'm not sure if you'll find one in your library. The full discussion is on David Laribee's blog linked above.&lt;br /&gt;&lt;br /&gt;At other points I had discussed using GIT instead of SVN, the intricacies of moving to message based architecture, new things coming out of Microsoft Research like Spec# and many other things. I'll leave these things for posts in the very near future. There were many really smart part people there and I was very happy to be a part of the event.&lt;br /&gt;&lt;br /&gt;A special thanks goes out to Scott Bellware for pushing this forward from day one of the idea of an "ALT.NET"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-5393429613180786384?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/5393429613180786384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=5393429613180786384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5393429613180786384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5393429613180786384'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/04/back-from-dead-and-back-from-altnet.html' title='Back from the dead - and back from ALT.NET Seattle!'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-5080244231717000127</id><published>2008-01-04T16:45:00.000-08:00</published><updated>2008-01-04T17:03:19.969-08:00</updated><title type='text'>Castle Windsor for AOP</title><content type='html'>Finally I have an opportunity to use AOP on my current project that I'm working on. So I'll be using MicroKernal/Windsor.&lt;br /&gt;&lt;br /&gt;I will use attributes to mark long running methods. When those calls are intercepted, they will generate a status window that will inform the user that something is happening.&lt;br /&gt;&lt;br /&gt;Code will be posted soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-5080244231717000127?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/5080244231717000127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=5080244231717000127' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5080244231717000127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5080244231717000127'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2008/01/castle-windsor-for-aop.html' title='Castle Windsor for AOP'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-4998524670170179142</id><published>2007-12-28T11:23:00.000-08:00</published><updated>2007-12-28T11:30:48.473-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='altnet'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='discussion'/><category scheme='http://www.blogger.com/atom/ns#' term='newsgroup'/><category scheme='http://www.blogger.com/atom/ns#' term='alt.net'/><category scheme='http://www.blogger.com/atom/ns#' term='group'/><category scheme='http://www.blogger.com/atom/ns#' term='altdotnet'/><title type='text'>The altnetconf news group on yahoo</title><content type='html'>It's too bad it was renamed to cli_dev. To people that are not connected yet, searching out for a discussion group on alt.net has become a bit harder. I prefer Google Groups and set up a group for discussing alternates to MS's tool stack while still being ".NET".&lt;br /&gt;&lt;br /&gt;The cli_dev group description makes a very broad and ambitious brush stroke. What the google group does is focus in on people helping each other with the tools in one place. One can ask a question about Subversion, ActiveRecord, Resharper, Cruise Control in one group instead of having to go to the specific mailing list for that particular project.&lt;br /&gt;&lt;br /&gt;The link and subscription is in the left hand margin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-4998524670170179142?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/4998524670170179142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=4998524670170179142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4998524670170179142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/4998524670170179142'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/altnetconf-news-group-on-yahoo.html' title='The altnetconf news group on yahoo'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-7758640086374034729</id><published>2007-12-28T10:34:00.000-08:00</published><updated>2007-12-28T11:03:09.977-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='dsl'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>DSL Books</title><content type='html'>It seems Oren Eini (&lt;a href="http://www.ayende.com"&gt;Ayende.com&lt;/a&gt;) is &lt;a href="http://tech.groups.yahoo.com/group/cli_dev/message/8913"&gt;writing a book&lt;/a&gt; at the same time that Martin Fowler is &lt;a href="http://martinfowler.com/bliki/BookCode.html"&gt;writing a book&lt;/a&gt;. It should be nice to read both at once and cross reference. Both guys are getting feedback from the community.&lt;br /&gt;&lt;br /&gt;Can't wait!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-7758640086374034729?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/7758640086374034729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=7758640086374034729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/7758640086374034729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/7758640086374034729'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/dsl-books.html' title='DSL Books'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-3357036526848865083</id><published>2007-12-27T23:07:00.000-08:00</published><updated>2007-12-28T01:42:57.138-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='puzzle'/><category scheme='http://www.blogger.com/atom/ns#' term='exercise'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>TDD Challenge</title><content type='html'>&lt;a href="http://www.wanted-master-software-developers.com/"&gt;TDD Challenge&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;See if you can solve it.. post how far you got with your solution....&lt;br /&gt;&lt;br /&gt;.... wow. This is the start of a really deep rabbit hole... google around to see what this was designed to do...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-3357036526848865083?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/3357036526848865083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=3357036526848865083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3357036526848865083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3357036526848865083'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/tdd-challenge.html' title='TDD Challenge'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-2244865303442447292</id><published>2007-12-27T13:20:00.001-08:00</published><updated>2007-12-27T13:22:31.791-08:00</updated><title type='text'>Resharper 3.1 is out!</title><content type='html'>I'm a big fan of Resharper. In fact, I'm not half as productive with out it.&lt;br /&gt;&lt;br /&gt;With this little upgrade, you get solution wide real-time code analysis! Not just the file you are working on, but if anything else is not going to compile, you can get there without having to try recompiling first.&lt;br /&gt;&lt;br /&gt;I'm in the process of installing it now and will post more when I finally get to use it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-2244865303442447292?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/2244865303442447292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=2244865303442447292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2244865303442447292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/2244865303442447292'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/resharper-31-is-out.html' title='Resharper 3.1 is out!'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-3387339560749199626</id><published>2007-12-27T00:38:00.000-08:00</published><updated>2007-12-27T00:46:31.579-08:00</updated><title type='text'>Team City from JetBrains</title><content type='html'>It's free and it's really good. From what others have been saying about the previous versions, 3.0 is excellent.&lt;br /&gt;&lt;br /&gt;It takes a few moments to setup. Compared to CruiseControl.NET, it's a  breeze. No xml to swim through - just simple configuration through a web page!&lt;br /&gt;&lt;br /&gt;Take a look &lt;a href="http://www.jetbrains.com/teamcity/"&gt;here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-3387339560749199626?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/3387339560749199626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=3387339560749199626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3387339560749199626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/3387339560749199626'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/team-system-from-jetbrains.html' title='Team City from JetBrains'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-5107977094958782187</id><published>2007-12-06T22:53:00.000-08:00</published><updated>2007-12-06T23:54:07.523-08:00</updated><title type='text'>Now You Don't Need To Deal With SQL</title><content type='html'>Imagine this: You want to create some new functionality that involves a new entity. You write your test and your entity in 30 seconds using active record and some Resharper templates. When you run your test, a new table is there for you to store your new entity and your test passes.&lt;br /&gt;&lt;br /&gt;How is that possible? Code generators do this. More importantly, how is it maintainable? Most code generators start with the DB. I don't even want to &lt;span style="font-style: italic;"&gt;look &lt;/span&gt;at the db when I'm flying through my solution with Resharper. Here's how to roll your own "maintainable db generation".&lt;br /&gt;&lt;br /&gt;Dealing with the database is a pain when you're trying to develop something really fast. Active Record goes a long way for getting rid of 80% of the pain.&lt;br /&gt;&lt;br /&gt;There are 3 things to consider in automating this:&lt;br /&gt;&lt;br /&gt;1. What tables and columns exist in your schema right now?&lt;br /&gt;2. What entities do you have in your domain right now?&lt;br /&gt;3. How will this change to the db rolled out and then persisted?&lt;br /&gt;&lt;br /&gt;1. The answer is obvious by running this query:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-size:85%;" &gt;&lt;span style="font-family: courier new;"&gt;select table_name, column_name from INFORMATION_SCHEMA.Columns&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will give you all the columns and the tables they belong to in your schema. For dbs without the ability to query their own schemas, you can parse the version script or another artifact that reflects the schema.&lt;br /&gt;&lt;br /&gt;2. The entities in your assembly that you are interested in derive from ActiveRecordBase. You can use reflection to find all of them:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-size:85%;" &gt;&lt;span style="font-family: courier new;"&gt;      Type[] types = type.Assembly.GetTypes();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;      foreach(Type type1 in types) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        object[] attributes = type1.GetCustomAttributes(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        foreach(object attribute in attributes) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;          if (attribute is ActiveRecordAttribute) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            Console.Out.WriteLine(type1.Name);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            PropertyInfo[] properties = type1.GetProperties();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            foreach(PropertyInfo propertyInfo in properties) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;              object[] propertyAttributes = propertyInfo.GetCustomAttributes(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;              foreach(object propertyAttribute in propertyAttributes) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                if (propertyAttribute is PropertyAttribute) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                  Console.Out.WriteLine("--" + propertyInfo.Name);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                  break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;       } } } } } }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above code is missing a lot, but it will get you started. You will need to check the types, nullability, BelongsTo, HasMany, many-to-many, nested and others.&lt;br /&gt;&lt;br /&gt;3. Comparing the information from 1 and 2 you will get the additions to the entities that don't yet exist in the db yet. The differences can be mapped to the following addition to the version script - which may look something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);font-size:85%;" &gt;&lt;span style="font-family: courier new;"&gt;IF EXISTS (SELECT version from [dbo].[version] where version = 39)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;BEGIN&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;    ALTER TABLE [distributors] ADD [accountID] nvarchar(50) NULL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;CREATE TABLE [dbo].[config](&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     [id] [int] IDENTITY(1,1) NOT NULL,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     [configName] [varchar](50) NOT NULL,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     [configDescription] [varchar](100) NOT NULL,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     [configValue] [varchar](100) NOT NULL,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;  CONSTRAINT [PK_config] PRIMARY KEY CLUSTERED &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;     [id] ASC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt; ) ON [PRIMARY]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;UPDATE [dbo].[version] SET version = 40 where version = 39&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;GO&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The version script runs anytime the test project recompiles (the post compile event in the project properties).&lt;br /&gt;&lt;br /&gt;I will have a working prototype in the next couple of days. I want to hit the low hanging fruit first. This will take care of basic additions for now. The alterations and other concerns will have to wait. I'll add them as the needs arise.&lt;br /&gt;&lt;br /&gt;Let me know if you have done anything like this or have any comments or suggestions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-5107977094958782187?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/5107977094958782187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=5107977094958782187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5107977094958782187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5107977094958782187'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/now-you-dont-need-to-deal-with-sql.html' title='Now You Don&apos;t Need To Deal With SQL'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-8041289671984276821</id><published>2007-12-06T21:18:00.000-08:00</published><updated>2007-12-06T21:26:40.711-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='map'/><category scheme='http://www.blogger.com/atom/ns#' term='alt.net'/><category scheme='http://www.blogger.com/atom/ns#' term='locations'/><category scheme='http://www.blogger.com/atom/ns#' term='members'/><title type='text'>ALT.NET Google Maps</title><content type='html'>Scott Reynolds has started a &lt;a href="http://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;om=1&amp;amp;msa=0&amp;amp;msid=106173137380857741164.000440a0be8af9af0f477&amp;amp;ll=29.160556,-82.155075&amp;amp;spn=149.137462,360&amp;amp;z=2"&gt;google map&lt;/a&gt; of where all the ALT.NET folks are located. This is a great resource for if you are wanting to make a regular local tech talk happen, or if you would want to collaborate on a project together. Put yourself on the map!&lt;br /&gt;&lt;br /&gt;PS. To add yourself on the map, click edit once you zoomed on your area. In the top left corner of the map you will see the pin.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-8041289671984276821?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/8041289671984276821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=8041289671984276821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8041289671984276821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/8041289671984276821'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/altnet-google-maps.html' title='ALT.NET Google Maps'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-1622599202141619954</id><published>2007-12-06T13:43:00.001-08:00</published><updated>2007-12-06T14:08:53.176-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='notes'/><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Joshua Kerievsky's 10 Terrific Transition Tips Presentation</title><content type='html'>Here is the &lt;a href="http://www.kruchten.org/agilevancouver/TenTerrificTransitionTips-JoshuaKerievsky.pdf"&gt;link&lt;/a&gt; to the presentation slides that Joshua showed last night.&lt;br /&gt;&lt;br /&gt;Some highlights are:&lt;br /&gt;&lt;br /&gt;Perils of Solo-Programming:&lt;br /&gt;– Tunnel Vision (Frog-In-A-Well) Syndrome&lt;br /&gt;– Less Productivity&lt;br /&gt;– Less Knowledge Transfer&lt;br /&gt;– Longer Times Fixing Defects&lt;br /&gt;– Less Code Re-Use&lt;br /&gt;– Poorer testing&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td colspan="4" align="center"&gt;&lt;span style="font-size:130%;font-weight: bold;"&gt;XP/Agile Productivity Improvement&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="font-weight: bold;"&gt;Previous Performance&lt;/td&gt;&lt;td style="font-weight: bold; text-align: center;"&gt;Current Performance&lt;/td&gt;&lt;td style="font-weight: bold;"&gt;Percentage Improvement&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="font-weight: bold;"&gt;Staffing&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;39%&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="font-weight: bold;"&gt;Defects&lt;/td&gt;&lt;td&gt;2,270&lt;/td&gt;&lt;td&gt;381&lt;/td&gt;&lt;td&gt;83%&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="font-weight: bold;"&gt;Schedule&lt;/td&gt;&lt;td&gt;18 Months&lt;/td&gt;&lt;td&gt;13.5 Months&lt;/td&gt;&lt;td&gt;24%&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="font-weight: bold;"&gt;Cost&lt;/td&gt;&lt;td&gt;$2.8 Million&lt;/td&gt;&lt;td&gt;$1.1 Million&lt;/td&gt;&lt;td&gt;61%&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-1622599202141619954?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/1622599202141619954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=1622599202141619954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/1622599202141619954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/1622599202141619954'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/joshua-kerievskys-10-terrific_06.html' title='Joshua Kerievsky&apos;s 10 Terrific Transition Tips Presentation'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-6390589510676482846</id><published>2007-12-06T12:55:00.000-08:00</published><updated>2007-12-06T13:37:17.680-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='activerecord'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Active Record and Many to Many Update</title><content type='html'>Ok. I've cleaned it up now. In the continuing journey of learning Active Record and NHibernate, the static FindAll method can be overridden and the client code is as clean as you would expect it to be:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;      Distributor[] all = Distributor.&lt;span style="font-weight: bold;"&gt;FindAll()&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      foreach(Distributor distributor in all) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        Console.WriteLine(distributor.Name);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        foreach(DeliveryMethod deliveryMethod in distributor.DeliveryMethods)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          Console.WriteLine("--" + deliveryMethod.Description);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here is what was added to the Distributor class:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    public new static Distributor[] FindAll() { return FindAll(DetachedCriteria.For(typeof(Distributor)).SetResultTransformer(CriteriaUtil.DistinctRootEntity).SetFetchMode("DeliveryMethods", FetchMode.Eager)); }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;I'm sure there's a way to include the same attribute on the DeliveryMethod and still get the results you want - I just haven't learned enough of the API yet to know how to do that. Tips are welcome..&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-6390589510676482846?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/6390589510676482846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=6390589510676482846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/6390589510676482846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/6390589510676482846'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/active-record-and-many-to-many-update.html' title='Active Record and Many to Many Update'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-9173187604501552835</id><published>2007-12-05T23:20:00.001-08:00</published><updated>2007-12-05T23:32:58.724-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='activerecord'/><category scheme='http://www.blogger.com/atom/ns#' term='CSharp'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Active Record and Many to Many</title><content type='html'>I tried to get the following to work:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;      Distributor[] all = Distributor.FindAll();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      foreach(Distributor distributor in all) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Console.WriteLine(distributor.Name);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  foreach(DeliveryMethod deliveryMethod in distributor.DeliveryMethods)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Console.WriteLine("--" + deliveryMethod.Description);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The result was multiple queries to the db and multiples of Distributor objects.&lt;br /&gt;It had to be changed to this to actually get what a non-AR user would expect:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;      Distributor[] all = Distributor.FindAll(&lt;span style="font-weight: bold;"&gt;DetachedCriteria.For(typeof(Distributor)).SetResultTransformer(CriteriaUtil.DistinctRootEntity).SetFetchMode("DeliveryMethods", FetchMode.Eager)&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      foreach(Distributor distributor in all) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Console.WriteLine(distributor.Name);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  foreach(DeliveryMethod deliveryMethod in distributor.DeliveryMethods)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Console.WriteLine("--" + deliveryMethod.Description);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The attribute on the Distributor class' DeliveryMethods property is as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;    [HasAndBelongsToMany(typeof(DeliveryMethod), Table="distributorDeliveryMethod", ColumnKey="distributorId", ColumnRef = "deliveryMethodId")]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    public ICollection&lt;deliverymethod&gt; DeliveryMethods { get { return distributorDeliveryMethods; } set { distributorDeliveryMethods = value; } }&lt;/deliverymethod&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While no collection of Distributors exists on the DeliveryMethod class.&lt;br /&gt;&lt;br /&gt;Is there an easier way to do the above find? What happens if you want 3 or more joins chained?&lt;br /&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-9173187604501552835?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/9173187604501552835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=9173187604501552835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/9173187604501552835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/9173187604501552835'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/active-record-and-many-to-many.html' title='Active Record and Many to Many'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7757566786700790763.post-5754263949184827036</id><published>2007-12-05T21:55:00.000-08:00</published><updated>2007-12-05T23:12:06.115-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='vancouver'/><title type='text'>Joshua Kerievsky's 10 Terrific Transition Tips</title><content type='html'>I attended Joshua's presentation today at Sophos.  This was put on by &lt;a href="http://www.kruchten.org/agilevancouver/"&gt;Agile Vancouver&lt;/a&gt;. Joshua is the author of &lt;a href="http://industriallogic.com/xp/refactoring/"&gt;Refactoring to Patterns&lt;/a&gt;. Here are the points he made:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Management and Development Process is Important.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Scrum alone does not work. Eventually it will be frequent releases of buggy code. Saw that one before.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Pair programming can't be sold.&lt;/span&gt; From my experience many object to it as they are very anti-social. Their programming skills have been honed by spending late nights in front of the computer alone. It's certainly what I remember doing since I was a kid.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;What works better is selling the risks of Solo Programming&lt;/span&gt;. Joshua's list was more comprehensive. If anyone has anything to add to this, please feel free to comment.&lt;br /&gt;&lt;br /&gt;Frog-in-a-well: The developer has a very small view on what is being worked on. There is no one around to rescue the direction of the code to be in line with what is being worked on. The risk of throwing away what you've written and starting over is real and will happen often.&lt;br /&gt;&lt;br /&gt;Productivity not as high: Developer is sitting alone. Goes off on a coding tangent (related to above). Or goes over and above of just enough to work. Or reads a blog, gets entrenched in an email thread, etc. No one there to ensure focus is on building the software.&lt;br /&gt;&lt;br /&gt;Low code reuse: Without anyone there to suggest that this was already done somewhere else in the code base, a similar solution is coded. Because it was reinvented, it's harder to refactor the duplication.&lt;br /&gt;&lt;br /&gt;There are way more.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Removing Risks:&lt;/span&gt;&lt;br /&gt;A company goes to agile to mitigate risks better. There was more to this, but I think I was busy finding a plug for my dying laptop at the time. I managed to capture the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Technical Debt:&lt;/span&gt; It is very hard for business to understand technical debt. At one of the companies that Joshua was consulted to introduce Agile at, there was a method that was 28 printed pages long. He taped them together and rolled the method out on the floor of the hotel lobby. He showed us the video of that. If I get it from him, I'll post it on this blog. The use of endless analogies is needed for them to grasp what the developers have to face.&lt;br /&gt;&lt;br /&gt;- credit card: Ask the executives how often they make a payment on their credit card. What would happen if they stopped making payment? This is what developers are faced with.&lt;br /&gt;&lt;br /&gt;- driving instructions: Joshua wrote really bad driving directions from a patchwork of old English, pig Latin, etc. He asked the execs if they could use those instructions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Business Trumps Process&lt;/span&gt;&lt;br /&gt;Should not happen all the time. See above. Business tends to add features in the fashion of a drug pusher: "Just have another feature..." It is important to be a good debt manager and push back on features before the machine grinds to a halt. "Version 5" software is where this happens. By this time, you are only fixing bugs to the product and don't have enough cycles to push out more features and stay competitive. Like having a maxed out credit card.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Engage the Entire Organization&lt;/span&gt;&lt;br /&gt;Management, Support, Customers and Development must be involved. The concept of a project community is important. It is usually larger than one would expect.&lt;br /&gt;&lt;br /&gt;HR is really important as they usually make dire mistakes such as rewarding cowboy coding. HR should be on board as soon as possible.&lt;br /&gt;&lt;br /&gt;A major, big project should be chosen to introduce agile on. A one-off project will always be dismissed as a fluke, or didn't have the high standards that the rest of the company works against.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Handle Scaling Problems&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.industriallogic.com/"&gt;Joshua's company&lt;/a&gt;'s sales pitch. They do eLearing for Agile. DRY on the meta level. It was not productive to repeat themselves over and over because the company is too large to get everyone trained within a reasonable amount of time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Fail fast&lt;/span&gt;&lt;br /&gt;Tests will do this nicely. The #1 success factor in agile is automated testing. HTTPParser is an OSS project with tests. They are bad tests as changing one line in the production code will make a slew of tests fail. But this has contributors from all walks of life - should be happy that it's fully regression tested.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. Gather Metrics&lt;/span&gt;&lt;br /&gt;How will you know that the agile practices have helped? &lt;a href="http://www.amazon.com/Five-Core-Metrics-Intelligence-Successful/dp/0932633552"&gt;Five Core Metrics&lt;/a&gt; is a book that outlines how to measure the productivity on your project and other indicators. Agile/XP has proven to eliminate 83% of the defects that are found on large projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. Readiness&lt;/span&gt;&lt;br /&gt;This was actually the first point. I'm just remembering it now. The company can have the money, the time, etc. But if the db architects group is a rock that won't budge, agile won't get very far. If that does not change, walk away. Joshua's example was one where the db architects group would take 3-4 weeks to consider adding an extra column in a table.&lt;br /&gt;&lt;br /&gt;My question at the end was what specifically was important to report regularly to management - at the end of an itteration. Reporting of risks to management was the number one thing.&lt;br /&gt;&lt;br /&gt;I know there was 10 points, but in my notes I may have dropped one or two, or mixed them in with the other points. The Agile Vancouver folks say the power point will be available tomorrow. I'll post a link and update then.&lt;br /&gt;&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7757566786700790763-5754263949184827036?l=adventuresinagile.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adventuresinagile.blogspot.com/feeds/5754263949184827036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=5754263949184827036' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5754263949184827036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default/5754263949184827036'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/2007/12/joshua-kerievskys-10-terrific.html' title='Joshua Kerievsky&apos;s 10 Terrific Transition Tips'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://bp2.blogger.com/_KQ92vS7TrFg/R1iiwIZktJI/AAAAAAAAAAM/6-uwqmavMpE/S220/me+in+montreal.jpg'/></author><thr:total>2</thr:total></entry></feed>
