<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>new ThoughtStream("Derick Bailey");</title><link>http://www.lostechies.com/blogs/derickbailey/default.aspx</link><description>Question Everything. Especially Your Own Assumptions.</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><geo:lat>31.514067</geo:lat><geo:long>-97.235465</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/DerickBailey" type="application/rss+xml" /><feedburner:emailServiceId>DerickBailey</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>Theory Of Constraints: Productivity Metrics in Software Development</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/SOQ2gmRBZmE/theory-of-constraints-productivity-metrics-in-software-development.aspx</link><pubDate>Fri, 03 Jul 2009 17:38:16 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22619</guid><dc:creator>derick.bailey</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=22619</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=22619</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/07/03/theory-of-constraints-productivity-metrics-in-software-development.aspx#comments</comments><description>&lt;p&gt;In the past, I’ve been a true believer that software development is not really possible to measure from a productivity perspective. I was ignorant, basically. I’m now a bit wiser and I understand that software development is no different than any other product development process. We can and should measure productivity of software developers by understanding that we are building business value via functionality that the end-user wants. So, we should essentially be measuring our progress toward the end user facing functionality (as an over-simplification). &lt;/p&gt;  &lt;h3&gt;A Paper On The Theory Of Constraints&lt;/h3&gt;  &lt;p&gt;Several months ago, I wrote up a paper for an internal company effort to help define productivity metrics for software developers. This paper is largely based on the work of &lt;a href="http://agilemanagement.net/"&gt;David J. Anderson&lt;/a&gt;, in “&lt;a href="http://www.amazon.com/Agile-Management-Software-Engineering-Constraints/dp/0131424602"&gt;Agile Management For Software Engineering&lt;/a&gt;”. It also includes some of my own interpretations and understandings of the Theory of Constraints. &lt;/p&gt;  &lt;p&gt;The original intent of this paper was to facilitate the discussion of productivity and metrics in the Development Department at McLane Advanced Technologies, LLC., where I work. I decided to release it to the world, to hopefully help others understand how we can measure productivity as software developers. I did not intend this to be a comprehensive or exhaustive discussion of the points within, but am trying to spur additional research and conversations. I hope you enjoy reading it as much as I enjoyed writing it.&lt;/p&gt;  &lt;h3&gt;Download The Paper&lt;/h3&gt;  &lt;p&gt;You can download the PDF here: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.lostechies.com/media/p/22618.aspx"&gt;&lt;strong&gt;The Theory of Constraints: Productivity Metrics In Software Development&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22619" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=SOQ2gmRBZmE:opU10jJsLM0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=SOQ2gmRBZmE:opU10jJsLM0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=SOQ2gmRBZmE:opU10jJsLM0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=SOQ2gmRBZmE:opU10jJsLM0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=SOQ2gmRBZmE:opU10jJsLM0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=SOQ2gmRBZmE:opU10jJsLM0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=SOQ2gmRBZmE:opU10jJsLM0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=SOQ2gmRBZmE:opU10jJsLM0:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/SOQ2gmRBZmE" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Throughput/default.aspx">Throughput</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/E-Books/default.aspx">E-Books</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Theory+Of+Constraints/default.aspx">Theory Of Constraints</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Productivity/default.aspx">Productivity</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Metrics/default.aspx">Metrics</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/07/03/theory-of-constraints-productivity-metrics-in-software-development.aspx</feedburner:origLink></item><item><title>How To? Highly Complex Query Generating Based On Security Needs</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/sO_yoD96rhw/how-to-highly-complex-query-generating-based-on-security-needs.aspx</link><pubDate>Thu, 25 Jun 2009 20:26:29 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22430</guid><dc:creator>derick.bailey</dc:creator><slash:comments>11</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=22430</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=22430</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/25/how-to-highly-complex-query-generating-based-on-security-needs.aspx#comments</comments><description>&lt;p&gt;I have the following object model:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="508" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_38648237.png" width="512" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;An Office belongs to one Office Group. An Office also belongs to one Office Region. There is no relationship between Office Group and Office Region. They are two separate groupings for various reasons. A Counselor belongs to one Office. A Veteran is assigned to one Office.&lt;/p&gt;  &lt;p&gt;I need to implement the following security rules for a Counselor looking at Veterans, starting with “deny access to all Veteran records, unless any of the following are true”:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;If a Counselor is an Administrator (a role of the Counselor), that Counselor can see all Veteran records &lt;/li&gt;    &lt;li&gt;A Counselor can see any Veteran that has no current Office assignment &lt;/li&gt;    &lt;li&gt;A Counselor can see Veterans that are assigned to an Office within the Counselor’s Office Group &lt;/li&gt;    &lt;li&gt;If a Counselor belongs to a “Regional Office”, that Counselor can see Veterans that are assigned to that Region &lt;/li&gt;    &lt;li&gt;… a few others in similar fashion … &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I also need to implement the following around the above rules:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;When a Counselor searches for Veterans, they are only allowed to see search results that meet the above criteria &lt;/li&gt;    &lt;li&gt;When a Counselor views the detail of a Veteran, they are only allowed to see the the Veteran if the above criteria is met. This includes, if a Counselor tries to manually load a Veteran (manually type in url “id=1234”)&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;… and the Counselor is not allowed to see the Veteran, show a “Not Authorized” message &lt;/li&gt;      &lt;li&gt;… and the Vet does not exist, show a “Vet Does Not Exist” message &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;p&gt;so…&lt;/p&gt;  &lt;p&gt;how do you create a search process around a security need like this? How do you go about creating a very complex rule system to determine which Veterans the Counselor can see? In my ideal world, I’d have some way of checking this security need against the search results and against an individual veteran record, without duplicating the code or logic for that check anywhere… is this a realistic expectation? What “standard” security implementations are out there, that would help me resolve my needs?&lt;/p&gt;  &lt;p&gt;This is being done in C# in an ASP.NET Webforms app, using NHibernate for our ORM. I don’t expect NHibernate to be able to solve this problem for us, but if it can, that’s even better. And, I do expect to be able to write some sort of Unit or Integration tests around whatever the process is.&lt;/p&gt;  &lt;p&gt;Any advice or help is appreciated.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22430" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=sO_yoD96rhw:zDIQRwZBRUo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=sO_yoD96rhw:zDIQRwZBRUo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=sO_yoD96rhw:zDIQRwZBRUo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=sO_yoD96rhw:zDIQRwZBRUo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=sO_yoD96rhw:zDIQRwZBRUo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=sO_yoD96rhw:zDIQRwZBRUo:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=sO_yoD96rhw:zDIQRwZBRUo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=sO_yoD96rhw:zDIQRwZBRUo:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/sO_yoD96rhw" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Security/default.aspx">Security</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/25/how-to-highly-complex-query-generating-based-on-security-needs.aspx</feedburner:origLink></item><item><title>Cloning Or Converting Linux VM From VMWare Workstation To ESX Server: ETH0 Gone. ETH1 Available?</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/l6SyndvX814/cloning-or-converting-linux-vm-from-vmware-workstation-to-esx-server-eth0-gone-eth1-available.aspx</link><pubDate>Sat, 20 Jun 2009 18:57:01 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22311</guid><dc:creator>derick.bailey</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=22311</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=22311</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/20/cloning-or-converting-linux-vm-from-vmware-workstation-to-esx-server-eth0-gone-eth1-available.aspx#comments</comments><description>&lt;p&gt;I ran into a fun situation yesterday. I downloaded a virtual appliance for the &lt;a href="http://www.agile42.com/cms/pages/agilo/"&gt;Agilo Trac Plugin&lt;/a&gt; (which, if you’re a &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; user and trying to do sprints or iterations with it, you need to get this. It’s free and it rocks.) Turns out this VM is a Debian distribution. (I’m certainly no linux guru, but I can usually find my way around.)&lt;/p&gt;  &lt;p&gt;Starting up the VM on my local VMWare Workstation worked fine. The distro is configured for DHCP, and my VM network bridged to my box, found the company network and found an IP for the VM. You can see the IP show up in the screen shot below:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_6ACE3661.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="326" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_188BD95A.png" width="449" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After playing with the Agilo app for a few minutes, I wanted to share it with my coworkers and get their opinions. Fortunately for me, I’ve been helping the company grow a rather nice VMWare ESX Server infrastructure for our development needs. So, I thought the easy thing to do would be to migrate the VM up to a server and make it available.&lt;/p&gt;  &lt;p&gt;I go through the “Export” process from VMWare Workstation and send it up to a server with no problems. I configured a static IP address in the /etc/network/interfaces file, &lt;a href="http://www.cyberciti.biz/tips/howto-ubuntu-linux-convert-dhcp-network-configuration-to-static-ip-configuration.html"&gt;as described in this article&lt;/a&gt;. However, when I get the server based VM up and running again, I run into a problem:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_03B9E0DA.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="335" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_27FEC55C.png" width="497" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;p&gt;Note the first error circled: “eth0: error fetching interface information: Device not found”. And the second error circled: no ip address!!! That’s not good… how am I supposed to get to the box without an IP address… so, I check the network adapters through ifconfig to see if I can get eth0 back up. &lt;/p&gt;  &lt;p&gt;No luck - “eth0: ERROR while getting interface flags: No such device”&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_3E0530EE.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="62" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_249D2DB4.png" width="552" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Checking ifconfig, i see that there’s only an “eth1” configured in the vm.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_2F5A8509.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="351" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_5FC0E3B2.png" width="507" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After some serious hair-pulling-out frustration, several coworkers not having any clue, and a general sense of doom and gloom; I managed to pull some serious google-fu out, &lt;a href="http://www.nabble.com/Changing-NIC-in-existing-Server-results-in-no-ETH0-td19956170.html"&gt;and found this post&lt;/a&gt;. The information provided looked like what I needed:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;either        &lt;br /&gt;        &lt;br /&gt;- the kernel in Lenny is newer and &lt;b&gt;has&lt;/b&gt; a driver that is missing (or &lt;b&gt;not&lt;/b&gt;        &lt;br /&gt;&amp;#160; fully functional for your hardware) on the other system         &lt;br /&gt;&lt;/em&gt;&lt;em&gt;       &lt;br /&gt;or         &lt;br /&gt;&lt;/em&gt;&lt;em&gt;       &lt;br /&gt;- the new card was assigned &lt;b&gt;eth1&lt;/b&gt; because the previous card&amp;#39;s mac address         &lt;br /&gt;&amp;#160; is still listed in the database of persistent &lt;b&gt;ethernet&lt;/b&gt; device names &lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Boot the problematic system and run &amp;quot;/sbin/ifconfig&amp;quot;. If you see the        &lt;br /&gt;3Com NIC listed as &lt;b&gt;eth1&lt;/b&gt; then you can edit the file         &lt;br /&gt;        &lt;br /&gt;&lt;strong&gt;/etc/udev/rules.d/70-persistent-net.rules          &lt;br /&gt;&lt;/strong&gt;        &lt;br /&gt;to assign &lt;b&gt;eth0&lt;/b&gt; to it. (Remove or comment out the entry for the old NIC.) &lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As it turned out, the conversion process from local VMWare workstation up to VMWare ESX Server caused the virtual NIC’s MAC Address to change. So I go hunting for the file they talk about, and it’s not there. Fortunately, it was only a few characters off from my debian box:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;/etc/udev/rules.d/z25-persistent-net.rules&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;looking at the contents of this file, I found the system’s configuration for all of the network adapters, and noticed that there are two of them in my file:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_6EA812CC.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="116" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_66B0706A.png" width="733" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;but I know that the VM only has one virtual NIC. so, following the advice from the post above, I comment out the current “eth0” and rename “eth1” to “eth0”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_2D2D6073.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="111" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_532310C9.png" width="733" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Reboot the box and it works!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_19A000D2.png"&gt;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="135" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_3D59286C.png" width="416" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22311" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=l6SyndvX814:pGj3843Ry_w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=l6SyndvX814:pGj3843Ry_w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=l6SyndvX814:pGj3843Ry_w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=l6SyndvX814:pGj3843Ry_w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=l6SyndvX814:pGj3843Ry_w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=l6SyndvX814:pGj3843Ry_w:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=l6SyndvX814:pGj3843Ry_w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=l6SyndvX814:pGj3843Ry_w:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/l6SyndvX814" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Linux/default.aspx">Linux</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Networking/default.aspx">Networking</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/20/cloning-or-converting-linux-vm-from-vmware-workstation-to-esx-server-eth0-gone-eth1-available.aspx</feedburner:origLink></item><item><title>A Kanban Is Just A Signal To Do Work</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/B4Zol1P7g_g/a-kanban-is-just-a-signal-to-do-work.aspx</link><pubDate>Thu, 18 Jun 2009 21:10:03 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22185</guid><dc:creator>derick.bailey</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=22185</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=22185</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/18/a-kanban-is-just-a-signal-to-do-work.aspx#comments</comments><description>&lt;p&gt;A &lt;a href="http://en.wikipedia.org/wiki/Kanban"&gt;kanban&lt;/a&gt; is &lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2008/11/20/kanban-pulling-value-from-the-supplier.aspx"&gt;a signal to do something&lt;/a&gt;. I don’t think kanban implies a pull-based system, honestly. &lt;a href="http://agilejoe.lostechies.com/"&gt;Joe Ocampo&lt;/a&gt; showed it best in his Scrumban presentation at Austin Code Camp:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_67709A35.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="180" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_0CFA1797.png" width="240" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;That’s not a signal to pull anything… it’s a signal to RUN FOR YOUR LIFE!!! :) Now, having said that – I do think that a pull-based system is facilitated by kanban. &lt;/p&gt;  &lt;h3&gt;A Simple Kanban Enabled, Pull-Based Workflow&lt;/h3&gt;  &lt;p&gt;In a pull-based system, a kanban is used to signal the upstream process of the downstream needs. As an example, let’s look at a simple 2-step process. &lt;/p&gt;  &lt;p&gt;Step 1 produces 10 parts and moves them into the “DONE” queue, saying that they are ready to be used by the next step.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="230" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_376648B4.png" width="282" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Step 2 then uses 5 of those parts by pulling them out of Step 1’s “DONE” queue.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="229" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_05027535.png" width="281" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;When Step 2 pulls those 5 parts out, the person doing Step 2 will signal Step 1 to make more parts. That is, they send a kanban back to Step 1, telling Step 1 that more parts need to be produced. This kanban may be a card, an email, a tap-on-the-shoulder, or any other mechanism that anyone can think of, to tell the previous step that work needs to be done.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img title="image" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="291" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_682B7EB3.png" width="413" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;When Step 2 is done, the parts can be put into the next queue. Step 2 then pulls the next set of parts out of Step 1’s “DONE” queue, and the cycle starts over…&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="310" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_1D25DF90.png" width="524" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;To properly understand the flow of work in this diagram, read from right to left:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Finished work put into Step 2’s “done” queue &lt;/li&gt;    &lt;li&gt;Next set of available parts pulled into Step 2 &lt;/li&gt;    &lt;li&gt;Step 2 signals Step 1 that work needs to be done &lt;/li&gt;    &lt;li&gt;Finished parts pulled from Step 1 into Step 1 “done” queue &lt;/li&gt;    &lt;li&gt;Repeat from #1 &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;A Task Card Is Not A Kanban&lt;/h3&gt;  &lt;p&gt;I was involved in a project that ended a few months ago, where we did some experimenting with a pull-based, kanban-enabled workflow. The following picture is what our process looked like and was a direct outcome of the research and learning that went into my previous &lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2008/11/19/adventures-in-lean.aspx"&gt;Kanban In Software Development posts&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img title="image_thumb2" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="446" alt="image_thumb2" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb2_5F00_35B57CE0.png" width="596" border="0" /&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;(&lt;strong&gt;Note:&lt;/strong&gt; Please disregard the glaring problems with this board. It was a learning experience for me and my team. :) )&lt;/p&gt;  &lt;p&gt;Our kanban – our signal for an upstream process to provide more input for the downstream process - was not the task cards that moved across the board. In fact, I think calling a task card (a user story, an MMF, a function point, or whatever it is) a kanban is a serious misrepresentation of kanban. The task cards are exactly that – task cards. They are the work to be done, the work in process, and the inventory in queues. &lt;/p&gt;  &lt;h3&gt;My Team’s Kanban: Nothing&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;For my team, the signal to do more work was an empty stikki clip.&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="453" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_22281D3F.png" width="603" border="0" /&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;That empty slot in the “System Test” column was a signal to the testers that they could pull another task from the upstream process. The empty slot in “In Dev” was a signal to pull from their upstream. And the empty slot in “Analysis &amp;amp; Estimation” … you get the idea, right?&lt;/p&gt;  &lt;h3&gt;Kanban vs kanban&lt;/h3&gt;  &lt;p&gt;A kanban is just a signal for work to be done. It doesn’t have to be a “kanban card”. It doesn’t have to be any &lt;u&gt;thing&lt;/u&gt;, actually – it may be the absence of something, as was the case in that project. In the end, I think the idea of calling that project’s board a “kanban board” was a misrepresentation of kanban. Additionally, there’s some &lt;a href="http://blog.robbowley.net/2009/05/20/kanban-is-just-a-tool-so-why-is-it-being-treated-like-a-methodology/"&gt;&lt;strong&gt;interesting&lt;/strong&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;a href="http://www.agilemanagement.net/Articles/Weblog/IsKanbanJustaTool.html"&gt;&lt;strong&gt;banter&lt;/strong&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;a href="http://theagileexecutive.com/2009/05/20/it-is-not-what-it-is-that-really-matters/"&gt;&lt;strong&gt;going around&lt;/strong&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;a href="http://thinkprojectmanagement.blogspot.com/2009/05/kanban-its-tool-and-theres-no-such.html"&gt;&lt;strong&gt;the blogs&lt;/strong&gt;&lt;/a&gt; on kanban as a tool, more than just a tool, kanban vs “Kaban” (capital K), and how the software industry has branded a pull-based, signal-enabled workflow system as capital-K “Kanban” (and I can’t help but think that I contributed to this situation). So, maybe I can call this a “Kanban” board… but just because I can, doesn’t mean I should.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22185" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=B4Zol1P7g_g:QlKKdQQVNyI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=B4Zol1P7g_g:QlKKdQQVNyI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=B4Zol1P7g_g:QlKKdQQVNyI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=B4Zol1P7g_g:QlKKdQQVNyI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=B4Zol1P7g_g:QlKKdQQVNyI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=B4Zol1P7g_g:QlKKdQQVNyI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=B4Zol1P7g_g:QlKKdQQVNyI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=B4Zol1P7g_g:QlKKdQQVNyI:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/B4Zol1P7g_g" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Lean+Systems/default.aspx">Lean Systems</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Kanban/default.aspx">Kanban</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Workflow/default.aspx">Workflow</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/18/a-kanban-is-just-a-signal-to-do-work.aspx</feedburner:origLink></item><item><title>I’m Presenting SOLID At North Dallas .NET (NDDNUG), July 8th</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/laz8zJ9wgV0/i-m-presenting-solid-at-north-dallas-net-nddnug-july-8th.aspx</link><pubDate>Wed, 17 Jun 2009 21:24:23 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:22156</guid><dc:creator>derick.bailey</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=22156</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=22156</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/17/i-m-presenting-solid-at-north-dallas-net-nddnug-july-8th.aspx#comments</comments><description>&lt;p&gt;On Wednesday, July 8th, I’m scheduled to give my SOLID presentation at &lt;a href="http://northdallas.net/"&gt;NDDNUG&lt;/a&gt;, up in Plano, TX. I don’t know if anyone up there remembers me, but NDDNUG was the first user group that I ever went to. I worked in Richardson, TX, for more than 4 years, just off Collins &amp;amp; 75, half a block away from &lt;a href="http://www.nerdbooks.com/"&gt;NerdBooks&lt;/a&gt;. I’m excited to be able to return to my old stomping ground and do a presentation in front of the first professional software developer group that I was a part of, 6+ years ago!&lt;/p&gt;  &lt;h3&gt;The Presentation Materials&lt;/h3&gt;  &lt;p&gt;If anyone is interested in obtaining the slide deck and code for this presentation, I recently updated the .zip package in my media section, with the latest version of the slides.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Download The Presentation Slides And Code Here: &lt;/strong&gt;&lt;a title="http://www.lostechies.com/media/p/5415.aspx" href="http://www.lostechies.com/media/p/5415.aspx"&gt;&lt;strong&gt;http://www.lostechies.com/media/p/5415.aspx&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;The Presentation Abstract&lt;/h3&gt;  &lt;p&gt;Almost every professional software developer understands the academic definitions of Coupling, Cohesion, and Encapsulation. However, many of us do not understand how to actually achieve Low Coupling, High Cohesion, and strong Encapsulation, as prescribed. Fortunately, there are a set of stepping stones that we can use to reach these end goals, giving us a clear cut path to software that is easier to read, easier to understand, and easier to change. This presentation will define not only the three object oriented goals, but also the five S.O.L.I.D. principle that lead us there, while walking through a sample application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/SOLID_5F00_6EC97F9C.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="303" alt="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/SOLID_5F00_6EC97F9C.jpg" src="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/SOLID_5F00_6EC97F9C.jpg" width="379" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;&lt;a title="http://www.lostechies.com/media/p/5415.aspx" href="http://www.lostechies.com/media/p/5415.aspx"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=22156" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=laz8zJ9wgV0:iBFuxFpknGs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=laz8zJ9wgV0:iBFuxFpknGs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=laz8zJ9wgV0:iBFuxFpknGs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=laz8zJ9wgV0:iBFuxFpknGs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=laz8zJ9wgV0:iBFuxFpknGs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=laz8zJ9wgV0:iBFuxFpknGs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=laz8zJ9wgV0:iBFuxFpknGs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=laz8zJ9wgV0:iBFuxFpknGs:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/laz8zJ9wgV0" height="1" width="1"/&gt;</description><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/17/i-m-presenting-solid-at-north-dallas-net-nddnug-july-8th.aspx</feedburner:origLink></item><item><title>The Impact of Staffing Practices on Software Quality and Productivity</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/q2EdgSTvDcY/the-impact-of-staffing-practices-on-software-quality-and-productivity.aspx</link><pubDate>Sun, 07 Jun 2009 23:59:55 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21596</guid><dc:creator>derick.bailey</dc:creator><slash:comments>10</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21596</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21596</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/07/the-impact-of-staffing-practices-on-software-quality-and-productivity.aspx#comments</comments><description>&lt;h3&gt;A Junior-Heavy Organization&lt;/h3&gt;  &lt;p&gt;Companies tend to staff various teams with an experience level of employees that have a very junior heavy bias. That is, for every person with senior level experience in the organization, there tend to be multiple mid level persons. And, for every mid level person, there tend to be multiple junior level persons. The end result is that we create an organization that resembles a hierarchy such as Figure 1. &lt;/p&gt;  &lt;p&gt;   &lt;table style="float:left;" cellspacing="0" cellpadding="5"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td align="center"&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/clip_5F00_image002_5F00_65719362.gif"&gt;&lt;img title="clip_image002" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="187" alt="clip_image002" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/clip_5F00_image002_5F00_thumb_5F00_0BD376AE.gif" width="204" border="0" /&gt;&lt;/a&gt;             &lt;br /&gt;&lt;font size="1"&gt;&lt;b&gt;Figure 1.&lt;/b&gt; Junior-Heavy Hierarchy&lt;/font&gt; &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; One of the key factors to understanding this hierarchy is to recognize that a person may be capable of working at a senior level in spite of a relatively short career. It is also likely that an individual in an organization may be considered senior level only by years in the industry or pay level, while that individual may not be able to work in a senior level capacity. Given these factors, an honest analysis of the company is likely to show many department hierarchies that are similar to the one outlined here.&lt;/p&gt;  &lt;p&gt;There are many different reasons for staffing an organization in this manner. It may not be possible to find talented, senior level persons when a company is in a position to hire. There may be labor cost considerations, such as a desire to reduce the labor rates of a project resulting in a lower-cost proposal. Furthermore, it is often easier to teach inexperienced persons how to work according to a team or company standard, since they do not come with years of experience working in other manners. No matter the actual reasons, though, a department structure such as this is likely to have a significant and negative impact on the productivity and quality of the work done by that department.&lt;/p&gt;  &lt;p&gt;Once a team begins to formalize around a junior heavy structure, there are a number of issues that begin to arise.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;“As new products grow, revenues grow, the R&amp;amp;D budget grows, and engineering and research staff grows. Eventually, this burgeoning technical staff becomes increasingly complex and difficult to manage. The management burden often falls on senior engineers, who in turn have less time to spend on engineering. Diverting the most experienced engineers from engineering to management results in longer product development times, which slow down the introduction of new products.”&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;- Peter M. Senge, “The Fifth Discipline”, p. 96&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Technical Leadership vs. Project Management&lt;/h3&gt;  &lt;p&gt;In a software development organization such as ours, there is a distinction between technical leadership versus project management. Technical leadership includes activities such as high level systems design and architecture, implementation details such as frameworks, tools and development techniques, and ensuring that the team is up to speed on the team standards and following those standards. In order to facilitate technical leadership in a team, the person tasked with this role will need to be involved in both the implementation of the system, as well as conversations on the system definition and requirements. However, the role of the technical leader should be to focus on the technical aspects of the system, ensuring consistency and stability of the system while meeting the business needs. It should also be noted that the senior level persons on a team are the appropriate persons for this type of work. They have the necessary experience and design capabilities, and should be adept at communicating decisions and technical directions to the rest of the technical team, effectively.&lt;/p&gt;  &lt;p&gt;From a functionality standpoint, the project manager coordinates the high-level requirements and work organization with the customer, helping to prioritize the order in which those features need to be implemented. The prioritization of work is correlated with the assignment of work to be done by the functional groups. For example, the feature with the highest priority will be handed to the various functional teams: “Testers, go write scenarios for this, now,” and “Developers, go architect and build that, next,” etc. &lt;/p&gt;  &lt;p&gt;At the functional group level, a technical lead (dev lead, test lead, etc) would help to break down the features and user stories into individual work tasks, and help to prioritize the order in which those tasks should be done. This is needed to facilitate the implementation needs of the system. At this point, the team members doing the actual work are to be given the authority to grab the next available task from the list, whenever they are freed up from their current task. In situations where individual tasks for a story have a similar or same priority (for example, if it doesn’t matter that screen/workflow X is done before or after screen/workflow Y), then the person who needs work is free to choose which task to take on next.&lt;/p&gt;  &lt;p&gt;Unfortunately, senior level engineers often end up doing project management work instead of technical leadership work, when a team is structured in a junior heavy manner. This includes activities that do overlap the technical leadership role, to an extent. For example, the project management role includes definition and discussion of the system and requirements. However, the project management role also includes additional responsibilities that fall outside of the technical leadership role, such as maintaining project status and visibility or determining work to be done by functional groups. The project management role must account for the needs of project team members that are not directly involved in the implementation, as well. Persons such as technical writers, business analysts, testers and others, including the technical staff, need to have consistency of project management to ensure that the entire system is moving forward correctly.&lt;/p&gt;  &lt;h3&gt;Cycles of Decreasing Productivity&lt;/h3&gt;  &lt;p&gt;In Figure 2, there are two cycles of increasing momentum at play, which ultimately lead to the same conclusion – lowered productivity of the team. When the senior engineers in this scenario begin to have their time taken up with management tasks and meetings, there are additional side effects that lead to poor quality and unhappy customers. &lt;/p&gt;  &lt;p&gt;   &lt;table style="float:left;" cellspacing="0" cellpadding="5"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td align="center"&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/clip_5F00_image004_5F00_21D69694.jpg"&gt;&lt;font size="1"&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/clip_5F00_image004_5F00_47CC46EA.jpg"&gt;&lt;img title="clip_image004" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="363" alt="clip_image004" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/clip_5F00_image004_5F00_thumb_5F00_1E3BC763.jpg" width="429" border="0" /&gt;&lt;/a&gt;&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt;              &lt;br /&gt;&lt;b&gt;Figure 2. &lt;/b&gt;Increasing Cycles of Lowered Productivity&lt;/font&gt; &lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;As hiring is done, it is focused on mid and junior level personnel, for the various reasons previously discussed. This causes an obvious growth in the team, increasing the need for management structure and overhead in the team. Most often, the senior level persons on the team will fulfill this need. They are the most qualified individuals to do the training, and are able to help organize, direct, and assist the new hires and existing team members. &lt;/p&gt;  &lt;p&gt;With the senior level persons’ time taken up with management tasks, they no longer have time to perform the high level designs and architectures for the team efforts. This leaves the mid level persons to the designs and architecture, when they may not have the experience and understanding necessary to complete these tasks. The burden of learning through trial and error of implementation can quickly become overwhelming, and the mid level persons will often spend an inordinate amount of time working on these tasks. When this occurs, the junior level team members will do the majority of the implementation work, in spite of being the least capable and least well equipped for the job. This ultimately leads to lowered productivity of the team, as the junior level members struggle with implementation details and technology questions that they cannot answer or get quick answers to. The lowered productivity of a team often leads to a desire to increase the staff, to boost productivity. However, only mid and junior level personnel are hired and the cycle begins again, causing additional delays.&lt;/p&gt;  &lt;p&gt;The second cycle depicted shows how the lowered productivity of the team will lead to longer delays for customers to receive the end product. This often leads to unhappy customers, wondering why they must wait. When the management structure of the team hears about the unhappy customers, they often push the team harder, to try and increase productivity. Unfortunately, this usually comes at the cost of lowering standards and cutting corners. The individuals doing the work, at mid and junior levels of experience, may not have an adequate knowledge or understanding of the standards, or simply may not be able to maintain the standards without significant guidance from the senior level persons, who are not available on a regular basis. The drop in standards will eventually create a drop in the quality of the product, which inevitably leads to defects being found in the end product. The defective parts of the product are either delivered as-is, or immediately reworked to correct the issues, resulting in a still longer lead time for the delivery of the product. The result is again, a lowered productivity of the team as they deal with the issues that they are introducing into the system, and this secondary cycle begins again, resulting in customers that are less and less satisfied.&lt;/p&gt;  &lt;h3&gt;Combating the Issues&lt;/h3&gt;  &lt;table style="float:left;" cellspacing="0" cellpadding="5"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td align="center"&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/clip_5F00_image006_5F00_0152A28E.jpg"&gt;&lt;img title="clip_image006" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="77" alt="clip_image006" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/clip_5F00_image006_5F00_thumb_5F00_0EB8B594.jpg" width="240" border="0" /&gt;&lt;/a&gt;           &lt;br /&gt;&lt;font size="1"&gt;&lt;b&gt;Figure 3.&lt;/b&gt; Senior Heavy Structure&lt;/font&gt; &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Fortunately, there are ways to mitigate the issues described. To start with, teams should not be created with junior heavy structures. Rather, a senior heavy structure is desirable, as shown in Figure 3. This structure allows for the necessary promotion of senior level persons, into management roles and responsibilities. Assuming that the senior level persons have the necessary people skills for management and leadership, they are the most qualified persons to lead the teams in question. With such a structure, though, the teams are not left with a missing portion of technical leadership, implementation, and training needs. When one or two senior level persons are required to perform management tasks or attend meetings, there are additional senior level members available to handle the work load of that experience level.&lt;/p&gt;  &lt;p&gt;Additional benefits can also be realized through a structure such as this. For example, it is widely believed that there are productivity gains of 10 to 20 times, or more, for senior level software developers vs. junior level software developers. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“&lt;i&gt;The original study that showed huge variations in individual programming productivity was conducted in the late 1960s by Sackman, Erikson, and Grant (1968). They studied professional programmers with an average of 7 years&amp;#39; experience and found that the ratio of initial coding time between the best and worst programmers was about 20 to 1, the ratio of debugging times over 25 to 1, of program size 5 to 1, and of program execution speed about 10 to 1. They found no relationship between a programmer&amp;#39;s amount of experience and code&lt;a name="or_productivity"&gt;&lt;/a&gt; quality or productivity.&lt;/i&gt;”&lt;/p&gt;    &lt;p&gt;- Steve McConnell, “Code Complete 2&lt;sup&gt;nd&lt;/sup&gt; Edition”, p. 682&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Such productivity gains should immediately result in lower cost and shorter lead times. The experience and capabilities of the senior level personnel should also reduce the number of defects that are introduced into the product, improving quality and again reducing the lead time for delivery of the product. &lt;/p&gt;  &lt;h3&gt;Recognizing Reality&lt;/h3&gt;  &lt;p&gt;There are likely other benefits that can be attributed directly to the capabilities of a senior heavy team structure, as well. However, there are no silver bullets for anything in the real world. Simply having a team structured with a high number of seniors does not ensure that the work will be of high quality, or that they will be significantly more productive. Additional factors such as empowering the employees, focusing them with short term objectives that move toward long term goals, and a culture of open communication are also necessary. Fortunately, truly senior level persons should be able to facilitate the additional needs of the culture and environment. And in the end the time to delivery, product quality, and ultimately customer satisfaction should be sufficient motivation to begin ensuring a proper team structure.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21596" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=q2EdgSTvDcY:sML7Ok88hNQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=q2EdgSTvDcY:sML7Ok88hNQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=q2EdgSTvDcY:sML7Ok88hNQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=q2EdgSTvDcY:sML7Ok88hNQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=q2EdgSTvDcY:sML7Ok88hNQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=q2EdgSTvDcY:sML7Ok88hNQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=q2EdgSTvDcY:sML7Ok88hNQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=q2EdgSTvDcY:sML7Ok88hNQ:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/q2EdgSTvDcY" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Philosophy+of+Software/default.aspx">Philosophy of Software</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Management/default.aspx">Management</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Quality/default.aspx">Quality</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/07/the-impact-of-staffing-practices-on-software-quality-and-productivity.aspx</feedburner:origLink></item><item><title>Violating CQS. Looking For Suggestions And Alternatives.</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/vwDe9zOXvmk/violating-cqs-looking-for-suggestions-and-alternatives.aspx</link><pubDate>Fri, 05 Jun 2009 18:50:32 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21551</guid><dc:creator>derick.bailey</dc:creator><slash:comments>9</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21551</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21551</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/05/violating-cqs-looking-for-suggestions-and-alternatives.aspx#comments</comments><description>&lt;p&gt;When doing simple input validation on forms, I often end up writing a lot of code like this:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="border-right:silver 1px solid;padding-right:4px;border-top:silver 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; SaveRequested()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; descriptionIsValid = ValidateDescription();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; abbreviationIsValid = ValidateAbbreviation();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; isValid = (descriptionIsValid &amp;amp;&amp;amp; abbreviationIsValid);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (isValid)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; {&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;   VisitType visitType = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; VisitType(Description, Abbreviation);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   VisitTypeRepository.Save(visitType);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; ValidateAbbreviation()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; isValid = !&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(Abbreviation);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (isValid)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   View.HideAbbreviationRequiredMessage();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   View.ShowAbbreviationRequiredMessage();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; isValid;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; ValidateDescription()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; isValid = !&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(Description);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (isValid)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   View.HideDescriptionRequiredMessage();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   View.ShowDescriptionRequiredMessage();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; isValid;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I recognize the violations of &lt;a href="http://en.wikipedia.org/wiki/Command-query_separation"&gt;Command-Query-Separation&lt;/a&gt; in this code, and potentially other issues in design and implementation. The ValidateDescription and ValidateAbbreviation methods are fairly horrendous, from a CQS perspective. They are both querying the data to see if it’s valid, and also executing commands if it is or is not valid. Then on top of that, the SaveRequested method is executing another set of commands if both Description and Abbreviation are valid.&lt;/p&gt;

&lt;p&gt;The requirements of this functionality are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If Description is null or empty, show the “Description Required” message &lt;/li&gt;

  &lt;li&gt;If Abbreviation is null or empty, show the “Abbreviation Required” message &lt;/li&gt;

  &lt;li&gt;If both Description and Abbreviation are ok, allow the save to happen. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’m not considering the difference between active and passive validation (on typing, vs on clicking save) in this example. That’s a different discussion for a different time.&lt;/p&gt;

&lt;p&gt;So, how do you handle this type of input validation, accounting for CQS, code readability, testability, etc? I’m looking for suggestions and alternatives to this type of ugly code. I have a lot of my own ideas, but before I travel too far down the road, I want input from the rest of the world.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note On Responses:&lt;/strong&gt; As a suggestion for responding – if your response will take more than a few lines of very simple code and text, I’d really like to see your full response on your blog. Post a comment here (or pingback/trackback from your post) when you have your post up. If you don’t have a blog to respond with – shame on you! Blogspot.com is free. Go get a blog and respond. :)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21551" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=vwDe9zOXvmk:DpjW3FtB0Sc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=vwDe9zOXvmk:DpjW3FtB0Sc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=vwDe9zOXvmk:DpjW3FtB0Sc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=vwDe9zOXvmk:DpjW3FtB0Sc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=vwDe9zOXvmk:DpjW3FtB0Sc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=vwDe9zOXvmk:DpjW3FtB0Sc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=vwDe9zOXvmk:DpjW3FtB0Sc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=vwDe9zOXvmk:DpjW3FtB0Sc:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/vwDe9zOXvmk" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Analysis+and+Design/default.aspx">Analysis and Design</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Principles+and+Patterns/default.aspx">Principles and Patterns</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/C_2300_/default.aspx">C#</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/05/violating-cqs-looking-for-suggestions-and-alternatives.aspx</feedburner:origLink></item><item><title>I’m Presenting SOLID At AlamoCoders On June 9th</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/BW7xgQnIiGk/i-m-presenting-solid-at-alamocoders-on-june-9th.aspx</link><pubDate>Wed, 03 Jun 2009 21:25:37 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21487</guid><dc:creator>derick.bailey</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21487</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21487</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/03/i-m-presenting-solid-at-alamocoders-on-june-9th.aspx#comments</comments><description>&lt;p&gt;&lt;strike&gt;I may be jumping the gun a bit, since it’s not posted on the &lt;/strike&gt;&lt;a href="http://www.alamocoders.net/"&gt;&lt;strike&gt;AlamoCoders&lt;/strike&gt;&lt;/a&gt;&lt;strike&gt; site, yet. :)&lt;/strike&gt;&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://www.alamocoders.net/"&gt;AlamoCoders&lt;/a&gt; site has been updated to show my presentation. Please note that there is a &lt;strong&gt;different start time than usual - 5:30pm&lt;/strong&gt; – to facilitate the 1.5 hours+ that my presentation takes.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;On Tuesday, June 9th, I’ll be giving my SOLID Presentation at AlamoCoders, down in San Antonio. I’m looking forward to the opportunity, and am hoping to see &lt;a href="http://agilejoe.lostechies.com"&gt;Joe&lt;/a&gt;, &lt;a href="http://jason.lostechies.com"&gt;Jason&lt;/a&gt;, &lt;a href="http://www.lostechies.com/blogs/rssvihla/"&gt;Ryan&lt;/a&gt;, etc in their native town! This is the same SOLID presentation that I did at Austin Code Camp last weekend. I’d like to give a huge thanks to all the AlamoCoders that I got to hang out with at ACC, for giving me this opportunity, too. &lt;/p&gt;  &lt;h3&gt;The Presentation Abstract&lt;/h3&gt;  &lt;p&gt;Almost every professional software developer understands the academic definitions of Coupling, Cohesion, and Encapsulation. However, many of us do not understand how to actually achieve Low Coupling, High Cohesion, and strong Encapsulation, as prescribed. Fortunately, there are a set of stepping stones that we can use to reach these end goals, giving us a clear cut path to software that is easier to read, easier to understand, and easier to change. This presentation will define not only the three object oriented goals, but also the five S.O.L.I.D. principle that lead us there, while walking through a sample application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/SOLID_5F00_6EC97F9C.jpg"&gt;&lt;img height="303" alt="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/SOLID_5F00_6EC97F9C.jpg" src="http://www.lostechies.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/SOLID_5F00_6EC97F9C.jpg" width="379" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21487" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BW7xgQnIiGk:X2o3XZhIULQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=BW7xgQnIiGk:X2o3XZhIULQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BW7xgQnIiGk:X2o3XZhIULQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=BW7xgQnIiGk:X2o3XZhIULQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BW7xgQnIiGk:X2o3XZhIULQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BW7xgQnIiGk:X2o3XZhIULQ:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BW7xgQnIiGk:X2o3XZhIULQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BW7xgQnIiGk:X2o3XZhIULQ:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/BW7xgQnIiGk" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Community/default.aspx">Community</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Principles+and+Patterns/default.aspx">Principles and Patterns</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Presentations/default.aspx">Presentations</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/03/i-m-presenting-solid-at-alamocoders-on-june-9th.aspx</feedburner:origLink></item><item><title>Austin Code Camp 2009 Was A Ton-O-Fun!</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/8AVZKaITSZU/austin-code-camp-2009-was-a-ton-o-fun.aspx</link><pubDate>Mon, 01 Jun 2009 16:33:54 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21417</guid><dc:creator>derick.bailey</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21417</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21417</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/01/austin-code-camp-2009-was-a-ton-o-fun.aspx#comments</comments><description>&lt;p&gt;First and foremost - thanks to John Teague and Eric Hexter for organizing such a great event. It was as good, if not better than any of the previous Code Camps. The content was tremendous, the speakers were great, the attendees were passionate and eager to ask questions! Everyone that was there really pulled together a great conference.&lt;/p&gt;  &lt;h3&gt;My Presentations&lt;/h3&gt;  &lt;p&gt;My SOLID presentation was probably my best presentation to-date. It was fun, I felt good, and I am honestly overwhelmed by how much positive feedback I received from this presentation. People from all over Texas, and as far away as Arkansas are asking me to do this presentation at their local user groups! I really do feel blessed to been able to deliver this presentation to such a packed room of people – and I’ve seen a few tweets about people that couldn’t even get into the room! &lt;/p&gt;  &lt;p&gt;My Decoupling Workflow Presentation went about as well as I expected. It was a little disjoined, I presented some things in the wrong order, and had a hard time keeping the audience interested at times. For those of you who provided feedback on this, THANK YOU! I have some great ideas on how to improve this by restructuring and reorganizing. I sincerely hope that you took at least something away from that session.&lt;/p&gt;  &lt;h3&gt;Presentation Material &lt;/h3&gt;  &lt;p&gt;For those of you who are interested in obtaining the presentation materials, you can get them from the&lt;strong&gt; &lt;/strong&gt;&lt;a href="http://code.google.com/p/austincodecamp09/"&gt;&lt;strong&gt;Austin Code Camp Subversion repository @ Google code&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Pictures and Video&lt;/h3&gt;  &lt;p&gt;A recording of my SOLID presentation was made – and I can’t remember the name of the guy who did it! D’OH! I was promised that it would be posted online somewhere – maybe Youtube or something – so that we can share it with the world. If anyone has any pictures or video of this presentation, please contact me (myfirstname@firstnamelastname.com) with info on where it’s posted, or how I can get a copy of it so that I can post it.&lt;/p&gt;  &lt;p&gt;A coworker (&lt;a href="http://michaeladkins.blogspot.com/"&gt;Michael Adkins&lt;/a&gt;) made &lt;a href="http://qik.com/michaeladkins"&gt;a few short video clips of my SOLID presentation&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Here are some pictures that I took, and some that my coworkers took with my camera, at #ACC09.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1622_5F00_423C9D9E.jpg"&gt;&lt;img title="IMG_1622" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1622" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1622_5F00_thumb_5F00_0F6C972A.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1628_5F00_6EE55777.jpg"&gt;&lt;img title="IMG_1628" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1628" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1628_5F00_thumb_5F00_0055B850.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1643_5F00_5BC42ACB.jpg"&gt;&lt;img title="IMG_1643" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1643" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1643_5F00_thumb_5F00_1402A1E4.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1633_5F00_5A7F91EC.jpg"&gt;&lt;img title="IMG_1633" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1633" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1633_5F00_thumb_5F00_4BD4E607.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1636_5F00_2B4DA655.jpg"&gt;&lt;img title="IMG_1636" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1636" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1636_5F00_thumb_5F00_6AAB59E5.jpg" width="244" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1647_5F00_033AF736.jpg"&gt;&lt;img title="IMG_1647" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1647" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1647_5F00_thumb_5F00_7085FD7E.jpg" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1652_5F00_09159ACF.jpg"&gt;&lt;img title="IMG_1652" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1652" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1652_5F00_thumb_5F00_1A85FBA7.jpg" width="244" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1660_5F00_48071B6A.jpg"&gt;&lt;img title="IMG_1660" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1660" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1660_5F00_thumb_5F00_0764CEFB.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1664_5F00_34E5EEBE.jpg"&gt;&lt;img title="IMG_1664" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1664" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1664_5F00_thumb_5F00_5F521FDB.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1682_5F00_77E1BD2B.jpg"&gt;&lt;img title="IMG_1682" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1682" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1682_5F00_thumb_5F00_4511B6B7.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1691_5F00_5277C9BD.jpg"&gt;&lt;img title="IMG_1691" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1691" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1691_5F00_thumb_5F00_0AB640D6.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1692_5F00_6A2F0123.jpg"&gt;&lt;img title="IMG_1692" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1692" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1692_5F00_thumb_5F00_69569B39.jpg" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1693_5F00_48CF5B87.jpg"&gt;&lt;img title="IMG_1693" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1693" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1693_5F00_thumb_5F00_2EFB2558.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1712_5F00_79826332.jpg"&gt;&lt;img title="IMG_1712" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1712" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1712_5F00_thumb_5F00_31C0DA4B.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1714_5F00_3F26ED51.jpg"&gt;&lt;img title="IMG_1714" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="184" alt="IMG_1714" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/IMG_5F00_1714_5F00_thumb_5F00_2552B722.jpg" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21417" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=8AVZKaITSZU:5UPAE-21VAY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=8AVZKaITSZU:5UPAE-21VAY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=8AVZKaITSZU:5UPAE-21VAY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=8AVZKaITSZU:5UPAE-21VAY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=8AVZKaITSZU:5UPAE-21VAY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=8AVZKaITSZU:5UPAE-21VAY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=8AVZKaITSZU:5UPAE-21VAY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=8AVZKaITSZU:5UPAE-21VAY:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/8AVZKaITSZU" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Community/default.aspx">Community</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Austin+Code+Camp/default.aspx">Austin Code Camp</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/06/01/austin-code-camp-2009-was-a-ton-o-fun.aspx</feedburner:origLink></item><item><title>Announcing Pablo’s E-Books! Book #1: Pablo’s SOLID Software Development</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/GUyKHu_TYsc/announcing-pablo-s-e-books-book-1-pablo-s-solid-software-development.aspx</link><pubDate>Wed, 20 May 2009 01:37:03 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21115</guid><dc:creator>derick.bailey</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21115</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21115</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/19/announcing-pablo-s-e-books-book-1-pablo-s-solid-software-development.aspx#comments</comments><description>&lt;p&gt;Hello World! I’m happy to announce the first Los Techies compiled, Pablo endorsed, E-Book: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/content/pablo_ebook.aspx"&gt;&lt;strong&gt;Pablo’s SOLID Software Development&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“S.O.L.I.D. is a collection of best-practice object-oriented design principles that you can apply to your design to accomplish various desirable goals like loose-coupling, higher maintainability, intuitive location of interesting code, etc.”&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This tremendous volume of information is a conglomeration of blog posts and other information produced by the LosTechies crew, and includes over 80 pages of information on how to work with the principles in question. From page 1 of the E-Book:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_3FB01AB4.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="221" alt="image" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/image_5F00_thumb_5F00_352F4694.png" width="564" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So what are you waiting for? Go download the greatest compilation of SOLID information ever produced by Los Techies bloggers!&lt;/p&gt;  &lt;h3&gt;Credits Due&lt;/h3&gt;  &lt;p&gt;I’d like to give a huge thanks to our fellow Pablo-ite, &lt;a href="http://www.lostechies.com/blogs/seanbiefeld/default.aspx"&gt;Sean Biefeld&lt;/a&gt;, for the hard work he put into the editing of this document. He spent a good deal of time ensuring the formatting of content was good to go. &lt;a href="http://www.lostechies.com/blogs/jason_meridth/default.aspx"&gt;Jason Meridth&lt;/a&gt; and &lt;a href="http://www.lostechies.com/blogs/joe_ocampo/default.aspx"&gt;Joe Ocampo&lt;/a&gt; also need some props for getting the e-book posted so quickly. And give a shout-out to a Los Techies blogger the next time you see one for providing such a great compendium of SOLID information via the &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx"&gt;March 2008 Pablo’s Topic Of The Month&lt;/a&gt;, as well as the other SOLID contributions that made it into the site at later times.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21115" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=GUyKHu_TYsc:vo7ZkyCZhUI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=GUyKHu_TYsc:vo7ZkyCZhUI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=GUyKHu_TYsc:vo7ZkyCZhUI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=GUyKHu_TYsc:vo7ZkyCZhUI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=GUyKHu_TYsc:vo7ZkyCZhUI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=GUyKHu_TYsc:vo7ZkyCZhUI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=GUyKHu_TYsc:vo7ZkyCZhUI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=GUyKHu_TYsc:vo7ZkyCZhUI:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/GUyKHu_TYsc" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Community/default.aspx">Community</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Principles+and+Patterns/default.aspx">Principles and Patterns</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/E-Books/default.aspx">E-Books</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/19/announcing-pablo-s-e-books-book-1-pablo-s-solid-software-development.aspx</feedburner:origLink></item><item><title>Result&lt;T&gt;: Directing Workflow With A Return Status And Value</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/Cm9SFJrDA_I/result-lt-t-gt-directing-workflow-with-a-return-status-and-value.aspx</link><pubDate>Tue, 19 May 2009 14:35:34 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21095</guid><dc:creator>derick.bailey</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21095</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21095</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/19/result-lt-t-gt-directing-workflow-with-a-return-status-and-value.aspx#comments</comments><description>&lt;p&gt;I often code user interfaces that have some sort of cancel button on them. For example, in my upcoming ‘&lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/05/18/i-m-presenting-at-austin-code-camp-2009.aspx"&gt;Decoupling Workflow&lt;/a&gt;’ presentation, I have the following screen:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/NewEmployeeInfo_5F00_78597AF0.png"&gt;&lt;img title="New Employee - Info" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="257" alt="New Employee - Info" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/NewEmployeeInfo_5F00_thumb_5F00_05BF8DF7.png" width="470" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice the nice cancel button on the form. The trick to this situation is that I need to have my workflow code understand whether or not I clicked Next or clicked Cancel. Depending on the button that was clicked, I need to do something different in the workflow.&amp;#160; If I click cancel, throw away all of the data that was entered on the form. If I click next, though, I need to store all of the data and continue on to the next screen. &lt;/p&gt;  &lt;h3&gt;The Result&amp;lt;T&amp;gt; and ServiceResult&lt;/h3&gt;  &lt;p&gt;In the past, I’ve handled these types of buttons in many, many different ways. I’ve returned null from the form, I’ve checked the DialogResult of the form, I’ve done out parameters for methods, and I’ve done specific properties on the form or the form’s presenter to tell me the status vs the data. Recently, though, I’ve begun to settle into a nice little Result&amp;lt;T&amp;gt; class that does two things for me:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Provides a result status – for example, a ServiceResult enum with Ok and Cancel as the two options&lt;/li&gt;    &lt;li&gt;Provides a data object (the &amp;lt;T&amp;gt; generic in Result&amp;lt;T&amp;gt;) for the values I need, if I need them&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Here is the code for my ServiceResult and my Result&amp;lt;T&amp;gt; object.&lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="border-right:silver 1px solid;padding-right:4px;border-top:silver 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;enum&lt;/span&gt; ServiceResult&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; Ok = 0,&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; Cancel = 1&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Result&amp;lt;T&amp;gt;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ServiceResult ServiceResult { get; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; T Data { get; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; set; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Result(ServiceResult serviceResult): &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;(serviceResult, &lt;span style="color:#0000ff;"&gt;default&lt;/span&gt;(T)){}&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Result(ServiceResult serviceResult, T data)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; {&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;   ServiceResult = serviceResult;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   Data = data;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Putting Result&amp;lt;T&amp;gt; To Work&lt;/h3&gt;

&lt;p&gt;With this simple little solution, I can create very concise and clear workflow objects that know how to handle the cancel button versus the next button. The code becomes easier to read and understand, and makes the real workflow that much easier to see. The workflow code that runs the “Add New Employee” process for the screen shot above, is this:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right:silver 1px solid;padding-right:4px;border-top:silver 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Run()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;{&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; Result&amp;lt;EmployeeInfo&amp;gt; result = GetNewEmployeeInfo.Get();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (result.ServiceResult == ServiceResult.Ok)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; {&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;   EmployeeInfo info = result.Data;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   Employee employee = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Employee(info.FirstName, info.LastName, info.Email);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;   Employee manager = GetEmployeeManager.GetManagerFor(employee);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;   manager.Employees.Add(employee);&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; }&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Notice the use of Result&amp;lt;EmployeeInfo&amp;gt; in this code. I’m checking to see if the result.ServiceResult is Ok before moving on to the use of the data. The GetNewEmployeeInfo class return a Result&amp;lt;EmployeeInfo&amp;gt; object from the .Get() method. The EmployeeInfo object contains the first name, last name, and email address of the employee as simple string values (and in the “real world”, the EmployeeInfo object would probably contain the input validation for these). &lt;/p&gt;

&lt;p&gt;Because Result&amp;lt;T&amp;gt; is a generics class and returns &amp;lt;T&amp;gt; from the .Data property, I can specify any data value that I need and it returned from the presenter in question. This is where the real flexibility of the Result&amp;lt;T&amp;gt; object comes into play. When I have verified that the user clicked OK, via the result.ServiceResult property, I can then grab the real EmployeeInfo object out of the result.Data parameter which isstrongly typed to my EmployeeInfo class. Once I have this data in hand, I can do what I need with it and move on to the next step if there are any.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Having tried many different approaches to workflow code, I’m fairly well settled into this pattern right now. That doesn’t mean it won’t evolve, though. The basic implementation would cover most of what I need right now, but could easily be extended to include different “status” values instead of just the ServiceResults of OK and Cancel. Overall, though, this simple Result&amp;lt;T&amp;gt; class is saving me a lot of headache and heartache trying to figure out what to return from a method so that a workflow can figure out if the user is continuing, cancelling, or whatever. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21095" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=Cm9SFJrDA_I:bigaUG-sSpM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=Cm9SFJrDA_I:bigaUG-sSpM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=Cm9SFJrDA_I:bigaUG-sSpM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=Cm9SFJrDA_I:bigaUG-sSpM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=Cm9SFJrDA_I:bigaUG-sSpM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=Cm9SFJrDA_I:bigaUG-sSpM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=Cm9SFJrDA_I:bigaUG-sSpM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=Cm9SFJrDA_I:bigaUG-sSpM:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/Cm9SFJrDA_I" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Principles+and+Patterns/default.aspx">Principles and Patterns</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Presentations/default.aspx">Presentations</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Workflow/default.aspx">Workflow</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/19/result-lt-t-gt-directing-workflow-with-a-return-status-and-value.aspx</feedburner:origLink></item><item><title>A .NET (C#) Developer’s .gitignore File</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/NfnKvKYgwIM/a-net-c-developer-s-gitignore-file.aspx</link><pubDate>Tue, 19 May 2009 02:55:26 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21078</guid><dc:creator>derick.bailey</dc:creator><slash:comments>11</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21078</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21078</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/18/a-net-c-developer-s-gitignore-file.aspx#comments</comments><description>&lt;p&gt;As a recent convert to &lt;a href="http://git-scm.com/"&gt;the awesomeness that is git&lt;/a&gt; (my current flavor is &lt;a href="http://code.google.com/p/msysgit/"&gt;msysgit&lt;/a&gt;), I find myself continuously needing to update the &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gitignore.html"&gt;.gitignore&lt;/a&gt; file that I copy and paste between my repositories. Here’s what my ignore file currently contains:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="border-right:silver 1px solid;padding-right:4px;border-top:silver 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;obj&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;bin&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;deploy&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;deploy/*&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;_ReSharper.*&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;*.csproj.user&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;*.resharper.user&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;*.resharper&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;*.suo&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;*.cache&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;~$*&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The “~$*” line is for MS Office temp files. Other than that, it’s a pretty common list of files and folders that .NET (C#) developers would want to ignore in the git repositories.&lt;/p&gt;

&lt;p&gt;What does your .gitignore file look like? What am I missing from mine?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21078" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=NfnKvKYgwIM:3-jwIoLHJE8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=NfnKvKYgwIM:3-jwIoLHJE8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=NfnKvKYgwIM:3-jwIoLHJE8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=NfnKvKYgwIM:3-jwIoLHJE8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=NfnKvKYgwIM:3-jwIoLHJE8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=NfnKvKYgwIM:3-jwIoLHJE8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=NfnKvKYgwIM:3-jwIoLHJE8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=NfnKvKYgwIM:3-jwIoLHJE8:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/NfnKvKYgwIM" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Git/default.aspx">Git</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/18/a-net-c-developer-s-gitignore-file.aspx</feedburner:origLink></item><item><title>I’m Presenting At Austin Code Camp 2009</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/BVlu87-tvJg/i-m-presenting-at-austin-code-camp-2009.aspx</link><pubDate>Tue, 19 May 2009 01:29:32 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21071</guid><dc:creator>derick.bailey</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21071</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21071</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/18/i-m-presenting-at-austin-code-camp-2009.aspx#comments</comments><description>&lt;p&gt;As Chad so eloquently stated, this year’s &lt;a href="http://austincodecamp.com/"&gt;AustinCodeCamp&lt;/a&gt; really is going to be &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2009/05/17/austin-codecamp-09-quite-possibly-better-than-bacon.aspx"&gt;better than bacon&lt;/a&gt;! And I feel honored to be one of the better than bacon speakers at this year’s event. &lt;/p&gt;  &lt;p&gt;I’m delivering two presentations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The &lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2008/10/14/thanks-adnug-attendees-slides-and-code-available.aspx"&gt;SOLID presentation that I gave at the Austin .NET User Group last October&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;And a new presentation on Decoupling Workflow From Forms.&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;SOLID Software Development: Achieving Object Oriented Principles, One Step At A Time&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;Almost every professional software developer understands the academic definitions of Coupling, Cohesion, and Encapsulation. However, many of us do not understand how to actually achieve Low Coupling, High Cohesion, and strong Encapsulation, as prescribed. Fortunately, there are a set of stepping stones that we can use to reach these end goals, giving us a clear cut path to software that is easier to read, easier to understand, and easier to change. This presentation will define not only the three object oriented goals, but also the five S.O.L.I.D. principle that lead us there, while walking through a sample application. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;You can download the slides and code for this presentation from &lt;a href="http://www.lostechies.com/media/p/5415.aspx"&gt;here at LosTechies&lt;/a&gt;, or from the Austin Code Camp subversion repository closer to / during / after the event.&lt;/p&gt;  &lt;h3&gt;Decoupling Workflow From Forms With An Application Controller And IoC Container&lt;/h3&gt;  &lt;blockquote&gt;   &lt;p&gt;In the development and maintenance of a WinForms application, using a Model-View-Presenter setup, over the last two years, I&amp;#39;ve ran into a fairly significant challenge: I had my workflow between forms coupled to the forms directly. For example, to get from MainForm to SubForm, code inside of MainForm would instantiate SubForm, it&amp;#39;s Presenter, and all of the dependencies of each of&amp;#160; thesse. In this application, the form codebehind would often contain several hundred lines of code to create all the needed views, presenters, etc for a workflow - per workflow. By introducing the concept Application Controller, in combination with a good IoC Container, we can quickly and easily reduce the tight coupling between our forms, while simplifying our presenters and enabling the workflow to change independently of the forms and presenters.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I’m (embarrassingly) still writing the presentation and code for this session. However, you can get a few sneak peaks of the presentation in these two blog posts:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/04/18/decoupling-workflow-and-forms-with-an-application-controller.aspx"&gt;Decoupling Workflow And Forms With An Application Controller&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/05/14/balsamiq-and-a-sneak-preview-of-my-decoupling-workflow-presentation.aspx"&gt;Balsamiq And A Sneak Preview Of My ‘Decoupling Workflow’ Presentation&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;You can also keep up to date with the presentation as I’m creating it, &lt;a href="http://github.com/derickbailey/presentations-and-training/tree/master"&gt;over at my Github account&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;The Code Camp&lt;/h3&gt;  &lt;p&gt;Come join the fun on May 30th, down in Austin! The event is being held at the same place that it’s been for the last 4 years. Head over to &lt;a href="http://austincodecamp.com"&gt;the official website&lt;/a&gt; for more information. Also check out Chad’s post, linked above, for some great links to other information about ACC. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Last, but definitely most important:&lt;/strong&gt; We all need to give a huge round of thanks to &lt;a href="http://johnteague.lostechies.com/"&gt;John Teague&lt;/a&gt; and &lt;a href="http://hex.lostechies.com/"&gt;Eric Hexter&lt;/a&gt; for putting together this event. They’ve done a tremendous job of organizing the sponsors, the facilities, and getting the schedule of speakers lined up.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21071" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BVlu87-tvJg:4h9sPJimM9U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=BVlu87-tvJg:4h9sPJimM9U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BVlu87-tvJg:4h9sPJimM9U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=BVlu87-tvJg:4h9sPJimM9U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BVlu87-tvJg:4h9sPJimM9U:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BVlu87-tvJg:4h9sPJimM9U:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BVlu87-tvJg:4h9sPJimM9U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=BVlu87-tvJg:4h9sPJimM9U:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/BVlu87-tvJg" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Community/default.aspx">Community</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Principles+and+Patterns/default.aspx">Principles and Patterns</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Austin+Code+Camp/default.aspx">Austin Code Camp</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Presentations/default.aspx">Presentations</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/18/i-m-presenting-at-austin-code-camp-2009.aspx</feedburner:origLink></item><item><title>Balsamiq And A Sneak Preview Of My ‘Decoupling Workflow’ Presentation</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/xeGwQcua6JM/balsamiq-and-a-sneak-preview-of-my-decoupling-workflow-presentation.aspx</link><pubDate>Fri, 15 May 2009 01:25:23 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21012</guid><dc:creator>derick.bailey</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=21012</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=21012</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/14/balsamiq-and-a-sneak-preview-of-my-decoupling-workflow-presentation.aspx#comments</comments><description>&lt;p&gt;I know I’m late jumping on this bandwagon, but it’s better late than never, right? :)&lt;/p&gt;  &lt;p&gt;I decided to try out the &lt;a href="http://www.balsamiq.com/"&gt;Balsamiq Mockups&lt;/a&gt; tool while working on my sample application for the ‘&lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/04/18/decoupling-workflow-and-forms-with-an-application-controller.aspx"&gt;Decoupling Workflow from Forms&lt;/a&gt;’ presentation that I’m planning (hoping! Go &lt;a href="http://www.adnug.org/AustinCodeCamp09/Proposal/List"&gt;vote for my session&lt;/a&gt;!) to give at this year’s &lt;a href="http://austincodecamp.com"&gt;Austin Code Camp&lt;/a&gt;. The code for the presentation will revolve around a very simple “Org Chart” set of features, illustrating the principles and patterns of Application Controller, IoC containers, and others.&lt;/p&gt;  &lt;h3&gt;The Org Chart Screens&lt;/h3&gt;  &lt;p&gt;I’ve played with Balsamiq in the past, but never for an actual project. In less than 30 minutes, I was able to come up with the following screen layouts for my presentation. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The “Org Chart” Main Form&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/OrgChartView_5F00_3BBFA4A7.png"&gt;&lt;img title="Org Chart View" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="231" alt="Org Chart View" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/OrgChartView_5F00_thumb_5F00_5376DC0D.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The “Add New Employee – Info” Form&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/NewEmployeeInfo_5F00_647B09F0.png"&gt;&lt;img title="New Employee - Info" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="130" alt="New Employee - Info" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/NewEmployeeInfo_5F00_thumb_5F00_43879749.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The “Add New Employee – Manager” Form&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/NewEmployeeManager_5F00_709C8417.png"&gt;&lt;img title="New Employee - Manager" style="border-right:0px;border-top:0px;display:inline;border-left:0px;border-bottom:0px;" height="103" alt="New Employee - Manager" src="http://www.lostechies.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/derickbailey/NewEmployeeManager_5F00_thumb_5F00_21BBBEB8.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The general workflow between these screens should be fairly intuitive. You can select an employee from the treeview, in the main form, and see their details. You can also click the “Add New Employee” button to go through the wizard-style process of adding a new employee’s information and selecting their manager.&lt;/p&gt;  &lt;p&gt;It’s a very simple system, but it contains just enough elements to illustrate all of the concepts in my presentation. I’ll be using an Event Aggregator to know what user information to display, after selecting someone in the treeview. I’ll use a command object to start up the Add New Employee wizard, facilitated with a workflow service. And, it will all be wired together at runtime, with the &lt;a href="http://structuremap.sourceforge.net/"&gt;StructureMap&lt;/a&gt; IoC container, illustrating the very low coupling that I am going for.&lt;/p&gt;  &lt;h3&gt;Balsamiq – It’s Not Just A Great Condiment With Chicken!&lt;/h3&gt;  &lt;p&gt;Overall, I’m very happy with the ease and usability of Balsamiq. The UI toolset that Balsamiq comes with is quite large, and is composed of the most often used, most fundamental UI elements. And with the data editing capabilities (titles, captions, lists, etc) that are available on each of the controls, it takes almost no time to string together to create compelling design. Even for the UI that aren’t covered by the default tools, there are user contributed controls that you can download and add from &lt;a href="http://www.mockupstogo.net/"&gt;MockupsToGo.net&lt;/a&gt;! &lt;/p&gt;  &lt;h3&gt;One Minor Critique&lt;/h3&gt;  &lt;p&gt;Honestly, the only glaring issue that I have with Balsamiq is the name itself. Technically, the product name is “Balsamiq Mockups”. My problem with this name comes from being heavily influenced by the user experience realm of software development. The products of Balsamiq are not “mockups”, they are wireframes. Mockups are usually full color, highly detailed, almost-production-ready renderings.&lt;/p&gt;  &lt;p&gt;Seriously… that’s the only problem I have with this product, at this point. &lt;/p&gt;  &lt;h3&gt;The Verdict&lt;/h3&gt;  &lt;p&gt;Balsamiq Mockups is a tremendous tool that &lt;u&gt;all&lt;/u&gt; software developers and designers should have in their toolbox. It may not “wow” your socks off with all the “cool” of an iPod or iPhone, but it doesn’t need to. It’s simple. It sticks to what it does well. And it does what it does, exceptionally well. Most importantly, though - &lt;em&gt;it doesn’t get in your way when you’re trying to let the creative design juices flow&lt;/em&gt;! The only thing that is less intrusive is a whiteboard and markers, but that solution doesn’t let you drag, drop and resize without erasing and starting over. :)&lt;/p&gt;  &lt;p&gt;Go spend 10 minutes trying out the online version and then spend the $79 to buy the desktop version.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.balsamiq.com/products/mockups"&gt;Balsamiq Mockups&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.balsamiq.com/demos/mockups/Mockups.html"&gt;Try It Now&lt;/a&gt; – the online demo (with some limitations)&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.balsamiq.com/products/mockups/desktop"&gt;Buy The Desktop Version&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;There are also versions that integrate with Atlassian’s &lt;a href="http://www.balsamiq.com/products/mockups/confluence"&gt;Confluence&lt;/a&gt; and &lt;a href="http://www.balsamiq.com/products/mockups/jira"&gt;Jira&lt;/a&gt;, and the &lt;a href="http://www.balsamiq.com/products/mockups/xwiki"&gt;XWiki&lt;/a&gt; system, making it that much more attractive.&lt;/p&gt;  &lt;h3&gt;The Disclaimer / Full Disclosure&lt;/h3&gt;  &lt;p&gt;To keep myself and my blog honest, I do want to note that I was given a free $79 license for the desktop edition of Balsamiq Mockups. This review is essentially my “payment” for the free license. I do want to note, however, that I am not endorsing this product simply for the sake of a license. If I felt the product was not worth my time, I would say so. The truth is, I have been prompting the user experience team at my office to look into Balsamiq and do demos to the rest of the development department. I’ve recommended it to friends and other bloggers. And most importantly – I would have paid the $79 for the license if my request for a “blogger” license was denied. It really is worth the money.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21012" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=xeGwQcua6JM:puN-Byk-E-w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=xeGwQcua6JM:puN-Byk-E-w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=xeGwQcua6JM:puN-Byk-E-w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=xeGwQcua6JM:puN-Byk-E-w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=xeGwQcua6JM:puN-Byk-E-w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=xeGwQcua6JM:puN-Byk-E-w:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=xeGwQcua6JM:puN-Byk-E-w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=xeGwQcua6JM:puN-Byk-E-w:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/xeGwQcua6JM" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/User+Experience/default.aspx">User Experience</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Product+Reviews/default.aspx">Product Reviews</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/14/balsamiq-and-a-sneak-preview-of-my-decoupling-workflow-presentation.aspx</feedburner:origLink></item><item><title>FluentNHibernate Contrib (FNH.Contrib) Is Alive!</title><link>http://feedproxy.google.com/~r/DerickBailey/~3/K8TcKQ7MgAM/fluentnhibernate-contrib-fnh-contrib-is-alive.aspx</link><pubDate>Thu, 14 May 2009 02:14:06 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:20967</guid><dc:creator>derick.bailey</dc:creator><slash:comments>18</slash:comments><wfw:commentRss>http://www.lostechies.com/blogs/derickbailey/rsscomments.aspx?PostID=20967</wfw:commentRss><wfw:comment>http://www.lostechies.com/blogs/derickbailey/commentapi.aspx?PostID=20967</wfw:comment><comments>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/13/fluentnhibernate-contrib-fnh-contrib-is-alive.aspx#comments</comments><description>&lt;p&gt;A few months ago, a coworker created a set of extension methods to turn &lt;a href="http://nhibernate.org"&gt;NHibernate&lt;/a&gt;’s &lt;a href="https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/querycriteria.html"&gt;Criteria API&lt;/a&gt; into a more fluenty, strongly typed API. We’ve been using it in a production app for a few months, and I wanted to share it with the world. After talking about it with the other &lt;a href="http://fluentnhibernate.org"&gt;Fluent NHibernate&lt;/a&gt; contributors, we decided that it was not a good time to introduce new APIs and features into FNH right now (especially considering that we just removed Repository and Linq from FNH).&lt;/p&gt;  &lt;p&gt;Thus, &lt;a href="http://github.com/derickbailey/FNH.Contrib/tree/master"&gt;FNH.Contrib&lt;/a&gt; was born!&lt;/p&gt;  &lt;h3&gt;FluentNHibernate.Query&lt;/h3&gt;  &lt;p&gt;Right now the only project in FNH.Contrib is the fluent query API. The basic idea was to turn a standard NHibernate Criteria query, like this:&lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="border-right:silver 1px solid;padding-right:4px;border-top:silver 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;"&gt;   &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;     &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;IList&amp;lt;Fault&amp;gt; faults = Criteria&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;             .Add(Expression.Eq(&lt;span style="color:#006080;"&gt;&amp;quot;FaultNumber&amp;quot;&lt;/span&gt;, faultNumber))&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;             .Add(Expression.Eq(&lt;span style="color:#006080;"&gt;&amp;quot;AdminNumber&amp;quot;&lt;/span&gt;, adminNumber))&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;             .CreateCriteria(&lt;span style="color:#006080;"&gt;&amp;quot;UIC&amp;quot;&lt;/span&gt;)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;             .Add(Expression.Eq(&lt;span style="color:#006080;"&gt;&amp;quot;UIC&amp;quot;&lt;/span&gt;, uic.UIC))&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;             .SetMaxResults(1)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;             .List&amp;lt;Fault&amp;gt;();&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;&amp;#160;&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (faults != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; faults.Count &amp;gt; 0)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;   fault = faults[0];&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Into a more strongly typed, no-magic-strings API, like this:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right:silver 1px solid;padding-right:4px;border-top:silver 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:silver 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;text-align:left;"&gt;
  &lt;div id="codeSnippet" style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;
    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;fault = Session.GetOne&amp;lt;Fault&amp;gt;()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;             .Where(f =&amp;gt; f.FaultNumber).IsEqualTo(faultNumber)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;             .And(f =&amp;gt; f.AdminNumber).IsEqualTo(adminNumber)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;             .AndHasChild(f =&amp;gt; f.UIC)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;                    .Where(u =&amp;gt; u.UIC).IsEqualTo(uic.UIC)&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;text-align:left;border-bottom-style:none;"&gt;                    .EndChild()&lt;/pre&gt;


    &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;direction:ltr;border-top-style:none;line-height:12pt;padding-top:0px;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:white;text-align:left;border-bottom-style:none;"&gt;             .Execute();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The syntax is not perfect, by any means. However, it’s a great start and it’s been in a production app for several months now! I’m hoping to continue expanding this, cleaning up the syntax, etc, as I start using it in more projects.&lt;/p&gt;

&lt;h3&gt;Moving Forward and Other Contributions&lt;/h3&gt;

&lt;p&gt;At the moment, there are no other contributions in FNH.Contrib. However, I would love to get input and other projects up and running in it. There was some brief discussion of moving the FNH Repository and Linq APIs into. Perhaps that’s a good place to start?&lt;/p&gt;

&lt;p&gt;I also plan to put in a complete &lt;a href="http://www.lostechies.com/blogs/derickbailey/archive/2009/04/08/how-a-net-developer-learned-ruby-and-rake-to-build-net-apps-in-windows.aspx"&gt;Rake&lt;/a&gt; based automated build, and hopefully get a full suite of unit tests wrapped around the code, moving forward.&lt;/p&gt;

&lt;h3&gt;&lt;/h3&gt;

&lt;h3&gt;How To Contribute&lt;/h3&gt;

&lt;p&gt;FNH.Contrib is being hosted over at Github:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a title="http://github.com/derickbailey/FNH.Contrib/tree/master" href="http://github.com/derickbailey/FNH.Contrib/tree/master"&gt;&lt;strong&gt;http://github.com/derickbailey/FNH.Contrib/tree/master&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you would like to contribute, just fork the master repository and start plugging your contributions in! When you have something ready to go, send me a pull request and we can start putting together a more complete contrib library.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=20967" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=K8TcKQ7MgAM:AE8H4c1pdsA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=K8TcKQ7MgAM:AE8H4c1pdsA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=K8TcKQ7MgAM:AE8H4c1pdsA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?i=K8TcKQ7MgAM:AE8H4c1pdsA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=K8TcKQ7MgAM:AE8H4c1pdsA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=K8TcKQ7MgAM:AE8H4c1pdsA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=K8TcKQ7MgAM:AE8H4c1pdsA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/DerickBailey?a=K8TcKQ7MgAM:AE8H4c1pdsA:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/DerickBailey?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/DerickBailey/~4/K8TcKQ7MgAM" height="1" width="1"/&gt;</description><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Community/default.aspx">Community</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Git/default.aspx">Git</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/Fluent+NHibernate/default.aspx">Fluent NHibernate</category><category domain="http://www.lostechies.com/blogs/derickbailey/archive/tags/FNH.Contrib/default.aspx">FNH.Contrib</category><feedburner:origLink>http://www.lostechies.com/blogs/derickbailey/archive/2009/05/13/fluentnhibernate-contrib-fnh-contrib-is-alive.aspx</feedburner:origLink></item></channel></rss>
