<?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'><id>tag:blogger.com,1999:blog-7757566786700790763</id><updated>2009-11-02T16:18:02.248-08:00</updated><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'/><link rel='alternate' type='text/html' href='http://adventuresinagile.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7757566786700790763/posts/default?start-index=26&amp;max-results=25'/><author><name>Adam</name><uri>http://www.blogger.com/profile/00624806802039000519</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://www.blogger.com/comment.g?blogID=7757566786700790763&amp;postID=6956151211137958232' title='2 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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_KQ92vS7TrFg/SrMAObktQJI/AAAAAAAAACU/ixdwoO3WZQE/s72-c/layers.jpeg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></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 xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></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 xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>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='https://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:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='02993608557481284098'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>