<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUYFQnc6eip7ImA9WhRVEUQ.&quot;"><id>tag:blogger.com,1999:blog-5201404</id><updated>2012-01-10T23:05:13.912+11:00</updated><category term="mobile" /><category term="pirates" /><category term="funny" /><category term="news" /><category term="bugs" /><category term="free" /><category term="eLearning" /><category term="community" /><category term="how to" /><category term="gear" /><category term="war" /><category term="Edupunk" /><category term="Elcom" /><category term="men's health" /><category term="Australia" /><category term="nuclear" /><category term="RSS" /><category term="TDD" /><category term="review" /><category term="blogs" /><category term="training" /><category term="rant" /><category term="future" /><category term="Firefly" /><category term="soccer" /><category term="global warming" /><category term="security" /><category term="Christmas" /><category term="gapingvoid" /><category term="Gmail" /><category term="XML" /><category term="government" /><category term="cloud" /><category term="climate change" /><category term="links" /><category term="Serenity" /><category term="movie" /><category term="Firefox" /><category term="argumentation" /><category term="innovation" /><category term="marketing" /><category term="design" /><category term="Enterprise 2.0" /><category term="Agile Development" /><category term="bureaucracy" /><category term="Iraq" /><category term=".NET" /><category term="space" /><category term="media" /><category term="education" /><category term="technology" /><category term="Microsoft" /><category term="MVC" /><category term="SQL Server" /><category term="SOA" /><category term="inspiration" /><category term="Christian" /><category term="America" /><category term="Ajax" /><category term="beautiful" /><category term="Wikipedia" /><category term="SaaS" /><category term="Lebanon" /><category term="Chrome" /><category term="survey" /><category term="craftsmanship" /><category term="wikis" /><category term="DDD" /><category term="Ruby on Rails" /><category term="Middle East" /><category term="Yahoo" /><category term="presentations" /><category term="Islam" /><category term="knowledge" /><category term="Social" /><category term="HipsterPDA" /><category term="personal" /><category term="law" /><category term="REST" /><category term="politics" /><category term="programming" /><category term="ALT.NET" /><category term="tribalism" /><category term="Mars" /><category term="music" /><category term="entrepreneurship" /><category term="martial arts" /><category term="ccoz" /><category term="YouTube" /><category term="rugby" /><category term="Web 2.0" /><category term="terrorism" /><category term="book" /><category term="Google" /><category term="Long Tail" /><category term="smart thinking" /><category term="Britain" /><category term="NSW" /><category term="GTD" /><category term="conspiracy theory" /><category term="My Blog" /><category term="workliteracy" /><category term="economics" /><category term="Movember" /><category term="Iran" /><category term="Ruby" /><category term="Linux" /><category term="Sharepoint" /><category term="quotes" /><category term="project management" /><category term="management" /><category term="Silverlight" /><title>Falkayn's Nest</title><subtitle type="html">This is my personal blog - stuff not directly connected to my businesses goes here - some of it's a little spicy, so watch out for heartburn. Of course if you're lucky you'll find something valuable in the mix of agile software, Ruby on Rails, ASP.NET, eLearning, technology, politics and marketing that I write about.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.falkayn.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.falkayn.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>343</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/FalkaynsBlog" /><feedburner:info uri="falkaynsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>FalkaynsBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><entry gd:etag="W/&quot;AkEAR3g7cSp7ImA9WhdXFko.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-5776211407353305103</id><published>2011-08-30T14:30:00.001+10:00</published><updated>2011-08-30T14:30:46.609+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-30T14:30:46.609+10:00</app:edited><title>My geek origin story</title><content type="html">&lt;p&gt;&lt;a href="http://twitter.com/#!/delic8genius"&gt;Delicate Genius&lt;/a&gt; (aka Microsoft’s Michael Kordahi) tweeted me a while ago about putting this up, and in the interest of historical accuracy, here it is! Other &lt;a href="http://delicategeniusblog.com/?p=1292"&gt;geek origin stories&lt;/a&gt; can be found from his blog post.&lt;/p&gt; &lt;p&gt;I wasn’t terribly geeky as a young lad, except I loved Lego and got into roleplaying games in a big way. At university I fell into a crowd that were much geekier than I (hat tip to &lt;a href="http://twitter.com/#!/justinmclean"&gt;Justin McLean&lt;/a&gt;), and along the way got pulled into doing an Information Systems major for my Bachelors of Commerce degree.&lt;/p&gt; &lt;p&gt;Something must have happened because by the time I met and married my lovely wife I looked like a true geek! (gotta love the Doc Martens)&lt;/p&gt; &lt;p&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="apict2011-07-15_08-02-15-PM" border="0" alt="apict2011-07-15_08-02-15-PM" src="http://lh4.ggpht.com/-s2IHWpUkgsU/TlxndB67MjI/AAAAAAAABDs/SFfWff_uNNA/apict2011-07-15_08-02-15-PM%25255B7%25255D.jpg?imgmax=800" width="399" height="484"&gt;&lt;/p&gt; &lt;p&gt;Looking back I think the same qualities that caused me to fail Accounting Financial Management 1B led to my success as a geek. Things like:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Always wanting to improve the system,&lt;/li&gt; &lt;li&gt;Searching for truth,&lt;/li&gt; &lt;li&gt;Wanting my work to matter.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;None of those things applied to rote learning T accounts and double entry accounting, but they sure do matter when you are building &lt;a href="http://www.elcomcms.com"&gt;fantastic tools for web developers to build awesome, award-winning sites with&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;So that’s how I ended up becoming the geek t-shirt wearer I am today – although I no longer have those DMs ...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-5776211407353305103?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=VYCOpbMfhKw:mFwL9gjAGbA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=VYCOpbMfhKw:mFwL9gjAGbA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=VYCOpbMfhKw:mFwL9gjAGbA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=VYCOpbMfhKw:mFwL9gjAGbA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=VYCOpbMfhKw:mFwL9gjAGbA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=VYCOpbMfhKw:mFwL9gjAGbA:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=VYCOpbMfhKw:mFwL9gjAGbA:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/VYCOpbMfhKw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/5776211407353305103/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2011/08/my-geek-origin-story.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/5776211407353305103?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/5776211407353305103?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/VYCOpbMfhKw/my-geek-origin-story.html" title="My geek origin story" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/-s2IHWpUkgsU/TlxndB67MjI/AAAAAAAABDs/SFfWff_uNNA/s72-c/apict2011-07-15_08-02-15-PM%25255B7%25255D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2011/08/my-geek-origin-story.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYFRX0zfyp7ImA9WhZbGUo.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-209219965405503914</id><published>2011-06-25T14:51:00.004+10:00</published><updated>2011-06-25T15:01:54.387+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-25T15:01:54.387+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="workliteracy" /><category scheme="http://www.blogger.com/atom/ns#" term="education" /><category scheme="http://www.blogger.com/atom/ns#" term="eLearning" /><title>Context may be key to blended learning</title><content type="html">&lt;p&gt;I have been reading two excellent books recently, John Medina’s &lt;a href="http://www.amazon.com/gp/product/0979777747/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=falkayncom06-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399377&amp;amp;creativeASIN=0979777747"&gt;Brain Rules&lt;/a&gt;&lt;img style="border-bottom-style: none !important; margin: 0px; border-left-style: none !important; border-top-style: none !important; border-right-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=falkayncom06-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0979777747&amp;amp;camp=217145&amp;amp;creative=399377" width="1" height="1"&gt;&lt;label id="showTextCategoryLinkPreview_l1"&gt;&lt;img style="border-bottom-style: none !important; margin: 0px; border-left-style: none !important; border-top-style: none !important; border-right-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=falkayncom06-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0979777747&amp;amp;camp=217145&amp;amp;creative=399385" width="1" height="1"&gt; and Dan Coyle’s &lt;a href="http://www.amazon.com/gp/product/0099519852/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=falkayncom06-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399377&amp;amp;creativeASIN=0099519852"&gt;The Talent Code&lt;/a&gt;&lt;img style="border-bottom-style: none !important; margin: 0px; border-left-style: none !important; border-top-style: none !important; border-right-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=falkayncom06-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0099519852&amp;amp;camp=217145&amp;amp;creative=399377" width="1" height="1"&gt;&lt;label id="showTextCategoryLinkPreview_l1"&gt; (see other &lt;/label&gt;&lt;a href="http://www.amazon.com/Personal-Transformation-Self-Help-Books/b/ref=as_li_tf_tl?ie=UTF8&amp;amp;tag=falkayncom06-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399385&amp;amp;creativeASIN=0099519852&amp;amp;ie=UTF8&amp;amp;node=4745"&gt;Personal Transformation Books&lt;/a&gt;)&lt;img style="border-bottom-style: none !important; margin: 0px; border-left-style: none !important; border-top-style: none !important; border-right-style: none !important" border="0" alt="" src="http://www.assoc-amazon.com/e/ir?t=falkayncom06-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0099519852&amp;amp;camp=217145&amp;amp;creative=399385" width="1" height="1"&gt;&lt;/label&gt;&lt;label&gt;, both deal with how our brain works, and there are interesting things they tell us about learning skills that we can apply to how we structure and run blended learning programs.&lt;/label&gt;&lt;/p&gt; &lt;p&gt;&lt;label&gt;I have &lt;a href="http://blog.falkayn.com/2010/03/goals-behaviours-roi-and-testing-ideas.html"&gt;mentioned before&lt;/a&gt; David Maister’s article &lt;a title="Why (Most) Training is Useless article" href="http://davidmaister.com/articles/1/96/"&gt;Why (Most) Training Is Useless&lt;/a&gt;&amp;nbsp;&lt;/label&gt;&lt;label&gt;in the context of saying that behaviour is what we should be aiming to change, and measure, not simple skill identification. The point was that it is not good saying I want to train your consulting skills if I don’t know what behaviour indicates that you are have learnt and are applying them. Maister also wants incentives made to match those behaviours, based on seeing his training undermined by the structure of the organisation’s incentives.&lt;/label&gt;&lt;/p&gt; &lt;p&gt;&lt;label&gt;&lt;/label&gt;&lt;label&gt;Coyle breaks down two ways we can affect skills development, ignition, which is a combination of incentives/encouragement/vision and deep practice, which is the focused practicing of technique at the edge of our ability, with the aim of achieving perfection in the small components of a skill, and then building into perfection in the larger components. Maister’s complaint about incentives not matching behaviours is talking to the ignition side of skill development.&lt;/label&gt;&lt;/p&gt; &lt;p&gt;&lt;label&gt;Medina’s book is interesting because it gives us lots of clues about how memory relates to instructional methods, with the main points being that repetition is important, but so is learning in the context in which we want to be able to remember what we learn. In this sense it relates well to Coyle’s idea of deep practice.&lt;/label&gt;&lt;/p&gt; &lt;p&gt;&lt;label&gt;&lt;/label&gt;&lt;label&gt;This last point is the one I want to focus on. If Medina is correct when he says that we recall things more easily when in the physical/emotional context we learned them in, then most teaching is done in the wrong context!&lt;/label&gt;&lt;/p&gt; &lt;p&gt;&lt;label&gt;&lt;/label&gt;&lt;label&gt;This suggests that eLearning is best used when the skills being taught are to be expressed online, with use of much the same tools that the learning occurred on. It is one reason learner drivers are encouraged to use their own cars when learning and when going to do their driver’s test.&lt;/label&gt;&lt;/p&gt; &lt;p&gt;&lt;label&gt;&lt;/label&gt;&lt;label&gt;Classroom learning may suit well skills that need to be exhibited in front of other people, in social or meeting situations, where the ability to perform before your peers may be required (it may also help people perform better in classrooms - any professional students listening?). Even then the layout of the room may benefit from being closer to their likely environment. When Anthony Milner and I did the excellent NIDA Corporate Performance Course the format was that of a class, but the frequent practice sessions were done in front of the group with us facing them as a very real audience, an experience that made it easier to recall the skills learnt when actually presenting in front of audiences later.&lt;/label&gt;&lt;/p&gt; &lt;p&gt;&lt;label&gt;One on one mentoring may be the best approach when the skill must be exhibited in the context of a&amp;nbsp; personal relationship, and even then it is best done in the workplace. This is how we handle important parts of facilitator training in the &lt;a href="http://www.careforcelifekeys.org/"&gt;Careforce Lifekeys’ courses&lt;/a&gt;&amp;nbsp;&lt;/label&gt;&lt;label&gt;– the small group facilitator is given the opportunity to practice their skills in the context of a one on one conversation with a trainer playing the role of a small group member.&lt;/label&gt;&lt;/p&gt; &lt;p&gt;&lt;label&gt;There is one caveat to this, both Medina and Coyle point out that the ability to comprehend the big picture is a vital component of skill competency – one of the factors that differentiates experts form beginners in a particular field is that the experts have a mental abstraction that allows them to deal with the complexities of the problem domain more easily. Getting that big picture view across need not necessarily take place in the environment the skill is exercised in – in fact it may benefit from the distance provided by being away from that environment.&lt;/label&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-209219965405503914?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=fM5emeaIVoQ:PNUIqVrDiVE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=fM5emeaIVoQ:PNUIqVrDiVE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=fM5emeaIVoQ:PNUIqVrDiVE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=fM5emeaIVoQ:PNUIqVrDiVE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=fM5emeaIVoQ:PNUIqVrDiVE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=fM5emeaIVoQ:PNUIqVrDiVE:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=fM5emeaIVoQ:PNUIqVrDiVE:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/fM5emeaIVoQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/209219965405503914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2011/06/context-may-be-key-to-blended-learning.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/209219965405503914?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/209219965405503914?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/fM5emeaIVoQ/context-may-be-key-to-blended-learning.html" title="Context may be key to blended learning" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2011/06/context-may-be-key-to-blended-learning.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MCSXc8fCp7ImA9WhZbGEU.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-7255138172399046800</id><published>2011-05-15T21:19:00.001+10:00</published><updated>2011-06-24T13:17:48.974+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-24T13:17:48.974+10:00</app:edited><title>Why web will win the mobile app race</title><content type="html">&lt;p&gt;Everyone wants a mobile app, banks, health funds, airlines, pubs and all sorts of marketers want us interacting, playing with and using their mobile apps. This is fine and dandy, and is a Good Thing for the future of humanity, but … which OS do you want to target? &lt;/p&gt; &lt;p&gt;Is your app going to target iPhone, Android, Blackberry, Windows Phone 7 or (heavens!) Symbian?&lt;/p&gt; &lt;p&gt;The right answer will, of course, be &lt;em&gt;all of the above&lt;/em&gt;. It really isn’t hard to figure out, and there is a precedent you see.&lt;/p&gt; &lt;p&gt;What do you do if you want to target users on MacOS, Windows 7, Linux (a bazillion flavours itself), Google OS or (heavens!) Unix?&lt;/p&gt; &lt;p&gt;The answer to that question is you created a web app, because the browser environment was designed to be (reasonably) neutral between vendors. The same paradigm exists in the mobile world. Creating a specific OS version just limits your app to that OS, and who wants that?&lt;/p&gt; &lt;p&gt;However there is one big difference, the mobile app needs to deal with being &lt;a href="blog.falkayn.com/2011/02/occasionally-dis-connected-is-future.html"&gt;occasionally (dis)connected&lt;/a&gt;, right? Solving that problem has been hard enough that mobile apps are still sprouting up that basically show content offline.&lt;/p&gt; &lt;p&gt;Riding to the rescue of the beleaguered user comes &lt;a href="http://www.w3.org/TR/html5/offline.html#offline"&gt;HTML5 with its cache manifest&lt;/a&gt; offering to give web apps a completely sane way of specifying what content should be held offline and what resides online. The&amp;nbsp; only problem is the memory limits most browsers place on the cache – except for Opera they all only let you have 5MB (or 10MB if you are on IE) – and in these days of fast connections and rich media that simply isn’t enough to get the job done.&lt;/p&gt; &lt;p&gt;There are various ways around this, with Google Gears, Microsoft Sync Framework and Flash also offering ways of getting offline storage to work, and there are some jQuery plugins that hint at the promise of getting this working in a framework that leaves the browser sensitivities to someone else (although I’m always leary of potentially &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;leaky abstraction layers&lt;/a&gt;). &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Personally I don’t care how we solve the problem of sufficiently large offline storage, but I think the future of web development demands that solve it we must.&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;In the meantime we will continue to see niche agencies offering native applications for various phone OSs, but not necessarily delivering the value the business needs because the cost is so high to develop cross-platform apps – and some other applications that target specific OS flavours, most notably Apple iOS or Android, and get away with that because the user base &lt;em&gt;can&lt;/em&gt; be targeted that way (for now).&lt;/p&gt; &lt;h3&gt;EDIT – 23rd Jun 2011&lt;/h3&gt; &lt;p&gt;&lt;a href="http://gigaom.com/mobile/sorry-html-5-mobile-apps-are-used-more-than-the-web/"&gt;GigaOM recently weighed in&lt;/a&gt;, telling us that native mobile apps were beating HTML5 ones. One commenter, Roshan Shrestha, &lt;a href="http://gigaom.com/mobile/sorry-html-5-mobile-apps-are-used-more-than-the-web/#comment-632886"&gt;mentioned&lt;/a&gt; that:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;“I see that many of the apps are just a wrapper against an HTML browser component. Most of them do not store much data locally and require internet connection, so these are basically web apps.”&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;I agree that most apps could be web apps, and I think it will end up there, but not yet. In the meantime everyone needs an Android app, wants an iPhone app and should have a Windows Phone 7 app.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-7255138172399046800?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5n4nk0lFUlg:MLv6ns7-fNQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5n4nk0lFUlg:MLv6ns7-fNQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5n4nk0lFUlg:MLv6ns7-fNQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5n4nk0lFUlg:MLv6ns7-fNQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=5n4nk0lFUlg:MLv6ns7-fNQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5n4nk0lFUlg:MLv6ns7-fNQ:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=5n4nk0lFUlg:MLv6ns7-fNQ:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/5n4nk0lFUlg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/7255138172399046800/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2011/05/why-web-will-win-mobile-app-race.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/7255138172399046800?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/7255138172399046800?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/5n4nk0lFUlg/why-web-will-win-mobile-app-race.html" title="Why web will win the mobile app race" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.falkayn.com/2011/05/why-web-will-win-mobile-app-race.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkABRnw9eyp7ImA9Wx9aF08.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-3798848604405090268</id><published>2011-03-10T14:44:00.001+11:00</published><updated>2011-03-10T14:45:57.263+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-10T14:45:57.263+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="personal" /><category scheme="http://www.blogger.com/atom/ns#" term="media" /><category scheme="http://www.blogger.com/atom/ns#" term="Australia" /><title>Arthur Douglas Burgess</title><content type="html">&lt;p&gt;I just got delivered a very nice present. The National Library of Australia maintains an online archive of Australian newspapers for the last hundred years or so called Trove (&lt;a href="http://trove.nla.gov.au/"&gt;http://trove.nla.gov.au/&lt;/a&gt;). A couple of weeks go I found a reference to my grandfather on my mother’s side, and a few days ago I ordered a copy of it via PDF. Thanks to the miracles of scanning + the internet, here it is:&lt;/p&gt; &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Arthur Douglas Burgess Biography" border="0" alt="Arthur Douglas Burgess Biography" src="http://lh6.ggpht.com/_1GrPn-zPqXU/TXhJcxg27dI/AAAAAAAABAg/Km0vqQV85Qg/Arthur%20Douglas%20Burgess%20Biography%5B5%5D.png?imgmax=800" width="494" height="711"&gt; &lt;/p&gt; &lt;p&gt;My other grandfather was also involved with Fairfax and the Sydney Morning Herald, but in the capacity of a typesetter on the printing presses.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-3798848604405090268?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=dxUDzt-uVZc:GmR6jTj-fgc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=dxUDzt-uVZc:GmR6jTj-fgc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=dxUDzt-uVZc:GmR6jTj-fgc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=dxUDzt-uVZc:GmR6jTj-fgc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=dxUDzt-uVZc:GmR6jTj-fgc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=dxUDzt-uVZc:GmR6jTj-fgc:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=dxUDzt-uVZc:GmR6jTj-fgc:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/dxUDzt-uVZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/3798848604405090268/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2011/03/arthur-douglas-burgess.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/3798848604405090268?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/3798848604405090268?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/dxUDzt-uVZc/arthur-douglas-burgess.html" title="Arthur Douglas Burgess" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_1GrPn-zPqXU/TXhJcxg27dI/AAAAAAAABAg/Km0vqQV85Qg/s72-c/Arthur%20Douglas%20Burgess%20Biography%5B5%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2011/03/arthur-douglas-burgess.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcHQX87fyp7ImA9Wx9aFkk.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-6976989584230834606</id><published>2011-03-09T14:02:00.002+11:00</published><updated>2011-03-09T14:07:10.107+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-09T14:07:10.107+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knowledge" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise 2.0" /><title>Is knowledge all there is?</title><content type="html">&lt;p&gt;I spent a fair bit of time this week helping a client with their information strategy and information management policy. Their definition of information included “Emails, Databases, Documentation and Knowledge”, which is a mixed bag if ever I saw one!&lt;/p&gt; &lt;p&gt;Clearly they needed to get a better handle on what they were dealing with, so I introduced them to a little pyramid that I had worked on several years ago (back when I was thinking about pursuing a career in knowledge management). I call this the &lt;em&gt;Wisdom Pyramid&lt;/em&gt;, and use it to help differentiate between raw data, meaningful information, contextualised knowledge and applied wisdom.&lt;/p&gt; &lt;p align="center"&gt;&lt;strong&gt;&lt;font size="5" face="Trebuchet MS"&gt;Wisdom Pyramid&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1GrPn-zPqXU/TXbt1XGAwYI/AAAAAAAABAM/g9AG_EbMZPc/s1600-h/Wisdom%20Knowledge%20Information%20Data%20Pyramid%5B15%5D.png"&gt;&lt;img style="display: inline" title="Wisdom Knowledge Information Data Pyramid" alt="Wisdom Knowledge Information Data Pyramid" src="http://lh5.ggpht.com/_1GrPn-zPqXU/TXbt2SAVVlI/AAAAAAAABAQ/-tDbzA8eatU/Wisdom%20Knowledge%20Information%20Data%20Pyramid_thumb%5B13%5D.png?imgmax=800" width="490" height="366"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The example I usually use to bring it to life is that of a traffic light changing colour from amber to red.&lt;/p&gt; &lt;p&gt;At a data level there is a single bit of information, isolated from context and basically without meaning, unless one is familiar with that particular data type.&lt;/p&gt; &lt;p&gt;That data becomes information when meaning is given to it so that a human can more easily understand it.&lt;/p&gt; &lt;p&gt;The information becomes knowledge when context is considered, in this case that the traffic light is one I am heading towards.&lt;/p&gt; &lt;p&gt;Wisdom is exhibited when that knowledge is applied to my situation, so that I stop the car at the red light.&lt;/p&gt; &lt;p&gt;The pyramid is pretty useful, although there is a catch with wisdom as we only call an action wise when knowledge is applied &lt;em&gt;correctly&lt;/em&gt; to a situation. Incorrect application is at worst foolish, and at best thoughtless.&lt;/p&gt; &lt;p&gt;Much ado has been made about the management of corporate knowledge, especially the attempt to capture explicit knowledge, although tacit knowledge is also sometimes acknowledged as something that must be transferred. The real issue however is how do we inculcate wisdom into our staff so they make wise decisions and not foolish ones?&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;“Take hold of my words with all your heart; keep my commands, and you will live. Get wisdom, get understanding; do not forget my words or turn away from them. Do not forsake wisdom, and she will protect you; love her, and she will watch over you. The beginning of wisdom is this: Get wisdom. Though it cost all you have, get understanding.” &lt;br&gt;&lt;em&gt;Proverbs 4:4-7 (NIV translation)&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;You grow wisdom by growing people, and that’s where most knowledge management should start – tools are useful (and Elcom has some &lt;a href="http://www.elcom.com.au/Products/Intranet-Manager/Knowledge-Management"&gt;good KM tools&lt;/a&gt;) but mentoring, teaching and encouraging wisdom in our people is where the real benefits come from.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-6976989584230834606?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=-1c54ZjsrP8:zIpb1Y8xmcA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=-1c54ZjsrP8:zIpb1Y8xmcA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=-1c54ZjsrP8:zIpb1Y8xmcA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=-1c54ZjsrP8:zIpb1Y8xmcA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=-1c54ZjsrP8:zIpb1Y8xmcA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=-1c54ZjsrP8:zIpb1Y8xmcA:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=-1c54ZjsrP8:zIpb1Y8xmcA:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/-1c54ZjsrP8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/6976989584230834606/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2011/03/is-knowledge-all-there-is.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/6976989584230834606?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/6976989584230834606?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/-1c54ZjsrP8/is-knowledge-all-there-is.html" title="Is knowledge all there is?" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_1GrPn-zPqXU/TXbt2SAVVlI/AAAAAAAABAQ/-tDbzA8eatU/s72-c/Wisdom%20Knowledge%20Information%20Data%20Pyramid_thumb%5B13%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2011/03/is-knowledge-all-there-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMBQXw8eCp7ImA9Wx9UE0o.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-3977390656645808153</id><published>2011-02-11T09:19:00.002+11:00</published><updated>2011-02-11T09:20:50.270+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-11T09:20:50.270+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="personal" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><title>Fresh design!</title><content type="html">&lt;p&gt;In case you’re reading an RSS feed, I have updated my blog design to use a core Blogger template, and done some (slightly) artistic tweaking to get a look that I’m happy with.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-3977390656645808153?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=wxVpbiWU9_8:QophnJVEqSw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=wxVpbiWU9_8:QophnJVEqSw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=wxVpbiWU9_8:QophnJVEqSw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=wxVpbiWU9_8:QophnJVEqSw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=wxVpbiWU9_8:QophnJVEqSw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=wxVpbiWU9_8:QophnJVEqSw:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=wxVpbiWU9_8:QophnJVEqSw:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/wxVpbiWU9_8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/3977390656645808153/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2011/02/fresh-design.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/3977390656645808153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/3977390656645808153?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/wxVpbiWU9_8/fresh-design.html" title="Fresh design!" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2011/02/fresh-design.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAER3k4eSp7ImA9Wx9UEkQ.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-5592418527579784896</id><published>2011-02-10T10:32:00.002+11:00</published><updated>2011-02-10T10:38:26.731+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-10T10:38:26.731+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="space" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="future" /><title>Occasionally (Dis-)Connected is the Future</title><content type="html">&lt;p&gt;As web application developers we tend to build for always connected scenarios. They simplify the problem of web development and allow us to keep the complexity of our solution hidden on web and application servers back at corporate headquarters.&lt;/p&gt;  &lt;p&gt;Pity the poor rich GUI developer who needed to handle both connected and disconnected modes – mainly for corporate management with laptops. This requirement increased the complexity of their applications and forced sharing of business logic with the client GUI layer. Recently mobile developers have realised the need to provide the same service, and with HTML5 web developers are now being pushed to as well.&lt;/p&gt;  &lt;p&gt;At the same time, the ability of any client machine to get connected is increasing dramatically. Modern cities provide plentiful sources of free, commercial public and private wifi services, and most modern telecommunications devices allow for secondary use as internet modems.&lt;/p&gt;  &lt;p&gt;It is now clear that most web applications/websites are likely to be accessed via mobile devices, and there are far more people with internet access via their mobile devices than via landlines/roaming broadband.&lt;/p&gt;  &lt;p&gt;One might wonder whether disconnected clients still need to be supported, or whether the vast majority of clients in the vast majority of locations are best handled by assuming connected, always-on access? &lt;/p&gt;  &lt;p&gt;The problem with this thinking is that it ignores a fundamental truth:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font size="3"&gt;“Space is big. Really big.”&lt;/font&gt;&lt;font size="2"&gt; – &lt;em&gt;The Hitchhikers Guide to the Galaxy&lt;/em&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1GrPn-zPqXU/TVMkEExcbKI/AAAAAAAAA_g/aIKFy-cAtHk/s1600-h/hubbledeepfield4.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="hubbledeepfield" border="0" alt="hubbledeepfield" src="http://lh4.ggpht.com/_1GrPn-zPqXU/TVMkE1v53LI/AAAAAAAAA_k/vdzhxhSXX3U/hubbledeepfield_thumb2.jpg?imgmax=800" width="490" height="368" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;OK, so these are not all apps that will be used in space (has the first iPhone gone to space yet?), but they can’t all assume that the user is always connected.&lt;/p&gt;  &lt;p&gt;There are two fallacies with the premise of always-on access, the first is assuming that most people’s situations mimic the developers’ own ultra-connected, hyper-geek, lives, the second is limiting “everywhere” to the points on the daily commute. For most people in the world, in most places, there are going to be frequent losses of signal – even in Australia &lt;a href="http://au.todaytonight.yahoo.com/article/36032"&gt;most telcos&lt;/a&gt; can’t get reliable mobile signal to all urban locations, let alone cover the vastness of our Outback.&lt;/p&gt;  &lt;p&gt;Of course mobile developers know this is a problem, and might decry that their app can handle the phone losing and resuming signal flawlessly. But is there still value in the app when it is disconnected?&lt;/p&gt;  &lt;p&gt;The &lt;em&gt;most&lt;/em&gt; interesting opportunities lie with providing access to applications that can still provide value during the occasional disconnection – these are the applications that will be truly useful all the time and everywhere. For example the mapping application on my Nokia N85 can operate with three levels of connection:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Connected to the internet and GPS.&lt;/strong&gt;       &lt;br /&gt;In this mode I get the latest map updates and can tell where I am on the map. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Connected to GPS only.        &lt;br /&gt;&lt;/strong&gt;In this mode the maps used are the ones stored locally but my current location is derived from GPS. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Disconnected.&lt;/strong&gt;       &lt;br /&gt;In this mode the maps are available to be read, queried or manually moved around on, but my current location is not available. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Even in the most disconnected mode the maps are useful, I can lookup addresses and perform most of what I would have with an old-school street directory. When they connect further I get increasing amounts of value. Because of this sort of disconnected operation, the map and email applications are the most useful aspects of the phone to me (the other is the clock). They are more useful than a static application because they can occasionally connect and update themselves.&lt;/p&gt;  &lt;p&gt;There is a term for this sort of behaviour that web developers have coined with websites that offer substantial value for all browser clients, but increase their value for some special browser clients.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Progressive_enhancement"&gt;&lt;font size="3"&gt;Progressive enhancement&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The point is to view the extra potential as something great to have, but not necessary for the application to fulfil its value proposition.&lt;/p&gt;  &lt;p&gt;I really think this is the killer feature for a mobile app – provided of course that there can still be a value proposition in the disconnected mode. I also think that the best mobile apps will be web apps that respond and adapt to the restrictions of the mobile space rather than custom built ghetto-apps that can only prosper in one particular mobile OS. But that can be another post …&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-5592418527579784896?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=d7mReiJOzxQ:ybObVuCX0KQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=d7mReiJOzxQ:ybObVuCX0KQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=d7mReiJOzxQ:ybObVuCX0KQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=d7mReiJOzxQ:ybObVuCX0KQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=d7mReiJOzxQ:ybObVuCX0KQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=d7mReiJOzxQ:ybObVuCX0KQ:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=d7mReiJOzxQ:ybObVuCX0KQ:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/d7mReiJOzxQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/5592418527579784896/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2011/02/occasionally-dis-connected-is-future.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/5592418527579784896?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/5592418527579784896?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/d7mReiJOzxQ/occasionally-dis-connected-is-future.html" title="Occasionally (Dis-)Connected is the Future" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_1GrPn-zPqXU/TVMkE1v53LI/AAAAAAAAA_k/vdzhxhSXX3U/s72-c/hubbledeepfield_thumb2.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2011/02/occasionally-dis-connected-is-future.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEHR3k_eyp7ImA9Wx5aGUs.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-7640549374790603681</id><published>2010-11-17T14:12:00.002+11:00</published><updated>2010-11-17T14:13:56.743+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-17T14:13:56.743+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Elcom" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="ALT.NET" /><title>Dependency injection our way</title><content type="html">&lt;style&gt;div.code {background-color:#222; width:530px; overflow:scroll; margin:5px 0px 0px 0px; padding: 5px;}
pre.code {background-color:#222; width:1400px; height:100%; margin:0px; padding:0px;}&lt;/style&gt;  &lt;p&gt;
Like most everyone else practicing automated unit testing the developers at &lt;a href="http://www.elcom.com.au"&gt;Elcom Technology&lt;/a&gt; have the issue to deal with of how to handle dependency injection – that is the exposure of a given object’s dependencies on other objects outside of the object so that the calling object can be made responsible for acquiring those dependent objects. In general this is most easily done by exposing said dependencies in the object’s constructor as required parameters – thus ensuring that the calling objects knows it needs to supply them when new'ing the object. So far, so good.&lt;/p&gt;
&lt;p&gt;
Recently (as of CM v7.2) we have introduced the Elcom.API library in an attempt to use the adapter pattern to present a more cogent, safer and easier to use interface to our &lt;a href="http://www.elcom.com.au/Products/Community-Manager/Community-Manager-Summary/default.aspx"&gt;CommunityManager.NET web CMS product&lt;/a&gt;. This is all well and good, but it means that to ensure testability we now have chains of dependencies throughout our application code – and declaring something a dependency of object A, when it is required by that object only to call object B, which then only needs it to call object C, creates some very smelly code.&lt;/p&gt;
&lt;p&gt;
Clearly we needed a dependency injection framework of some sort, but what should we use? &lt;a href="http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion"&gt;Like Uncle Bob&lt;/a&gt; we didn’t want our DI framework to leave code smell throughout our projects. Well, we already have an object with all static/shared methods called &lt;font face="Courier New"&gt;Current&lt;/font&gt;. We use this to give an easy way of accessing some current state items, such as:&lt;/p&gt;
&lt;div class="code"&gt;
&lt;pre class="code"&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;a &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Current&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;Configuration&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;ConnectionString
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;b &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Current&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;Configuration&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;EncryptionSettings
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;c &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Current&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;Configuration&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;ShortDateFormat
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;d &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Current&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;HttpContext
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;e &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Current&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;UrlId
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;f &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Current&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;User
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;g &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Current&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;UserId&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;
Now we want to expand that to offer this sort of syntax to give easy access to services/repositories:&lt;/p&gt;


&lt;div class="code"&gt;

&lt;pre class="code"&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;myContSvc &lt;/span&gt;&lt;span style="color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="color: #4fa745"&gt;Content&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IContentService &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Current&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;Service&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;ContentServiceGet&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;()&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;
That would give a simple way for object B to instantiate an &lt;font face="Courier New"&gt;IContentService&lt;/font&gt; without needing to declare it as a dependency to object A (but object C should still declare this in its constructor). For this to be truly useful, we have to be able to wire up the &lt;font face="Courier New"&gt;Content.Service&lt;/font&gt; container at runtime from either a configuration file (the default behaviour) or from code (during testing).&lt;/p&gt;


&lt;h2&gt;
Sidebar: On DI Containers&lt;/h2&gt;


&lt;p&gt;
To digress briefly, you will notice that the Current.Service container is a custom-built one, rather than a &lt;a href="http://unity.codeplex.com/"&gt;Unity&lt;/a&gt; or other DI framework’s container. The reason for this is twofold:&lt;/p&gt;


&lt;ol&gt;
&lt;li&gt;We want to minimise our product’s dependencies on other products or open-source projects. &lt;/li&gt;


&lt;li&gt;We want developers using our product to be able to know in their IDE whether a given service can expect to be found wired up in the container, hence our use of methods like &lt;font face="Courier New"&gt;ContentServiceGet()&lt;/font&gt; and &lt;font face="Courier New"&gt;SecurityServiceGet()&lt;/font&gt;. &lt;/li&gt;

&lt;/ol&gt;


&lt;p&gt;
That second reason is very important given that we are still actively developing the Elcom.API and pushing it out across all of our product’s many modules. One version of CommunityManager.NET may have very different abilities to the next one, and our partners’ developers may be dealing in multiple versions at once – hence the need for good IDE support.&lt;/p&gt;


&lt;h2&gt;
Saved by the Static Property&lt;/h2&gt;


&lt;p&gt;
So we like the syntax afforded us by static/shared methods, but they present problems when it comes to setting the values during testing. We looked at lots of options, including using delegates or even events, but they all made production code smelly in order to aid testing, and that didn’t sit well with us.&lt;/p&gt;


&lt;p&gt;
What we ended up doing was creating an &lt;font face="Courier New"&gt;IServiceContainer&lt;/font&gt; interface which declared all the types of services that could be returned, and using a factory within the &lt;font face="Courier New"&gt;Current.Service&lt;/font&gt; method to build a &lt;font face="Courier New"&gt;DefaultServiceContainer&lt;/font&gt; from a configuration file. We then provided a &lt;font face="Courier New"&gt;Current.ServiceContainer&lt;/font&gt; object which would contain the concrete version of &lt;font face="Courier New"&gt;IServiceContainer&lt;/font&gt; being used and which could be overwritten when testing.&lt;/p&gt;


&lt;div class="code"&gt;

&lt;pre class="code"&gt;&lt;span style="color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;summary&amp;gt;
&lt;/span&gt;&lt;span style="color: #ebd767"&gt;''' This holds the concrete implementation of IServiceContainer that is used. This is writable in order to help testability.
''' &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/summary&amp;gt;
&lt;/span&gt;&lt;span style="color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span style="color: #ebd767"&gt;The concrete implementation of IServiceContainer that is used by Current.Service (or that is created by that function).&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/value&amp;gt;
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Public Shared Property &lt;/span&gt;&lt;span style="color: #4fa745"&gt;ServiceContainer &lt;/span&gt;&lt;span style="color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IServiceContainer &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Nothing

Public Shared Function &lt;/span&gt;&lt;span style="color: #4fa745"&gt;Service&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;() &lt;/span&gt;&lt;span style="color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IServiceContainer
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;currentContainer &lt;/span&gt;&lt;span style="color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IServiceContainer

&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;If &lt;/span&gt;&lt;span style="color: #4fa745"&gt;ServiceContainer &lt;/span&gt;&lt;span style="color: #9d9dce"&gt;IsNot Nothing Then
&lt;/span&gt;&lt;span style="color: #ebd767"&gt;' retrieving the previously created one (or the testing one if its been written by our tests)
&lt;/span&gt;&lt;span style="color: #4fa745"&gt;currentContainer &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #4fa745"&gt;ServiceContainer
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;Else
Dim &lt;/span&gt;&lt;span style="color: #4fa745"&gt;factory &lt;/span&gt;&lt;span style="color: #9d9dce"&gt;As New &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ContainerFactory

&lt;/span&gt;&lt;span style="color: #4fa745"&gt;currentContainer &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #4fa745"&gt;factory&lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="color: #4fa745"&gt;ServiceContainer

&lt;/span&gt;&lt;span style="color: #ebd767"&gt;' obviously we need to store/cache this and not just instantiate each time, so put it back into Current.ServiceContainer
&lt;/span&gt;&lt;span style="color: #4fa745"&gt;ServiceContainer &lt;/span&gt;&lt;span style="color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="color: #4fa745"&gt;currentContainer
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;End If

Return &lt;/span&gt;&lt;span style="color: #4fa745"&gt;currentContainer
&lt;/span&gt;&lt;span style="color: #9d9dce"&gt;End Function&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;
This approach works really well, provided you don’t mix production and testing code in the same application instance, which we never do. It doesn’t offer a generic container for developers to use for custom projects built on CommunityManager.NET – but there is nothing stopping them using Unity or other generic containers for their own purposes.&lt;/p&gt;


&lt;p&gt;
In case you’re wondering this has become a pattern we’re using across the &lt;font face="Courier New"&gt;Current&lt;/font&gt; object’s static/shared methods, including of course &lt;font face="Courier New"&gt;Current.HttpContext&lt;/font&gt;. Our caching at the moment is still fairly primitive (stick the object in the static property), but we are looking at making improvements in that area in this release too. If nothing else we have a proxy for Session objects that can be swapped at test time for something not dependent on web projects (although ASP.NET cache is available outside web projects anyway, See &lt;a href="http://www.hanselman.com/blog/UsingTheASPNETCacheOutsideOfASPNET.aspx"&gt;Scott Hanselman’s reference&lt;/a&gt; to using &lt;font face="Courier New"&gt;HttpRuntime.Cache&lt;/font&gt; outside ASP.NET).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-7640549374790603681?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=gRSU-qFnr0k:_hZ2EV930Pw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=gRSU-qFnr0k:_hZ2EV930Pw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=gRSU-qFnr0k:_hZ2EV930Pw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=gRSU-qFnr0k:_hZ2EV930Pw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=gRSU-qFnr0k:_hZ2EV930Pw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=gRSU-qFnr0k:_hZ2EV930Pw:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=gRSU-qFnr0k:_hZ2EV930Pw:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/gRSU-qFnr0k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/7640549374790603681/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2010/11/dependency-injection-our-way.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/7640549374790603681?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/7640549374790603681?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/gRSU-qFnr0k/dependency-injection-our-way.html" title="Dependency injection our way" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2010/11/dependency-injection-our-way.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UBQng5fyp7ImA9Wx5XGUU.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-2646174227145211954</id><published>2010-09-20T23:27:00.000+10:00</published><updated>2010-09-20T23:27:33.627+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-20T23:27:33.627+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="My Blog" /><title>Is blogrolling dead?</title><content type="html">I just removed my Blogrolling links as Google warns me that the site was being used to distribute malware. It's a real shame, but it opens up the door to me looking at freshening the design for the first time in a few years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-2646174227145211954?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=MHQpTTmE0yU:m0DPl9QKgK4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=MHQpTTmE0yU:m0DPl9QKgK4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=MHQpTTmE0yU:m0DPl9QKgK4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=MHQpTTmE0yU:m0DPl9QKgK4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=MHQpTTmE0yU:m0DPl9QKgK4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=MHQpTTmE0yU:m0DPl9QKgK4:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=MHQpTTmE0yU:m0DPl9QKgK4:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/MHQpTTmE0yU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/2646174227145211954/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2010/09/is-blogrolling-dead.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/2646174227145211954?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/2646174227145211954?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/MHQpTTmE0yU/is-blogrolling-dead.html" title="Is blogrolling dead?" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2010/09/is-blogrolling-dead.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04GQn89eSp7ImA9WxFSE00.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-8805982892264012128</id><published>2010-04-15T13:25:00.001+10:00</published><updated>2010-04-15T13:25:23.161+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-15T13:25:23.161+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="innovation" /><category scheme="http://www.blogger.com/atom/ns#" term="how to" /><category scheme="http://www.blogger.com/atom/ns#" term="Social" /><category scheme="http://www.blogger.com/atom/ns#" term="Web 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise 2.0" /><title>Using Enterprise 2.0</title><content type="html">&lt;p&gt;&lt;em&gt;Continuing from my &lt;a href="http://falkayn.blogspot.com/2010/04/untapping-your-peoples-passion.html"&gt;previous post&lt;/a&gt;, this one is more in line with the actual talk I gave on the 13th April at &lt;a href="http://www.internetshow.com.au"&gt;The Internet Show&lt;/a&gt; in Melbourne. We will be putting the actual transcript and slides of that talk (and video if the quality is good enough) up for people to download in the next week or so.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;If you are interested in Web 2.0 and social software then you should have a look at Enterprise 2.0, which could be thought of as just Web 2.0 within the enterprise, although the originator of the idea, &lt;a href="http://andrewmcafee.org"&gt;Andrew McAfee&lt;/a&gt; has a more &lt;a href="http://andrewmcafee.org/2006/05/enterprise_20_version_20/"&gt;precise definition&lt;/a&gt; for it:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Enterprise 2.0 is the use of emergent social software platforms within companies, or between companies and their partners or customers.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;He places particular emphasis on the idea that it should be emergent, and for this reason excludes traditional intranets as part of the Enterprise 2.0 toolset.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“&lt;em&gt;Emergent&lt;/em&gt; means that the software is freeform, and that it contains mechanisms to let the patterns and structure inherent in people’s interactions become visible over time.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The whole idea of &lt;a href="http://en.wikipedia.org/wiki/Emergence"&gt;emergence&lt;/a&gt; is a tricky one, but a good example is the way Google assesses the relative merit of web pages based on the number (and quality) of inbound links, something which emerges over time as people find a page useful and link to it, rather than something pre-planned and orchestrated. A more concrete example is the idea of not placing paths in a garden up front, but allowing people’s actual movement to determine where paths should be placed – hence having them emerge as real patterns of use are known.&lt;/p&gt;  &lt;p&gt;A point worth noting is that this means that the early structure or format of an Enterprise 2.0 tool can be expected to change over time. Initially it may seem somewhat useless, and not the sort of quality resource the business hopes it will be. This is a &lt;em&gt;good thing&lt;/em&gt; as this quote from &lt;a title="Art &amp;amp; Fear: Observations on the Perils (and Rewards) of Artmaking" href="http://www.kk.org/cooltools/archives/000216.php"&gt;Art &amp;amp; Fear&lt;/a&gt; illustrates:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“The ceramics teacher announced on opening day that he was dividing the class into two groups. All those on the left side of the studio, he said, would be graded solely on the quantity of work they produced, all those on the right solely on its quality. His procedure was simple: on the final day of class he would bring in his bathroom scales and weigh the work of the ‘quantity’ group: fifty pound of pots rated an ‘A’, forty pounds a ‘B’, and so on. Those being graded on ‘quality’, however, needed to produce only one pot -albeit a perfect one - to get an &amp;quot;A&amp;quot;. Well, came grading time and a curious fact emerged: the works of highest quality were all produced by the group being graded for quantity. It seems that while the ‘quantity’ group was busily churning out piles of work - and learning from their mistakes – the ‘quality’ group had sat theorizing about perfection, and in the end had little more to show for their efforts than grandiose theories and a pile of dead clay.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The point about emergence is that it usually leads to a more appropriate and higher quality result than something meticulously planned from “theorizing about perfection”.&lt;/p&gt;  &lt;p&gt;It is important to realise that the interactions that will take place, and help the emergence of patterns and structure, will be around ideas and especially the communication of ideas. Any Enterprise 2.0 initiative must have as its basis the ability for people to express, challenge, endorse and modify their and other’s ideas.&lt;/p&gt;  &lt;p&gt;It can seem that some of this is a waste of people’s time, creating yet more ideas (some rubbish) for them to have to trawl through and interact with. We should remember that what ultimately matters is how it helps to &lt;a href="http://blog.thingamy.com/sigs_blog/2010/03/organisational-effectiveness-vs-personal-efficiency.html"&gt;optimise overall organisational effectiveness&lt;/a&gt;, not necessarily the impact on individual efficiency. Efficiency is one of the items that gets addressed as complexity emerges in the unstructured content that Enterprise 2.0 deals with – good tools will help you deal with this complexity.&lt;/p&gt;  &lt;h4&gt;What Can Enterprise 2.0 Do?&lt;/h4&gt;  &lt;p&gt;One of the biggest differences in Enterprise 2.0 tools is that they bring broadcasting to the average employee. This means that everyone can take advantage of the virtues of pull versus push publishing. Instead of identifying who should see something, and then pushing it into their email inboxes, or onto their IM clients, pull publishing allows the idea to be pulled into someone’s attention when they want it to be. Key enablers for pull publishing are RSS feeds and feed-readers, easily browsable content and micro-blogging enterprise tools like Yammer.&lt;/p&gt;  &lt;p&gt;Another key difference is that most Enterprise 2.0 tools have come out of the consumer marketplace. That means they are highly usable and are designed from the ground up to be easy to learn. It turns out that’s a really important point, because it makes adoption across an enterprise much easier than most enterprise software. One key point is that the tools should address security and legal concerns, unlike most Web 2.0 tools, the content being dealt with is commercially sensitive.&lt;/p&gt;  &lt;p&gt;Here are some business problems that Enterprise 2.0 helps address better than many other tools:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Bring new employees up to speed&lt;/strong&gt;       &lt;br /&gt;Wikis allow corporate knowledge to be easily captured, reviewed, edited and re-published as necessary so that new employees can quickly see the latest information. Internal blogs can operate the same way, but have the additional bonus of making it obvious who knows what, which gives the new employee someone to connect with. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Accurately forecast something&lt;/strong&gt;       &lt;br /&gt;Some cutting edge applications of Enterprise 2.0 include crowd sourcing from within the organisation, using internal &lt;a href="http://en.wikipedia.org/wiki/Prediction_market"&gt;prediction markets&lt;/a&gt; to identify probable issues or forecasting delivery dates or prices. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Help customers&lt;/strong&gt;       &lt;br /&gt;One of the oldest Enterprise 2.0 ideas, and something pre-dating Web 2.0, self-help community forums enable customers to be helped by other customers acting as a volunteer helpdesk. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Make things findable&lt;/strong&gt;       &lt;br /&gt;Blogs (and intranets) that implement folksonomy tagging well allow users to easily tag things to find later and make content more browsable. Good enterprise search solutions that cover blogs, wikis, intranets and other Enterprise 2.0 tools also help make things more findable. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Broadcast ideas (pull not push)&lt;/strong&gt;       &lt;br /&gt;As mentioned above, RSS and Yammer allow users to publish content in a way that broadcasts it outside their normal circle of influence, without creating disruptive interruptions as push publishing tends to. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Transparent project progress&lt;/strong&gt;       &lt;br /&gt;Using a wiki, blog or a simple project management tool like Basecamp to track project progress both allows the emergence of patterns and can make those visible to people outside the immediate project team. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Communicate to the rest of the organisation        &lt;br /&gt;&lt;/strong&gt;Department blogs can act as venues for communications between components of an organisation, and capture the discussions around those communications for future users to review and understand. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Helping upcoming leaders network&lt;/strong&gt;       &lt;br /&gt;It is well established that upcoming leaders do better when their networks are more diverse and cross organisational boundaries. Internal blogs, the comments around them and a good flexible corporate directory tool can help upcoming leaders get noticed outside their existing teams and make the connections they will require to succeed. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Enhance employee self-learning&lt;/strong&gt;       &lt;br /&gt;I’ve &lt;a href="http://falkayn.blogspot.com/2008/06/how-do-you-make-training-useful.html"&gt;mentioned before&lt;/a&gt; David Maister’s opinion that &lt;a href="http://davidmaister.com/articles/1/96/"&gt;most training is useless&lt;/a&gt; and the current focus of much etraining is actually on how to teach the individual to become a better learner, rather than pushing particular content at them. Wikis, blogs and social bookmarking all place a part in enabling better self-learning. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Improve innovation&lt;/strong&gt;       &lt;br /&gt;Innovation is done by creative people, usually passionate creative people (see my previous post on &lt;a href="http://falkayn.blogspot.com/2010/04/untapping-your-peoples-passion.html"&gt;passion&lt;/a&gt;) and Enterprise 2.0 helps them do this by making it easy for their ideas to be shared with internal audiences to inspire and call forth more ideas from them. Any Enterprise 2.0 tool can help innovation, but the best ones are often internal blogs. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Below is a great slidedeck that illustrates how someone might use these tools:&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_42907"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Meet Charlie - what is Enterprise2.0?" href="http://www.slideshare.net/slgavin/meet-charlie-what-is-enterprise20"&gt;Meet Charlie - what is Enterprise2.0?&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=meet-charlie-what-is-enterprise20-29751&amp;amp;stripped_title=meet-charlie-what-is-enterprise20" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=meet-charlie-what-is-enterprise20-29751&amp;amp;stripped_title=meet-charlie-what-is-enterprise20" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/slgavin"&gt;Scott Gavin&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;h4&gt;What Do I Need in an Enterprise 2.0 Tool?&lt;/h4&gt;  &lt;p&gt;What should you look for in an Enterprise 2.0 tool?&lt;/p&gt;  &lt;p&gt;You want to start with one that is more of a toolbox than a single tool, a good start is to look for something that offers blogs, wikis and a well-integrated corporate directory. You want something that is expandable, so you have the option to add more tools later.&lt;/p&gt;  &lt;p&gt;Any tool you choose should play nice with other enterprise software, so you should find something that offers single sign-on (SSO) with your particular network, for example Active Directory/LDAP integration and that satisfies your IT department’s security needs.&lt;/p&gt;  &lt;p&gt;Playing nicely with other Enterprise 2.0 tools is also mandatory. In this case that is mainly done by providing (and consuming) RSS feeds and integrating with your chosen enterprise search tool, but integration with a corporate directory offering will become necessary.&lt;/p&gt;  &lt;p&gt;Basic functionality to allow emergent behaviours is also necessary, at a minimum this requires tagging and the ability to comment on anything, but micro-blogging and social bookmarking are also good candidates for this.&lt;/p&gt;  &lt;p&gt;If you want to try something without involving IT, then you can look at various hosted solutions (such as Yammer), but eventually you should make sure that IT is happy with your choice of tools – especially of it ends up being something that you need to host yourselves, or if it will contain content vital to the continuity of the organisation in the case of a disaster.&lt;/p&gt;  &lt;h4&gt;Do I Need It?&lt;/h4&gt;  &lt;p&gt;Small companies, or larger ones faced with large amount of routines tasks and few opportunities for passionate creative work, might find that Enterprise 2.0 offers less robust ROI than most IT purchases, but even they may benefit from using Yammer or similar low-cost, hosted tools.&lt;/p&gt;  &lt;p&gt;Companies in highly competitive environments, where the ability to be agile and quick to react to change is important, or organisations seeking to &lt;a href="http://falkayn.blogspot.com/2010/04/untapping-your-peoples-passion.html"&gt;ignite the passion of their employees and find more effective ways to work&lt;/a&gt; will find that these tools are indispensable in helping flatten the organisation and efficiently distribute ideas.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-8805982892264012128?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yh1w4Uro0vQ:W1smdRloDw4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yh1w4Uro0vQ:W1smdRloDw4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yh1w4Uro0vQ:W1smdRloDw4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yh1w4Uro0vQ:W1smdRloDw4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=yh1w4Uro0vQ:W1smdRloDw4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yh1w4Uro0vQ:W1smdRloDw4:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=yh1w4Uro0vQ:W1smdRloDw4:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/yh1w4Uro0vQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/8805982892264012128/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2010/04/using-enterprise-20.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/8805982892264012128?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/8805982892264012128?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/yh1w4Uro0vQ/using-enterprise-20.html" title="Using Enterprise 2.0" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.falkayn.com/2010/04/using-enterprise-20.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUBRnszeyp7ImA9WxFTFUw.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-1801027212352021667</id><published>2010-04-06T11:44:00.001+10:00</published><updated>2010-04-06T11:44:17.583+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-06T11:44:17.583+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="smart thinking" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile Development" /><category scheme="http://www.blogger.com/atom/ns#" term="innovation" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><category scheme="http://www.blogger.com/atom/ns#" term="inspiration" /><category scheme="http://www.blogger.com/atom/ns#" term="craftsmanship" /><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise 2.0" /><title>Untapping your people’s passion</title><content type="html">&lt;p&gt;&lt;em&gt;I’m in the midst of preparing for The Internet Show in Melbourne, 13-14 April 2010. As a sponsor my employer, Elcom Technology, has several slots for presentations. We’re doing a case study on a social networking startup and a CMS clinic, but most importantly for me I am also doing a session on Web 2.0 and Social Media within the enterprise. These are the key ideas behind that talk, although this is more detailed than I will be on the day.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Passion is one of those wonderful ideas, it is hard to quantify or measure, but unmistakable when you meet it. In the business world we tend to think of it as messy, disorganised, hard to manage, hard to inspire and hard to control.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1GrPn-zPqXU/S7qR6UrR77I/AAAAAAAAA-Q/NRB-3-QYx8I/s1600-h/iStock_000000486247Large%5B9%5D.jpg"&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="Passion is messy" alt="Passion is messy" src="http://lh4.ggpht.com/_1GrPn-zPqXU/S7qR7RbcEMI/AAAAAAAAA-U/gLjwtORa5Mg/iStock_000000486247Large_thumb%5B7%5D.jpg?imgmax=800" width="400" height="328" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;However, passion is one of the greatest competitive advantages, with something they are passionate about, people will spend more time, think more creatively and fight harder than they will with other things in their lives. It is also well-recognised that passionate employees create passionate customers, and that’s something any business should be interested in.&lt;/p&gt;  &lt;p&gt;Deloitte’s &lt;a href="http://www.johnseelybrown.com/shiftindex.pdf"&gt;2009 Shift Index&lt;/a&gt; says that “Passion is when people discover the work that they love and when their job becomes more than a mode of income.” They describe the need for passion in terms of competing for employees:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Why does passion matter? Because staying competitive in the newly globalized labor market requires all of us to constantly renew and update our professional skills and capabilities. The effort required to increase our rate of professional development is difficult to muster unless we are passionately engaged with our professional activities.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;A History Lesson&lt;/h4&gt;  &lt;p&gt;Around 100 years ago the Ford Motor Company implemented an &lt;a href="http://en.wikipedia.org/wiki/Assembly_line"&gt;assembly line&lt;/a&gt; in order to boost the production of the Model T. Initially, Ford raised the wages of assembly line workers to keep them interested in the innovations they were rolling out, but now we think of assembly lines as places where cost is minimised by reducing the complexity of the work across many simple steps, and therefore minimising the training (and wages) required for employees.&lt;/p&gt;  &lt;p&gt;By simultaneously innovating to a lower price point and creating a middle class that could afford their product, Ford managed to reach a dominant early lead in the production of motor cars. This precipitated a movement from &lt;a href="http://en.wikipedia.org/wiki/Craft_production"&gt;craft production&lt;/a&gt; to &lt;a href="http://en.wikipedia.org/wiki/Mass_production"&gt;mass production&lt;/a&gt; and in large part was based on &lt;a href="http://en.wikipedia.org/wiki/Taylorism"&gt;scientific management&lt;/a&gt;, a term coined by &lt;a href="http://en.wikipedia.org/wiki/Frederick_Winslow_Taylor"&gt;Frederick Taylor&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The motor car industry might have continued in this vein forever, except for the advent of the &lt;a href="http://en.wikipedia.org/wiki/Toyota_Production_System"&gt;Toyota Production System&lt;/a&gt; (TPS). The founders of Toyota were unimpressed with Ford’s assembly line, but found a way to improve it greatly. Their ideas were wildly successful and a host of studies tried to understand the core ideas in the TPS in order to apply it in the western world. Thus we received just-in-time manufacturing, total quality management, continuous improvement and lean manufacturing.&lt;/p&gt;  &lt;p&gt;Most of these ideas have failed to find as fertile soil in the west as they did in Japan – however the evidence is that the difference is not cultural (Toyota runs plants in America run as well as they do in Japan), predicated upon Japanese corporate solidarity, or based on some secret sauce hidden from researchers. In fact the key items were in plain view all the time, but hidden by the biases the researchers brought with them.&lt;/p&gt;  &lt;p&gt;There are two key differences they ignored:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;1. People Management&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;The first key difference was the way people were treated. In the TPS people at all levels are valued and given control of their area of work. For example, an assembly line worker is able to shut down the entire line if they find a defect, and will then be part of the team tasked with finding the root cause of that defect and solving it.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;2. Practice Makes Perfect&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Another key difference is that the Japanese understood W. Edward Deming’s &lt;a href="http://en.wikipedia.org/wiki/Statistical_process_control"&gt;statistical process control&lt;/a&gt; methodology, and saw their assembly lines as being imperfect and in need of continuous improvement, rather than the perfectly &lt;a href="http://en.wikipedia.org/wiki/Defined_process"&gt;defined processes&lt;/a&gt; that scientific management assumed.&lt;/p&gt;    &lt;p&gt;An illustration of this is the pottery class that was split 50/50 between students who were told they would be judged on the quality of a single pot at the end of the course, and ones that were told they would be judged on the quantity of the pots they produced. The ones who focussed on quantity ended up producing better quality pots because they learnt from each one they created, whilst the others got stuck in trying to create the single perfect pot first time.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Eventually in the mid-80’s, Ford asked Deming to help them turn around their quality problems. They were surprised when his focus was on their management methods, but his influence was quickly seen in the profitable Taurus-Sable line.&lt;/p&gt;  &lt;p&gt;Today these principles are working their way into other areas of work, through &lt;a href="http://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile software development&lt;/a&gt; and the general concept of &lt;a href="http://en.wikipedia.org/wiki/Lean"&gt;Lean&lt;/a&gt;. An important key concept is the idea of &lt;a href="http://en.wikipedia.org/wiki/Lean_manufacturing#Types_of_wastes"&gt;waste&lt;/a&gt; – whether it be spare inventory, transportation, defects, unnecessary motion, over-production or over-processing. The well-known Scrum methodology lists three important pillars for empirical process control:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Transparency&lt;/strong&gt;       &lt;br /&gt;Know what is happening and be able to measure everything. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Inspection&lt;/strong&gt;       &lt;br /&gt;Regular and frequent inspection of the process to ensure it is functioning without &lt;a href="http://en.wikipedia.org/wiki/Lean_manufacturing#Types_of_wastes"&gt;waste&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Adaptation&lt;/strong&gt;       &lt;br /&gt;Adapting the process to remove any &lt;a href="http://en.wikipedia.org/wiki/Lean_manufacturing#Types_of_wastes"&gt;waste&lt;/a&gt;. &lt;/li&gt; &lt;/ol&gt;  &lt;h4&gt;So What?&lt;/h4&gt;  &lt;p&gt;A big part of Deming’s management principles was helping people re-discover &lt;strong&gt;“pride of workmanship”&lt;/strong&gt; (or passion!) in their work, and removing barriers to them doing this (e.g. work standards, quotas, annual ratings, management by objective, etc.), substituting leadership for those barriers.&lt;/p&gt;  &lt;p&gt;Whilst Deming’s methods have transformed the manufacturing industry, with companies like Dell and Boeing taking lessons from the TPS and applying them well, there are many industries where Taylor’s scientific management methods still rule, mostly because of habit and management (mis)training.&lt;/p&gt;  &lt;p&gt;I know that I learnt how to manage very much in line with scientific management techniques (mainly by osmosis from poor managers). Plan, control, punish, reward, etc. The reality is that there is a shift in our working lives, we need more &lt;a href="http://edgeperspectives.typepad.com/edge_perspectives/2009/09/a-labor-day-manifesto-for-a-new-world.html"&gt;passionate creatives&lt;/a&gt; than ever, more artisans or craftspeople than unthinking drones. There is scarcely any industry or business that does not need at least some of their people to be passionately involved, engaged and thinking outside the box.&lt;/p&gt;  &lt;p&gt;That last point is key to applying this. For some organisations the amount of passionate creative work that overlaps their routine work is minimal, for others there is almost a total overlap. The trend is towards more passionate creative work, and we will see that increasingly the leaders in their field are organisations that tap into this and harness it properly. Ford’s initial success in keeping their assembly workers by doubling their pay was short-term, soon the rest of the employment market matched their wages and the middle class expanded rapidly thereafter.&lt;/p&gt;  &lt;p&gt;Your efforts need to match the amount of passionate creative work that overlaps routine work in your industry – but don’t shy away from finding ways to move away from the industry average and get more creative work in there.&lt;/p&gt;  &lt;h4&gt;How Can We Do It?&lt;/h4&gt;  &lt;p&gt;The question is how do we help people tap their passionate creativity in the workplace so they want to stay?&lt;/p&gt;  &lt;p&gt;We need to go back to the basics of good management again to find out what really motivates employees. &lt;a href="http://www.danpink.com"&gt;Daniel Pink&lt;/a&gt; talked about this at &lt;a href="http://www.ted.com"&gt;TED&lt;/a&gt; in August last year.&lt;/p&gt; &lt;object width="522" height="324"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/rrkrvAUbU9Y&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/rrkrvAUbU9Y&amp;amp;hl=en_GB&amp;amp;fs=1&amp;amp;rel=0&amp;amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="522" height="324"&gt;&lt;/embed&gt;&lt;/object&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“There is a mismatch between what science knows and what business does. And here is what science knows. &lt;em&gt;One:&lt;/em&gt; Those 20th century rewards,those motivators we think are a natural part of business, do work, but only in a surprisingly narrow band of circumstances. &lt;em&gt;Two:&lt;/em&gt; Those if-then rewards often destroy creativity. &lt;em&gt;Three:&lt;/em&gt; The secret to high performance isn't rewards and punishments, but that unseen intrinsic drive. The drive to do things for their own sake. The drive to do things because they matter.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In summary Daniel points to three key ideas for managing people in the 21st century:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;       &lt;br /&gt;The urge to direct our work and have some say in what we do. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Mastery&lt;/strong&gt;       &lt;br /&gt;The desire to get better and better at something, to make progress and overcome challenges. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Purpose&lt;/strong&gt;       &lt;br /&gt;The yearning we have to work in the service of something greater than ourselves. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There was some interesting research reported in the &lt;a href="http://hbr.org/2010/01/the-hbr-list-breakthrough-ideas-for-2010/ar/1"&gt;Jan-Feb 2010 Harvard Business Review&lt;/a&gt; that supports the power of mastery in motivating employees:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“On days when workers have the sense they’re making headway in their jobs, or when they receive support that helps them overcome obstacles, &lt;em&gt;their emotions are most positive and their drive to succeed is at its peak&lt;/em&gt;. On days when they feel they are spinning their wheels or encountering roadblocks to meaningful accomplishment, &lt;em&gt;their moods and motivation are lowest&lt;/em&gt;.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Deloitte’s &lt;a href="http://www.johnseelybrown.com/shiftindex.pdf"&gt;2009 Shift Index&lt;/a&gt; had similar findings about autonomy and mastery:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“24 percent responded that flexibility, freedom, and autonomy were the reasons they “loved their job.” Similarly, 23 percent of the respondents cited challenges and opportunities for problem solving and creativity as the reasons they loved their job.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;These keys can all be found within the TPS, and are the foundation of any great 21st century business. If they can work for assembly line workers in one of the world’s largest car manufacturers, then surely they can work in our office environments?&lt;/p&gt;  &lt;p&gt;More to the point, if we don’t offer work environments that have these keys, then we can expect to see more of our best and brightest leaving to go freelance, or joining that new startup, or even finding a big company that gets this idea.&lt;/p&gt;  &lt;h4&gt;Getting a Leg Up from Enterprise 2.0&lt;/h4&gt;  &lt;p&gt;I’m a Technical Director, so of course at some point I want to see just how technology can help us, and in this area as so many others there are some interesting possibilities thanks to Enterprise 2.0.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="Original photo from istockphoto.com" alt="Original photo from istockphoto.com" src="http://lh5.ggpht.com/_1GrPn-zPqXU/S7qR8MVG7yI/AAAAAAAAA-Y/4lv9iszQZFA/ist2_7100676-universal-men-assistance-in-achieving-green-targets%5B6%5D.jpg?imgmax=800" width="380" height="258" /&gt;&lt;/p&gt;  &lt;h5&gt;Learning&lt;/h5&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Modern creative work places a huge demand on people to be constantly learning, diversifying their experience and increasing their speed of uptake of new ideas and skills. More then ever before success demands that people self-educate themselves, and with information overload and the skyrocketing complexity of our global business environment (where your competitors may just as easily be half a world away as down the road) that is harder than ever.&lt;/p&gt;  &lt;p&gt;Enterprise 2.0 offers lots of help in the area of learning and knowledge transfer.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Wikis        &lt;br /&gt;&lt;/strong&gt;These are great for helping people record their knowledge, and then allowing that knowledge to be reviewed, improved, updated and generally kept alive. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Blogs        &lt;br /&gt;&lt;/strong&gt;Fantastic for putting ideas out there and getting feedback on them. They can provide employees with acceptable avenues for bridging great gaps in relative seniority (e.g. letting a new hire question the corporate vision statement) as they can allow people other than the original author to respond and correct mistaken ideas. The ability to browse posts by chronology and/or tags means that content is more usefully categorised than it would be in an email inbox. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Social Bookmarking        &lt;br /&gt;&lt;/strong&gt;Whilst bookmarks can be overrated, if properly categorised and rated, they allow people to make new information available to their colleagues and can act as scent as to who is most interested or interesting. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Enterprise search&lt;/strong&gt;       &lt;br /&gt;Having an effective and useful enterprise search tool is a must-have Enterprise 2.0 tool. Most Enterprise 2.0 content is unstructured and a good search tool is essential to ensuring that people find the right content when they need it. &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Networking&lt;/h5&gt;  &lt;p&gt;There is a need for us to connect with ever greater numbers of people, and being increasingly time-poor to find the &lt;em&gt;right&lt;/em&gt; people to connect with. Research has shown that &lt;a href="https://webapp.comm.virginia.edu/NetworkRoundtable/Portals/0/High_Performer_Networks_and_Traps_Roundtable_Final.pdf"&gt;high performing individuals maintain better networks than others&lt;/a&gt;, and in particular that their networks are more diverse/disconnected. This allows them to “see the big picture better, generate innovative solutions by integrating the expertise of those with unique backgrounds, position their efforts well, bypass bureaucratic gridlock and obtain necessary resources and support.”&lt;/p&gt;  &lt;p&gt;Enterprise 2.0 makes it possible to find the right people in your network by reviewing their ideas and following the commentary and discussion about those ideas. It also helps people develop connections beyond their immediate team or management hierarchy.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Corporate directory        &lt;br /&gt;&lt;/strong&gt;Having an active and useful corporate directory, one that tracks projects worked on, positions held and teams an individual has belonged to can help identify key people. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Employee pages        &lt;br /&gt;&lt;/strong&gt;Giving employees their own page to talk about themselves can be risky, but for those passionate creatives it can offer a way to get their ideas out there, attracting others that have similar interests and passions. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Blogs        &lt;br /&gt;&lt;/strong&gt;The commentary and discussion facilitated by blogs, along with their attachment to individuals (and hopefully the corporate directory), makes them an ideal place to connect with others and find out who else you should connect to. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Yammer        &lt;br /&gt;&lt;/strong&gt;Internal tweeting tools like Yammer offer interesting possibilities as people can follow who they like within the organisation and find out who is following them. &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Managing Autonomy&lt;/h5&gt;  &lt;p&gt;One of the main reasons people fear worker autonomy is that they will lose oversight of what is going on. Obviously implementing transparency properly means this is not an issue, but there are problems with managing transparency when collaboration is limited to email inboxes and offline meetings.&lt;/p&gt;  &lt;p&gt;Enterprise 2.0 offers ways for collaborative work to be both done at a distance (of either time or place), and to be recorded in ways that allow for relatively easy monitoring by managers who want to help ensure that responsibility is taken seriously and known problems are not repeated.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Wikis        &lt;br /&gt;&lt;/strong&gt;Tracking progress on a wiki gives managers insight into what is happening and an avenue for querying ideas and outcomes. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Online document collaboration        &lt;br /&gt;&lt;/strong&gt;Collaborating on a document online makes the draft version available to people beyond the immediate team, often in a read-only version. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Basecamp        &lt;br /&gt;&lt;/strong&gt;online project management tools like Basecamp are highly regarded for their ease of use, simplicity and ability to facilitate complex project discussions and task workflow. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Google Wave        &lt;br /&gt;&lt;/strong&gt;Still in Beta, and with real performance and usability problems still, Google Wave offers interesting possibilities with low-overhead asynchronous conversations organically evolving into rich document collaboration opportunities and even real-time conversation. &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Making Progress&lt;/h5&gt;  &lt;p&gt;We have seen that a key motivator is the sense of making progress, achieving real results and conquering challenges. One way our current systems can rob us of this is by interrupting our state of flow and causing us to drop out to check something that turns out to be unnecessary – it is estimated that a 1 minute interruption kills 15 minutes of productive time. Two deadly forms of this are unimportant emails and face to face social desk visits.&lt;/p&gt;  &lt;p&gt;Enterprise 2.0 tools can help reduce the amount of email flow by moving items to more useful forms of communication that rely on a pull method of distribution (where users choose to use it), rather than the invasive push method employed by email.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;RSS feeds        &lt;br /&gt;&lt;/strong&gt;By eliminating the push nature of methods like email, RSS feeds give a generic method for tools like blogs and wikis to make their data available for the user when they want it. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Yammer        &lt;br /&gt;&lt;/strong&gt;By bringing micro-blogging to the enterprise tools like Yammer remove the instant interruption hassle of instant messaging (IM) and provide an outlet for broadcasts of ideas that may be useful, but don’t need to be considered immediately. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enterprise 2.0 tools can help move social interaction away from invasive face to face time in the office to more asynchronous means, or at least ones that include less wasteful interruption time.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Yammer        &lt;br /&gt;&lt;/strong&gt;Social engagement via micro-blogs like Yammer is ideal because it is asynchronous, based on the push/broadcast mode of communication and carries an implicit understanding that it is not important content. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Intranets/Wikis        &lt;br /&gt;&lt;/strong&gt;Placing social event information online, and providing interactive photo galleries can help reduce the amount of social interaction that must occur face to face. &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;In Summary&lt;/h4&gt;  &lt;p&gt;Deciding to manage work empirically, through transparency, inspection and adaptation can help give your employees the sense of autonomy, mastery and purpose that is necessary to untap their passionate creativity.&lt;/p&gt;  &lt;p&gt;There are key ideas I have not covered here, such as the willingness to accept failure as learning experiences, the need to align authority with responsibility, and responsibility with ability that must be addressed for this to work well.&lt;/p&gt;  &lt;p&gt;However untapping passion is not only possible, but well within our reach. It fundamentally depends on the willingness of senior management to set the direction, free their people and unleash their own passion.&lt;/p&gt;  &lt;p&gt;Finally, Enterprise 2.0 offers some interesting tools to help manage and enable this change in our organisations. But as ever, technology plays an enabling and supporting role rather than being the driver of true change.&lt;/p&gt;  &lt;h4&gt;Thanks&lt;/h4&gt;  &lt;p&gt;There is a lot packed into this particular post, but a few people were key in helping me understand these issues.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Jason Yip&lt;/em&gt;, from ThoughtWorks Australia, whose passion for Lean got me interested in looking at Agile software development and whose ideas and &lt;a href="http://jchyip.blogspot.com/"&gt;blog&lt;/a&gt; have helped me work out my own thinking.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Lachlan Heasman&lt;/em&gt;, also from ThoughtWorks Australia, who runs the &lt;a href="http://www.meetup.com/The-Sydney-Scrum-Meetup-Group/"&gt;Sydney Scrum Meetup&lt;/a&gt;, and is a good friend and great Scrum trainer.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Craig Bailey&lt;/em&gt;, who in a year as my boss ignited hope in me for great managers once again, and who has gone on to embody following your passionate creativity &lt;a href="http://www.craigbailey.net/"&gt;wherever it may lead&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Chris Scoggins&lt;/em&gt;, my first &lt;a href="http://uk.linkedin.com/pub/chris-scoggins/1/79a/b67"&gt;great manager&lt;/a&gt; and a great example to me of how to mentor and build leadership into your staff.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Daniel Pink&lt;/em&gt; for bringing the &lt;a href="http://www.danpink.com"&gt;hidden truths about motivation&lt;/a&gt; into plain view, and pointing out the Emperor’s New Clothes of management.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;My Dad&lt;/em&gt;, for always making me question what is true, and helping me understand my own passionate creativity.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-1801027212352021667?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QWwfqdesAlc:2wenaKBu0Bw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QWwfqdesAlc:2wenaKBu0Bw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QWwfqdesAlc:2wenaKBu0Bw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QWwfqdesAlc:2wenaKBu0Bw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=QWwfqdesAlc:2wenaKBu0Bw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QWwfqdesAlc:2wenaKBu0Bw:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=QWwfqdesAlc:2wenaKBu0Bw:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/QWwfqdesAlc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/1801027212352021667/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2010/04/untapping-your-peoples-passion.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/1801027212352021667?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/1801027212352021667?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/QWwfqdesAlc/untapping-your-peoples-passion.html" title="Untapping your people’s passion" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_1GrPn-zPqXU/S7qR7RbcEMI/AAAAAAAAA-U/gLjwtORa5Mg/s72-c/iStock_000000486247Large_thumb%5B7%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.falkayn.com/2010/04/untapping-your-peoples-passion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAMR34yfip7ImA9WxBbEEg.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-787510800779115321</id><published>2010-03-09T00:09:00.001+11:00</published><updated>2010-03-09T00:09:46.096+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-09T00:09:46.096+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="entrepreneurship" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="innovation" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="Social" /><category scheme="http://www.blogger.com/atom/ns#" term="Web 2.0" /><title>Goals, Behaviours, ROI and Testing Ideas</title><content type="html">&lt;p&gt;You're developing a great web application, training course or social software strategy. You cost it and it looks like a substantial piece of work, so you need to get executive approval. Putting together a list of the benefits you find to your dismay that the list is full of terms like &amp;quot;easier&amp;quot;, &amp;quot;more efficient&amp;quot;, &amp;quot;more usable&amp;quot; and &amp;quot;collaborative&amp;quot;. You know your executive will ask questions this list doesn't answer, &amp;quot;How will you know you're successful?&amp;quot; and &amp;quot;What's it worth to us?&amp;quot;.&lt;/p&gt;  &lt;p&gt;There are two common (and wrong) approaches to this question:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;It's Web 2.0/training/social, it's intangible and can't be measured. &lt;/li&gt;    &lt;li&gt;It should add to the bottom line, so just measure revenue changes. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The first one incorrectly assumes that intangibles can't be assessed, but market analysts know that they certainly &lt;em&gt;can&lt;/em&gt;, and indeed regularly &lt;em&gt;are&lt;/em&gt;, just ask what Google's stock valuation is based on.&lt;/p&gt;  &lt;p&gt;The second one jumps to the über-goal and ignores the fact that as everything the organisation does can potentially affect revenue, it will be nigh impossible to really know whether any change in the bottom-line is the result of this particular web application, training or social software strategy (you can easily have a great success in one area cancelled out by a horrible mess in another).&lt;/p&gt;  &lt;p&gt;Fortunately this problem is well known. Unfortunately the answer is hard. That is, hard as in deciding what you want for your birthday, not hard as in needing a PhD in Applied Rocket Science.&lt;/p&gt;  &lt;h4&gt;Find your desired user behaviours&lt;/h4&gt;  &lt;p&gt;The bottom line is that you need to find what change in user/trainee behaviours will support your business goals and then use that to derive metrics that can be measured (and eventually valued).&lt;/p&gt;  &lt;p&gt;David Maister talked about the importance of identifying desired behaviours in his article &lt;a title="Why (Most) Training is Useless article" href="http://davidmaister.com/articles/1/96/"&gt;Why (Most) Training Is Useless&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;There is no point putting on skills training if there is no incentive for the behavior; the people don’t believe in it and they don’t yet know exactly what it is they are supposed to be good at! ...&lt;/p&gt;    &lt;p&gt;What behaviors by top management need to change to convince people that the new behaviors are really required, not just encouraged? If the behavior is going to be optional, then so should the training be.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In other words, if we don't know what behaviours we want training to encourage, or if we don't actually support the display of those behaviours (e.g. through measurement and feedback) then we can't expect our training to actually help our business goals.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1GrPn-zPqXU/S5T3BEHgwnI/AAAAAAAAA9U/V0Y_ta6oTOs/s1600-h/909064_599068454.jpg"&gt;&lt;img alt="909064_59906845" src="http://lh5.ggpht.com/_1GrPn-zPqXU/S5T3B_HJ6PI/AAAAAAAAA9Y/nmLYaM4PRjE/909064_59906845_thumb2.jpg?imgmax=800" width="500" height="394" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In exactly the same way software applications (not just web or social ones!) are often built without thinking what change in user behaviours is really desired or how the change in user behaviours will be measured - thus guaranteeing that even if success is achieved there is no way of valuing it.&lt;/p&gt;  &lt;h4&gt;ROI for difficult stuff&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.adaptivepath.com"&gt;Adaptive Path&lt;/a&gt; introduced a way of valuing user experience by reflecting on the change in behaviours we desire to solve our business problem. They gave us the graphic below as a way of envisaging how business problems map to user behaviours and how they in turn can be mapped to valuable financial metrics.&lt;/p&gt;  &lt;p align="right"&gt;&lt;a href="http://lh6.ggpht.com/_1GrPn-zPqXU/S5T3CoQ7BII/AAAAAAAAA9c/HE1scSB8Npw/s1600-h/AdaptivePathValueChain12.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="AdaptivePath-ValueChain" src="http://lh5.ggpht.com/_1GrPn-zPqXU/S5T3DZaPWtI/AAAAAAAAA9g/0-5-GqJ-ryQ/AdaptivePathValueChain_thumb10.png?imgmax=800" width="520" height="107" /&gt;&lt;/a&gt;&amp;#160;&lt;em&gt;Source: &lt;a title="Source: Adaptive Path" href="http://www.adaptivepath.com"&gt;Adaptive Path&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p style="margin-top: -10px" align="right"&gt;&lt;em&gt;via &lt;a title="Marina Chiovetti&amp;#39;s ThoughtWorks&amp;#39; profile" href="http://www.thoughtworks.com/who-we-are/our-people/profiles/Chiovetti,+Marina.html"&gt;Marina Chiovetti&lt;/a&gt; at ThoughtWorks&lt;/em&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Business Problem = a specific problem you want to affect &lt;/li&gt;    &lt;li&gt;User Behaviour = a change in user behaviour that would introduce the effect desired &lt;/li&gt;    &lt;li&gt;Behaviour Metric = a way you can measure the change in user behaviour &lt;/li&gt;    &lt;li&gt;Value Metric = the dollar value we can apply to the behaviour metric &lt;/li&gt;    &lt;li&gt;Financial Metric = the expected amount of user behaviour change to come from the project, multiplied by the value metric and compared to the expected cost of the project &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A specific example might help make this clearer. Imagine you want to increase leads and you decide to do this by improving your website's ability to elicit customer responses via the contact us form:&lt;/p&gt;  &lt;p align="right"&gt;&lt;a href="http://lh6.ggpht.com/_1GrPn-zPqXU/S5T3ENGB0iI/AAAAAAAAA9k/89tRL_jmFhs/s1600-h/AdaptivePathValueChain27.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="AdaptivePath-ValueChain2" src="http://lh4.ggpht.com/_1GrPn-zPqXU/S5T3EohhrSI/AAAAAAAAA9o/XP9GRq9MGag/AdaptivePathValueChain2_thumb5.png?imgmax=800" width="520" height="173" /&gt;&lt;/a&gt;&amp;#160;&lt;em&gt;Source: &lt;a title="Source: Adaptive Path" href="http://www.adaptivepath.com"&gt;Adaptive Path&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;If we add some case studies to the website, and then place the contact us form at the bottom of each one as a call to action then we might expect some increase (assuming this was a new initiative for our website).&lt;/p&gt;  &lt;p&gt;The behaviour metric for this is the number of leads received from the website contact form per month. Our sales team has estimated that 1 in 10 leads becomes a sale, worth on average $1,000 to us (whether revenue or profit depends on what you are most interested in - the smart money is on profit though).&lt;/p&gt;  &lt;p&gt;Based on our website's traffic patterns we expect to increase our leads from 7 per month to 20 per month by implementing this measure. If we are happy to get a breakeven return on investment (ROI) over the next 3 months then we could invest $1,000 * (20 - 7) * 3 = $39,000 in the project.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Before someone tries to tell me I don't know how to value project returns, I know that you could use Net Present Value (NPV), Internal Rate of Return (IRR) or other methods to ensure this is comparing apples with apples across projects, time and investment opportunities - but that's not the point of this post.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now we might well spend a fraction of that on case studies and a contact form, but if we wanted we could now justify getting a professional copywriter to help shape up our case studies and spend a bit on usability testing to ensure our contact forms get out of the way and give us the leads as easily as possible.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1GrPn-zPqXU/S5T3FY2qrxI/AAAAAAAAA9s/FDfuH5_nI2g/s1600-h/808213_495638064.jpg"&gt;&lt;img alt="808213_49563806" src="http://lh6.ggpht.com/_1GrPn-zPqXU/S5T3GEQp14I/AAAAAAAAA9w/3MjpdPMrO1w/808213_49563806_thumb2.jpg?imgmax=800" width="500" height="333" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Okay, okay, this is a fairly simple example, with straightforward metrics. After all, we might well not know how much a lead is worth, and often we're asked to solve business problems far more complex than this one.&lt;/p&gt;  &lt;h4&gt;What if I’ve got no history (i.e. I’m a startup)?&lt;/h4&gt;  &lt;p&gt;We have used this process with startups to help them prioritise wildly diverse feature lists when they do not have the budget to afford to build it all in their launch timeframe.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(&lt;strong&gt;Aside:&lt;/strong&gt; There is a lesson here about launching a simple, compelling product and then iteratively adding value to it based on user feedback, the problem is that in many startup ideas there is usually no simple, compelling offering. It's the fault of funding requirements, but more about that in another post.)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Startups do not have financial history to fall back on, and even with good financial modelling they might only have a guess to give you for their value metric. In this case we take the prioritisation this gives us and keep the rest of the information for analysis of the success of the startup down the track and (as importantly) for helping us identify which changes we should look at implementing later.&lt;/p&gt;  &lt;h4&gt;What if you don’t know what to change?&lt;/h4&gt;  &lt;p&gt;The methodology is still useful even when you have a complex situation with incomplete information. If nothing else it focuses your attention where it belongs, on the problem you are solving and the user/trainee behaviours that you think will help solve it rather than on the application technology or the subject matter of your training courses.&lt;/p&gt;  &lt;p&gt;Of course you often don’t know what to do to create a particular desired behaviour. In this case a bit of prototyping and A/B testing can go a long way. &lt;a href="http://www.google.com/websiteoptimizer"&gt;Google Website Optimizer&lt;/a&gt; does a great job of helping you do this with content or separate functional pages, but it does require two separate pages exist, and sometimes you just want to tweak the way a particular feature works (e.g. adding a couple of extra fields to a form).&lt;/p&gt;  &lt;p&gt;Assaf Arkin has created a plugin for Rails called &lt;a href="http://vanity.labnotes.org/"&gt;Vanity&lt;/a&gt; that supports A/B testing in a rather unique way, by creating an easy way for developers to embed the tests into their code and then run them for a set number of iterations and/or exceed a set probability for one option over the other.&lt;/p&gt;  &lt;p&gt;By using a simple API, and elegant admin functionality, Vanity provides a very viable way of testing one idea against another. While the time to make such a change is greater than not doing the A/B test – the marginal extra cost is small enough that you do it in order to find out which option really works better.&lt;/p&gt;  &lt;p&gt;Assaf has a great post explaining how this is really &lt;a href="http://labnotes.org/2009/11/19/vanity-experiment-driven-development-for-rails/"&gt;Experimental Driven Development&lt;/a&gt; in action. He explains the cost/benefit tradeoff this way in the comments section:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“You start with an idea for a change that will improve your software. Your baseline cost of development is having both alternatives — before and after the change. Without EDD these alternatives will be separate in time, with EDD you’re going to have some overlap (the duration of the experiment).&lt;/p&gt;    &lt;p&gt;For the experiment, you only need a skeletal implementation, you’re not committed to fully developing the feature until after it proves itself. For small changes it makes little difference, the cost is the same.&lt;/p&gt;    &lt;p&gt;For complex changes, you can save a lot by not fully developing features that don’t matter. You’re going to know whether a feature matters or not quickly enough, and with data to back up, that you can make the decision to *not* develop it further.&lt;/p&gt;    &lt;p&gt;You can also kill unused features early. So these are two ways to reduce development costs using EDD.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;Summary&lt;/h4&gt;  &lt;p&gt;Get behind whatever you are doing and try to understand the underlying business goals, the user behaviours that would support those and derive the ROI from that. If you are not sure what would best support the change in user behaviours, then try A/B testing to establish which way you should jump. Whatever you do, don’t allow yourself to be sucked into doing something just because your competitors did, or to be “simpler”, or more “usable” in some undefined, unaccountable, way.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-787510800779115321?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=soyyHzzdA_8:AV_wXLGS4zg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=soyyHzzdA_8:AV_wXLGS4zg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=soyyHzzdA_8:AV_wXLGS4zg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=soyyHzzdA_8:AV_wXLGS4zg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=soyyHzzdA_8:AV_wXLGS4zg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=soyyHzzdA_8:AV_wXLGS4zg:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=soyyHzzdA_8:AV_wXLGS4zg:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/soyyHzzdA_8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/787510800779115321/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2010/03/goals-behaviours-roi-and-testing-ideas.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/787510800779115321?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/787510800779115321?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/soyyHzzdA_8/goals-behaviours-roi-and-testing-ideas.html" title="Goals, Behaviours, ROI and Testing Ideas" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_1GrPn-zPqXU/S5T3B_HJ6PI/AAAAAAAAA9Y/nmLYaM4PRjE/s72-c/909064_59906845_thumb2.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.falkayn.com/2010/03/goals-behaviours-roi-and-testing-ideas.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIGQnk8eCp7ImA9WxBUFks.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-4256488884539962276</id><published>2010-03-04T11:45:00.001+11:00</published><updated>2010-03-04T11:45:23.770+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-04T11:45:23.770+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="community" /><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile Development" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><category scheme="http://www.blogger.com/atom/ns#" term="Australia" /><title>Sydney Scrum Meetup (March)</title><content type="html">&lt;p&gt;&lt;a href="http://jeffsutherland.com/"&gt;Jeff Sutherland&lt;/a&gt; and &lt;a href="http://www.scrumalliance.org/profiles/60-jens-stergaard"&gt;Jens Østergaard&lt;/a&gt; visited the &lt;a href="http://www.meetup.com/The-Sydney-Scrum-Meetup-Group/"&gt;Sydney Scrum Meetup&lt;/a&gt; last Thursday. We had some great pizza and then they got everyone doing the Nokia test!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;My Test Results&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Iteration length, 2 weeks – 10&lt;/p&gt;  &lt;p&gt;Testing, customer acceptance testing – 8&lt;/p&gt;  &lt;p&gt;Agile specifications, poor user stories – 4 (good enabling specifications might be 3-5 pages long – before sprint planning)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(for venture companies Jeff finds that 2 sprints planned is necessary)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Product owner, product owner with backlog – 5 (or 2 with last project!)&lt;/p&gt;  &lt;p&gt;Product backlog, single product backlog - 3&lt;/p&gt;  &lt;p&gt;Estimates, backlog estimated by BA – 0&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(Jeff said that usually as teams get better their stories get smaller and eventually are about the size of tasks, and then estimating changes to use points vs hours – surprising what can be untangled and done separately)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Sprint burndown chart, no chart, but team knows velocity – 0 + 3 + 2&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(Jeff mentioned that partial completion of tasks creates a high-risk environment)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Team disruption, project leaders telling people what to do – 3&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;(self-organise to maximise velocity)&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Team, no emergent leadership - 1&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Total = 4.33&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Most of the room were between 2 and 5, and apparently, most of OpenView’s venture companies start out around 4, but when they work on it they end up around 6. It looks like &lt;a href="http://www.tidc.nsw.gov.au/"&gt;TIDC&lt;/a&gt; might have a great Scrum team as someone from there scored 8 for their team! (they were the only one higher than 5)&lt;/p&gt;  &lt;p&gt;If your reference stories change then so do the story points. But Jeff said it is really the delta in velocity that is interesting. One of the symptoms of hyper-productive teams is that you get asked to slow down!&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Sustainable pace &lt;/li&gt;    &lt;li&gt;Quality &lt;/li&gt;    &lt;li&gt;Velocity &lt;/li&gt;    &lt;li&gt;“Balanced Scorecard” (not right term, but Jeff couldn’t remember what it was) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Jens recommends the &lt;a href="http://www.xp.be/xpgame.html"&gt;XP game&lt;/a&gt; for teams to learn about velocity.&lt;/p&gt;  &lt;p&gt;How long does it take to fix a bug from CI/automated testing. If longer than 2 hours then create an impediment list and get the Scrum master to remove them. Simple metric, track the day you start a story and the day you finish a story and then compare to your standard process efficiency (usually around 20% – measures the quality of your backlog) {calc elapsed days versus theoretical ideal days based on velocity}. Raising the efficiency meant getting the backlog well enough detailed that you spend less time waiting to do a particular item. Measuring the time to &lt;strong&gt;Done&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Speed of testing is usually the bottleneck, and is more important than the speed of coding. So interrupt devs immediately with a bug, rather than leaving them to finish what they’re doing. The availability of testable code is another way of thinking of it.&lt;/p&gt;  &lt;p&gt;Just evaluate the code in production is one way of incentivising people.&lt;/p&gt;  &lt;p&gt;I asked about how to handle client projects using Scrum, Jeff mentioned that &lt;a href="http://www.systematic.com"&gt;Systematic&lt;/a&gt; is doing big fixed price contracts using Scrum. They provide 2 bids on every project, with the Scrum bid at around half the price.&lt;/p&gt;  &lt;p&gt;In response to someone’s question about Scrum, Jeff mentioned he’d written about the answer in an article titled &lt;a href="http://jeffsutherland.com/SutherlandFutureOfScrumAgile2005.pdf"&gt;Future of Scrum&lt;/a&gt; from the Agile 2005 conference.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Metrics to Live By&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Jeff got me hooked on metrics as it is obvious when talking to him that empirical process control &lt;em&gt;requires&lt;/em&gt; metrics to be successful. Some of these metrics assume that you use story points for estimating, which we have done with some success on one project. To do this well you need a range of reference stories of various sizes and rough sizing (e.g. Fibonacci numbers) that the team can agree on the size of.&lt;/p&gt;  &lt;p&gt;Here are some of the metrics Jeff mentioned:&lt;/p&gt;  &lt;p&gt;Backlog Velocity = story points/sprint&lt;/p&gt;  &lt;p&gt;Sprint Velocity = story points ‘done’/day&lt;/p&gt;  &lt;p&gt;Efficiency = story’s ideal days/actual elapsed days from ‘start’ to ‘done’   &lt;br /&gt;(if an item should have taken 2 ideal days, but it actually took 10 days from the ‘start’ to the ‘done’ date, then you have 20% efficiency)&lt;/p&gt;  &lt;p&gt;Churn = % of ‘done’ items that testers send back to developers for fixing    &lt;br /&gt;(if all items churns once then you have 100% churn, if half of those churn again then you have 150% churn! Ignore size of item when calculating)&lt;/p&gt;  &lt;p&gt;Jeff has an upcoming conference session on this very topic and he discusses it further in his &lt;a href="http://jeffsutherland.com/2010/01/excel-spreadsheet-for-hyperproductive.html"&gt;Excel Spreadsheet for Hyperproductive Scrum Teams&lt;/a&gt; post. The spreadsheet seems a little hard to get into, but I’ve given it to our Solutions team to review.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-4256488884539962276?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=KDv3D1H10nY:RBhwVWjhweQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=KDv3D1H10nY:RBhwVWjhweQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=KDv3D1H10nY:RBhwVWjhweQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=KDv3D1H10nY:RBhwVWjhweQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=KDv3D1H10nY:RBhwVWjhweQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=KDv3D1H10nY:RBhwVWjhweQ:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=KDv3D1H10nY:RBhwVWjhweQ:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/KDv3D1H10nY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/4256488884539962276/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2010/03/sydney-scrum-meetup-march.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/4256488884539962276?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/4256488884539962276?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/KDv3D1H10nY/sydney-scrum-meetup-march.html" title="Sydney Scrum Meetup (March)" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2010/03/sydney-scrum-meetup-march.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04NQng7fCp7ImA9WxBXF0w.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-7792604616763050999</id><published>2010-01-29T10:06:00.001+11:00</published><updated>2010-01-29T10:06:33.604+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-29T10:06:33.604+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="smart thinking" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile Development" /><category scheme="http://www.blogger.com/atom/ns#" term="how to" /><title>Do I Need User Stories?</title><content type="html">&lt;p&gt;How do you create a worthwhile specification of the requirements for a system?&lt;/p&gt;  &lt;p&gt;As an Agile Scrum practitioner I’m supposed to answer this by pointing to user stories, but as others have found before me, these are a slippery beastie to define. Cat Schwamm &lt;a href="http://catschwamm.com/2009/08/09/constructing-effective-user-stories-or-my-user-stories-bring-all-the-boys-to-the-yard/"&gt;takes a stab at a definition&lt;/a&gt;, but finds Scott Bellware telling her she is following Scrum too blindly and should go change what she’s doing.&lt;/p&gt;  &lt;p&gt;Scott’s point of view is interesting, but like a lot of his comments he is coming at the problem from the frame of his lean methodology, which is not fully explained and therefore extremely hard to argue with/understand. This is not Scott’s fault, he is after all busy consulting not writing Agile methodologies, but it does make his commentary a tad alarming when one first reads it.&lt;/p&gt;  &lt;p&gt;The classic format of a user story is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;As a [user] I need/want [feature] so that [benefit].&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Or as Cat puts it:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;As a [role] I need [feature] so that [business value].&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Cat points out that this is fairly barebones, and leaves lots of scope for you to choose the wrong level of granularity for your user story. She points out that her team also follows the INVEST acronym and use the concept of minimum marketable feature (MMF) as defined by &lt;a href="http://jamesshore.com/Blog"&gt;James Shore&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;INVEST = Independent, Negotiable, Valuable, Estimable, Small, Testable&lt;/p&gt;    &lt;p&gt;MMF = “Smallest possible set of functionality that, by itself, has value in the marketplace”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is obviously working for her team, but I suspect they benefit from having a single Business Analyst who works everything through for them and ensures some consistency across user stories. This is actually very Agile, as the &lt;a href="http://agilemanifesto.org/"&gt;manifesto points out&lt;/a&gt; we value “individuals and interactions over processes and tools”. However, we still need some processes/tools for those individuals.&lt;/p&gt;  &lt;p&gt;Scott Bellware’s suggestion was to change the format to:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;As a [role] I want to [goal] so that [motivation].&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;He wants us to avoid mentioning the software altogether and have the user story simply capture what the users actually do (or will do once they have a system to help them). He then divorces the user story from work items altogether, and simply relegates them to the role of being information about the goals of the system. This may work for him, but it then begs the question of how he defines what the work item is all about, which is where we started talking about the need for user stories …&lt;/p&gt;  &lt;p&gt;I have been reading a great book called &lt;a href="http://www.designingforinteraction.com/"&gt;Designing for Interaction&lt;/a&gt; by Dan Saffer that gave me another viewpoint on this issue. One of the things I learnt from this book was that user-centred design (UCD) is not the best way to design interactions, it is simply one of the possible ways you could design them and its relevance depends upon the goals of the thing you are designing.&lt;/p&gt;  &lt;p&gt;Dan Saffer lists 4 different approaches to interaction design:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/User-centered_design"&gt;User-Centred Design&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Activity-Centred Design (aka &lt;a href="http://en.wikipedia.org/wiki/Use-centered_design"&gt;Use-Centred Design&lt;/a&gt; ???) &lt;/li&gt;    &lt;li&gt;Systems Design (aka Service Design???) &lt;/li&gt;    &lt;li&gt;Genius Design (aka Rapid Expert Design???) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Cat’s user stories actually sounded like activity-centred design, and Scott sounds like he is more interested in user-centred design. Quite possibly they are both right in the contexts they are working in. Neither one may be better than the other (Scott at this point would probably call BS on me, he has previously talked about the need for &lt;a href="http://blog.scottbellware.com/2009/05/flow-leveling-and-problem-with-user.html"&gt;user stories to communicate expectation&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Coming back to my &lt;em&gt;own&lt;/em&gt; issues with user stories, I need to ask what sort of design approach am I taking, otherwise I will find my user stories being all over the place. Is the user story meant to encapsulate the MMF in a single story, or is it supposed to be used to specify all ways of looking at the functionality.&lt;/p&gt;  &lt;p&gt;As an example, when looking at the search function for administrators of an organisation I have specified:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;As an admin I want to be able to search for a member by their Member Id so that I can find a specific member quickly. &lt;/li&gt;    &lt;li&gt;As an admin I want to be able to search for one or more members by their Member Type so that I can target an action against all members of a specific type. &lt;/li&gt;    &lt;li&gt;As an admin I want to be able to search for one or more members by a wildcard search of first and last names so that I can find a member just by knowing their name. &lt;/li&gt;    &lt;li&gt;As an admin I want to be able to search for one or more members by region or industry so that I can find members from specific industries or regions. &lt;/li&gt;    &lt;li&gt;As an admin I want to be able to search for one or more members by a wildcard search of job title so that I can find members with specific job titles. &lt;/li&gt;    &lt;li&gt;As an admin I want to be able to search for one or more members by member status for my organisation so that I can target an action against all members of a specific member status. &lt;/li&gt;    &lt;li&gt;As an admin I want to be able to search for one or more members by activation status so that I can target an action against all members of a specific activation status. &lt;/li&gt;    &lt;li&gt;As an admin I want to be able to conduct a search against multiple facets of a member at once (e.g. by member status, industry, member type and job title) so that I can get very specific search results. &lt;/li&gt;    &lt;li&gt;As the system I want to give admins a common page which allows them to search for members for all sorts of reasons and then target actions against the members found. &lt;/li&gt;    &lt;li&gt;As the system I want to ensure that admins can only ever see their organisation’s own members in search results. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can see the format slipping towards the end of that list, with the “so that [benefit]” element disappearing. There is also no regard to the INVEST principles, particularly the independent one. If I adopted another (MMF?) approach I might reduce all of that to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;As an admin I need to be able to find the members I’m interested in from my organisation so that I can work with those members’ details. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Scott’s format might leave me with:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;As an admin I want to work with my members so that I can help them use our organisation’s online tools. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I think this demonstrates that there is a lot of variance possible within this simple definition of user story. In the past I think I have &lt;em&gt;over-specified&lt;/em&gt; functionality with user stories, leaving my developers with a weird tension between overly specific (and hence out of date) user stories and little or no supporting documentation around other design issues.&lt;/p&gt;  &lt;p&gt;This actually speaks to the N in INVEST, as Cat explains it:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“Negotiable: User stories are not a contract; they are reminders for the team to discuss and collaborate to clarify the details near time of development&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;What a user story really is is a placeholder for a conversation.&amp;#160; We’ve gotten away from writing strict, rigid use cases and into these user stories, which are much better for the way the business world really works.&amp;#160; By writing a user story this way, I am opening up a higher bandwidth conversation.&amp;#160; Instead of a developer just reading what I have and doing it word for word, now we can talk about things and make sure everyone is on the same page and fully understands the business value and the needs of the user.&amp;#160; I like that Kelly specified “near time of development” though; that’s one thing you’ll always find: CHANGE IS A CONSTANT.&amp;#160; Friggin annoying, but it is inevitable.&amp;#160; The closer to development time you talk about something the more likely it is that you’ll have the best information and the most clarity on the item.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I especially like the idea of a user story as a placeholder for a conversation. Of course this depends on your developers actually being willing to talk to anyone about the requirements (sometimes they still seem to think that it is faster to code away on assumptions and correct later than to have a 30 min conversation up front and ensure you know what you are doing!).&lt;/p&gt;  &lt;p&gt;Scott Reynolds works with Cat, and he points out that &lt;a href="http://scottcreynolds.com/archive/2009/11/13/616.aspx"&gt;not everything can be captured in user stories&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Here’s the thing, stories and tasks are only part of the equation. Stories alone aren’t enough to define a system, and trying to define everything in text is a fool’s task. (I’ve been that fool). You need a full arsenal of specification tools to do the best job possible.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I think I’ve been the fool Scott mentioned myself (once or twice). Scott (&lt;a href="http://catschwamm.com/2009/11/13/using-the-right-medium/"&gt;and Cat&lt;/a&gt;) mentions 3 other tools that they use as well as user stories:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Mockups&lt;/strong&gt;       &lt;br /&gt;Basically a low-fidelity prototype. They are great for eliciting feedback about visual design and interaction issues without leaving anyone feeling like these ideas are final. They are poor for actually designing off of as they frequently ignore or skimp on the design of areas that were not pertinent to the original design issues being explored in them. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;High Fidelity Design&lt;/strong&gt;       &lt;br /&gt;High-fidelity screenshots showing exactly how the screen should look. These are great when you need signoff on something from outside the development team as they show &lt;em&gt;everything&lt;/em&gt; that needs to be taken into account. They are poor when the design needs to change and you don’t have time to re-do those rich initial screenshots for the change request. Actually they are poor for Agile, full-stop, as they reek of BUFD. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Conversation and Whiteboarding&lt;/strong&gt;       &lt;br /&gt;This is the higher bandwidth conversation that Cat referred to. This is a chance to meet, collaboratively engage each other and work out what the business need for this feature is. The caveat is that it is only as good as the conversation and whiteboarding ability of your developers, and it requires that the customer be available immediately when the developers need them (this is &lt;a href="http://falkayn.blogspot.com/2009/11/when-agile-doesnt-work.html"&gt;why Agile doesn’t work&lt;/a&gt; for many projects). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;There are other good ideas for artifacts to capture interaction design ideas, such as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Acceptance Tests&lt;/strong&gt;       &lt;br /&gt;Here I mean a light version of the full test scripts that are possible. Ones that match user stories come in the form:       &lt;br /&gt;&lt;em&gt;Given that [context], when [event/action], then [expected outcome].&lt;/em&gt;       &lt;br /&gt;Like user stories they have the same problems with being at the right scale. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Key Scenarios&lt;/strong&gt;       &lt;br /&gt;Penny Hagen &lt;a href="http://johnnyholland.org/2009/11/10/a-ux-strategy-through-stories-scenarios-and-sketches/"&gt;describes these&lt;/a&gt; as combinations of user stories that help define the strategic direction of the website. Whilst she uses them as a tool to help define design strategy early on, they have a useful purpose in helping developers understand the context of the user stories they are working on. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;User Pathways&lt;/strong&gt;       &lt;br /&gt;Again Penny Hagen &lt;a href="http://johnnyholland.org/2009/11/10/a-ux-strategy-through-stories-scenarios-and-sketches/"&gt;describes these&lt;/a&gt; as a detailed view of the pathway a user needs to follow for a key scenario. They don’t explicitly restrict themselves to pages, or data, but they do help identify the user’s view of what is happening when they interact with the system – and give insight into the user’s experience over time. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Personally I’ve used mockups, high fidelity design, conversation/whiteboarding and acceptance tests to varying levels of success. One of the problems you face in Agile development is that the more artifacts you ask for, the longer it takes to go from designing to building – and the greater the chance that your artifacts are out of date and, frankly, &lt;em&gt;wrong&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;I’m still not sure about how to set my user stories, I sure appreciate the discipline they grant even quick feature specifications, but I’m loathe now to simply bang them out when the reality is that I might need to use either less, or more, detail for a given feature. I’m going to keep experimenting because that’s what Agile is all about. In the meantime let me know if you find something better to use!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-7792604616763050999?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=_jRdZqDAmCI:qI10vQX4ud0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=_jRdZqDAmCI:qI10vQX4ud0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=_jRdZqDAmCI:qI10vQX4ud0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=_jRdZqDAmCI:qI10vQX4ud0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=_jRdZqDAmCI:qI10vQX4ud0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=_jRdZqDAmCI:qI10vQX4ud0:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=_jRdZqDAmCI:qI10vQX4ud0:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/_jRdZqDAmCI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/7792604616763050999/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2010/01/do-i-need-user-stories.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/7792604616763050999?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/7792604616763050999?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/_jRdZqDAmCI/do-i-need-user-stories.html" title="Do I Need User Stories?" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.falkayn.com/2010/01/do-i-need-user-stories.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECR3g5cSp7ImA9WxNbFUQ.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-36307348214464689</id><published>2009-11-19T13:44:00.001+11:00</published><updated>2009-11-19T13:44:26.629+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-19T13:44:26.629+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Elcom" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile Development" /><category scheme="http://www.blogger.com/atom/ns#" term="innovation" /><category scheme="http://www.blogger.com/atom/ns#" term="management" /><title>When Agile Doesn’t Work</title><content type="html">&lt;p&gt;&lt;a href="http://www.elcom.com.au"&gt;&lt;/a&gt;&lt;a href="http://lh4.ggpht.com/_1GrPn-zPqXU/SwSw_eF6MrI/AAAAAAAAA8U/c814EJz48Iw/s1600-h/image10.png"&gt;&lt;img style="margin: 0px 0px 0px 5px; display: inline" title="image" alt="image" align="right" src="http://lh4.ggpht.com/_1GrPn-zPqXU/SwSxAJGXfvI/AAAAAAAAA8Y/LHQKPXGZk_8/image_thumb2.png?imgmax=800" width="240" height="240" /&gt;&lt;/a&gt;&lt;/a&gt;I am a huge fan of &lt;a href="http://agilemanifesto.org/"&gt;Agile software development&lt;/a&gt; and since &lt;a href="http://falkayn.blogspot.com/2008/11/my-new-role-at-elcom-technology.html"&gt;becoming&lt;/a&gt; &lt;a href="http://www.elcom.com.au"&gt;Elcom’s&lt;/a&gt; Technical Director I have made it my business to push us to become more Agile at every step. But a few months ago I realised I was pushing a square block into a round hole.&lt;/p&gt;  &lt;p&gt;It started with a realisation that most proponents of Agile software development had a common single clause that modified their promises of great results.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Customers must get involved for Agile to work.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;In Scrum it’s the &lt;a href="http://www.mountaingoatsoftware.com/product-owner"&gt;Product Owner&lt;/a&gt;, and it must be the single wringable neck – the person accountable to the business for the project’s delivery of real value. It is the person who not only understands, but can make decisions about functionality, business needs and the user interface.&lt;/p&gt;  &lt;p&gt;Oops.&lt;/p&gt;  &lt;p&gt;While this sounds great, and you would think that people paying you tens (if not hundreds) of thousands of dollars would want to get involved, we had found all too often that big promises of ongoing involvement disappeared as soon as the project kicked off. Clients wanted to tell us what they wanted, approve our quote, pay us the money, and then pretend we didn’t exist until we had finished their project. Or they had a committee of thousands that wanted to give us their pent up IT requirements, regardless of whether it was in scope or not, and often in conflict with each other.&lt;/p&gt;  &lt;p&gt;To be fair to our clients, we often are simply implementing our software and the amount of customer involvement is quite low – however that didn’t fit the Agile methodology we wanted to work within.&lt;/p&gt;  &lt;p&gt;Things became clearer for me when I attended a &lt;a href="http://www.thoughtworks.com.au/what-we-say/events/tech-briefing_au.html"&gt;ThoughtWorks Quarterly Technology Briefing&lt;/a&gt; in Sydney, and got the chance to hear &lt;a href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; speak about how to fail in Agile adoption. During the Q&amp;amp;A I asked him how he suggested we handle customers who were reluctant to get involved.&lt;/p&gt;  &lt;p&gt;Martin pointed out that there are in general two sorts of projects:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Strategic:&lt;/strong&gt; Key to business success, and as such important. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Infrastructure:&lt;/strong&gt; Necessary to do, but not seen as particularly vital for business success. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Immediately I saw that for many of our clients their projects were internally seen as necessary (new intranet, re-skinned website) but were not particularly risky or impactful on the organisation’s success. I mulled that answer over for a while and wondered what it might mean for our use of Agile.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 10px 0px 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="MaisterProfessionalServicesFirm" border="0" alt="MaisterProfessionalServicesFirm" align="left" src="http://lh5.ggpht.com/_1GrPn-zPqXU/SwSxAn1OJwI/AAAAAAAAA8c/tz01oMSNaMM/MaisterProfessionalServicesFirm6.png?imgmax=800" width="86" height="124" /&gt; A few weekends later I was re-reading &lt;a href="http://davidmaister.com/"&gt;David Maister’s&lt;/a&gt; classic book &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0743231562/falkayncom06-20"&gt;Managing the Professional Service Firm&lt;/a&gt; and came across his definition of the three basic types of professional service delivery. He writes for any type of professional service and uses examples from disciplines as far apart as architecture, accounting, engineering and management consulting to make his point. &lt;/p&gt;  &lt;h4&gt;Brains/Expertise&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Client problem is at forefront of professional or technical knowledge &lt;/li&gt;    &lt;li&gt;“Hire us because we’re smart” &lt;/li&gt;    &lt;li&gt;One-off projects &lt;/li&gt;    &lt;li&gt;Highly skilled and highly paid professionals &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Grey Hair/Experience&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Clients require highly customised output, more familiar problems &lt;/li&gt;    &lt;li&gt;“Hire us because we’ve done it before” &lt;/li&gt;    &lt;li&gt;Specialised knowledge in project area &lt;/li&gt;    &lt;li&gt;We sell our knowledge, experience and judgement &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Procedure/Efficiency&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Client problems are well-known and familiar, solutions also well-known &lt;/li&gt;    &lt;li&gt;“Hire us because we can do it for you” &lt;/li&gt;    &lt;li&gt;Repeat projects, well understood, standard solutions &lt;/li&gt;    &lt;li&gt;Well trained and supervised junior staff &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="image" alt="image" src="http://lh3.ggpht.com/_1GrPn-zPqXU/SwSxBSYVoOI/AAAAAAAAA8g/Vg2OALjMPnQ/image5.png?imgmax=800" width="432" height="258" /&gt;&lt;/p&gt;  &lt;p&gt;Maister points out that you can see a continuum from Brains to Grey Hair to Procedure for a range of different service features.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: inline" title="image" alt="image" src="http://lh3.ggpht.com/_1GrPn-zPqXU/SwSxCQw10EI/AAAAAAAAA8k/siiJGUGie-o/image_thumb6.png?imgmax=800" width="500" height="379" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Using this idea, I could see that most of the “infrastructure” projects we had involved procedure or efficiency services. A simple deployment of &lt;a href="http://www.elcom.com.au/Products/Community-Manager/default.aspx"&gt;CommunityManager.NET&lt;/a&gt; with implementation of a specified basic website design and some custom styling of forms and other modules. Agile simply slowed these projects down and was generally ignored by the team doing most of this work.&lt;/p&gt;  &lt;p&gt;On the other hand some of our custom development work fell into the realm of grey hair or experience services – enhancing or extending CommunityManager.NET for a client. These usually did not need to be Agile projects, but were being forced into our product sprint cycle, even when they were a day or two of custom work not dependent upon enhancements to our core product.&lt;/p&gt;  &lt;p&gt;Our product work deserves a mention here. Whilst not for any specific client, this is in fact the work that provides the greatest return on investment for the business. However a need for cash flow meant there was a limit to how much could be done at any given time. We had a settled sprint duration of 6 weeks (5 weeks dev + 1 week regression testing and release preparation), wit 1 week in between sprints, that the team had a good rhythm with. Agile was a great fit for this work.&lt;/p&gt;  &lt;p&gt;After this analysis there was a small, but important part of our business. Small in terms of number of projects, but important in terms of revenue. This was the projects that involved significant custom development work and had little dependency upon CommunityManager.NET. Sometimes these jobs could have been delivered without our product at all, but using it gave a convenient head start to the project. These projects were strategic to the client, but as a result often had loose, or non-existent requirements because it was acknowledged that the requirements would change during the course of the project. This type of work suits Agile methodologies, but the business needed to recognise that this work shouldn’t be sold the same way our other services were.&lt;/p&gt;  &lt;p&gt;Clearly Agile suited some parts of our business, but was a poor fit for others. Our sales material made a big deal of our Agile methodology, but it was not always relevant or appropriate for our clients. Worse, working in an Agile manner was causing many projects to have a greater chance of failure, and to delay client solutions.&lt;/p&gt;  &lt;h4&gt;Agile Wasn’t Working&lt;/h4&gt;  &lt;p&gt;I now knew why Agile wasn’t a great fit for much of our business, but it still had value in some areas. Maister also made the point that when for a professional service firms to mix Brains, Grey Hair and Procedure work successfully it is necessary to create divisions within the firm to allow each to have a management style and culture that fit their style of work.&lt;/p&gt;  &lt;p&gt;I really like the way that &lt;a href="http://www.noop.nl"&gt;Jurgen Appelo&lt;/a&gt; organises his development teams, with a project manager assigned 3-5 other staff as their permanent team, with them needing to complete each of their projects using that team. By pushing resource constraints to the lowest level (that of the project team) they ensure that other projects’ resource variances do not adversely affect them. However I know that Elcom is much smaller than Jurgen’s company, and such a profound shift would create more friction than it would generate in gains.&lt;/p&gt;  &lt;p&gt;I discussed these ideas with my boss and some of my colleagues, but felt that we quickly needed to make a change as a large custom development project was about to kickoff its second stage.&lt;/p&gt;  &lt;p&gt;The team structure we are now heading towards is this:&lt;/p&gt;  &lt;h5&gt;Delivery Team&lt;/h5&gt;  &lt;p&gt;This is a team made up of web designers, front-end web developers, and .NET analyst/programmers. Their role will be to implement new customers’ versions of CommunityManager.NET as painlessly and efficiently as possible. They will handle custom development work that is tightly integrated to, or built around, CommunityManager.NET. They work in traditional BUFD (big up-front design) projects with well-scoped requirements. Project duration would usually be anything from 1-8 weeks.&lt;/p&gt;  &lt;h5&gt;Solutions Team&lt;/h5&gt;  &lt;p&gt;This is a team made up of user experience (UX) consultants, designers, and web developers. It is the renaissance team that is responsible for finding new ways to deliver innovative solutions for strategic client problems using design thinking and Agile software development methodologies. They work in a more flexible manner, preferably with a pseudo time and materials approach, with the client purchasing entire sprint’s worth of work. Project duration would usually be more than 12 weeks, with usually two week sprints.&lt;/p&gt;  &lt;h5&gt;Product Team&lt;/h5&gt;  &lt;p&gt;This is a team made with a web designer, front-end web developer and .NET developers. It is responsible for enhancements to, and strategic development of our products, particularly CommunityManager.NET. They follow an Agile software development methodology and are very much the traditional product-centred Agile team. Sprint duration would depend upon the ability to regression test in a timely manner – but for the moment this would be around the same 6 week duration we had used previously.&lt;/p&gt;  &lt;h4&gt;Right Now&lt;/h4&gt;  &lt;p&gt;When we first made this change, there wasn’t enough strategic product work for us to justify having a dedicated Product Team. Instead members of the Delivery Team are made available as and when required to work on the product. We still have 6 week product sprints.&lt;/p&gt;  &lt;p&gt;The Delivery Team has started transitioning away from Agile, and their time is now more easily shifted from one piece of client work to another (they previously were committed&amp;#160; up to 6 weeks in advance for a particular sprint). Our clients have started to notice that we have become more flexible and responsive to sudden requests. Our project managers have been learning a new resource planning tool which is slightly clunky (built in Excel, requiring double data entry) but that we soon hope to replace with a more effective system.&lt;/p&gt;  &lt;p&gt;The Solutions Team has had some success working in a more Agile manner, but they need to learn to do it without the moral, emotional or practical support of the rest of the technical teams. By removing many of the restrictions that product work placed on them, they are now free to explore new technologies and test them in practice before we roll them into our products. For instance they have used Domain-Driven Design (DDD) and LINQ2SQL.&lt;/p&gt;  &lt;p&gt;The teams are differentiated by more than just name. They have different KPIs, different management styles and different things to get good at.&lt;/p&gt;  &lt;p&gt;The Delivery Team needs to become more process-driven. Too many things are left to individual choice when the best solution is already known and has been tested in practice. Also documenting requirements up front is a skill set that needs to be re-discovered and applied. After all if you are going to do BUFD projects then you need to be good at it.&lt;/p&gt;  &lt;p&gt;The Solutions Team needs to become more Agile, and look at ideas like TDD/BDD and more comprehensive automated testing so that short sprints do not lead to a reduction in quality. Selling a job as an Agile development project is proving harder than we would have thought. It seems lip service to Agile is easy to sell, it sounds good and requires few changes in the way clients work. Real Agile development requires an altogether different mindset, and this is much harder to sell up front. We may well need to lead these projects with an initial fixed price project that uses BDUF, and then transition to a more Agile approach once we have some credits in the trust account with our client.&lt;/p&gt;  &lt;h4&gt;The Future&lt;/h4&gt;  &lt;p&gt;The Solutions Team will be undertaking a major strategic product initiative for Elcom over the Christmas period and will bring their Agile approach and technical expertise to bear in order to give us a major new element to our product for CommunityManager.NET version 7.0. After this we hope to have another major project lined up, but if not then they may become our Product Team.&lt;/p&gt;  &lt;p&gt;If another Solutions Team project does come up, then the next step will be to create a full-time Product Team. We believe that version 7.0 will create enough demand that a full-time team will be justified. An important part of this strategy is to find partners that are comfortable enough implementing CommunityManager.NET that our Delivery Team is not a bottleneck on our sales. One of the keys to version 7’s success will be the way that it makes it far easier for digital agencies and systems integrators to use our product for their own web projects.&lt;/p&gt;  &lt;p&gt;After that fame, fortune and fun might consume our days – or more likely we will find ourselves looking beyond enterprise content management to create a new market niche in the manner of good Blue Ocean strategists. Whatever we do, Agile will remain a part of it, but only when it deserves to be.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-36307348214464689?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=y5tF3Oan-e8:bhUJ8gQOjgI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=y5tF3Oan-e8:bhUJ8gQOjgI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=y5tF3Oan-e8:bhUJ8gQOjgI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=y5tF3Oan-e8:bhUJ8gQOjgI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=y5tF3Oan-e8:bhUJ8gQOjgI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=y5tF3Oan-e8:bhUJ8gQOjgI:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=y5tF3Oan-e8:bhUJ8gQOjgI:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/y5tF3Oan-e8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/36307348214464689/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2009/11/when-agile-doesnt-work.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/36307348214464689?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/36307348214464689?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/y5tF3Oan-e8/when-agile-doesnt-work.html" title="When Agile Doesn’t Work" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_1GrPn-zPqXU/SwSxAJGXfvI/AAAAAAAAA8Y/LHQKPXGZk_8/s72-c/image_thumb2.png?imgmax=800" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://blog.falkayn.com/2009/11/when-agile-doesnt-work.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUCQ30-fip7ImA9WxNbEEs.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-4110764526186120412</id><published>2009-11-13T09:01:00.001+11:00</published><updated>2009-11-13T09:01:02.356+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-13T09:01:02.356+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="smart thinking" /><category scheme="http://www.blogger.com/atom/ns#" term="personal" /><category scheme="http://www.blogger.com/atom/ns#" term="My Blog" /><category scheme="http://www.blogger.com/atom/ns#" term="craftsmanship" /><title>Keep Blogging, Don’t Stop!</title><content type="html">&lt;p&gt;This is a reminder for myself as much as anything else. With my meeting schedule and responsibilities it can be easy to avoid blogging for weeks at a time. However, I think that is a mistake – and I want to record why. In fact, blogging about not blogging is a meme all bloggers seem to fall into at one stage or another, so this might seem a little trite. My excuse is that I’m encouraging my team to consider blogging more themselves (and I need to kick my own backside from time to time too!).&lt;/p&gt;  &lt;p&gt;In summary I think the Reasons to Keep Blogging are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Career&lt;/li&gt;    &lt;li&gt;Mental health/sharpness&lt;/li&gt;    &lt;li&gt;Community&lt;/li&gt;    &lt;li&gt;Memory&lt;/li&gt;    &lt;li&gt;Discipline&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Career&lt;/h4&gt;  &lt;p&gt;I have had the unfortunate experience of working somewhere for a relatively long time (5 years) and then being retrenched through no fault of my own. What I found was that I had been ignoring my career in general in favour of my career in the company that employed me.&lt;/p&gt;  &lt;p&gt;Let me unwrap that a little. It is easy when working for someone to find yourself learning just what you need to for the tasks at hand. To restrict your professional relationships to colleagues and clients. To ignore new ideas that are not acceptable where you work. To stunt your growth in other words.&lt;/p&gt;  &lt;p&gt;Just as it’s important to have a life outside work, it is important to have a professional life outside of work. If you get to know people outside your normal range of professional contacts, explore ideas outside what is needed for work and generally get interested in your industry then it is surprising how much more effective it makes your job search chances later.&lt;/p&gt;  &lt;p&gt;For information works, especially creative types like developers, blogging can be a very effective way of building a portfolio of work and ideas that future employers can be impressed by. As an employer, I know that it also helps potential employers validate their face to face opinion of you.&lt;/p&gt;  &lt;h4&gt;Mental Health&lt;/h4&gt;  &lt;p&gt;As a creative type you need to keep your mental faculties well exercised and challenged. Work is not always the best place where you can get a chance to push yourself. Sometimes it helps to try something in public, but not to have too much hanging on the result.&lt;/p&gt;  &lt;p&gt;Use your blog as a place to explore new ideas, techniques and ways of doing things. It is not just the content that needs to be fresh, so does the design and layout of the site. (reminder to self: take your own advice!)&lt;/p&gt;  &lt;h4&gt;Community&lt;/h4&gt;  &lt;p&gt;Don’t just blog on your own. Leave comments on other people’s site and link your name back to your blog so people can come see more of what you think if they liked it. Get into conversations, write articles criticising other’s ideas, commenting on them, stretching them, validating them, taking them further, or writing them off.&lt;/p&gt;  &lt;p&gt;In other words, get involved with people.&lt;/p&gt;  &lt;h4&gt;Memory&lt;/h4&gt;  &lt;p&gt;Sometimes I wish I’d record how I fixed something, or where I found an idea out, because often I need it again later and can’t find it (easily). I discussed this with Neil Houghton the other day, sometimes you use a nifty technique in apiece of code, but then requirements change and it gets deleted, and you;re left hunting through sourced code control (Subversion in our case) to find it. Far better to make the effort to blog about it, and then some other poor schmuck might get help too!&lt;/p&gt;  &lt;h4&gt;Discipline&lt;/h4&gt;  &lt;p&gt;Aaaah the “D” word. Need anything else be said?&lt;/p&gt;  &lt;p&gt;Self-discipline is something to be much admired, the enemy within is always vastly more difficult to conquer than the one without. But it seems to have a bad name.&lt;/p&gt;  &lt;p&gt;Discipline is not about some rigid, heavily controlled lifestyle that simply denies and restricts our actions to the ones most acceptable, or least harmful to others.&lt;/p&gt;  &lt;p&gt;Discipline is useful because it builds up the strength of will, and willpower is often the only difference between success and failure. Can you keep going even when you fail? Does one loss make you a loser? I think discipline is the habit of trying to succeed just one more time. It is denial, and restriction, but the purpose behind it is to do what we really want to do and not get distracted by the unnecessary, the mundane or the superficial.&lt;/p&gt;  &lt;p&gt;If you really want to blog, if it fulfils one of the purposes I’ve outlined above, then you will find that continuing to do it helps build in you the discipline needed to do other things you really want to do. And that is the &lt;em&gt;best reason&lt;/em&gt; I can think of to keep blogging.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-4110764526186120412?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yxAQ77t7hJM:EJMKUULtqAU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yxAQ77t7hJM:EJMKUULtqAU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yxAQ77t7hJM:EJMKUULtqAU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yxAQ77t7hJM:EJMKUULtqAU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=yxAQ77t7hJM:EJMKUULtqAU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=yxAQ77t7hJM:EJMKUULtqAU:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=yxAQ77t7hJM:EJMKUULtqAU:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/yxAQ77t7hJM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/4110764526186120412/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2009/11/keep-blogging-dont-stop.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/4110764526186120412?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/4110764526186120412?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/yxAQ77t7hJM/keep-blogging-dont-stop.html" title="Keep Blogging, Don’t Stop!" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.falkayn.com/2009/11/keep-blogging-dont-stop.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUASHgzeSp7ImA9WxJaGUs.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-6350883716430299800</id><published>2009-08-11T13:09:00.001+10:00</published><updated>2009-08-11T13:10:49.681+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-11T13:10:49.681+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="project management" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile Development" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Software projects are like sailing voyages</title><content type="html">&lt;p&gt;I have been reading Greg Smith's new &lt;a href="http://www.manning.com/smith/"&gt;Becoming Agile&lt;/a&gt; book and was struck by the false analogy that is often applied to software projects, which compares them to construction projects, where Smith points out you typically &amp;quot;gather requirements, create a design, excavate, lay the foundation, and then build the walls.&amp;quot;&lt;/p&gt;  &lt;p&gt;Smith points out two problems with applying this analogy:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;&amp;quot;1. Additional requirements will be discovered during design, coding, demonstration, and testing.        &lt;br /&gt;2. Software development does not require completion of each step before the following step can be initiated. You can start design and coding based on a few initial requirements. You can iteratively build out the system, revisiting it and going deeper on requirements, design, and code as you make discoveries and refine the vision for the project.&amp;quot;&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Analogies are dangerous because they build in these sorts of inaccuracies, and that can lead to dangerous assumptions and attitudes later on. However they are excellent for helping non-experts in a field understand complex topics. I dearly want a better analogy for software projects and I have never heard a really satisfactory one, so I got the mental juices going and looked for one that makes sense to me. This is what I found ...&lt;/p&gt;  &lt;h2&gt;Software Projects are Sailing Voyages&lt;/h2&gt;  &lt;p&gt;Software projects, at least the ones I have been involved in, feel more like ocean voyages in small yachts than anything else. Like any sailing voyage you will have an idea of where you want to get to, and if you are smart you will have checked the weather forecast and planned your route - even calculating what you average speed should be and when you will reach your destination.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1GrPn-zPqXU/SoDg4jS3K2I/AAAAAAAAA70/yXStgfba_c8/s1600-h/3100906233_d9fa131d23_b%5B4%5D.jpg"&gt;&lt;img height="310" alt="3100906233_d9fa131d23_b" src="http://lh4.ggpht.com/_1GrPn-zPqXU/SoDg5sXRviI/AAAAAAAAA74/LApqk8FkR_U/3100906233_d9fa131d23_b_thumb%5B2%5D.jpg?imgmax=800" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;from: &lt;/font&gt;&lt;a href="http://www.flickr.com/photos/14132971@N05/3100906233/"&gt;&lt;font size="1"&gt;http://www.flickr.com/photos/14132971@N05/3100906233/&lt;/font&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This is reasonably similar to the planning and preparation for a software project where a goal will be set, the estimated time to reach it mapped out and the current environment and conditions researched.&lt;/p&gt;  &lt;p&gt;However, in sailing you can expect to find a number of things changing your plans. Perhaps the wind changes in unexpected ways, or your plan failed to take into account the wind shadow of a particularly large island, or the strength of local currents or tides. The helmsman may have neglected to keep his eye on where you were headed, being distracted by a pretty sight, or other crew may not have kept the sails properly trimmed or closed the bilge valve. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1GrPn-zPqXU/SoDg6gJkhaI/AAAAAAAAA78/U-IRsIWfosQ/s1600-h/2791384256_cb84d28653_b%5B4%5D.jpg"&gt;&lt;img height="431" alt="2791384256_cb84d28653_b" src="http://lh6.ggpht.com/_1GrPn-zPqXU/SoDg7onXZzI/AAAAAAAAA8A/rh8tm2yI5I0/2791384256_cb84d28653_b_thumb%5B2%5D.jpg?imgmax=800" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;from: &lt;/font&gt;&lt;a href="http://www.flickr.com/photos/flasporty/2791384256/"&gt;&lt;font size="1"&gt;http://www.flickr.com/photos/flasporty/2791384256/&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt;&amp;#160;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Mishaps can occur, such as equipment failure, collisions with other vessels or even crew sickness or injury. Your destination port might be closed, and you find that you need to make landfall either sooner or later than planned. Even the captain's intent may change as it becomes apparent that the passengers would prefer a leisurely cruise around the coast to a deep ocean adventure.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1GrPn-zPqXU/SoDg8XTC_eI/AAAAAAAAA8E/oXRtPlDGP4w/s1600-h/2691809503_bd8ec4d118_b%5B4%5D.jpg"&gt;&lt;img height="500" alt="2691809503_bd8ec4d118_b" src="http://lh6.ggpht.com/_1GrPn-zPqXU/SoDg9lrfEuI/AAAAAAAAA8I/L-JUMBHilCU/2691809503_bd8ec4d118_b_thumb%5B2%5D.jpg?imgmax=800" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;from: &lt;/font&gt;&lt;a href="http://www.flickr.com/photos/wili/2691809503/"&gt;&lt;font size="1"&gt;http://www.flickr.com/photos/wili/2691809503/&lt;/font&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Very similar changes can be expected in software projects. Your tools vendor may bring out a new release that opens up new development options, business goals can change or be re-assessed, leading to changes in requirements. Staff changes can cause a change in vision, or highlight mistakes or negligence in the work previously performed. Individuals' performance may fall short or exceed expectations for their role, and unexpected leave or changes in priorities may derail timelines.&lt;/p&gt;  &lt;p&gt;These problems occur on construction projects too, but they have a real, physical object they have been developing with building approvals already acquired so it is far more likely that they will simply continue to the end (even then, you might end up with a project like Sydney's World Square, where it was just a huge hole in the ground with some cement in it for &lt;em&gt;years&lt;/em&gt;).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1GrPn-zPqXU/SoDg-RifRnI/AAAAAAAAA8M/Jl_5otFsb3I/s1600-h/Hole-in-the-ground%5B4%5D.jpg"&gt;&lt;img height="117" alt="Hole-in-the-ground" src="http://lh5.ggpht.com/_1GrPn-zPqXU/SoDg_b1nuFI/AAAAAAAAA8Q/JxmSD99yS0w/Hole-in-the-ground_thumb%5B2%5D.jpg?imgmax=800" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;from: &lt;/font&gt;&lt;a title="World Square hold in the ground" href="http://cityofsydney.nsw.gov.au/AboutSydney/HistoryandArchives/VisionsOfSydney/images_lrg/Hole.asp"&gt;&lt;font size="1"&gt;City of Sydney&lt;/font&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;With software it always seems easier to throw it all away and start again (and indeed this is sometimes the best course to take). Simply having a shared analogy with the customer that makes more sense than a building will help them understand that while we can give up the voyage now, we can't avoid the fact that we have sailed this far, and perhaps we should take that learning and make use of it.&lt;/p&gt;  &lt;p&gt;Agile software development in this case can be seen as a series of small hops around the coast, rather than the usual grand exploratory voyage undertaken by many traditional software projects. Each hop allows us to review where we have gotten to, and lets passengers get off if they so desire.&lt;/p&gt;  &lt;p&gt;Of course analogies have their limitations, and using them to model a complex system by comparing it to another simpler, or more familiar, system does not &lt;a title="Wikipedia&amp;#39;s article on analogical models" href="http://en.wikipedia.org/wiki/Analogical_models"&gt;guarantee success&lt;/a&gt;. It just makes client meetings shorter (which by some definitions &lt;em&gt;is&lt;/em&gt; success!).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-6350883716430299800?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QRcscwL0yPQ:NyWymmZ49TA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QRcscwL0yPQ:NyWymmZ49TA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QRcscwL0yPQ:NyWymmZ49TA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QRcscwL0yPQ:NyWymmZ49TA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=QRcscwL0yPQ:NyWymmZ49TA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=QRcscwL0yPQ:NyWymmZ49TA:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=QRcscwL0yPQ:NyWymmZ49TA:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/QRcscwL0yPQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/6350883716430299800/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2009/08/software-projects-are-like-sailing.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/6350883716430299800?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/6350883716430299800?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/QRcscwL0yPQ/software-projects-are-like-sailing.html" title="Software projects are like sailing voyages" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_1GrPn-zPqXU/SoDg5sXRviI/AAAAAAAAA74/LApqk8FkR_U/s72-c/3100906233_d9fa131d23_b_thumb%5B2%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.falkayn.com/2009/08/software-projects-are-like-sailing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4GRnk8fSp7ImA9WxJQFUg.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-2813983379558600292</id><published>2009-05-29T09:55:00.001+10:00</published><updated>2009-05-29T09:55:27.775+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-29T09:55:27.775+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="smart thinking" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><category scheme="http://www.blogger.com/atom/ns#" term="Australia" /><title>Half of TEDx Sydney 2009</title><content type="html">&lt;p&gt;Thanks to &lt;a href="http://twitter.com/JoshAnstey"&gt;Josh Anstey's&lt;/a&gt; generosity I was able to attend &lt;a href="http://tedxsydney.com.au/"&gt;TEDx Sydney&lt;/a&gt; last night. Whilst it was enjoyable, I ended up leaving at the half-time break and spending the evening with my family instead. Nevertheless if you're interested in &lt;a href="http://www.ted.com"&gt;TED&lt;/a&gt; then I would recommend giving an event like this a go, if nothing else there were some great people there like &lt;a href="http://twitter.com/markc"&gt;Mark Cohen&lt;/a&gt;, &lt;a href="http://twitter.com/jodiem"&gt;Jodie Miner&lt;/a&gt; and &lt;a href="http://www.absoluteclarity.com.au/"&gt;Brian Maguire&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Some background: &lt;a href="http://www.ted.com"&gt;TED&lt;/a&gt; is an event that focuses on thought leadership in the Technology, Entertainment and Design fields every year and has as its catch-cry &amp;quot;Ideas worth spreading&amp;quot;. The TED conference sells out quickly every year (despite some &lt;a href="http://www.ted.com/pages/view/id/72"&gt;unusual conditions&lt;/a&gt;) and attracts all sorts of luminaries and leaders. A TED event is the place to meet movers and shakers and has been the birthplace of some wonderful ideas over the years. They make the videos of each event available online during the year, and part of the focus of &lt;a title="About the TEDx Program" href="http://www.ted.com/pages/view/id/260"&gt;a TEDx event&lt;/a&gt; is to create that same buzz in a local venue by mixing TED videos with local speakers.&lt;/p&gt;  &lt;p&gt;So without further ado here is my thoughts on TEDx Sydney 2009:&lt;/p&gt;  &lt;h4&gt;Venue&lt;/h4&gt;  &lt;p&gt;The &lt;a href="http://www.atp.com.au/"&gt;Australian Technology Park&lt;/a&gt; hosted the event, and as that is where &lt;a href="http://www.elcom.com.au"&gt;Elcom&lt;/a&gt; is based that proved convenient for me. The theatre used was a great venue for watching TED videos and live speakers alike and I think it did a good job of providing some atmosphere - although I wonder whether other venues could have made a bigger impression? (e.g. &lt;a href="http://www.scec.com.au/"&gt;Darling Harbour Convention Centre&lt;/a&gt;)&lt;/p&gt;  &lt;h4&gt;MC/Host (Nils Vesk)&lt;/h4&gt;  &lt;p&gt;I don't think a Gen-Y host was the right choice for an event like this - I think less entertainment and more credibility was needed (although it was Mark Cohen who &lt;a href="http://twitter.com/markc/status/1944524410"&gt;blew Nils' credibility&lt;/a&gt; for me). However, Nils got the job done, and managed to do the more cheesy sales aspects of his role without making it seem &lt;em&gt;too&lt;/em&gt; cheesy (more about that later).&lt;/p&gt;  &lt;h4&gt;Craig Rispin (Futurist)&lt;/h4&gt;  &lt;p&gt;I have heard of &lt;a href="http://www.futuretrendsgroup.com/craigrispinbio.html"&gt;Craig Rispin&lt;/a&gt;, and indeed knew someone who he'd invited to the event. Unfortunately his recursive telling of the history of futurists who tell the history of the future left me bored and dual-tweeting with Mark Cohen.&lt;/p&gt;  &lt;p&gt;I'm not sure Craig had an idea worth spreading, perhaps he intended it to be that we are all futurists, but it felt more like he was telling us that we were smart and forward-thinking people - which was nice of him, but didn't give me a reason to care about his talk. He also pointed out the prophetic nature of speculative/science-fiction in a way that might have impacted those who didn't yet care about it - but I've known about that for most of my life so it was wasted on me.&lt;/p&gt;  &lt;h4&gt;Patti Maes (&lt;a href="http://www.ted.com/index.php/talks/pattie_maes_demos_the_sixth_sense.html"&gt;Video&lt;/a&gt;, MIT Media Lab)&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.media.mit.edu/people/bio_pattie.html"&gt;Patti Maes&lt;/a&gt; is from the MIT Media Lab and demonstrated a form of augmented reality where her students had cobbled together a wearable apparatus that linked a camera, phone and some software so that you could make any surface around you into a computer work area, and interact with your environment in ways that could both instruct the computer/camera to do something (e.g. take a photo by holding your hands up in a rectangle) or could bring digital information to you based on your context (e.g. talking to a person, reading a book, looking at a product label).&lt;/p&gt;  &lt;p&gt;She pointed out that the technology could be cobbled together for a few hundred dollars easily enough, but their point was that they were investigating what were reasonable ways to augment reality. Some of this has been done before with for example the head-up displays (HUD) that Boeing engineers use when wiring plane bodies.&lt;/p&gt;  &lt;p&gt;This was the most exciting talk, but hardly surprising to anyone who has been following technology for the last 15 years or so.&lt;/p&gt;  &lt;h4&gt;Peter Baines (Hands Across the Water)&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://www.peterbaines.com.au/About.asp"&gt;Peter Baines&lt;/a&gt; was one of the forensic specialists sent to Thailand in the aftermath of the recent Boxing Day Tsunami. He gave us a fairly somber account of that, especially dealing with the human side when giving bodies back to relatives. He went on to show how this created a desire in him and his colleagues to do more than they were for the Thais - out of that desire was birthed &lt;a href="http://www.handsacrossthewater.com.au"&gt;Hands Across the Water&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I think that Peter's idea worth spreading was that if you just focus on the results, and not the obstacles, then you can achieve your dreams - whatever they are, whoever you are. I think this was a great message, and Peter is obviously a good example of this in action. Focus, and the single-minded pursuit of an idea, is too often given lip-service as a reason for success, when I believe it might just be the major factor in it.&lt;/p&gt;  &lt;p&gt;A large part of Peter's story was a dig at the international aid agencies that quickly went into Thailand and then just as quickly pulled out around a year later. One of his ideas is that charities should be forced to put some stats on every piece of marketing literature telling the reader how much money they spent on admin versus aid in the last financial year. The idea (much like the MIT Media guys) being to give people information to make informed decisions about where to give their money. I think this ignores part of the bigger picture, which is a question of how much admin is required to run an international charity that coordinates volunteers from many nations into situations that are often not as attractively packaged as the Thai one was. However that discussion can't happen without making the information available, and so I would welcome it form that point of view.&lt;/p&gt;  &lt;h4&gt;Bill Gates (&lt;a href="http://www.ted.com/talks/bill_gates_unplugged.html"&gt;Video&lt;/a&gt;, Curing Malaria and Making Teachers Better)&lt;/h4&gt;  &lt;p&gt;I had seen this one before, but hung around to watch it on the big screen. &lt;a href="http://www.gatesfoundation.org"&gt;Bill and Melinda Gates' foundation&lt;/a&gt; is really trying to focus money and attention onto big issues that the market and governments are ignoring.&lt;/p&gt;  &lt;p&gt;The first issue he covered was curing malaria, which seems both an achievable aim and one that has been largely ignored now that wealthy nations are free of it. His idea here was that if we focus on eradicating it then a relatively modest effort will see it gone, whilst if we tackle it half-heartedly we only make things worse.&lt;/p&gt;  &lt;p&gt;The second issue was about how do you make teachers great, and he gave a long analysis of why this mattered, which seemed obvious, but I guess the hard numbers he pulled out showed people that it was an issue worth focusing on. I think his idea here was that we should care about the quality of teaching - mainly because in the US at least, the quality of a teacher is not easily discovered or rewarded.&lt;/p&gt;  &lt;h4&gt;Event&lt;/h4&gt;  &lt;p&gt;Overall the event had a good vibe, seemed interesting, and was a good way to share the watching of a TED video with people you knew. I think I missed too much of the schmoozing part of it to know whether that worked - but I was happy catching up with who I did see there.&lt;/p&gt;  &lt;p&gt;There was a cheesy side to the event which was the blatant pushing of wares for the main sponsors, especially the silent auction of the &lt;a href="http://www.thoughtleaders.com.au/"&gt;Thought Leaders'&lt;/a&gt; services (with some fairly suspicious dollar figures on their market value). I understand that some of this is necessary to get the event paid for - but I do wonder if this could have been handled in a more subtle and positive way.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-2813983379558600292?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=kvNHGBoCdAk:4cnuKsbpLAI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=kvNHGBoCdAk:4cnuKsbpLAI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=kvNHGBoCdAk:4cnuKsbpLAI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=kvNHGBoCdAk:4cnuKsbpLAI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=kvNHGBoCdAk:4cnuKsbpLAI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=kvNHGBoCdAk:4cnuKsbpLAI:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=kvNHGBoCdAk:4cnuKsbpLAI:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/kvNHGBoCdAk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/2813983379558600292/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2009/05/half-of-tedx-sydney-2009.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/2813983379558600292?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/2813983379558600292?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/kvNHGBoCdAk/half-of-tedx-sydney-2009.html" title="Half of TEDx Sydney 2009" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2009/05/half-of-tedx-sydney-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkACQns5fCp7ImA9WxJREkQ.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-1074751979919348076</id><published>2009-05-14T17:41:00.000+10:00</published><updated>2009-05-14T18:46:03.524+10:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-14T18:46:03.524+10:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="personal" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="funny" /><title>Top 5 classic programmer folly projects</title><content type="html">&lt;p&gt;Back in the day when the &lt;a href="http://en.wikipedia.org/wiki/British_empire"&gt;British Empire&lt;/a&gt; was still new, wealthy landowners who had heard about great places elsewhere (usually ones where it didn't rain all the time) started a trend of re-creating these great places on their own land - often right down to the current decrepit state of said places.&lt;/p&gt;  &lt;p&gt;Sometimes they didn't have a specific place in mind, but wanted a &amp;quot;ruined Greek temple&amp;quot; or similar stereotypical &amp;quot;interesting&amp;quot; structure (sometimes they were just plain strange). The point seemed to be to prove that a) you were interesting, b) you could pay for a spurious building for the sake of it, and c) foreign travel was all so unnecessary. These were known, rather aptly, as &lt;a href="http://en.wikipedia.org/wiki/Folly"&gt;follies&lt;/a&gt; (presumably because they represented the folly of spending your children's inheritance on an expensive monument when investing it might have proven more prudent).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1GrPn-zPqXU/SgvZWoZupmI/AAAAAAAAA7s/mgvm1Ylm7ik/s1600-h/142697575_46dc01af64_b8.jpg"&gt;&lt;img height="494" alt="142697575_46dc01af64_b" src="http://lh6.ggpht.com/_1GrPn-zPqXU/SgvZXrL4-rI/AAAAAAAAA7w/F-NsDRiJA8k/142697575_46dc01af64_b_thumb6.jpg?imgmax=800" width="500" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font size="1"&gt;&lt;em&gt;From:&lt;/em&gt; &lt;/font&gt;&lt;a href="http://flickr.com/photos/xerones/142697575/"&gt;&lt;font size="1"&gt;Xerones&lt;/font&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Programmers it turns out are no less susceptible to follies, although they might not realise it, and they are not deliberate fakeries. There are several classic programmer follies which tend to get repeated by each generation, with ever-increasing zeal and lack of awareness of their futility.&lt;/p&gt;  &lt;p&gt;Now, don't get me wrong, these are all fine examples of throwaway projects that you might play around with and practice on, but for some reason programmers can't seem to leave them stay as just throwaway projects - they always want to upgrade them to the status of &amp;quot;next big thing&amp;quot;.&lt;/p&gt;  &lt;p&gt;Without any further ado, here they are.&lt;/p&gt;  &lt;h2&gt;Top 5 classic programmer folly projects&lt;/h2&gt;  &lt;h4&gt;1. Bug tracking&lt;/h4&gt;  &lt;p&gt;Every software program has bugs, and most programmers find they need a good system to track said bugs. Some companies, &lt;a title="Atlassian&amp;#39;s Home Page" href="http://www.atlassian.com/"&gt;Atlassian&lt;/a&gt; and &lt;a title="Fog Creek Software&amp;#39;s Home Page" href="http://www.fogcreek.com/"&gt;Fog Creek Software&lt;/a&gt; have made their living providing great, simple yet powerful solutions for exactly this problem.&lt;/p&gt;  &lt;p&gt;However, there is always a temptation to take shortcuts, customise the bug tracking, or get a cheaper solution, and so inevitably every programmer gets tempted to build their own bug tracking application.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It's a folly because ... &lt;/strong&gt;    &lt;br /&gt;This is actually a fairly complicated domain, especially once you add in the bug resolution workflow, web interface and email integration that even free, open-source applications have. Of course there is also the problem of what to do when your bugs are in your bug tracking software ... evil recursion in the real world!&lt;/p&gt;  &lt;h4&gt;2. To do list&lt;/h4&gt;  &lt;p&gt;I just want to track what I need to do ... and what I want is to improve this to do list. &lt;a href="http://rememberthemilk.com"&gt;Remember the Milk&lt;/a&gt; has the best free implementation I've seen of this type of application, but BaseCamp, your mobile phone and even GMail are worth mentioning (not to mention trusty old pen and paper).&lt;/p&gt; &lt;strong&gt;It's a folly because ...    &lt;br /&gt;&lt;/strong&gt;You really don't need to waste brain cycles re-inventing something this simple, and when you look at the sophistication of &lt;a href="http://www.rememberthemilk.com"&gt;Remember the Milk&lt;/a&gt; (web, offline Google Gears, Twitter, email and mobile integration) anything you do yourself looks kinda ... sad.   &lt;br /&gt;  &lt;h4&gt;3. Website/blog engine&lt;/h4&gt;  &lt;p&gt;I want to use something I built myself, and it's a good chance to try my hand at content management ... except it isn't. If you are blogging then do your readers and yourself a favour and use an existing blogging application. You will have a more consistent user interface and will never find yourself not posting because the build is broken after that last refactor and you can't be bothered fixing it yet.&lt;/p&gt; &lt;strong&gt;It's a folly because ...    &lt;br /&gt;&lt;/strong&gt;The free alternatives are great, the cheap ones are even better and frankly it's not that great a domain for learning how to code, especially web stuff.   &lt;br /&gt;  &lt;h4&gt;4. Hobby management&lt;/h4&gt;  &lt;p&gt;My hobby (roleplaying games, model robots, high performance cars, salsa dancing, etc) is out of control and I need a way of managing it. Actually no you don't, you probably just need to get out and live more.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It's a folly because ... &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You don't really want to mix up your hobby and your work, it just makes one less fun and the other less professional. it is also an area where you will never really be satisfied with the result because it's &lt;em&gt;your &lt;/em&gt;hobby. Finally, when you show it to other people they are likely to go &amp;quot;Ummm ... very nice. What is it?&amp;quot; &lt;a title="Hugh&amp;#39;s blog" href="http://gapingvoid.com/"&gt;Hugh MacLeod&lt;/a&gt; defines a geek as &amp;quot;Somebody who socializes via objects&amp;quot; and congratulations, that's exactly what you've just become!&lt;/p&gt;  &lt;h4&gt;5. Application Building Applications&lt;/h4&gt;  &lt;p&gt;This is the one where you build an application that uses meta-data to build an application. It seems this is the purvey of the very smart and the very dumb. The really smart guys believe they can be the ones to break through and nail this problem, the really dumb ones just don't realise how hard it is.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;It's a folly because ... &lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;It's possible to do this in theory, but in practice you only ever get around 80% of the way there, and it turns out the other 20% is the bit that an application really needs to live and breathe. Really, really smart guys manage to push that 80% up to the giddy heights of 81.63%, but hey, it still doesn't do what you really wanted it to.&lt;/p&gt;  &lt;h4&gt;Bonus! Installer software&lt;/h4&gt;  &lt;p&gt;OK, here is number six. What do you do when you want to distribute your application to clients? Use the MSI installer for Visual Studio? Heck, no! You go ahead and create your own installer software, complete with license number check, built-in unzipper and some cross-platform nastiness.&lt;/p&gt; &lt;strong&gt;It's a folly because ... &lt;/strong&gt;  &lt;br /&gt;  &lt;p&gt;You already know you shouldn't be doing this. Go use something someone else created and love the fact that you don't need to do it by hand!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;OK, time for confession time, I've been guilty of each of these (at least through to the design stage). What about you, what were your follies?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-1074751979919348076?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=iadZ-emW0AA:QTowPMNqyQs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=iadZ-emW0AA:QTowPMNqyQs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=iadZ-emW0AA:QTowPMNqyQs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=iadZ-emW0AA:QTowPMNqyQs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=iadZ-emW0AA:QTowPMNqyQs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=iadZ-emW0AA:QTowPMNqyQs:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=iadZ-emW0AA:QTowPMNqyQs:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/iadZ-emW0AA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/1074751979919348076/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2009/05/top-5-classic-programmer-folly-projects.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/1074751979919348076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/1074751979919348076?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/iadZ-emW0AA/top-5-classic-programmer-folly-projects.html" title="Top 5 classic programmer folly projects" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_1GrPn-zPqXU/SgvZXrL4-rI/AAAAAAAAA7w/F-NsDRiJA8k/s72-c/142697575_46dc01af64_b_thumb6.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.falkayn.com/2009/05/top-5-classic-programmer-folly-projects.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGQHw7fip7ImA9WxVWEU0.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-6307912799120404717</id><published>2009-02-20T15:17:00.001+11:00</published><updated>2009-02-20T15:47:01.206+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-20T15:47:01.206+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DDD" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="free" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Loading objects' fields/properties automagically</title><content type="html">&lt;p&gt;There is a very nice function in the new &lt;a title="Official ASP.NET MVC home page" href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt; code that allows a Controller to load an object from values passed in from a HttpRequest (UPDATE: called &lt;font face="Courier New"&gt;&lt;strong&gt;UpdateFrom&lt;/strong&gt;&lt;/font&gt;, see &lt;a title="ScottGu&amp;#39;s post on handling forms in ASP.NET MVC" href="http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx"&gt;ScottGu's post&lt;/a&gt;). It did a best guess on matching values to object properties, but most (99%?) of the time that is all you need. Well, when I started using &lt;a title="Official DDD home page" href="http://domaindrivendesign.org"&gt;Domain-Driven Design (DDD)&lt;/a&gt; and &lt;a title="Wikipedia&amp;#39;s TDD entry" href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;Test-Driven Development (TDD)&lt;/a&gt; on the latest additions to our &lt;a title="Elcom&amp;#39;s Community Manager.NET product page" href="http://www.elcom.com.au/Products/Community-Manager/default.aspx"&gt;Community Manager.NET&lt;/a&gt; product I wanted to find something similar - but I couldn't find anything as terse and useful.&lt;/p&gt;  &lt;p&gt;So I did what any good dev would, I read the sourcecode and derived my own functions to do something similar, but with the SqlDataReaders that my repositories would be getting out of SQL Server (it almost feels like the ActiveRecord pattern ...). Below are the result, two &lt;font face="Courier New"&gt;&lt;strong&gt;LoadToObject()&lt;/strong&gt;&lt;/font&gt; functions (and a &lt;strong&gt;&lt;font face="Courier New"&gt;PopulateTypeException&lt;/font&gt;&lt;/strong&gt; class) in my &lt;font face="Courier New"&gt;&lt;strong&gt;BaseRepository&lt;/strong&gt;&lt;/font&gt; class that give me the functionality I need. &lt;strong&gt;I'm putting these out there in case someone else needs this, and in the hope that any glaringly obvious errors might get picked up by others!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;One issue I had with the Microsoft version of this function was they only load public properties of an object, not public fields. Now I know that in C# you can setup properties as easily as fields, but in VB it's still a hassle. I personally like using fields for simple value storing because it is clearer to see what they do in the code and leave more space for real method calls.&lt;/p&gt;  &lt;p&gt;The final problem I ran into was that my custom &lt;font face="Courier New"&gt;&lt;strong&gt;Html&lt;/strong&gt;&lt;/font&gt; data type needed to implement it's own TypeConverter so that the HTML in the SQL Server &lt;font face="Courier New"&gt;&lt;strong&gt;ntext&lt;/strong&gt;&lt;/font&gt; field could be converted to a strongly typed &lt;font face="Courier New"&gt;&lt;strong&gt;Html&lt;/strong&gt;&lt;/font&gt; type. But that can go into another blog post if people are interested.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="overflow-x: auto; width: 520px"&gt;   &lt;pre class="code" style="background: #181818; width: 1500px"&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' Populates an object's public fields and properties with values from a SqlDataReader.&lt;br /&gt;    ''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;param name=&amp;quot;readerToLoad&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;The SqlDataReader that needs to be loaded into the object.&lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;param name=&amp;quot;obj&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;The object we want to populate.&lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;param name=&amp;quot;objectPrefix&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;A prefix to the object field/property names. Tries to match using &amp;quot;.&amp;quot; and &amp;quot;_&amp;quot;.&lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;The object passed in with fields/properties loaded.&lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;remarks&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' Does a best guess as to how to match names from the SqlDataReader to the object.&lt;br /&gt;    ''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/remarks&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Protected Function &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;LoadToObject&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;readerToLoad &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;SqlDataReader&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;obj &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As Object&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objectPrefix &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As Object&lt;br /&gt;        Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;newColl &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;System&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Collections&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Specialized&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;NameValueCollection&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;()&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;x &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As Integer&lt;br /&gt;&lt;br /&gt;        If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;obj &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Is Nothing Then&lt;br /&gt;            Throw New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ArgumentNullException&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;obj&amp;quot;&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;Object must have a value in order to be loaded to.&amp;quot;&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;        For &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;x &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= 0 &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;To &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;readerToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;FieldCount &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;- 1)&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;newColl&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Add&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;readerToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;GetName&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;x&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;), &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;readerToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;GetValue&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;x&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;))&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Next&lt;br /&gt;&lt;br /&gt;        Return &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;LoadToObject&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;newColl&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;obj&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objectPrefix&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End Function&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' Populates an object's public fields and properties with values from a NameValueCollection.&lt;br /&gt;    ''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;param name=&amp;quot;valueCollectionToLoad&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;The NameValueCollection that needs to be loaded into the object.&lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;param name=&amp;quot;obj&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;The object we want to populate.&lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;param name=&amp;quot;objectPrefix&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;A prefix to the object field/property names. Tries to match using &amp;quot;.&amp;quot; and &amp;quot;_&amp;quot;.&lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;The object passed in with fields/properties loaded.&lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;remarks&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' Does a best guess as to how to match names from the NameValueCollection to the object.&lt;br /&gt;    ''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/remarks&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Protected Function &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;LoadToObject&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;System&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Collections&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Specialized&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;NameValueCollection&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;obj &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As Object&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objectPrefix &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As Object&lt;br /&gt;        Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objType &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Type &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;obj&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.GetType()&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objName &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;exceptionList &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;StringBuilder&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;()&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;props &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PropertyInfo&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;() = &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;GetProperties&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;()&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;fields &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;FieldInfo&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;() = &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;GetFields&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;()&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ex &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PopulateTypeException &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Nothing&lt;br /&gt;        Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PropertyInfo&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;FieldInfo&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;' try writing to the object's properties&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;For Each &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;In &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;props&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;'check the key, going to be forgiving here, allowing for full declaration or just propname&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objectPrefix &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;&amp;lt;&amp;gt; &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;String&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Empty &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Then&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objectPrefix &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;            If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) = &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Nothing Then&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objName &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;.&amp;quot; &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;            If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) = &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Nothing Then&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objName &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;_&amp;quot; &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;            If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) &amp;lt;&amp;gt; &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Nothing Then&lt;br /&gt;                Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;conv &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;TypeConverter &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;TypeDescriptor&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;GetConverter&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PropertyType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;value &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As Object &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;conv&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;CanConvertFrom&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;System&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Type&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.GetType(&lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;System.String&amp;quot;&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;True&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;True&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)) &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Then&lt;br /&gt;                    Try&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;value &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;conv&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ConvertFrom&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;))&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;SetValue&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;obj&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;value&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Nothing&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Catch &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;e &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Exception&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;message &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot; is not a valid &amp;quot; &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PropertyType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;; &amp;quot; &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;e&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Message&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ex &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Is Nothing Then&lt;br /&gt;                            &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ex &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PopulateTypeException&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;Errors occurred during object binding - review the LoadExceptions property of this exception for more details&amp;quot;&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;                        Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;info &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PopulateTypeException&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ExceptionInfo&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;()&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;AttemptedValue &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;value&lt;br /&gt;                        info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PropertyName &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;                        info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ErrorMessage &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;message&lt;br /&gt;&lt;br /&gt;                        ex&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;LoadExceptions&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Add&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End Try&lt;br /&gt;                Else&lt;br /&gt;                    Throw New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Exception&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;String&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Format&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;No type converter available for type: {0}&amp;quot;&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;prop&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PropertyType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;))&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;            End If&lt;br /&gt;        Next&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;' now try writing to the object's public fields&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;For Each &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;In &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;fields&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;'check the key, going to be forgiving here, allowing for full declaration or just fieldname&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objectPrefix &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;&amp;lt;&amp;gt; &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;String&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Empty &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Then&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objectPrefix &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;            If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) = &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Nothing Then&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objName &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;.&amp;quot; &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;            If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) = &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Nothing Then&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;objName &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;_&amp;quot; &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;            If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) &amp;lt;&amp;gt; &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Nothing Then&lt;br /&gt;                Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;conv &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;TypeConverter &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;TypeDescriptor&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;GetConverter&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;FieldType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;value &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As Object &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;conv&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;CanConvertFrom&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;System&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Type&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.GetType(&lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;System.String&amp;quot;&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;True&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;True&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)) &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Then&lt;br /&gt;                    Try&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;value &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;conv&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ConvertFrom&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;valueCollectionToLoad&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;key&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;))&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;SetValue&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;obj&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;value&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Catch &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;e &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Exception&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;message &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot; is not a valid &amp;quot; &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;FieldType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;; &amp;quot; &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;+ &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;e&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Message&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;If &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ex &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Is Nothing Then&lt;br /&gt;                            &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ex &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PopulateTypeException&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;Errors occurred during object binding - review the LoadExceptions property of this exception for more details&amp;quot;&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;&lt;br /&gt;                        Dim &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;info &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PopulateTypeException&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ExceptionInfo&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;()&lt;br /&gt;&lt;br /&gt;                        &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;AttemptedValue &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;value&lt;br /&gt;                        info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PropertyName &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Name&lt;br /&gt;                        info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ErrorMessage &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;= &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;message&lt;br /&gt;&lt;br /&gt;                        ex&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;LoadExceptions&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Add&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End Try&lt;br /&gt;                Else&lt;br /&gt;                    Throw New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Exception&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;String&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Format&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #ec6455"&gt;&amp;quot;No type converter available for type: {0}&amp;quot;&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;field&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;FieldType&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;))&lt;br /&gt;                &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;            End If&lt;br /&gt;        Next&lt;br /&gt;&lt;br /&gt;        If Not &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ex &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Is Nothing&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;) &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Then&lt;br /&gt;            Throw &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ex&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Else&lt;br /&gt;            Return &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;obj&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End If&lt;br /&gt;    End Function&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;summary&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #ebd767"&gt;''' Contains exceptions that arise during the populating of an object by the LoadToObject() method.&lt;br /&gt;    ''' &lt;/span&gt;&lt;span style="background: #181818; color: gray"&gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Global&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;System&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Serializable&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;()&amp;gt; &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Public Class &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PopulateTypeException&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Inherits &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Exception&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Public Class &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ExceptionInfo&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Public &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PropertyName &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String&lt;br /&gt;            Public &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;AttemptedValue &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As Object&lt;br /&gt;            Public &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ErrorMessage &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String&lt;br /&gt;        End Class&lt;br /&gt;&lt;br /&gt;        Public &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;LoadExceptions &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As New &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;List&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Of &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;ExceptionInfo&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Private &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;PopulateTypeException&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;()&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;Public Sub New&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;message &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;MyBase&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.new(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;message&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End Sub&lt;br /&gt;&lt;br /&gt;        Public Sub New&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;message &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As String&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;inner &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Exception&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;MyBase&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.new(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;message&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;inner&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End Sub&lt;br /&gt;&lt;br /&gt;        Protected Sub New&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;(&lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;info &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;System&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Runtime&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Serialization&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;SerializationInfo&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;ByVal &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;context &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;As &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;System&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Runtime&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;Serialization&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;StreamingContext&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;            &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;MyBase&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;.New(&lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;info&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;, &lt;/span&gt;&lt;span style="background: #181818; color: #4fa745"&gt;context&lt;/span&gt;&lt;span style="background: #181818; color: #e0e0e0"&gt;)&lt;br /&gt;        &lt;/span&gt;&lt;span style="background: #181818; color: #9d9dce"&gt;End Sub&lt;br /&gt;&lt;br /&gt;    End Class&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-6307912799120404717?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=nOUfuNmpTxk:g83XDdv7t5g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=nOUfuNmpTxk:g83XDdv7t5g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=nOUfuNmpTxk:g83XDdv7t5g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=nOUfuNmpTxk:g83XDdv7t5g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=nOUfuNmpTxk:g83XDdv7t5g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=nOUfuNmpTxk:g83XDdv7t5g:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=nOUfuNmpTxk:g83XDdv7t5g:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/nOUfuNmpTxk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/6307912799120404717/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2009/02/loading-objects-fieldsproperties.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/6307912799120404717?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/6307912799120404717?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/nOUfuNmpTxk/loading-objects-fieldsproperties.html" title="Loading objects&amp;#39; fields/properties automagically" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2009/02/loading-objects-fieldsproperties.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUFQXYzeCp7ImA9WxVXEkk.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-1634636177850361602</id><published>2009-02-10T15:30:00.001+11:00</published><updated>2009-02-10T15:30:10.880+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-10T15:30:10.880+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="smart thinking" /><category scheme="http://www.blogger.com/atom/ns#" term="blogs" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Challenging software development blogs</title><content type="html">&lt;p&gt;I am not hugely keen on top 100 lists or similar trite listings of people, blogs or posts, however sometimes I notice that I have too many tabs open in Chrome (hello, 58?!) and need to itemise some of them. Many of the ones I keep open are blogs that challenge me enough that I want to read them frequently (I know ... I should be using an RSS reader, so call me old-school! ;).&lt;/p&gt;  &lt;p&gt;I think these are some of the more challenging blogs* out there with regards to software development - read these and you will find your brain, assumptions and dealer-held beliefs under high-voltage attack.&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;* OK, so I am going to miss a couple of fantastic ones - what is important is that you check out the ones I &lt;em&gt;do&lt;/em&gt; mention!&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_1GrPn-zPqXU/SZECzpYVxuI/AAAAAAAAA7E/r2n23Gii4PQ/s1600-h/59459065_0ed25c902e_o%5B6%5D.jpg"&gt;&lt;img height="375" alt="59459065_0ed25c902e_o" src="http://lh5.ggpht.com/_1GrPn-zPqXU/SZEC0dCC5vI/AAAAAAAAA7I/bqybOkPq-Qk/59459065_0ed25c902e_o_thumb%5B4%5D.jpg?imgmax=800" width="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Joel on Software (&lt;a href="http://www.joelonsoftware.com/"&gt;visit&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Joel Spolsky of &lt;a href="http://www.fogcreek.com/"&gt;Fog Creek Software&lt;/a&gt; and &lt;a href="http://stackoverflow.com"&gt;Stack Overflow&lt;/a&gt; fame has had one of the most well-read and discussed software development blogs on the planet for years now. He is an original thinker in a market filled with duplicates, he also has a deep commitment to giving his developers &lt;a href="http://www.joelonsoftware.com/items/2008/12/29.html"&gt;great office space&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Software Simplist (&lt;/strong&gt;&lt;a href="http://www.udidahan.com/?blog=true"&gt;&lt;strong&gt;visit&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Udi Dahan's blog specialises in Service Oriented Architecture (SOA), but I read him for his refreshing view of domain-driven design (DDD). I got a new insight into DDD from his &lt;a href="http://www.udidahan.com/2009/01/24/ddd-many-to-many-object-relational-mapping/"&gt;DDD &amp;amp; Many to Many Object Relational Mapping&lt;/a&gt; post.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Scott Bellware's Blog (&lt;/strong&gt;&lt;a href="http://blog.scottbellware.com/"&gt;&lt;strong&gt;visit&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Scott Bellware is probably the most hated/respected .NET rebel on the planet. His abrasive manner and obvious chip on his shoulder with Microsoft and the ALT.NET mainstream put some people off, but he has a deep insight into what Agile development is meant to be all about and a straightforward manner in sharing what he knows. He also seems pretty sure that most developers are &lt;a href="http://twitter.com/bellware/statuses/1127160361"&gt;learning impaired&lt;/a&gt;. A good example of his (more positive) thinking is &lt;a href="http://blog.scottbellware.com/2008/12/productivity-it-comes-from-software.html"&gt;Productivity: It Comes from Software Design Rather than Software Tools&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Noop.nl (&lt;/strong&gt;&lt;a href="http://www.noop.nl/"&gt;&lt;strong&gt;visit&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Jurgen Appelo's software development management blog has some of the most pragmatic and interesting advice available for functional managers of developers. His company's situation is similar to &lt;a href="http://www.elcom.com.au"&gt;Elcom's&lt;/a&gt;, so I appreciate his honest and smart insight into how to make Scrum work with large teams working on many disparate projects. He has useful posts like &lt;a href="http://www.noop.nl/2008/09/how-to-handle-many-simultaneous-projects.html"&gt;How to Handle Many Simultaneous Projects&lt;/a&gt; which apply Lean/Scrum principles to the real world of custom software development.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;You'd think with all my video game experience that I'd be more prepared for this (&lt;a href="http://jchyip.blogspot.com/"&gt;visit&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Jason Yip from ThoughtWorks focuses his blog on lean manufacturing principles and how they apply to the reality of software development. A challenging thinker and opinionated professional, he manages to stay as radical as someone like Scott Bellware with a more pleasant demeanour. A typical (longer) post from him would be &lt;a href="http://jchyip.blogspot.com/2009/01/no-matter-how-many-times-you-say-it-we.html"&gt;No matter how many times you say it, we still don't need a QA on the team&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Greg Young's Blog (&lt;a href="http://codebetter.com/blogs/gregyoung/"&gt;visit&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Greg Young is a Microsoft MVP who has some very interesting opinions on domain-driven design, namely that the domain model is only there for &lt;em&gt;write&lt;/em&gt; operations. Check out his &lt;a href="http://codebetter.com/blogs/gregyoung/archive/2009/01/13/dddd-master-detail-question.aspx"&gt;DDDD: Master-Detail Question&lt;/a&gt; post for more details on this and how he uses a thin DTO layer to power his read-only UI pages.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Chad Myers' Blog (&lt;/strong&gt;&lt;a href="http://www.lostechies.com/blogs/chad_myers/default.aspx"&gt;&lt;strong&gt;visit&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I first found out about Chad from a talk he and Jeremy Miller gave on Opinionated MVC (see videos &lt;a href="http://www.viddler.com/explore/lostechies/videos/2/"&gt;here&lt;/a&gt; and &lt;a href="http://www.viddler.com/explore/lostechies/videos/3/"&gt;here&lt;/a&gt;). Jeremy Miller developed &lt;a href="http://structuremap.sourceforge.net/"&gt;StructureMap&lt;/a&gt;, which is a Dependency Injection/Inversion of Control framework. Chad is also the driving force behind the &lt;a href="http://groups.google.com/group/virtualaltnet?pli=1"&gt;Virtual ALT.NET&lt;/a&gt; (VAN) group which has helped developers connect from places as far afield as Texas and Australia!&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;James Bach's Blog (&lt;a href="http://www.satisfice.com/blog/"&gt;visit&lt;/a&gt;)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Interested in software testing? Then you need to quickly head over to &lt;a href="http://www.satisfice.com/blog/"&gt;James Bach's blog&lt;/a&gt; and check out his controversial, but smart and honest posts on the topic. To understand where he is coming from, check out his &lt;a href="http://www.satisfice.com/blog/archives/134"&gt;Schools of Testing ... Here to Stay&lt;/a&gt; blog post.&lt;/p&gt;  &lt;p&gt;So ...&lt;/p&gt;  &lt;p&gt;Who did I miss? Leave a comment and let me know!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-1634636177850361602?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=mRpoQ8vRjV4:5dJeHDz6prQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=mRpoQ8vRjV4:5dJeHDz6prQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=mRpoQ8vRjV4:5dJeHDz6prQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=mRpoQ8vRjV4:5dJeHDz6prQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=mRpoQ8vRjV4:5dJeHDz6prQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=mRpoQ8vRjV4:5dJeHDz6prQ:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=mRpoQ8vRjV4:5dJeHDz6prQ:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/mRpoQ8vRjV4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/1634636177850361602/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2009/02/challenging-software-development-blogs.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/1634636177850361602?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/1634636177850361602?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/mRpoQ8vRjV4/challenging-software-development-blogs.html" title="Challenging software development blogs" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_1GrPn-zPqXU/SZEC0dCC5vI/AAAAAAAAA7I/bqybOkPq-Qk/s72-c/59459065_0ed25c902e_o_thumb%5B4%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2009/02/challenging-software-development-blogs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UFQXY7eCp7ImA9WxVQF0U.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-4806938512091505384</id><published>2009-02-05T09:06:00.001+11:00</published><updated>2009-02-05T09:06:50.800+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-05T09:06:50.800+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term=".NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby on Rails" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="ALT.NET" /><title>The Fat Controller must die!</title><content type="html">&lt;p&gt;As most parents with little boys know the Fat Controller is a key figure in the &lt;a title="Tomas the Tank Engine website" href="http://www.thomasandfriends.com"&gt;Thomas the Tank Engine&lt;/a&gt; TV series (and books, toys, clothing, linen, bags, crockery, snacks, etc.). he is a cheery fellow, unfortunately prone to angrily shouting at train engines, but equally kindly and caring about his beloved vehicles (especially steam powered ones like Elizabeth the lorry). For the sake of my children I must point out that I have &lt;em&gt;no problem&lt;/em&gt; with &lt;em&gt;this&lt;/em&gt; jolly fellow.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_1GrPn-zPqXU/SYoRZdGoK-I/AAAAAAAAA6Q/ac2GGvlC4l4/s1600-h/fatcontroller4.jpg"&gt;&lt;img height="480" alt="fat controller" src="http://lh3.ggpht.com/_1GrPn-zPqXU/SYoRar6qTzI/AAAAAAAAA6U/TOs4lEUnWMI/fatcontroller_thumb2.jpg?imgmax=800" width="480" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There is another domain where fat controllers exist, and that is the world of the MVC (Model-View-Controller) pattern. The pattern has experienced a renaissance recently in web applications, particularly because of &lt;a title="Ruby on Rails website" href="http://rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt;, and now Microsoft's &lt;a title="ASP.NET MVC website" href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt; offering.&lt;/p&gt;  &lt;p&gt;Now these Ruby on Rails guys have been doing this for a little while longer than the ASP.NET guys, and one key paradigm became clear fairly early on:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Try to keep your controller actions and views as slim as possible.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This was most clearly explained by Jamis Buck in his excellent &lt;a title="Jamis&amp;#39; post" href="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model"&gt;Skinny Controller, Fat Model&lt;/a&gt; post back in 2006, which is still worth reading even if you don't use Ruby on Rails. More recently Ian Cooper &lt;a title="The Fat Controller post from Ian Cooper" href="http://codebetter.com/blogs/ian_cooper/archive/2008/12/03/the-fat-controller.aspx"&gt;has pointed out this is the same problem webforms had&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;This is the good old problem of domain-logic in code-behind that we had in ASP.NET webforms. Indeed Webforms are just another type of controller, a &lt;a href="http://martinfowler.com/eaaCatalog/pageController.html"&gt;page controller&lt;/a&gt;, and switching to an &lt;a href="http://martinfowler.com/eaaCatalog/applicationController.html"&gt;application controller&lt;/a&gt; model does not remove the need for us to watch for domain logic creeping into the controller. There can be a temptation to believe that just because the controller is easier to test it is now safe to put domain logic in there. Do not fall into that trap.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;In his book, &lt;a title="Domain-Driven Design at Amazon.com" href="http://www.amazon.com/exec/obidos/ASIN/0321125215/falkayncom06-20"&gt;Domain-Driven Design&lt;/a&gt;, &lt;a title="Eric Evans&amp;#39; bio" href="http://domaindrivendesign.org/about/index.html#eric"&gt;Eric Evans&lt;/a&gt; identifies this as the &lt;em&gt;Smart UI Anti-Pattern&lt;/em&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#8220;Put all the business logic into the user interface. Chop the application into small functions and implement them as separate user interfaces, embedding the business rules into them. Use a relational database as a shared repository of the data. Use the most automated UI building and visual programming tools available.&amp;#8221;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1GrPn-zPqXU/SYoRbZkaP5I/AAAAAAAAA6Y/laL4ehOGRng/s1600-h/SmartUI4.png"&gt;&lt;img height="243" alt="SmartUI" src="http://lh6.ggpht.com/_1GrPn-zPqXU/SYoRcvKB5uI/AAAAAAAAA6c/BwwEfk1NEcs/SmartUI_thumb2.png?imgmax=800" width="443" /&gt;&lt;/a&gt;       &lt;br /&gt;&lt;a title="Original blog post SmartUI image came from" href="http://codebetter.com/blogs/david.hayden/archive/2005/03/29/60806.aspx"&gt;&lt;font size="1"&gt;Image from David Hayden's blog&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Eric is kind (and pragmatic) enough to point out when it &lt;em&gt;is&lt;/em&gt; useful.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;#8220;A project needs to deliver simple functionality, dominated by data entry and display, with few business rules. Staff is not composed of advanced object modelers.&amp;#8221;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Clearly ASP.NET's webforms model encouraged this sort of practice (it is just far too easy to do), but surely a controller is a safe place for this code? After all, a controller can use many views, so it is more clearly separated than code behind. The problem is that whilst application logic (&amp;quot;Which view do I show next?&amp;quot;, &amp;quot;What domain object is handling this request?&amp;quot;) makes perfect sense in a controller, there are too many examples of them being used as stores for business/domain logic - which is the province of the domain model.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Hang on, we probably have a (ubiquitous) language problem here.&lt;/strong&gt; You see, the &amp;quot;Model&amp;quot; in MVC != the &amp;quot;domain model&amp;quot; in &lt;a title="Official DDD website" href="http://domaindrivendesign.org/"&gt;Domain-Driven Design&lt;/a&gt; (DDD). In fact we need to map the DDD concept of layered architecture to MVC in order to see what we truly have.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1GrPn-zPqXU/SYoRdWnHIxI/AAAAAAAAA6g/yuiPwYvbmo4/s1600-h/MvcMapToDdd8.png"&gt;&lt;img height="342" alt="MvcMapToDdd" src="http://lh6.ggpht.com/_1GrPn-zPqXU/SYoReDgD9jI/AAAAAAAAA6k/ZjeWZsSrgXQ/MvcMapToDdd_thumb4.png?imgmax=800" width="500" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Instead of giving the Model layer a fully fleshed out domain and supporting infrastructure (repository and services), many ASP.NET developers seem to want to treat the Model as pure database infrastructure and DAL (like the one in the Smart UI graphic above). This leads to the problem of where to put the business logic, and the natural assumption is that it belongs in the controller ... which is like making the navigator the captain of the ship.&lt;/p&gt;  &lt;p&gt;&lt;a title="Ian Cooper&amp;#39;s excellent post on The Fat Controller" href="http://codebetter.com/blogs/ian_cooper/archive/2008/12/03/the-fat-controller.aspx"&gt;Ian&lt;/a&gt; and &lt;a title="Jamis Buck&amp;#39;s excellent post on the Skinny Controller, Fat Model" href="http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model"&gt;Jamis&lt;/a&gt; have much more (technical) stuff to say on this subject so I'd advise you to check their posts out if you're into .NET or Rails, respectively, but do take this message with you, the Fat Controller must die!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-4806938512091505384?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=giXtpmjuY3s:UQtUO2pEt1Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=giXtpmjuY3s:UQtUO2pEt1Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=giXtpmjuY3s:UQtUO2pEt1Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=giXtpmjuY3s:UQtUO2pEt1Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=giXtpmjuY3s:UQtUO2pEt1Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=giXtpmjuY3s:UQtUO2pEt1Y:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=giXtpmjuY3s:UQtUO2pEt1Y:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/giXtpmjuY3s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/4806938512091505384/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2009/02/fat-controller-must-die.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/4806938512091505384?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/4806938512091505384?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/giXtpmjuY3s/fat-controller-must-die.html" title="The Fat Controller must die!" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_1GrPn-zPqXU/SYoRar6qTzI/AAAAAAAAA6U/TOs4lEUnWMI/s72-c/fatcontroller_thumb2.jpg?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.falkayn.com/2009/02/fat-controller-must-die.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQDR3o9eCp7ImA9WxRbGEs.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-6197014252603105399</id><published>2008-12-10T10:39:00.002+11:00</published><updated>2008-12-10T10:46:16.460+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T10:46:16.460+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="ALT.NET" /><title>Useful URLs</title><content type="html">&lt;p&gt;Whilst at the &lt;a href="http://sydneyaltdotnet.blogspot.com/"&gt;Sydney ALT.NET&lt;/a&gt; meeting &lt;strike&gt;this week&lt;/strike&gt; last month (this post took &lt;em&gt;far&lt;/em&gt; too long to write) I had two divergent lines of thought crossover and mashup inside my brain ...&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_1GrPn-zPqXU/ST8BYgCQOjI/AAAAAAAAA4g/eXeOEPsgcWU/s1600-h/office-sign-brain%5B2%5D.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="647" alt="office-sign-brain" src="http://lh3.ggpht.com/_1GrPn-zPqXU/ST8Blog1O6I/AAAAAAAAA4w/FR5793kI7ig/office-sign-brain_thumb%5B2%5D.jpg?imgmax=800" width="500" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I have been working for some months on a large corporate extranet portal and have been steadily fighting to keep the client focused on organising the site around, not &lt;em&gt;my&lt;/em&gt; ideas of their organisation's needs, not &lt;em&gt;their&lt;/em&gt; ideas of their organisation chart, but rather on the information needs of &lt;em&gt;their clients&lt;/em&gt;, the people the portal is really there for.&lt;/p&gt;  &lt;p&gt;This can be subtle, after all we all have good reasons for liking our ideas of how to organise the site. In fact we needed to make sure that the content authors from our client in fact could publish their content in a way that made sense to them (and thus organised around their needs).&lt;/p&gt;  &lt;p&gt;Back to the &lt;a href="http://sydneyaltdotnet.blogspot.com/"&gt;Sydney ALT.NET&lt;/a&gt; group, as Ali went about explaining the usual routing options with ASP.NET MVC it occurred to me that ASP/ASP.NET developers have been doing the same thing with the organisation of their application URLs. For years they have been organised around the structure of the site as it is developed, with folders in the original web projects visible on the final website URLs. Even when we have introduced user-friendly URLs, and used ASP.NET MVC's routing we still manage to come up with ideas that fit our view of the business model and not our users' needs.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Aside: Do users even care about URLs?&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;This is a &lt;em&gt;great&lt;/em&gt; question because it is at the heart of what I'm talking about here. My subjective view is that they do, I know that I do and I've seen people refer to the URL when trying to work out where they are within a site. However, many sites still have complex, unfriendly URLs and I think the average user (quite rightly) doesn't trust them.&lt;/p&gt;    &lt;p&gt;Let's look at it another way, do you care about your users? If you do then you will want to help them every way you can, including making your URLs friendly and useful.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I suspect that the real problem is that we lack a clear design language, or paradigm for helping us work these things out. After all when you can do &lt;em&gt;anything&lt;/em&gt; with a URL, who is to say what is right? Yet, if there is one thing the growth of the web has taught us, it is that UI standards grow out of users liking websites that follow common practices (e.g. shopping carts instead of bags, boxes or orders; horizontal main navigation menus as opposed to vertical, circular, drop down boxes, etc.). See &lt;a title="from the excellent End of Web Designa Alertbox" href="http://www.useit.com/alertbox/20000723.html"&gt;Jakob's Law of the Internet User Experience&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;&lt;strong&gt;Users spend most of their time on other sites.&lt;/strong&gt; This means that users prefer your site to work the same way as all the other sites they already know.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Similarly we may find that websites that follow &lt;a title="Rob Conery&amp;#39;s excellent post about doing this with ASP.NET MVC" href="http://blog.wekeroad.com/2007/12/06/aspnet-mvc-using-restful-architecture/"&gt;RESTful URL&lt;/a&gt; paradigms with particularly clear syntax are seen as much more useful than ones where you have to rely on the menu structure or search. Here is a (contrived) online shopping example:&lt;/p&gt;  &lt;p&gt;Old School (ASP.NET Webforms):&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;http://domain/shop/cart/default.aspx?Method=AddCart&amp;amp;ProductId=123&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;New School (ASP.NET MVC):&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;http://domain/cart/add/123&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Most Useful (or not):&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;http://domain/buy/Sony/Walkman?quantity=1&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Now I'm unhappy with that last example (perhaps going against the &amp;quot;shopping cart&amp;quot; paradigm muddles things), but my point is that we should phrase things the way the user sees them and not what suits our architecture/business model. Give the URL back to the user as another useful tool and see what happens!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-6197014252603105399?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=3nT2caKcx7c:cN_NmGx5-28:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=3nT2caKcx7c:cN_NmGx5-28:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=3nT2caKcx7c:cN_NmGx5-28:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=3nT2caKcx7c:cN_NmGx5-28:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=3nT2caKcx7c:cN_NmGx5-28:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=3nT2caKcx7c:cN_NmGx5-28:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=3nT2caKcx7c:cN_NmGx5-28:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/3nT2caKcx7c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/6197014252603105399/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2008/12/useful-urls.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/6197014252603105399?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/6197014252603105399?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/3nT2caKcx7c/useful-urls.html" title="Useful URLs" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_1GrPn-zPqXU/ST8Blog1O6I/AAAAAAAAA4w/FR5793kI7ig/s72-c/office-sign-brain_thumb%5B2%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2008/12/useful-urls.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IDSXgyeCp7ImA9WxRUGUs.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-2354786856036809001</id><published>2008-11-30T00:32:00.001+11:00</published><updated>2008-11-30T00:32:58.690+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-30T00:32:58.690+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Elcom" /><category scheme="http://www.blogger.com/atom/ns#" term="personal" /><category scheme="http://www.blogger.com/atom/ns#" term="news" /><title>My new role at Elcom Technology</title><content type="html">&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="76" alt="elcomlogo-highres" src="http://lh4.ggpht.com/_1GrPn-zPqXU/STFEbaLZ2wI/AAAAAAAAA4U/ih_uWap6dxQ/elcomlogo-highres_thumb%5B8%5D.png?imgmax=800" width="240" align="right" border="0" /&gt;Some of you might be aware that Elcom's Technology Director and my friend &lt;a title="Craig&amp;#39;s blog" href="http://www.craigbailey.net"&gt;Craig Bailey&lt;/a&gt; is leaving &lt;a title="Our employer" href="http://www.elcom.com.au/"&gt;Elcom Technology&lt;/a&gt; - in fact his last day was last Friday. As our Technical Director he was inspiring, motivating and a great encourager - he let us know we had his confidence and trust, and backed that attitude up with his words and actions when under stress.&lt;/p&gt;  &lt;p&gt;I will be stepping into Craig's shoes, and taking on the role of Technical Director for Elcom and helping guide our development, sysadmin and helpdesk teams. Whilst we have some similarities, I have more of a focus on &lt;a title="My post&amp;#39;s on Agile development" href="http://falkayn.blogspot.com/search/label/Agile%20Development"&gt;Agile development&lt;/a&gt; and &lt;a title="My post&amp;#39;s on software craftsmanship" href="http://falkayn.blogspot.com/search/label/craftsmanship"&gt;software craftsmanship&lt;/a&gt; (as &lt;a href="http://www.craigbailey.net/live/post/2008/11/13/Software-Craftsmanship.aspx"&gt;Craig has mentioned&lt;/a&gt;). I will probably be taking a more hands-on approach to the role - simply because I have contributed to the dev work I will now be managing.&lt;/p&gt;  &lt;p&gt;Craig and I have been discussing this role over the last month or so, and he &lt;a title="Craig&amp;#39;s post that helped me understand it" href="http://www.craigbailey.net/live/post/2008/10/20/My-ideal-role.aspx"&gt;got me interested&lt;/a&gt; in the &lt;a title="The Hedgehog Concept explained" href="http://www.jimcollins.com/lab/hedgehog/p2.html"&gt;hedgehog concept&lt;/a&gt;. That last link explains it pretty well, but basically it is all about helping you focus on what you &lt;em&gt;could be&lt;/em&gt;&amp;#160;&lt;strong&gt;best at&lt;/strong&gt; in the world, how you can add (&lt;strong&gt;money&lt;/strong&gt;) value and what you are most &lt;strong&gt;passionate &lt;/strong&gt;about. The point where you will be most effective, rewarded and fulfilled, lies in the region where those three overlap.&lt;/p&gt;  &lt;p&gt;After thinking about these, and discussing them with people that know me, my (current) take on these three is below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_1GrPn-zPqXU/STFEcZGsJYI/AAAAAAAAA4Y/eVxl0lxUrrI/Hedgehog%20Circles%20-%20Best%5B8%5D.png?imgmax=800"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="480" alt="Hedgehog Circles - Best" src="http://lh4.ggpht.com/_1GrPn-zPqXU/STFEfxTXTRI/AAAAAAAAA4c/U5lPiPD3hsQ/Hedgehog%20Circles%20-%20Best_thumb%5B6%5D.png?imgmax=800" width="490" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I had followed a similar process many times in the past, but without the emphasis on coming up with a &lt;em&gt;&amp;quot;simple, crystalline concept that flows from deep understanding about the intersection&amp;quot;&lt;/em&gt; of these three circles. Or as my Dad put it to me, something actionable and concrete.&lt;/p&gt;  &lt;p&gt;Being Technical Director at Elcom offers me a chance to move closer to that intersection point, and I hope that in my first few months I can work on those things that might currently distract me from that focus in order to generate some very tangible results for myself and Elcom's owners.&lt;/p&gt;  &lt;p&gt;I am a firm believer in &lt;a title="Wikipedia&amp;#39;s explanation of servant leadership" href="http://en.wikipedia.org/wiki/Servant_leadership"&gt;servant leadership&lt;/a&gt; and am honoured that I have some of the best technical people it's been my pleasure to work with in our development, sysadmin and helpdesk teams. With great people in the team around you, it certainly makes my job easier, and more pleasurable. Like a good &lt;a title="Mountain Goat Software&amp;#39;s definition of scrum master" href="http://www.mountaingoatsoftware.com/scrum/scrummaster.php"&gt;scrum master&lt;/a&gt; I am aiming to remove obstacles in the way of our technical teams and act as &lt;a title="Wikipedia&amp;#39;s definition of force multiplier" href="http://en.wikipedia.org/wiki/Force_multiplier"&gt;force multiplier&lt;/a&gt; for the whole team (the &lt;a title="Wikipedia definition of the OODA Loop" href="http://en.wikipedia.org/wiki/OODA_Loop"&gt;OODA Loop&lt;/a&gt; has some interesting parallels with the &lt;a title="Agile Manifesto&amp;#39;s 12 Principles" href="http://agilemanifesto.org/principles.html"&gt;Agile principles&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;It should be an interesting journey ahead!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-2354786856036809001?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5HfCC_MVxAo:zjMB2yrILHQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5HfCC_MVxAo:zjMB2yrILHQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5HfCC_MVxAo:zjMB2yrILHQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5HfCC_MVxAo:zjMB2yrILHQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=5HfCC_MVxAo:zjMB2yrILHQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=5HfCC_MVxAo:zjMB2yrILHQ:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=5HfCC_MVxAo:zjMB2yrILHQ:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/5HfCC_MVxAo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/2354786856036809001/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2008/11/my-new-role-at-elcom-technology.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/2354786856036809001?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/2354786856036809001?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/5HfCC_MVxAo/my-new-role-at-elcom-technology.html" title="My new role at Elcom Technology" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_1GrPn-zPqXU/STFEbaLZ2wI/AAAAAAAAA4U/ih_uWap6dxQ/s72-c/elcomlogo-highres_thumb%5B8%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.falkayn.com/2008/11/my-new-role-at-elcom-technology.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEGR347fSp7ImA9WxRVEE4.&quot;"><id>tag:blogger.com,1999:blog-5201404.post-5975263800040152674</id><published>2008-11-07T09:52:00.003+11:00</published><updated>2008-11-07T16:10:26.005+11:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-07T16:10:26.005+11:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Elcom" /><category scheme="http://www.blogger.com/atom/ns#" term="Agile Development" /><title>My first Agile retrospective</title><content type="html">&lt;p&gt;&lt;strong&gt;I facilitated my first Agile retrospective today&lt;/strong&gt;, going over a six month project with 12 people, mostly from &lt;a href="http://www.elcom.com.au/"&gt;Elcom's&lt;/a&gt; development team, along with one or two others from the systems admin, project management and implementation teams. We followed the format suggested by the Retrospective Goddesses in their &lt;a title="Agile Retrospectives at Amazon.com" href="http://www.amazon.com/exec/obidos/ASIN/0977616649/falkayncom06-20"&gt;Agile Retrospectives&lt;/a&gt; book. It was an interesting and rewarding experience, so I thought I'd document it here.&lt;/p&gt;  &lt;p&gt;&lt;img height="375" alt="P1050666" src="http://lh6.ggpht.com/_1GrPn-zPqXU/SRN1NXkNT8I/AAAAAAAAA24/lsAewsfIog0/P10506665.jpg?imgmax=800" width="500" /&gt; &lt;/p&gt;  &lt;p style="font-size: 10px; margin: -14px 5px 5px; color: #808080"&gt;Alan Lee, Rajesh Stephen and Chae Wan Kim do some group work.&lt;/p&gt;  &lt;p&gt;This project had been a large and challenging one for us, whilst still a success for the ultimate client. It had sucked in most of the development team at one point and I was one of the few people not directly involved. When our management decided to run the retrospective they had envisaged nothing more than a brainstorming session and opportunity to vent some emotions.&lt;/p&gt;  &lt;p&gt;We had purchased the Agile Retrospectives book some months ago and I suggested that our &lt;a href="http://www.craigbailey.net/"&gt;Technical Director&lt;/a&gt; run it using the book - except it had somehow gotten stuck in my bookshelf at home. Whilst bringing it in I flicked through it and noticed that the main facilitator role sounded exactly like the facilitator role I've been fulfilling in the &lt;a href="http://www.careforcelifekeys.org/aus/index.php?option=com_content&amp;amp;task=view&amp;amp;id=11&amp;amp;Itemid=12"&gt;Valiant Man&lt;/a&gt; courses I've been involved in this year. So I volunteered myself as the facilitator, negotiated to increase the time from one to two hours and promptly got stuck with all the preparation involved!&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 130%"&gt;Working Agreement&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;As the person with the most experience of this sort of group work I suggested most of the agreements, but the group did come up with &amp;quot;Don't interrupt others&amp;quot; on their own. Going &amp;quot;topless&amp;quot; was particularly hard for the managers in the group - but I think it really helped them engage with the process.&lt;/p&gt;  &lt;p&gt;&lt;img height="375" alt="P1050656" src="http://lh4.ggpht.com/_1GrPn-zPqXU/SRN1OF_UqtI/AAAAAAAAA28/-YnUSNhlyhA/P10506566.jpg?imgmax=800" width="500" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 130%"&gt;Goal&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;This was an interesting one, I had selected a reasonably neutral, positive (and &lt;em&gt;useful&lt;/em&gt;) goal by focusing on one of the unusual characteristics of the project, our work with a partner organisation. But the team thought that added to this should be a focus on big projects as this was another defining characteristic of this particular project.&lt;/p&gt;  &lt;p&gt;&lt;img height="376" alt="P1050658" src="http://lh4.ggpht.com/_1GrPn-zPqXU/SRN1O7LNGnI/AAAAAAAAA3A/9lvERS-YJW8/P10506587.jpg?imgmax=800" width="500" /&gt; &lt;/p&gt;  &lt;p&gt;I then got everyone to give us a quick one or two word description of their feeling or state at the end of this project. This was interesting as we got flat out positive and negative responses as well as mixed ones like, &amp;quot;stressed, happy.&amp;quot; The range of emotions described was a reminder that not everyone sees things the same way.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 130%"&gt;Information Gathering&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;I chose the timeline method to draw out details from the group as that would allow us to vary the amount of time we spent on it, and for a six month long project would help people remember their experiences.&lt;/p&gt;  &lt;p&gt;&lt;img height="375" alt="P1050660" src="http://lh6.ggpht.com/_1GrPn-zPqXU/SRN1Pkz8mGI/AAAAAAAAA3E/C-xQQTwG03A/P10506605.jpg?imgmax=800" width="500" /&gt; &lt;/p&gt;  &lt;p style="font-size: 10px; margin: -14px 5px 5px; color: #808080"&gt;Tracey Schneider, Gavin Silver, Balaji Sridharan and Chae Wan Kim place their cards&lt;/p&gt;  &lt;p&gt;The group broke out into three groups of 4 and worked on identifying important events in the project timeline, categorised into client (blue), Elcom (green), people/team (pink) and technical (yellow). I had previously prepared the whiteboard by separating it into months, and including the number of days of developer time used in each one.&lt;/p&gt;  &lt;p&gt;We ended up with a very interesting overview of the project that included many events that people had forgotten, or not even known about, as well as some that everyone was affected by (we stacked duplicate cards on top of each other). I mostly stood back and watched (that's me below, closest to the camera), and occasionally stepped in to help people understand how to handle duplicates (stacking), confusions with long-running events (put multiple cards across months at same level) and disagreements about what was an event (pretty much anything could be).&lt;/p&gt;  &lt;p&gt;&lt;img height="375" alt="P1050663" src="http://lh6.ggpht.com/_1GrPn-zPqXU/SRN1QKKiMzI/AAAAAAAAA3I/K9bKgoCBJGI/P10506635.jpg?imgmax=800" width="500" /&gt; &lt;/p&gt;  &lt;p style="font-size: 10px; margin: -14px 5px 5px; color: #808080"&gt;Craig Bailey, Tracey Schneider and Gavin Silver check out the cards, watched by me.&lt;/p&gt;  &lt;p&gt;Once each group had their cards up, I asked people to review the board, one group at a time, and discuss what others had identified, as well as looking for duplicates or events still missing. That only got us one or two extra events, but gave everyone a chance to see the total timeline up close.&lt;/p&gt;  &lt;p&gt;I then told each participant that they had five positive (green) dots and five negative (red) dots to apply to cards on the timeline - but they could only put one dot on each card. They came up in pairs to dot the cards. I wanted to use colour coded dots, but we made do with red and green pens. You can see the result below:&lt;/p&gt;  &lt;p&gt;&lt;img height="375" alt="P1050671 - Copy" src="http://lh3.ggpht.com/_1GrPn-zPqXU/SRPNwI6LYbI/AAAAAAAAA3Y/3JYA-ukn8KY/P1050671%20-%20Copy%5B5%5D.jpg?imgmax=800" width="500" /&gt; &lt;/p&gt;  &lt;p&gt;People wanted to know how to identify what was positive, or negative, but I pointed out it wasn't supposed to be scientific, just a subjective review of their feelings about the events listed. That worried people less than I thought it might. &lt;/p&gt;  &lt;p&gt;Once they had all finished I took over and went through the events that seemed the most interesting (lots of green dots, red dots, or a mix). I also pointed out events that were usually regarded as important, but that ended up having little significance to the team.&lt;/p&gt;  &lt;p&gt;Some of the event cards turned out to be confusing, so I also queried what they meant and made sure I added text where necessary to help clarify their meaning. One of the events that had a real mix of dots, turned out to be interpreted two completely different ways, so we drew a line between the dots and added text to each side to explain further.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 130%"&gt;Identify Experiments and Actions&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Unfortunately time was short for this retrospective, so I had planned a quick 5 Whys activity to help the team quickly find useful insights. They broke up into small groups/pairs (two groups of 3 and three pairs) and started asking why.&lt;/p&gt;  &lt;p&gt;5 Whys has one participant ask the others in their group why an event was important, positive or negative. It was left pretty open for them to choose their favourite item from the timeline. Once they got the answer, then then asked why that was important/relevant. They would do this a total of 5 times, and only record the answers to the fourth and fifth questions. Every member of each group got a chance to do this at least once and we got some funny and insightful responses as a result (one one of the cards below the fifth answer was that the person was &amp;quot;speechless&amp;quot;, so they drew an empty word bubble!).&lt;/p&gt;  &lt;p&gt;&lt;img height="375" alt="P1050676" src="http://lh5.ggpht.com/_1GrPn-zPqXU/SRN1Rt7r-8I/AAAAAAAAA3Q/6DUR-dVwMUE/P10506765.jpg?imgmax=800" width="500" /&gt; &lt;/p&gt;  &lt;p&gt;Next was the only awkward part of the retrospective (from my perspective). I had planned for people to do a vote on each item with one stroke per card, as many strokes as they wanted (hat-tip to ThoughtWorkers &lt;a href="http://babbleburblebanterbalderdash.blogspot.com/"&gt;Lachlan Heasman&lt;/a&gt;/&lt;a href="http://jchyip.blogspot.com/"&gt;Jason Yip&lt;/a&gt; for that one!), but the criteria I wanted to use was &amp;quot;which item would you most want to work on&amp;quot;. Indeed this is what I announced to the group, but I noticed when people actually came up to vote that the question/answer cards did not identify the experiment/action that could be taken to answer them.&lt;/p&gt;  &lt;p&gt;We were over-time by this stage, so I made sure everyone knew what the problem was, but let them keep voting anyway. I then had to step in to organise the cards by stroke-votes (as shown above) and then run a quick discussion of what steps might be taken for each one.&lt;/p&gt;  &lt;p&gt;&lt;img height="167" alt="P1050677" src="http://lh4.ggpht.com/_1GrPn-zPqXU/SRN1SKBIRPI/AAAAAAAAA3U/5Nd3Rb87hpQ/P10506776.jpg?imgmax=800" width="125" align="right" /&gt;The result was a set of 5 actions that were not really owned by the team. Coincidentally this was also when the more vocal and confident management types really shined, limiting input from others. To be fair (to myself and the team) this project highlighted some really basic issues in our project management, sales and quoting procedures - and these caused so much grief that it was a bit hard to see past them to other problems that might be owned by more of the team.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: 130%"&gt;Summary&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;I'm really proud of how enthusiastic the development team were in approaching this.&lt;/strong&gt; I did a Return On Time Invested poll at the end of the event and on a rating of 0-4 (0=No return, 2=Break even, 4=High return) most of the guys thought it was a 4, some thought it was 3 and a quarter of the group rated it as a 2 (one of those turned out to misunderstand what we were measuring and later said she would have voted 4 too!).&lt;/p&gt;  &lt;p&gt;We should be making this a regular part of our Agile process and I will certainly be agitating for it occur more often. I'm sure that having more retrospectives will help identify some of the more fundamental issues that affect the development team and get us continually improving.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5201404-5975263800040152674?l=blog.falkayn.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=Q_Uic0Cd0_o:U1y-GeWE6nk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=Q_Uic0Cd0_o:U1y-GeWE6nk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=Q_Uic0Cd0_o:U1y-GeWE6nk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=Q_Uic0Cd0_o:U1y-GeWE6nk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=Q_Uic0Cd0_o:U1y-GeWE6nk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/FalkaynsBlog?a=Q_Uic0Cd0_o:U1y-GeWE6nk:wF9xT3WuBAs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/FalkaynsBlog?i=Q_Uic0Cd0_o:U1y-GeWE6nk:wF9xT3WuBAs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FalkaynsBlog/~4/Q_Uic0Cd0_o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.falkayn.com/feeds/5975263800040152674/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.falkayn.com/2008/11/my-first-agile-retrospective.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/5975263800040152674?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5201404/posts/default/5975263800040152674?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/FalkaynsBlog/~3/Q_Uic0Cd0_o/my-first-agile-retrospective.html" title="My first Agile retrospective" /><author><name>Falkayn</name><uri>http://www.blogger.com/profile/13474476407114622880</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="29" height="32" src="http://4.bp.blogspot.com/_1GrPn-zPqXU/STEzmxmVINI/AAAAAAAAA38/npsC2ZDPkVc/S220/AngusBlue.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_1GrPn-zPqXU/SRN1NXkNT8I/AAAAAAAAA24/lsAewsfIog0/s72-c/P10506665.jpg?imgmax=800" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.falkayn.com/2008/11/my-first-agile-retrospective.html</feedburner:origLink></entry></feed>

