<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0YBQnYyfSp7ImA9WxNUGEs.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958</id><updated>2009-11-10T05:52:33.895-08:00</updated><title>Lone Star Developer</title><subtitle type="html">For the longest time I didn't know what I had. But now that I've lost it, I miss it dearly. I'm a developer deep in the Lone Star State, without peers or resources. Like a solitary cowboy, I make my own rules. I'm learning to survive and to rely on myself. This is my message to the rest of the world, hoping that someone out there will, one day, hear it.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.lonestardeveloper.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Louis</name><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/LoneStarDeveloper" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;C0cASH04eip7ImA9WxJTGUo.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-3646090789222697619</id><published>2009-04-28T19:09:00.001-07:00</published><updated>2009-04-28T19:10:49.332-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-28T19:10:49.332-07:00</app:edited><title>Emacs!</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;This has been posted with the use of e-blog, an Emacs addin that allows me to write my posts from this editor. So far so good, it seems!&lt;/p&gt;&lt;p&gt;Yeah, this is just a test. &lt;/p&gt;&lt;p&gt;Edit: Oh yeah, I published the post from Emacs too! How sweet is that?&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-3646090789222697619?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/3646090789222697619/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=3646090789222697619" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/3646090789222697619?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/3646090789222697619?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/Kk4_EGXfP3w/emacs.html" title="Emacs!" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/04/emacs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEMQno-eCp7ImA9WxVXGEQ.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-6763985408506168964</id><published>2009-02-17T11:08:00.001-08:00</published><updated>2009-02-17T11:08:03.450-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-17T11:08:03.450-08:00</app:edited><title>New blog</title><content type="html">&lt;p&gt;I have been honored recently with an invitation to blog on the Los Techies website. If you like my technical blurbs of knowledge, come on over and subscribe to my RSS feed! In fact, why don’t you go and subscribe to the main RSS feed? The bloggers there are all much smarter than me, really.&lt;/p&gt; &lt;p&gt;&lt;a href="http://feeds2.feedburner.com/LosTechies"&gt;http://feeds2.feedburner.com/LosTechies&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I plan to keep this blog going with slightly less technical postings. &lt;/p&gt; &lt;p&gt;Thanks for reading!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-6763985408506168964?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/6763985408506168964/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=6763985408506168964" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/6763985408506168964?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/6763985408506168964?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/mSjUwMrZ0y0/new-blog.html" title="New blog" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/02/new-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08DR3kycCp7ImA9WxVXFEo.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-5155454779743006605</id><published>2009-02-12T15:04:00.001-08:00</published><updated>2009-02-12T15:04:36.798-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-12T15:04:36.798-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="improvement" /><category scheme="http://www.blogger.com/atom/ns#" term="craft" /><title>Did you feel that?</title><content type="html">&lt;p&gt;A tingling sensation in the pit of my stomach, like a small flame that refuses to die as you turn off the gas… This is something I haven’t felt since my first days in college!&lt;/p&gt; &lt;p&gt;The passion for my craft and the pleasure I used to have at practicing it manifested themselves today. I’ve always known they were there, but for some reason they were hidden from my reach.&lt;/p&gt; &lt;p&gt;Through all the jobs I’ve had, I’ve yearned for that feeling to come back, that sheer joy of programming. I’m not talking about the exultation you feel when something that’s been bugging you finally works, like making an SSIS package work properly for example. No, I’m talking about loving the grind we all go through on a daily basis: writing lines of code.&lt;/p&gt; &lt;p&gt;I’ve been working on my behavior driven development skills and learning NHibernate today and it felt like I clicked. I was unable to write code before having written a spec and it eventually made me refactor in a few changes that made my code look… pretty!&lt;/p&gt; &lt;p&gt;I realized that I love doing well designed code. I thrive in such an environment and I’m able to enter the zone: spec-code-test-spec-code-test-spec-code-test… It makes me feel proud of what I did. I look at that big green bar and think that I can go home a happy man tonight. I’ve earned my diner. I feel like I went out of my cave and brought back a juicy mammoth for my family to eat. Aaarh! Something like that, anyway…&lt;/p&gt; &lt;p&gt;I don’t want to go back to my old ways, where passion had no room to expand and was all but extinguished! I shudder just to think of it. I don’t want to let go! I want to fan the flames.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-5155454779743006605?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/5155454779743006605/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=5155454779743006605" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5155454779743006605?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5155454779743006605?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/sTlKD2hypYc/did-you-feel-that.html" title="Did you feel that?" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/02/did-you-feel-that.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMFQ3c-cCp7ImA9WxVXEkQ.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-6438769997124101080</id><published>2009-02-10T11:16:00.001-08:00</published><updated>2009-02-10T11:16:52.958-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-10T11:16:52.958-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="craft" /><category scheme="http://www.blogger.com/atom/ns#" term="career" /><title>Design patterns usage</title><content type="html">&lt;p&gt;“What design patterns have you used?”&lt;/p&gt; &lt;p&gt;This used to be the killer question for me at all the job interviews I went to right after graduating from college. I’d stumble and mumble, even though I’d studied them the night before, like with so many previous employers. You’d think that I’d know them by heart! All my poor younger self could do is say that he used the singleton pattern extensively and cross his fingers… It is obvious that what I lacked was &lt;a href="http://blog.lonestardeveloper.com/2009/02/how-to-learn.html"&gt;practice&lt;/a&gt;. I’ve had to self-teach those skills over the years to overcome that deficiency.&lt;/p&gt; &lt;p&gt;Most job postings these days mention that you need some sort of expertise in Design Patterns. I deplore the wording, somewhat, since there are far more patterns than the ones depicted in the &lt;a href="http://c2.com/cgi/wiki?GangOfFour"&gt;Gang of Four&lt;/a&gt; &lt;a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1234292653&amp;amp;sr=8-1"&gt;book&lt;/a&gt;. For example, Design Driven Development introduces a couple of new patterns, &lt;a href="http://en.wikipedia.org/wiki/Martin_Fowler"&gt;Martin Fowler&lt;/a&gt; brought in the &lt;a href="http://en.wikipedia.org/wiki/Active_record_pattern"&gt;Active Record pattern&lt;/a&gt; with his books on &lt;a href="http://martinfowler.com/books.html#eaa"&gt;enterprise patterns&lt;/a&gt; and Agile practices have their own library of very useful patterns like &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;Dependency Injection&lt;/a&gt;, which requires you to use the &lt;a href="http://en.wikipedia.org/wiki/Bridge_pattern"&gt;bridge pattern&lt;/a&gt;. This is clearly a fast evolving field where patterns now use other patterns! Having been an active learner in the past two years, I have yet to come across a blog posting on how to use that old bridge pattern. Instead, I see a lot of Dependency Injection patterns articles, or &lt;a href="http://www.codeproject.com/KB/aspnet/IOCDI.aspx"&gt;Inversion of Control tutorials&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Separating your implementation from the interface is simply a good practice now. Is it really still a pattern? Do we still need to call it a bridge? And what about dynamic languages like Ruby, where there is no need for such a separation? Some patterns are so trivial to use in some languages that we are using them without even thinking about it.&lt;/p&gt; &lt;p&gt;Patterns are tools that allow us to do our jobs more efficiently, which is why employers keep asking us about them. You plug-an-play them into your object model, tweak them a little, run your tests and voila! It works.&lt;/p&gt; &lt;p&gt;Have you ever used &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx"&gt;Linq to SQL&lt;/a&gt;? Then you have used the &lt;a href="http://martinfowler.com/eaaCatalog/unitOfWork.html"&gt;unit of work pattern&lt;/a&gt;. Do you practice test driven development or &lt;a href="http://blog.lonestardeveloper.com/2009/02/bdd-testing-environment-for-net.html"&gt;behavior driven development&lt;/a&gt;? Then you most certainly have used dependency injection to make your system under test work with your mock objects.&lt;/p&gt; &lt;p&gt;I’m also willing to bet my life on the fact that you have used the infamous singleton pattern, where only one instance of the object can exist. I’m also going to go so far as to say that unit testing an object that uses a singleton internally has caused you to cry yourself to sleep.&lt;/p&gt; &lt;p&gt;When you are asked which design patterns you have used in the past, the interviewer typically wants to know if you know your craft’s tools. He wants to know if you’ll spend days, and company money, banging your head against a problem that could be easily solved using a design pattern. Am I personally an expert in design patterns? Do I know them all? No. The important thing is to know they exist and how to use them, and the only way to do that is to stay alert and keep up with what your peers are doing. Of course, &lt;a href="http://programmingtour.blogspot.com/2009/02/getting-it-done-vs-doing-it-right.html"&gt;a little practice goes a long way&lt;/a&gt;, because when the pressure is up and a deadline looms, we all tend not to do what’s right.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-6438769997124101080?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/6438769997124101080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=6438769997124101080" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/6438769997124101080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/6438769997124101080?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/f6Ig1Km2JEs/design-patterns-usage.html" title="Design patterns usage" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/02/design-patterns-usage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMBRXY-fCp7ImA9WxVXEEk.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-6353642246094772692</id><published>2009-02-07T13:33:00.001-08:00</published><updated>2009-02-07T13:34:14.854-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-07T13:34:14.854-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="tests" /><title>BDD testing environment for .Net</title><content type="html">&lt;p&gt;In my &lt;a href="http://blog.lonestardeveloper.com/2009/02/how-to-learn.html"&gt;last post&lt;/a&gt;, I mentioned I was going to use BDD and DDD to build a silverlight application. Well it took me a couple hours to settle on which BDD framework to use.&lt;/p&gt; &lt;p&gt;I started by trying out NBehave, but found it very verbose. I do not enjoy re-writing my stories in my tests. Stories should be defined, yes, but in a separate document. There is no point to repeating them again in the code. &lt;/p&gt; &lt;p&gt;Thus began a search for which framework I should try out. First, you have different unit testing frameworks, on top of which the BDD ones are built: &lt;a href="http://www.nunit.org/"&gt;nUnit&lt;/a&gt;, &lt;a href="http://www.codeplex.com/xunit"&gt;xUnit&lt;/a&gt; and &lt;a href="http://www.mbunit.com/"&gt;MbUnit&lt;/a&gt;. Then you have a choice between xUnit BDD extensions, &lt;a href="http://code.google.com/p/specunit-net/"&gt;SpecUnit.Net&lt;/a&gt;, &lt;a href="http://www.codeplex.com/NBehave"&gt;NBehave&lt;/a&gt;, &lt;a href="http://www.codeplex.com/storyq"&gt;StoryQ&lt;/a&gt; and &lt;a href="http://codebetter.com/blogs/aaron.jensen/archive/2008/05/08/introducing-machine-specifications-or-mspec-for-short.aspx"&gt;mSpec&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Well, that wasn’t easy. In the end, I decided to go with SpecUnit, just because it was &lt;a href="http://blog.scottbellware.com/"&gt;Scott Bellware&lt;/a&gt;’s project and he is quite vocal about what the &lt;a href="http://haacked.com/archive/2008/08/24/introducing-subspec.aspx"&gt;others do wrong&lt;/a&gt; (see comments) and I’d like to see what he’s got to teach me with his framework. Yes, mSpec was greatly influenced by SpecUnit, but it is currently under development, so I’ll wait a bit before I try it. I guess the main point is that writing a few tests in SpecUnit was enjoyable, which is important if you’re going to be writing thousands of tests, I guess.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-6353642246094772692?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/6353642246094772692/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=6353642246094772692" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/6353642246094772692?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/6353642246094772692?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/z4P9DL2l0FA/bdd-testing-environment-for-net.html" title="BDD testing environment for .Net" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/02/bdd-testing-environment-for-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQAQnw-eip7ImA9WxVXEE8.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-5514139544992768837</id><published>2009-02-07T08:32:00.001-08:00</published><updated>2009-02-07T08:32:23.252-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-07T08:32:23.252-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="improvement" /><category scheme="http://www.blogger.com/atom/ns#" term="career" /><title>How to learn</title><content type="html">&lt;p&gt;I’m going to Austin, TX in two weeks for a job interview where I’ll be asked to demonstrate my coding skills. Now, I’m the kind of guy who’s always humble about his talents. I mean, I grew up surrounded by people with mad hacking skills! They were doing object oriented programming, developing games and creating resident programs to allow us to use the mouse in the school lab when I was still trying to figure out how to program in Pascal.&lt;/p&gt; &lt;p&gt;Later, in College, those guys were rewriting C compilers, just for fun or putting in place a networked messaging system for their Quake-like gaming engine.&lt;/p&gt; &lt;p&gt;Great. I was having trouble balancing a binary tree in C++.&lt;/p&gt; &lt;p&gt;Okay, I’m selling myself a bit short here. After all, I did program a &lt;a href="http://en.wikipedia.org/wiki/Photon_mapping"&gt;photon mapping&lt;/a&gt; engine and an &lt;a href="http://en.wikipedia.org/wiki/Image-based_modeling_and_rendering"&gt;image-based renderer&lt;/a&gt;. But we all know these guys. You know, like the one that created Linux in his spare time? These guys can make you seriously &lt;a href="http://blog.lonestardeveloper.com/2008/08/becoming-great-programmer.html"&gt;doubt your own skill set&lt;/a&gt;. On the other hand, they represent only 1% of all programmers so maybe I should really see how I compare to the other 99%. Well, not too bad, I suppose.&lt;/p&gt; &lt;p&gt;The key here is that they knew things I didn’t. They practiced when I wasn’t. So I’m a bit to blame here. However, I’ve recently taken back the “student” mantle and tossed it over my shoulders.&lt;/p&gt; &lt;h2&gt;Learning&lt;/h2&gt; &lt;p&gt;Here is a &lt;a href="http://www.lostechies.com/blogs/gabrielschenker/archive/2009/02/05/learning-and-understanding.aspx"&gt;great article&lt;/a&gt; about learning and understanding. Go read it. I’ll wait.&lt;/p&gt; &lt;p&gt;Okay? Wasn’t that interesting? I mean, I knew practicing was part of the whole equation but I had never looked at the whole learning process like this before.&lt;/p&gt; &lt;p&gt;I’ve decided to put it into practice for the interview I’m going to. I’ve been reading a lot (and I mean *&lt;em&gt;a lot&lt;/em&gt;*!) about being agile in the past two years without having the chance to put it into practice where I work. Well that changes now. I vowed to my interviewer that I would learn some Silverlight and show him what I can do. Thankfully, I’m already at the practice stage here since I’ve played with it in the past (a good thing for me since Scott Guthrie’s &lt;a href="http://weblogs.asp.net/scottgu/pages/silverlight-2-end-to-end-tutorial-building-a-digg-search-client.aspx"&gt;tutorials&lt;/a&gt; are a bit outdated and you’ll have to figure out a thing or two on your own.)&lt;/p&gt; &lt;p&gt;It might be backwards, but I’ve been mixing the learning stages a bit. For example, I’m reading the &lt;a href="http://domaindrivendesign.org/books/index.html#DDD"&gt;DDD book&lt;/a&gt; and creating domain models as I go, practicing without knowing everything. Same with BDD; I jumped into rSpec on a ruby on rails project without even knowing how it works.&lt;/p&gt; &lt;p&gt;I usually tend to jump into it and fight my way out. But this path can be frustrating to follow, with too much stuff on your plate all at once. &lt;/p&gt; &lt;h2&gt;My Goal&lt;/h2&gt; &lt;p&gt;I’ve decided to build my Silverlight application using BDD and DDD, two subjects I’m currently studying intensely.&lt;/p&gt; &lt;p&gt;However, I will start by practicing the technologies and practices in isolation, so as not to be burdened too much. I’ve already been going through some Silverlight tutorials. Next, I’ll learn MbUnit and develop a domain model for my app with it. Finally, I’ll create the UI layer with Silverlight. I have 13 days, a wife and two kids. Can I do it and manage to impress a potential future employer?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-5514139544992768837?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/5514139544992768837/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=5514139544992768837" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5514139544992768837?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5514139544992768837?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/RGKfBrB-_q8/how-to-learn.html" title="How to learn" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/02/how-to-learn.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IMRH4_fSp7ImA9WxVQF0U.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-7874271885383199186</id><published>2009-02-04T14:10:00.001-08:00</published><updated>2009-02-04T14:13:05.045-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-04T14:13:05.045-08:00</app:edited><title>Never Eat Alone</title><content type="html">&lt;p&gt;I’ve just finished reading &lt;a href="http://www.amazon.com/Never-Eat-Alone-Secrets-Relationship/dp/0385512058"&gt;Never Eat Alone&lt;/a&gt;, a great book written by &lt;a href="http://www.keithferrazzi.com/"&gt;Keith Ferrazzi&lt;/a&gt; about networking and connecting with other people. I feel somewhat inadequate in this respect and I hoped I could gain a few good pointers from such a book. And I did! Living in the deep south of the Texas plains, I definitely need to grok networking to get further with my career.&lt;/p&gt; &lt;p&gt;The book was overall very useful. It is filled with techniques and examples of people who have successfully used them.&lt;/p&gt; &lt;p&gt;This is my attempt are summarizing the book.&lt;/p&gt; &lt;h2&gt;mind set&lt;/h2&gt; &lt;p&gt;You need to want to become a member of the club, somehow. Don’t be afraid! You want to hang out with the top dogs. In the end, who you hang out with kinda dictates who you are. Don’t keep score, be out there and help without asking for anything in return.&lt;/p&gt; &lt;p&gt;What is your mission? Write down your goals. It has been shown that you are more likely to achieve them if you write them down. Ferrazzi suggests detailing where you plan to be three months, six months, a year and three years from now.&lt;/p&gt; &lt;p&gt;You also need to build the network before you need it. This thing takes time! You need to have helped before you can be helped. So get out there and be audacious. Get in front of people and don’t be afraid to try and meet who you admire. CEOs and gurus are people just like you and I. As far as I know, they haven’t found a way to reach godhood, yet… But be careful not to be that networking jerk who tails people at conferences just because they said hi. Don’t hand out business cards without having first established a meaningful contact.&lt;/p&gt; &lt;h2&gt;the skill set&lt;/h2&gt; &lt;p&gt;Do your homework. Research who you want to meet and find out what they like, where they hang out and with whom, and where you’re more likely to “bump” into them. This isn’t cheating. You did it for your girlfriend or boyfriend, didn’t you? Why should it be different for IBM’s CEO?&lt;/p&gt; &lt;p&gt;Whoever you meet, take their names and note it down. These people will be useful later. You’re expanding your network and everybody is worthwhile to know. Remember, you’re not out to abuse your network, you’re also there for them. One of these people will probably be the key to getting connected to somebody more important. They can be referrals that you can use when cold calling your idols, which makes it not-so-cold anymore.&lt;/p&gt; &lt;p&gt;Speaking of cold calling, befriend the secretary or personal assistant. They can become powerful allies. Did you know they can actually influence the person you’re trying to reach? Yeah. They can.&lt;/p&gt; &lt;p&gt;Take your people out to lunch, share your passions. Keep developing the relationship and strengthening the bond. Invite somebody else you know to your lunch and be a connector yourself! And when you meet new people, follow up before they forget about you. A gentle reminder of a meeting in an email, simply saying thanks for a great time or just saying hi will work. You want them to remember your name the next time you talk to them.&lt;/p&gt; &lt;p&gt;Be a conference commando. Go to conferences to network. Research who will be there and plan on “bumping” into them. Learn who is organizing the whole thing and volunteer to help out. You’ll meet a lot of people that way in addition of getting a heads-up on who’s coming. Also, try to be a speaker.&lt;/p&gt; &lt;p&gt;Connect with connectors and marvel at the power of crossing the streams. I don’t care what you learned in Ghostbusters, crossing the streams is a good thing when mixing networks together. But there are rules. Don’t give away your entire network all at once, because the other won’t. And don’t make your connector friend look bad with their network.&lt;/p&gt; &lt;p&gt;Always work towards expanding your circle. Find ways to meet new people at all times. Master the art of small talk, which can be hard. Try listening to local talk radio. You'll have some stuff to talk about. It also help if you know what the other person is into.&lt;/p&gt; &lt;h2&gt;turning connections into compatriots&lt;/h2&gt; &lt;p&gt;Health, wealth, and children. Those are the three things people really care about. If you can help somebody with any of those, you’ve just made a friend for life. Can you get that guy’s kids into the best college in town? He’ll be forever grateful. Or did you refer that gal’s daughter for a very coveted position that just opened up in your organization?&lt;/p&gt; &lt;p&gt;Connect people together. If you meet someone who needs something and know a friend who can provide it, please connect them. Learn more about arbitrage &lt;a href="http://www.lifeoptimizer.org/2007/07/27/the-art-of-arbitrage-the-key-to-living-smart/"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Ping your contacts constantly. You don’t want them to forget you. Depending on how close they are to you, ping them monthly, semi-annually or annually. When you travel to their area, give them a call. Try to meet face-to-face.&lt;/p&gt; &lt;p&gt;Organize diner parties and invite anchor tenants: people with certain influence that keep coming to your parties. Almost by magic, other people will want to be there too.&lt;/p&gt; &lt;h2&gt;trading up and giving back&lt;/h2&gt; &lt;p&gt;Be interesting and build your brand. You have something to say and shouldn’t keep it to yourself. Form opinions, ideas, philosophies. Don’t be average. Stand out! Then broadcast your brand. Shout it out. Blog it, write guest columns, talk in conferences.&lt;/p&gt; &lt;p&gt;Get close to power by meeting assistants or people close to who you really want to meet. In gatherings, the important people will typically be extremely busy, while their aids will stand idle. Meet the aids! Again, we are not out to use them. We really want to know them.&lt;/p&gt; &lt;p&gt;Build a network that people will want to join, but don’t become arrogant or you’ll kill the golden goose. Find mentors who can teach you and mentees who will learn from you.&lt;/p&gt; &lt;p&gt;Finally, welcome to the connected age! Use LinkedIn, Twitter, blogs, FaceBook, Plaxo, etc. Connect!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-7874271885383199186?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/7874271885383199186/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=7874271885383199186" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/7874271885383199186?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/7874271885383199186?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/D7lR2FQ2BGY/never-eat-alone.html" title="Never Eat Alone" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/02/never-eat-alone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUNQXY-fSp7ImA9WxVQEkk.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-2229689868249685110</id><published>2009-01-29T08:41:00.001-08:00</published><updated>2009-01-29T08:41:30.855-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-29T08:41:30.855-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="design" /><title>Good Design</title><content type="html">&lt;p&gt;Someone asked me on a phone interview how I recognize a good software design. I think I managed to mumble some kind of response after blabbering a bunch of “uuh” and “aah”. I didn’t get the job, obviously, but since then I’ve never put the question to rest. It kept hunting me, distracting me like an annoying fruit fly that just won’t go away.&lt;/p&gt; &lt;p&gt;So I put a lot of thought into this and managed to get only as far as realizing that the following are signs that you have a good design:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The code is readable. By reading it, you can extract knowledge from it with a minimum of effort.&lt;/li&gt; &lt;li&gt;The code is reusable.&lt;/li&gt; &lt;li&gt;The code is easy to change.&lt;/li&gt; &lt;li&gt;The code is succinct and to the point.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Maybe I need to call the guy up again and tell him all of this. “Hey, it took me a month, but here’s what I think is essential in a good design!” Sure, it all looks like common sense. But that also means it is pretty rare. I find it incredibly hard to live up to those four intuitive guidelines. Sometimes I even forget that they exist!&lt;/p&gt; &lt;p&gt;Finally, I got my feelings validated a day or two ago when I read a blog post that mentioned the four qualities of BAD design (I apologize, but I can’t find that post anymore!):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;rigidity&lt;/li&gt; &lt;li&gt;fragility&lt;/li&gt; &lt;li&gt;immobility&lt;/li&gt; &lt;li&gt;viscosity&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Rigidity means your code is hard to change. Fragility means a change will break everything. Immobility means your code isn’t reusable. Finally, viscosity means that your stuff is hard to read and understand.&lt;/p&gt; &lt;p&gt;Wow, that’s exactly what I was thinking about! Now let’s get to work and apply all of this on a daily basis, shall we?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-2229689868249685110?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/2229689868249685110/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=2229689868249685110" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/2229689868249685110?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/2229689868249685110?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/Prqda2cB2hE/good-design.html" title="Good Design" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/01/good-design.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UARX4zfip7ImA9WxVSGEs.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-5128889175406096725</id><published>2009-01-13T09:54:00.001-08:00</published><updated>2009-01-13T09:54:04.086-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-13T09:54:04.086-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="me" /><category scheme="http://www.blogger.com/atom/ns#" term="craft" /><category scheme="http://www.blogger.com/atom/ns#" term="career" /><title>The answer to anything and everything…</title><content type="html">&lt;p&gt;… hasn’t been found yet in the case of software development.&lt;/p&gt; &lt;p&gt;We used to say that a good singer could sing the phone book without boring his or her audience. Nowadays, I feel like a good test for&amp;nbsp; singers would be to make them sing all the Agile acronyms without putting our managers to sleep. Or when your tired at night, instead of counting sheep, recite the acrony… Zzzzzzzz…&lt;/p&gt; &lt;p&gt;In the past couple of years, we grew so fed up with the classic waterfall model of software development that we started shooting in every direction at once in the search for the right way to develop software.&lt;/p&gt; &lt;p&gt;We have Agile development, with short and fixed iterations. Then Lean software development came about a said to hell with fixed iterations! We do it like Toyota is doing it (so much so that I actually wonder why they didn’t call it &lt;em&gt;Toyota Software Development, &lt;/em&gt;or TSD in short.) This is where a lot of our Agile terms come from, by the way. If you ever wondered what was up with all the Japanese terms in our field today, they come from Toyota: Kaizen, Andon, Kaikaku and Kanban are the ones I’ve heard the most, but there are about 10 others.&lt;/p&gt; &lt;p&gt;Sprinkle all of this with a bit of DRY, POCO, SOLID, DSL, BDD, TDD, DDD, IoC, MVC and PVC and you get a giant pool party where only the smartest ones that have had time to research all this are invited. It is our own Playboy mansion party!&lt;/p&gt; &lt;h2&gt;It’s like being 15 all over again&lt;/h2&gt; &lt;p&gt;It seems like we are entering our teenage years as a community. We are going through our identity crisis, trying to figure out who we are. Is writing software like building a house, or is it like manufacturing? Maybe it is like growing a garden? It’s probably none of those things. We don’t know for sure and these days, we are sticking with the manufacturing metaphor. Maybe in a couple of months we’ll think coding is like being in the police: you take your problem and circle it, make sure you have your snipers into place and don’t let any bug escape!&lt;/p&gt; &lt;p&gt;Eventually, however, we’ll start settling down in the same way other, more ancient fields have done. Engineering has it’s own set of rules and guidelines, and so do the people in manufacturing and construction, lawyers, cooks, doctors and party planners. They’ve been through it before. In the meantime, being teenagers, we get excited by the new stuff: “this new &lt;em&gt;watchamacallit&lt;/em&gt; is soooooo gonna replace Kanban boards!” But it the end, we need to show restraint.&lt;/p&gt; &lt;p&gt;What has been very hard to me recently was how to learn everything and how to use the new methodologies. Behavior Driven Development and Test Driven Development, for example, are two ways of driving your development. There can be only one driver, however, so which one is it? It seems like BDD has superseded TDD and is the way to go. Thank God I skipped TDD! &lt;/p&gt; &lt;p&gt;I also started learning Domain Driven Design to be a better designer. However, the methodology calls for a lot of coding *&lt;strong&gt;while&lt;/strong&gt;* you design your model. Ooookay, so do I have to code using BDD? I guess I could! And where does Activity Modeling fit into all this? Hmmm, I could use it to help me figure out my model. But where do DDD and Activity Modeling meet? At what point do I switch from designing the user experience to designing the domain model? I know they overlap a bit, but not completely. Do I use DDD to create my model layer and the create the app and UI layer using activity modeling and user stories? And can you use a Kanban board if you do DDD?&lt;/p&gt; &lt;p&gt;Etcetera…&lt;/p&gt; &lt;p&gt;This stuff is hard and people can’t do and test everything out. Some methodologies are known to be incompatible and some might repel each other, except that we don’t know it yet! Some very smart people are doing the hard work of figuring it all out and mostly end up saying that “you don’t have to follow every methodologies to the letter.” Great, now we can mix and match to circumvent things that won’t work together. What’s more, each team is different. What works somewhere won’t work everywhere. We need to adapt.&lt;/p&gt; &lt;p&gt;God damn it, I feel like a freaking headless chicken right now! Nobody has a perfect answer, everyone is still searching and every branch has its own dedicated evangelist saying that their way is THE way. I almost want to give up. The waterfall model seems so attractive compared the junk yard of methodologies in front of me…&lt;/p&gt; &lt;h2&gt;Let’s make this work&lt;/h2&gt; &lt;p&gt;Okay, let’s see. What have we got here…&lt;/p&gt; &lt;p&gt;Here’s what I know:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Coding takes time: a loooong time.&lt;/li&gt; &lt;li&gt;Coding always takes more time that you think&lt;/li&gt; &lt;li&gt;Coders are a constraint in the system. Software cannot be shipped faster than coders can code.&lt;/li&gt; &lt;li&gt;Modifying code is hard&lt;/li&gt; &lt;li&gt;Programmers and users never seem to understand each other&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Being a constraint in the system, coding must at all costs be protected so that it never stops. While this is all good in theory, it won’t be so in practice because we have to talk to our users, fix build servers, etc. This is what I like about Lean development: the idea that one must look for waste and get rid of it. In my mind, waste is anything that slows down development, like interruptions, waiting for customer response, waiting for DBAs, business analysts or managers. All of this waiting should be minimized, and any technique that helps you do that is good.&lt;/p&gt; &lt;p&gt;Oh, and why not throw in some good design practices in the mix? Your code should be easy to understand, easy to modify, easy to test and easy to reuse. Phew! Now for the rest of us mortals, try to make it as easy as possible, okay? Taking the time to understand code or being stuck when adding new features to unmanageable code: this is waste.&lt;/p&gt; &lt;p&gt;Another form of waste is the fact that users never seem to speak our language. This is why I love DDD. It helps develop a domain model and language in unison with the users. If done right, it increases the chance that the software will actually do what the users want! Novel, I know…&lt;/p&gt; &lt;p&gt;Hence, every methodology that I will ever follow will do the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Protect the coder by minimizing waste, and&lt;/li&gt; &lt;li&gt;Help users and coders understand each other&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;That’s it. The rest are just tools to help me achieve the above points.&lt;/p&gt; &lt;p&gt;It took since the industrial revolution to get to the way Toyota manufactures cars today. Software development is barely 40 years old. Hang in tight, it’s going to be a bumpy road.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-5128889175406096725?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/5128889175406096725/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=5128889175406096725" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5128889175406096725?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5128889175406096725?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/tuQAk1S4XKY/answer-to-anything-and-everything.html" title="The answer to anything and everything…" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/01/answer-to-anything-and-everything.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AMSHg9fSp7ImA9WxVSE0s.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-7069355809038880763</id><published>2009-01-07T13:31:00.001-08:00</published><updated>2009-01-07T14:03:09.665-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-07T14:03:09.665-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="coffee" /><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><title>Caffeine</title><content type="html">&lt;p&gt;Coffee tip#1: &lt;/p&gt; &lt;p&gt;Did you know that there is more caffeine in lighter roasts than in dark roasts? The roasting process burns away the caffeine in the coffee bean. While it might seem that the stronger taste indicates a stronger coffee, what you are tasting is just burnt oil.&lt;/p&gt; &lt;p&gt;Espresso beans, which are just regular beans that have been roasted darker to remove unwanted acidity in the taste profile, do not contain more caffeine than regular beans. &lt;/p&gt; &lt;p&gt;A 7 oz cup of drip coffee contains about 115mg of caffeine whereas a shot of espresso will contain 100mg. However, some espresso blends have a small amount of robusta beans. These beans have a higher caffeine content and might increase the dosage a bit. By the way, never get a cup of 100% robusta. That varietal is awfully bitter, almost undrinkable.&lt;/p&gt; &lt;p&gt;In the end, if you’re going to stay up all night programming, you’ll be better off drinking a light roasted cup of coffee then a darker one, or even espresso! What’s more, light roasts taste so much better. I purchased a small home roaster a year ago and have been roasting my own beans. In the morning, my cup of coffee leaves me licking my sticky lips, craving more. Yes, my lips get a bit sticky because of the very flavorful oils in the coffee beans that you don’t get from store bought beans. The oils disappears about a week or two after the roasting process.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-7069355809038880763?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/7069355809038880763/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=7069355809038880763" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/7069355809038880763?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/7069355809038880763?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/GSgZwpxdJao/caffeine.html" title="Caffeine" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/01/caffeine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HSX4zfyp7ImA9WxVSEkU.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-948382810271445723</id><published>2009-01-06T14:45:00.001-08:00</published><updated>2009-01-06T14:45:38.087-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-06T14:45:38.087-08:00</app:edited><title>Resolution</title><content type="html">&lt;p&gt;I'm 6 days late but I found one goal for the new year, which I'll hopefully attain before the summer.&lt;/p&gt; &lt;p&gt;I want to run a sub-20 minute 5k.&lt;/p&gt; &lt;p&gt;I already broke the 30 minute barrier, which was enough to create a loud BANG noise. Er.. no, wait. That's the sound barrier. Never mind.&lt;/p&gt; &lt;p&gt;Why running a sub-20 5k? Because We have four 5k races at work, once a quarter, where the winner gets $150. That's $600 per year! &lt;/p&gt; &lt;p&gt;And I want it. The problem is, there's this guy in my age bracket who runs the 5k in about 21 minutes, hence the sub-20 goal.&lt;/p&gt; &lt;h2&gt;Training&lt;/h2&gt; &lt;p&gt;I'm planning a toned-down, cardio centered &lt;a href="http://www.crossfit.com"&gt;crossfit&lt;/a&gt; workout during lunch, with one or two days of strength training every week. I will also run in the morning, 3 or 4 times a week doing mainly sprints like 4x400m or 8x800m and a longer run, maybe on Saturdays.&lt;/p&gt; &lt;p&gt;I'll also go back to my no bread, no sugar diet for a while, which is going to slim me down quite a bit. I'm hoping I can lose 10 pounds, which I won't have to haul when I run.&lt;/p&gt; &lt;h2&gt;Goals&lt;/h2&gt; &lt;p&gt;It's good to have a goal again! After attaining my goal of reaching my BMI last year, I was kind of in limbo. I didn't know what to train for and I wasn't very motivated to go to the gym . On top of that, I started eating bread and sugar during the holidays and had to go back a notch on my belt. Not good. &lt;/p&gt; &lt;p&gt;But now, with this new goal, I should be all set! Waking up early is gonna be a bitch though... &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-948382810271445723?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/948382810271445723/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=948382810271445723" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/948382810271445723?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/948382810271445723?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/diV9JJyam0c/resolution.html" title="Resolution" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/01/resolution.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIAR3c_eyp7ImA9WxVSEko.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-8479624106655955879</id><published>2009-01-06T12:09:00.001-08:00</published><updated>2009-01-06T12:09:06.943-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-06T12:09:06.943-08:00</app:edited><title>Format change = process change</title><content type="html">&lt;p&gt;I have just read that Dr. Dobb's Journal &lt;a href="http://herbsutter.wordpress.com/2008/12/31/the-2008-media-inflection-meet-dr-web-the-new-gorilla/"&gt;is going Web-only&lt;/a&gt;. My question now is will they try to fit a square peg in a round hole?&lt;/p&gt; &lt;p&gt;Traditional print magazines gather articles and publish them on a strict schedule. This is imposed on them by the publishing industry, where it is more cost effective to print one million copies every month then to make half a million every other week.&lt;/p&gt; &lt;p&gt;By going online, however, a magazine becomes free of that constraint and can release content every day or so. I hope that Dr. Dobb's Journal change their process this way instead of doing it the good old way just because "it's what we've always done!"&lt;/p&gt; &lt;p&gt;I have a subscription to the &lt;a href="http://journal.crossfit.com/"&gt;Crossfit Journal&lt;/a&gt;, a newsletter turned online magazine about fitness. They moved away from a monthly PDF to continuous content creation, which is a fabulous way to make your customers come back for more every day or two. Also, reactions to articles and discussions happen on a much shorter span where authors can respond or react almost immediately.&lt;/p&gt; &lt;p&gt;Changing your medium is a great opportunity to change your model for the best!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-8479624106655955879?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/8479624106655955879/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=8479624106655955879" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8479624106655955879?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8479624106655955879?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/MjGxcd69TNY/format-change-process-change.html" title="Format change = process change" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/01/format-change-process-change.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IAQ306eip7ImA9WxVSEko.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-8125910666885375072</id><published>2009-01-06T11:52:00.001-08:00</published><updated>2009-01-06T11:52:22.312-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-06T11:52:22.312-08:00</app:edited><title>Alone in the back country might be a good thing</title><content type="html">&lt;p&gt;The whole reason for this blog is to keep me connected, somehow, to the technological world where most uber-geeks live. I copied myself on the Internet through this blog, Twitter and Facebook to create the illusion that I live in this beautiful giant metropolis where bits fly down the highways and jump down from the high rises that are the layered applications of the World Wide Web.&lt;/p&gt; &lt;p&gt;My hope was to one day get back and live in a real city like Austin or San Fransisco, strong from all my digital connections. This all changed, however. I might not want to live in a big city anymore. Not since I've read &lt;a href="http://www.boston.com/bostonglobe/ideas/articles/2009/01/04/how_the_city_hurts_your_brain/"&gt;this article on Boston.com&lt;/a&gt;, anyway.&lt;/p&gt; &lt;p&gt;Cities are bad for my brain? That is definitely a thinker. All the things that I grew up to love about cities prevent my brain from operating at its full potential by saturating it with useless sensory experiences. In contrast, nature tends to heighten and relax the mind, studies show.&lt;/p&gt; &lt;p&gt;This seriously makes me rethink my strategy. While I miss the sophistication of bigger urban areas, with their 20 varieties of blue cheese and exotic food and restaurants, I also crave the quietness of nature and the sight of water.&lt;/p&gt; &lt;p&gt;As software developers, we are incredibly fortunate to be able to telecommute and work at a certain distance from our customers. Technology is helping us by allowing us to stay connected without being physically together. IM software, emails, scanners, the Web, Google Docs and now iWorks from Apple now allow you to share data online. More and more, people have the tools they need to connect and meet on the Internet.&lt;/p&gt; &lt;p&gt;We already see user group meetings online where one can attend from anywhere and contribute to the discussion. Apple enables you to present a keynote presentation (similar to power point) through an IM session. I'm positive there is already a tech book club online. Hell, IRC has been very useful for years already! What about Linux? It's been developed by people who lived all around the world.&lt;/p&gt; &lt;p&gt;Plus, I can always order my blue cheese from Amazon.com. Hmm, maybe it is time to move further into the wild! All I need is a T1 line and I'm all set!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-8125910666885375072?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/8125910666885375072/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=8125910666885375072" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8125910666885375072?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8125910666885375072?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/ukqp3SiUUEs/alone-in-back-country-might-be-good.html" title="Alone in the back country might be a good thing" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2009/01/alone-in-back-country-might-be-good.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AFQHg5fSp7ImA9WxVTEkw.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-7872433252504923107</id><published>2008-12-25T07:21:00.000-08:00</published><updated>2008-12-25T07:41:51.625-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-25T07:41:51.625-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="christmas" /><title>A message...</title><content type="html">def christmas&lt;br /&gt;   "Christmas"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def wish_a(holiday)&lt;br /&gt;   puts "I wish you all a merry #{send(holiday)}!!"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;wish_a(:christmas)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-7872433252504923107?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/7872433252504923107/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=7872433252504923107" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/7872433252504923107?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/7872433252504923107?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/ZTazde7oaV0/message.html" title="A message..." /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/message.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcFRnY_fyp7ImA9WxVTEEg.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-3205386865662841043</id><published>2008-12-23T10:13:00.001-08:00</published><updated>2008-12-23T10:13:37.847-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-23T10:13:37.847-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="me" /><category scheme="http://www.blogger.com/atom/ns#" term="craft" /><category scheme="http://www.blogger.com/atom/ns#" term="career" /><title>Is Smart UI what we need?</title><content type="html">&lt;p&gt;I just read a very perturbing section in Domain Driven Design called "Smart UI". This unthinkable, heretical pattern advocates that you put your business logic in the UI and that sometimes, it might even be worth it.&lt;/p&gt; &lt;p&gt;It was too late. I knew that the seeds of reason had started growing inside of me, like a vine on steroids. Soon, one of the thorns pierced my heart and I gave up.&lt;/p&gt; &lt;p&gt;According to Evans, Smart UI is useful for small projects or for teams that are not sophisticated enough to handle the complexity of Domain Driven Design. In that case, putting all the business logic in the UI will at least isolate it in the sense that all one has to do to modify it is to replace the UI. Of course, this means trouble in the long run. Things will get progressively harder and harder to change and you will end up with a monolithic beast that demands too much attention and sleeps on your side of the bed. But...&lt;/p&gt; &lt;p&gt;What if this is the best my team can do? Should I embark on a crusade to teach them Agility when I know deep inside that they don't really care? As far as they're concerned, they think things are just fine the way they are right now.&lt;/p&gt; &lt;p&gt;Why don't I think the same thing? Why am I on this quest for new methods and patterns?&lt;/p&gt; &lt;p&gt;I want to have fun programming like I used to in high school. This is a deep motivation of mine. Every company that I've worked for so far has somehow succeeded in making it more of a burden. I love the pureness of the craft, the manipulation of concepts, the massaging of data. On the other hand, I find that trying to make things fit is a bother. I love Quality things that just work.&lt;/p&gt; &lt;p&gt;This is who I am. I'm attracted by the beauty of mathematics, the usefulness of Ruby and the creativity and science of cooking food. &lt;/p&gt; &lt;p&gt;I'm put off by by the monotony of building data centric web applications that simply mirror the database schema with some extra validation and business rules sprinkled all over the place. I'm put off by anything that takes time and requires me to stop my creative flow, by things that create friction and that refuse to work even though it seems like you did everything right.&lt;/p&gt; &lt;p&gt;I also hate getting off track like I did just now... But it had to get off my chest. Sometimes I don't even know why I do it; why I sit at a desk and try to make code behave. This little rant helped me refocus on what makes me tick and on why I might want to go the Smart UI way with my team. In the end, it is the customer that counts. I might not become the equivalent of a Michelin three stars chef this way but at least I'll make some people happy... in the short term. The future, fortunately, will force us to change. By this time, I might gain enough influence and wisdom to help my team migrate towards a more... educated way of doing things.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-3205386865662841043?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/3205386865662841043/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=3205386865662841043" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/3205386865662841043?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/3205386865662841043?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/8FT6_6iAhYk/is-smart-ui-what-we-need.html" title="Is Smart UI what we need?" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/is-smart-ui-what-we-need.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4CSX8-eCp7ImA9WxRaF0Q.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-2709446667772710215</id><published>2008-12-20T08:13:00.000-08:00</published><updated>2008-12-20T08:36:08.150-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-20T08:36:08.150-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mentor" /><category scheme="http://www.blogger.com/atom/ns#" term="master developer" /><category scheme="http://www.blogger.com/atom/ns#" term="me" /><category scheme="http://www.blogger.com/atom/ns#" term="chief engineer" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="design" /><category scheme="http://www.blogger.com/atom/ns#" term="toyota" /><category scheme="http://www.blogger.com/atom/ns#" term="tests" /><title>Who is your Chief Engineer?</title><content type="html">I really like Scott Bellware's &lt;a href="http://blog.scottbellware.com/2008/12/chief-engineer.html"&gt;post about a chief engineer&lt;/a&gt; to drive the development of software within your organization, which is based on the definition of the same role at Toyota (which, incidentally, is referenced quite often when talking about lean software development.) I also like the though that such chief engineers need to be grown and cultivated within an organization with a culture of change already in place. This is very similar to what Mary Poppendieck calls master developers in her book &lt;a href="http://www.poppendieck.com/ld.htm"&gt;Lean Software Development&lt;/a&gt;. These people are responsible for representing the customer as domain experts and oversee the design and development of software since they know about the technology and still &lt;span class="Apple-style-span" style="font-style: italic;"&gt;use it&lt;/span&gt;! &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In another post, Scott rewords the chief engineer's responsibility within a context of &lt;a href="http://blog.scottbellware.com/2008/12/acceptance-tests.html"&gt;acceptance testing&lt;/a&gt;:&lt;/div&gt;&lt;blockquote&gt;A Chief Engineer in a software product development organization can write acceptance tests without the burden of elaborate end-user testing tools. He can use the common tools of the trade. He understands the imperatives of using tests as documentation and uses usability-focused test authorship, and sets standards for authorship that his organization cultivates and follows.&lt;/blockquote&gt;&lt;div&gt;If I'm reading between the lines correctly, it sounds like the chief engineer might not be writing code anymore, but can sure write tests to insure that the software is implemented in a way that its behaviors pass the tests that he wrote. I like that very much. I've read in so many places and truly believe that great managers and leaders still code. They have to have their hands wet and dirty. Writing acceptance tests, or BDD and other kinds of tests is a great way to do that while at the same time making sure that they are not in the way of the developers. Talk about having your feet in both the customer's world and in your own world at the same time! I don't think this concept exists any other way in software development.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, how do we get a chief engineer if we are a one man show like myself? I guess it is up to me to cultivate myself into one. But that can take years! I guess the only solution, in the meantime, is to surround myself with customers and use all the tools that we have so that I can understand them as best I can. BDD, DDD, acceptance tests, etc... Eventually, either I'll become a chief engineer in that domain or I'll end up cultivating another one, which will mean that the business that I haven't started growing yet will be making money (crossing my fingers!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks Scott for the great post!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-2709446667772710215?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/2709446667772710215/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=2709446667772710215" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/2709446667772710215?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/2709446667772710215?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/oz7rGTQUDl0/who-is-your-chief-engineer.html" title="Who is your Chief Engineer?" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/who-is-your-chief-engineer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMHRH48cCp7ImA9WxRaFU4.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-3266227542438118031</id><published>2008-12-17T09:03:00.001-08:00</published><updated>2008-12-17T09:03:55.078-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-17T09:03:55.078-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="smell" /><category scheme="http://www.blogger.com/atom/ns#" term="improvement" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>SQL separation of concerns</title><content type="html">&lt;p&gt;After writing my &lt;a href="http://blog.lonestardeveloper.com/2008/12/sql-code-can-smell-too.html"&gt;post&lt;/a&gt; last night, I started thinking about ways to remove the bad smell coming out of my SQL code. The issue is that I wrote a stored procedure whose &lt;/p&gt; &lt;p&gt;My thoughts followed this logic:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Well, that's okay. I'll just put an obvious comment in there asking anybody not to change the result set. I'll also rename the stored procedure, ending it with "ForInsert" so that it is obvious what it's for.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Oh man, that is even worse! Now it's like I just sprayed some strawberry fragrance to cover that nasty bathroom smell... You know what I mean!&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;I guess I could put in some output parameters in my stored procedure instead and use those to insert the data I want. That way, as long as nobody removes a parameter, I'm fine. &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Yes, that's better. Compared to my previous thought, this one removes the problem where another programmer would change the order of the fields returned, remove or even add fields in the returned result set. Adding field is the biggest issue here. I know I like to "supplement" stored procedures here and there by adding extra information that is returned to me. Which makes me think...&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;If I want a stored procedure to return extra data, I'll write another stored procedure that returns the result set of the first one with my extra stuff added to it. That way, I won't break the initial stored procedure.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Hey, I'm learning as I go, Ok? Cut me some slack. I'm going through the usual programming learning curve here. I'm fairly advanced when it comes to regular code like C# or Ruby, but mediocre with SQL. It feels like I just came out of the "Look 'ma! SQL code!" stage and started wondering about encapsulation and separation of concerns. Of course, that is much harder to achieve in SQL than it is in any good object oriented language.&lt;/p&gt; &lt;p&gt;I had one last thought, which I haven't acted upon yet. What about using views and filtering the data on the view instead of passing parameters to a stored procedure? Or what about using common table expression? What about temporary tables? I haven't had time to think those through just yet, but I will...&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-3266227542438118031?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/3266227542438118031/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=3266227542438118031" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/3266227542438118031?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/3266227542438118031?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/4cR_vtyVM5I/sql-separation-of-concerns.html" title="SQL separation of concerns" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/sql-separation-of-concerns.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcCQHw7fCp7ImA9WxRaFEU.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-8210695264569447335</id><published>2008-12-16T19:00:00.000-08:00</published><updated>2008-12-16T19:04:21.204-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-16T19:04:21.204-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="smell" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>SQL code can smell too</title><content type="html">I just wrote some bad SQL code tonight that I think I'll have to revisit tomorrow morning when I get back to work.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think that using a stored procedure to populate an Insert statement is simply wrong. Should anyone modify that stored procedure or change the order in which the values are returned, my insert will fail. Can you smell that? Yeah, it smells bad.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was simply trying to "encapsulate" things a little and make my code less cluttered. Maybe using a common table expression or temporary table would be a much better idea.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-8210695264569447335?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/8210695264569447335/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=8210695264569447335" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8210695264569447335?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8210695264569447335?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/_gB4Zti7m6c/sql-code-can-smell-too.html" title="SQL code can smell too" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/sql-code-can-smell-too.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUFQHw5fSp7ImA9WxRaEU8.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-6771504538278402563</id><published>2008-12-12T15:56:00.001-08:00</published><updated>2008-12-12T15:56:51.225-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-12T15:56:51.225-08:00</app:edited><title>Losing your work</title><content type="html">&lt;p&gt;Windows Live Writer, which I use to write this blog, decided to stop allowing me to use the undo function just at the moment when I had accidentally deleted 3/4th of my post. Of course, I had saved my work both before and after the accident. I guess the "save often" philosophy works only when you can trust the undo button to do its work properly.&lt;/p&gt; &lt;p&gt;I hope you guys were not hoping for my next installment of my SQL training recap. I really don't feel like writing it all again and I'm getting a little tired of SQL code. Yeah, it gets old.&lt;/p&gt; &lt;p&gt;Could somebody write a text editor that keeps track of the history of your file? Kthxbye.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-6771504538278402563?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/6771504538278402563/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=6771504538278402563" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/6771504538278402563?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/6771504538278402563?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/RpFPLACaaiU/losing-your-work.html" title="Losing your work" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/losing-your-work.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMDQ3Y-fSp7ImA9WxRbFUU.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-8556553494471869758</id><published>2008-12-06T08:45:00.000-08:00</published><updated>2008-12-06T09:11:12.855-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-06T09:11:12.855-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="me" /><category scheme="http://www.blogger.com/atom/ns#" term="digital self" /><title>State of my Digital Self</title><content type="html">When I created this blog &lt;a href="http://blog.lonestardeveloper.com/2008/07/this-blog-and-its-meaning.html"&gt;last July&lt;/a&gt;, my goal was to brand myself online and to create an online persona that would represent me, my thoughts and my values with the goal of becoming visible and gaining the respect and recognition of my peers in the software development world.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I started blogging without caring about the whether I was right or not with the assumption that the process of learning that takes place while writing is more important to me than being right. I have, after all, the rest of my life to be right.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I opened a &lt;a href="http://twitter.com/louis_salin"&gt;Twitter account&lt;/a&gt; with the intent of meeting new people and hoping that a few would follow me. What I discovered, however, is that Twitter is at its best when you use it to follow the right people. That is, following people you want to meet or that something that you don't, be it skills, money or fame. That is the magic of Twitter and that is how I got to go to the best &lt;a href="http://www.kaizenconf.com/"&gt;conference&lt;/a&gt; I've ever been to and meet people who would have a lot to teach me, and still do continuously!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm also on &lt;a href="http://www.linkedin.com/in/louissalin"&gt;LinkedIn&lt;/a&gt;. However, I'm not sure I have uncovered the key to that social networking site yet. I don't know how to make it work for me. It is a great place for people to examine your professional past and references, but that's about it so far. I'm sure I'm missing something, but what? I need to look into it some more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then there's &lt;a href="http://www.shelfari.com"&gt;Shelfari&lt;/a&gt;, a social site where you can advertise the books you've read, the ones you'd like to read and the ones you own. Seems interesting. I opened up &lt;a href="http://www.shelfari.com/louis_salin"&gt;an account&lt;/a&gt; just a couple days ago so we'll see where that takes me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And last but not least: Facebook. I do not have an account on Facebook simply because I never understood it. I used to have an account on MySpace and I hated it. Should I do Facebook? Is it different? I guess I'll have to check it out. Today!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-8556553494471869758?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/8556553494471869758/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=8556553494471869758" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8556553494471869758?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8556553494471869758?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/kDVi3-jlAyk/state-of-my-digital-self.html" title="State of my Digital Self" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/state-of-my-digital-self.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUABSX8yfip7ImA9WxRbFUw.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-5541885913578163926</id><published>2008-12-05T12:45:00.001-08:00</published><updated>2008-12-05T14:55:58.196-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-05T14:55:58.196-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Advanced SQL training</title><content type="html">&lt;p&gt;I ranted a bit about SQL in general in &lt;a href="http://blog.lonestardeveloper.com/2008/12/hey-i-like-sql.html"&gt;my previous post&lt;/a&gt;, which was supposed to be a quick intro to the SQL training I'm putting myself through at home. Instead, I rambled on about developers being scared of SQL and bending over backwards in order to avoid it. &lt;/p&gt; &lt;p&gt;Anyway, my boss asked me last week to go to a SQL training. He correctly identified my lack of knowledge and understanding about the database tools we use at work and wanted to correct that. But instead of going to a training that just covers the basics in a breath-first manner, I bought two books: &lt;a href="http://www.sql.co.il/books/insidetsql2005/"&gt;Inside SQL Server 2005: T-SQL Querying and Inside SQL Server 2005: T-SQL Programming&lt;/a&gt;. Oh my God... The amount and depth of knowledge in those books is staggering. I have four days to go from "just getting by" SQL developer to a "data can't hide from him" database guru. Of course, I told my boss that I'd be blogging about my discoveries in order to cement the knowledge in my head but now I find that I will not have enough of my four days of reclusion at home to learn everything I want to learn. I need to focus on what I need for work.&lt;/p&gt; &lt;p&gt;For this training, I dove deep into two books and started with the fundamentals...&lt;/p&gt; &lt;h2&gt;Fundamentals&lt;/h2&gt; &lt;p&gt;What steps SQL Server goes through to evaluate a query is a very useful thing to know and helps explain why certain things can or can't be done inside a query.&lt;/p&gt; &lt;p&gt;Take the following query for the Northwind database, which select the total number of orders made by all american employees where that number is greater than 100:&lt;/p&gt; &lt;div&gt; &lt;div style="font-size: 11pt; background: black; color: white; font-family: consolas"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #ff8000"&gt;SELECT COUNT&lt;/span&gt;(Orders.OrderID) &lt;span style="color: #ff8000"&gt;AS &lt;/span&gt;TotalOrderCount, Employees.EmployeeID&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #ff8000"&gt;FROM &lt;/span&gt;Orders&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff8000"&gt;JOIN &lt;/span&gt;Employees &lt;span style="color: #ff8000"&gt;ON &lt;/span&gt;Orders.EmployeeID = Employees.EmployeeID&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #ff8000"&gt;WHERE &lt;/span&gt;Employees.Country = &lt;span style="color: lime"&gt;'USA'&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #ff8000"&gt;GROUP BY &lt;/span&gt;Employees.EmployeeID&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #ff8000"&gt;HAVING COUNT&lt;/span&gt;(Orders.OrderID) &amp;gt; 100&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: #ff8000"&gt;ORDER BY &lt;/span&gt;TotalOrderCount&lt;br&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;SQL Server starts by executing the FROM and JOIN statements by performing a cross-join between the Orders table and the Employees table and storing the resulting rows in a virtual table that we'll call VT1. Then the ON statement is executed and only the rows that match the condition in the query are kept in another virtual table: VT2. The WHERE statement is then examined and SQL Server gets all the rows in VT2 where Country = 'USA' and stores them in VT3. VT4 is created by grouping together the rows based on employeeID, meaning that we are keeping only one row per employeeID and that we have to somehow aggregate the rest of the data from now on.&lt;/p&gt;&lt;p&gt;The HAVING clause indicates that we only want to keep the rows where the count of orderIDs per employeeID (aggregating the data) is greater than 100. The result is stored in VT5.&lt;/p&gt;&lt;p&gt;Then, we select the employeeID and the count of orders (remember, the rest of the data after executing the GROUP BY statement needs to be aggregated somehow) and assign, optionally, column aliases, which you can now use in the query, into VT6. Finally, VT7 is created when we use the ORDER BY clause.&lt;/p&gt;&lt;p&gt;Interstingly enough, VT7 is not returned. Instead, a cursor is what the query gives us back because of the ORDER BY clause. Without it, a virtual table would indeed by returned. This is why you cannot use ORDER BY inside subqueries, which are expected to return a table. After an ORDER BY statement, only functions that take cursors as input, like TOP(n), can be used. &lt;/p&gt;&lt;p&gt;So let's go back over the order in which SQL Server executes the query (I'll include every possible SQL statement this time): &lt;/p&gt;&lt;p&gt;1- FROM .. JOIN&lt;br&gt;2- ON&lt;br&gt;3- WHERE&lt;br&gt;4- GROUP BY&lt;br&gt;5- WITH&lt;br&gt;6- HAVING&lt;br&gt;7- SELECT&lt;br&gt;8- DISTINCT&lt;br&gt;9- ORDER BY&lt;br&gt;10- TOP &lt;p&gt;Any alias that you define in a query, be it a column alias, a table alias or a subquery alias can only be used in subsequent steps in the list or SQL Server will not recognize them. &lt;/p&gt;&lt;p&gt;On a side note, it is important to know about the UNKNOWN value in SQL. Usually, TRUE or FALSE is return when comparing values. But since some values can be NULL, comparing such a value with another one results in UNKNOWN. When a filter is applied to a query (WHERE, HAVING, ON), unknown values are considered like FALSE. But inside a check constraint, like making sure the salary in a column is greater than zero, unknown values are considered like TRUE.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-5541885913578163926?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/5541885913578163926/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=5541885913578163926" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5541885913578163926?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5541885913578163926?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/92uDd2OgOgo/advanced-sql-training.html" title="Advanced SQL training" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/advanced-sql-training.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIBSHs-eCp7ImA9WxRbFEU.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-2794997338531711407</id><published>2008-12-04T11:58:00.001-08:00</published><updated>2008-12-05T06:49:19.550-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-05T06:49:19.550-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="me" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Hey, I like SQL!</title><content type="html">&lt;p&gt;SQL is one of my weak spots. I've known that for a while, since college actually. I never thought I'd need it, you know? Ha, add that to the list of things that seemed superfluous to me at the time! SQL? That's what DBAs are for, no? Math? That's what mathematicians are for, no? Parallel programming? I'm never going to work on more than one CPU at a time! Statistics? I'll just look up formulas online. Ah, being young... &lt;/p&gt;  &lt;p&gt;Well my use of SQL has increased linearly since I got out of college and I always managed to learn just enough to get by. However, it has caught up with me. I work in a manufacture that creates pumps and valves for the oil fields. Tractability is important and we keep track of everything that is done to our parts during the manufacturing process. Add to that the HR system and our accounting software and we have massive amounts of data in the database. That data is there, just waiting to be used. &lt;/p&gt;  &lt;p&gt;Not being great with databases in general is a flaw since I do not know how to use SQL as a tool. Here are a ton of nails, but I don't have a hammer, just a C# screwdriver (I do VB.Net, so I what I really have is a plastic screwdriver!) &lt;/p&gt;  &lt;p&gt;Software developers and DBAs have been at war since they ever met. DBAs complain that software developers are nosy and don't know how to use a database properly and exist only to circumvent the systems they have put in place to safeguard against both data problems and intruders. Programmers, on the other hand, complain that DBAs take too long to take care of their requests and are just creating job security for themselves. &lt;/p&gt;  &lt;p&gt;On top of that, software developers in general just don't like databases. It seems alien to us. We can't debug it, it gathers data all at the same time and we can't ever be sure that we even got the right data to begin with! Why not just grab everything, loop over it and grab what we need? After all, our data is never complex. &lt;/p&gt;  &lt;p&gt;So we attempted to build object databases, which are far from being mainstream at the moment. We like them because we know Objects. But SQL just isn't going away. So we created ORM frameworks to help get rid of the repetitive CRUD operations in our models so we don't have to ever deal with SQL. Then, we declared a holy war on stored procedures, the only thing that can still possibly resist ORMs. &lt;/p&gt;  &lt;p&gt;Stored procedures are not faster than code! They're just there so that the DBAs have something to do. There is nothing a stored procedure can do that code can't do! &lt;/p&gt;  &lt;p&gt;To all of this I say: Bullshit! Programmers react to SQL the same way VB ASP.Net programmers react to functional languages. They don't want to touch them with a 10 foot pole simply because they don't understand them. All their arguments are a facade to hide the fact that they don't want to learn the new languages. &lt;/p&gt;  &lt;p&gt;You don't think the same way when you program in Javascript or Lisp or Ruby versus VB.Net. In the same manner, using SQL forces you to think in SQL, an entirely different beast altogether. &lt;/p&gt;  &lt;p&gt;I've really come around recently concerning SQL. I used to be like what I described above, but the more comfortable I became with the language, the more I started understanding it. I realized it is a tool in it's own right, used to solve a wide range of problems and that trying to resolve everything with my favorite language was not always the right thing to do. &lt;/p&gt;  &lt;p&gt;If you deal with data and databases, learn SQL. Learn your database management system. There is really nothing else out there that can work this efficiently with relational data. Sure, use ORMs, since they are a tool that helps you keep a clean model. But do not be afraid to use SQL. Do not let the ORM do all the SQL thinking for you the same way you wouldn't let the politicians in Washington tell you what to think! ORMs can't do everything, after all. Sometimes, you just need the data without an associated object.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-2794997338531711407?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/2794997338531711407/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=2794997338531711407" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/2794997338531711407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/2794997338531711407?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/sz7oiAEHClM/hey-i-like-sql.html" title="Hey, I like SQL!" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/12/hey-i-like-sql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEASX45fyp7ImA9WxRUFEs.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-5424683903460224646</id><published>2008-11-23T10:07:00.001-08:00</published><updated>2008-11-23T10:07:28.027-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-23T10:07:28.027-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="processes" /><category scheme="http://www.blogger.com/atom/ns#" term="lean" /><category scheme="http://www.blogger.com/atom/ns#" term="improvement" /><title>Lean Software Development</title><content type="html">&lt;h3&gt;A book review&lt;/h3&gt;  &lt;p&gt;I've just finished reading &lt;a href="http://www.poppendieck.com/ld.htm"&gt;Lean Software Development&lt;/a&gt;, a book written by Mary and Tom Poppendieck that introduced the lean practices used in the manufacturing world to software development as an evolution of Agile methodologies.&lt;/p&gt;  &lt;p&gt;Lean software development in general is still a new process, but the theories are solidly anchored by the manufacturers that have made it work for them. Toyota has introduced the kanban system and the &amp;quot;decide as late as possible&amp;quot; technique. 3M and the way they empower their teams. The Theory of Constraints which is used, incidentally, at the company I work for.&lt;/p&gt;  &lt;p&gt;What Mary and Tom did was to translate every good practice to the software world. But because of the novelty of the approach, there are very few examples in the book of the lean techniques as applied to software development. Some time has passed, however, since the book has been written and today the reader can find a plethora of examples dispersed on the Internet, via developer blogs everywhere. &lt;a href="http://altdotnet.org/"&gt;Alt.Net&lt;/a&gt; in particular is a group whose members adhere to agile and lean practices and would be a good place to start searching.&lt;/p&gt;  &lt;p&gt;I consider this book an excellent introduction to lean software development and highly recommend it to anyone looking into this methodology wanting to know more about it, or wanting to implement it in their workplace. The language of the book provides an easy read and most real life examples are taken from Mary and Tom's personal experiences at the various companies they have worked for and are always very insightful.&lt;/p&gt;  &lt;h2&gt;What is lean?&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Lean_software_development"&gt;Lean development&lt;/a&gt; is the elimination of waste. &lt;/p&gt;  &lt;p&gt;That's it... Really! You can stop reading now.&lt;/p&gt;  &lt;p&gt;Seriously, however, lean development is about using tools and techniques in accordance to seven basic principles in order to eliminate waste in the value creation process.&lt;/p&gt;  &lt;p&gt;The value creation process is simply how your company (or department) creates value. In our case, how we develop software is the process we are talking about here. Software is the value we create for our customers.&lt;/p&gt;  &lt;p&gt;One way we can visualize this process is by using a &lt;a href="http://en.wikipedia.org/wiki/Value_Stream_Mapping"&gt;value-stream map&lt;/a&gt;, which depicts all the steps taken when designing, developing and deploying software, along with the time taken to go through each step and the time that has been lost just waiting for something (feedback, testers, DBAs, etc.)&lt;/p&gt;  &lt;p&gt;Then we apply lean methodologies to try to shorten the value-stream map as much as possible without sacrificing on quality. All and all, it means having shorter software creation cycles.&lt;/p&gt;  &lt;p&gt;Let's talk a bit about each of the seven lean principles, as discussed in the book.&lt;/p&gt;  &lt;h2&gt;Eliminate waste&lt;/h2&gt;  &lt;p&gt;Well I've rambled a little about this already. The main thing is to learn to &lt;em&gt;&lt;strong&gt;see&lt;/strong&gt;&lt;/em&gt; waste, however. One way to do this is to search for anything that isn't coding and analysis and see if it adds value to the product. If it doesn't, then it is waste.&lt;/p&gt;  &lt;p&gt;The following is considered waste:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Partially done work &lt;/li&gt;    &lt;li&gt;Extra processes &lt;/li&gt;    &lt;li&gt;Extra features &lt;/li&gt;    &lt;li&gt;Task switching &lt;/li&gt;    &lt;li&gt;Waiting &lt;/li&gt;    &lt;li&gt;Motion (how far do you need to walk to for an answer to a question, for example?) &lt;/li&gt;    &lt;li&gt;Defects &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Another way is to map a value stream and try to reduce as much as possible the time spend on steps that don't provide a lot of value.&lt;/p&gt;  &lt;h2&gt;Amplify learning&lt;/h2&gt;  &lt;p&gt;Knowledge is key: knowledge about what the customer wants, knowledge about the system, knowledge about the constraints. We need to generate that kind of knowledge as fast as possible in order to make the best decisions we can.&lt;/p&gt;  &lt;p&gt;Having short release iterations will generate customer feedback faster. Also, constraints might become more obvious sooner. Your code needs to speak volumes about intent and design without the need to spend time trying to decode it (a major waste!)&lt;/p&gt;  &lt;p&gt;Try to do some &lt;a href="http://kaizenconf.pbwiki.com/Concurrent%20Set-Based%20Engineering"&gt;set-based development&lt;/a&gt; also to generate as many ideas at the same time as you can.&lt;/p&gt;  &lt;h2&gt;Decide as late as possible&lt;/h2&gt;  &lt;p&gt;This is one of the things that Toyota does that makes them stand apart from the competition (and why they still make a profit and don't need their government to bail them out!)&lt;/p&gt;  &lt;p&gt;Delay the critical, hard to undo, decisions until the last possible moment when delaying any further would reduce the value of the product or would eliminate important alternatives. &lt;/p&gt;  &lt;p&gt;Decouple your modules, anticipate, code multiple options knowing that one might be chosen and the others discarded later. The price of losing the options in this case would be lower than not doing them at all. Use parameters, interfaces, abstractions. Encapsulate variation and do not repeat yourself.&lt;/p&gt;  &lt;h2&gt;Deliver as fast as possible&lt;/h2&gt;  &lt;p&gt;Use a Kanban system and code in short iterations. Enough said!&lt;/p&gt;  &lt;p&gt;The key element in this principle is throughput: the rate at which value is created. The book mentions the theory of constraints, which deals with this in a manufacturing context where the entire shop cannot go faster than the slowest machine. The same can be said about software, which can't be written faster than the slowest process in the value-stream map. Everything must then be subordinated to the constraint since any extra effort by a non-constraint is waste. I suggest you read &lt;a href="http://www.amazon.com/Goal-Process-Ongoing-Improvement/dp/0884270610"&gt;The Goal&lt;/a&gt; if you haven't already. It is an excellent book.&lt;/p&gt;  &lt;h2&gt;Empower the team&lt;/h2&gt;  &lt;p&gt;Teams are more efficient when managers give them free reins over their processes. Most successful companies have seen change happen within their walls from shop employees, not managers.&lt;/p&gt;  &lt;p&gt;At 3M, for example, new inventions come from such employees, who are then expected to lead the effort to manufacture them!&lt;/p&gt;  &lt;p&gt;Allow leaders within teams to emerge and influence others. Allow master developers to take charge. And make sure your team members keep improving on their skills. Set them free!&lt;/p&gt;  &lt;h2&gt;Build integrity in&lt;/h2&gt;  &lt;p&gt;Integrity is how the software behaves. Is is consistent? Are all the parts acting in synergy with one another? How is the user experience? This principle helps you answer those questions.&lt;/p&gt;  &lt;p&gt;Use refactoring and testing to maintain a solid architecture and make sure you spend time designing a good user experience. The happier the user is, the less effort you'll spend down the road.&lt;/p&gt;  &lt;h2&gt;See the whole&lt;/h2&gt;  &lt;p&gt;Finally, focus on the whole. Do not spend time doing local optimizations like making the testing department faster when it is not the constraint of the system. Be weary of local measurements like lines of code per coder because you'll be tempted to improve on them (local optimization) in isolation of the big picture.&lt;/p&gt;  &lt;p&gt;Instead, focus on you value-stream map! Work on reducing the amount of time it takes for an equal amount of value to be created. When you change a process, go back to this map and make sure you didn't make it worse, even though a local area might have improved.&lt;/p&gt;  &lt;p&gt;Has throughput increased? Have operating expenses been reduced? Has the amount of work in process decreased? All three must be true.&lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;Of course, there is much, much more being discussed in the book. But what I have written in this post should get anyone started with lean or should be a good reminder of the key points of the book if you have already read it. I know I will refer to this often in the future in my own quest to implement lean techniques with the rest of my team!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-5424683903460224646?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/5424683903460224646/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=5424683903460224646" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5424683903460224646?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/5424683903460224646?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/jANQPoxTd7E/lean-software-development.html" title="Lean Software Development" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/11/lean-software-development.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEHQn85eip7ImA9WxRUFEs.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-8466141187762535045</id><published>2008-11-19T10:10:00.001-08:00</published><updated>2008-11-23T10:07:13.122-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-23T10:07:13.122-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="user experience" /><category scheme="http://www.blogger.com/atom/ns#" term="processes" /><category scheme="http://www.blogger.com/atom/ns#" term="kanban" /><category scheme="http://www.blogger.com/atom/ns#" term="lean" /><title>Activity Modeling and the Bag</title><content type="html">&lt;p&gt;This is the third and final part in this series. You can read the first two posts here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.lonestardeveloper.com/2008/11/bag-and-kanban-part-1.html"&gt;The Bag and the Kanban, part 1&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.lonestardeveloper.com/2008/11/bag-and-kanban-part-2.html"&gt;The Bag and the Kanban, part 2&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;On our last day at &lt;a href="http://kaizenconf.pbwiki.com/"&gt;Kaizenconf&lt;/a&gt;, I participated in an action type of session where our aim was to figure out what we could do about Activity Modeling, a design method. After reviewing it extensively, we decided that we would all try to fit it into a kanban pull system and &lt;a href="http://openscreens.com/articles/activity-modeling-for-kanban-pull-systems"&gt;blog&lt;/a&gt; about it.&lt;/p&gt;  &lt;h2&gt;Activity Modeling&lt;/h2&gt;  &lt;p&gt;In essence, Activity Modeling is a technique that allows a designer to create a set of actions and operations that different users, or personas, can do using a certain software application. It involves creating files on different personas to keep track of their goals, motivations and values using, among other methods, non-directed interviews where the main question is never asked directly.&lt;/p&gt;  &lt;p&gt;Then, using a very specific activity statement, actions are defined. From the example that was given to us at Kaizenconf, the activity statement could be: &amp;quot;Providing patients acute pain management services.&amp;quot; Now an action could be: &amp;quot;Admit patients into the acute pain management system.&amp;quot; Finally, operations are determined for each action: &amp;quot;Specify patient demographics,&amp;quot; for example.&lt;/p&gt;  &lt;p&gt;Our group decided that our action plan would be to incorporate Activity Modeling to Jef Newsom's Kanban technique, which I depicted in the &lt;a href="http://blog.lonestardeveloper.com/2008/11/bag-and-kanban-part-1.html"&gt;first post&lt;/a&gt; of this series.&lt;/p&gt;  &lt;p&gt;In retrospect, this seems easy enough, at least on paper! The first thing to do would be to make sure we have enough information about our main users, or our personas. This is a very important step, as it has a direct link to the &amp;quot;People&amp;quot; column in our Kanban board.&lt;/p&gt;  &lt;h2&gt;Filling up the BAG&lt;/h2&gt;  &lt;p&gt;So we have our Goal, and our personas, which we can translate to our Kanban board. Using what we know about them, we can write down their personal goals. A doctor wants to be able to edit information and wants to know what is going on at all times. A nurse might just need the history of the patient, or just what the current health care procedures that need to be performed are. Activity modeling helps us know all of this.&lt;/p&gt;  &lt;p&gt;Our bag used to be full at this point, but let's go ahead and add a new column at the end: the Actions column. This is a further refinement on each personal goal, normally a step we were reserving for the S.A.F.E. column in the Kanban. However, since we are still in the bag, actions remain at fairly a high level of abstraction, which is good since we might have the user helping us defining them.&lt;/p&gt;  &lt;h2&gt;S.A.F.E. scenarios benefit from Activity Modeling&lt;/h2&gt;  &lt;p&gt;Now that we have refined the bag, the designer and developers can work together to fill up the S.A.F.E. column at the beginning of an iteration. In Activity Modeling, operations are defined for each action and it just seems to me that this is exactly what we are doing by creating our S.A.F.E. scenarios. Our success, advance, fail and error scenarios are operations that have been classified!&lt;/p&gt;  &lt;p&gt;This is what really struck me in our session. Activity Modeling benefits from the S.A.F.E. scenarios idea by having its operations classified and our Kanban benefits from Activity Modeling for filling up the Bag. There is an almost perfect synergy between the two methods and it has enormous usefulness potential for developers and designers alike.&lt;/p&gt;  &lt;p&gt;From there, developers can simply pull operations into their iteration and can keep going with the rest of the Kanban.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-8466141187762535045?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/8466141187762535045/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=8466141187762535045" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8466141187762535045?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8466141187762535045?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/ngEgTVSPMeI/activity-modeling-and-bag.html" title="Activity Modeling and the Bag" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/11/activity-modeling-and-bag.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUECQXg7eCp7ImA9WxRUFEs.&quot;"><id>tag:blogger.com,1999:blog-4015078625407292958.post-8107162232081653186</id><published>2008-11-11T12:06:00.001-08:00</published><updated>2008-11-23T10:07:40.600-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-23T10:07:40.600-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="processes" /><category scheme="http://www.blogger.com/atom/ns#" term="kanban" /><category scheme="http://www.blogger.com/atom/ns#" term="lean" /><title>The Bag and the Kanban, part 2</title><content type="html">&lt;p&gt;You can view &lt;a href="http://blog.lonestardeveloper.com/2008/11/activity-modeling-and-bag.html"&gt;part 3 of this series here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In my last &lt;a href="http://blog.lonestardeveloper.com/2008/11/bag-and-kanban-part-1.html"&gt;post&lt;/a&gt;, I depicted the results of a workshop I attended at &lt;a href="http://kaizenconf.pbwiki.com"&gt;Kaizenconf&lt;/a&gt; called Driving Towards the Goal. Jef Newsom, our facilitator, had set up a little experiment&amp;#160; which we all voluntarily and happily participated in.&lt;/p&gt;  &lt;p&gt;As a whole, the experiment simulated the creation of software from Goal to Code, each step being a column in a kanban board.&lt;/p&gt;  &lt;p&gt;Even though it was a very enlightening experience, we quickly discovered that the further along you went, the longer it took to specify work items. For one, each work item became much more specialized the closer it got to being coded. Second, as they became more detailed, we needed a lot more work items to cover the previous ones.&lt;/p&gt;  &lt;p&gt;In terms of workflow, you can think of it like a sandglass. The thinnest part, where only a few grains of sand can flow through at a time, is the coding part. The sides of the sandglass are time and resources constraining your team and the distances between the sides is how fast the task takes to perform.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_aS8tEUKT_5Y/SRnl0sz5vnI/AAAAAAAAACY/Y0BPGOC-DGY/s1600-h/sandglass7.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="343" alt="sandglass" src="http://lh3.ggpht.com/_aS8tEUKT_5Y/SRnl1KhxUHI/AAAAAAAAACc/QOXtjvMeH0Y/sandglass_thumb3.png?imgmax=800" width="396" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Of course, specifying the goal can take years of efforts, but in terms of software development, since it is usually defined in advanced (I hope!), it is the fastest step. &lt;/p&gt;  &lt;h2&gt;The Bag&lt;/h2&gt;  &lt;p&gt;So how does one manage the flow in such a system? Well the idea came to me that the kanban in the previous post could be separated in two. The first part focuses more on the creative aspect of defining the problem, the solution, the people involved and their goals. Here, chaos can rule. People can jump in anywhere and add items to the board, prioritizing and moving stuff around. This is what I call the BAG, which happens to stand for &lt;strong&gt;BA&lt;/strong&gt;ck lo&lt;strong&gt;G&lt;/strong&gt;. It also makes me think of a bagpipe, where the player (the stakeholder) fills up a bag with air, which is then pressed into the flutes to produce a sound.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_aS8tEUKT_5Y/SRnl1nrOTiI/AAAAAAAAACg/BoQc1DMCj0c/s1600-h/thebag7.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="269" alt="the bag" src="http://lh5.ggpht.com/_aS8tEUKT_5Y/SRnl2P4jtkI/AAAAAAAAACk/41fUAi8FoYM/thebag_thumb3.png?imgmax=800" width="395" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;The Kanban&lt;/h2&gt;  &lt;p&gt;The second part of the kanban is where the more technical stuff happens. Here, work items actually have to be pulled from previous columns before any work can happen. This discipline and organization is important in order to maintain a good flow. Remember, since coding is the constraint, it must be protected at all costs. Any disruption in this part (called &amp;quot;kanban&amp;quot; from now on) will cause a drop in throughput. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_aS8tEUKT_5Y/SRnl2me2CiI/AAAAAAAAACo/uvPYYO8rH2E/s1600-h/thekanban4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="233" alt="the kanban" src="http://lh3.ggpht.com/_aS8tEUKT_5Y/SRnl3KLB_BI/AAAAAAAAACs/NbGlME12-LU/thekanban_thumb2.png?imgmax=800" width="395" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The reason that the S.A.F.E scenarios are outside the cloud in the picture above is that I believe the entire team should be working on them at the beginning of every new iteration. This will give every member of the team a general understanding of what is going on in the project.&lt;/p&gt;  &lt;h2&gt;Playing the bagpipe&lt;/h2&gt;  &lt;p&gt;To play the bagpipe, you start by filling up your bag with air. Then, using your arm, you compress the bag so that it pushes just enough air through the pipes to make the sound you want at the volume you want. &lt;/p&gt;  &lt;p&gt;Filling up our bag is fairly easy. You get your stakeholders together and use your favorite method for liberating the creative juices of every people in the room. When things have stabilized a bit, the developers can come in and pull a couple &amp;quot;features&amp;quot; from the personal goal column in the bag in order to create their first iteration.&lt;/p&gt;  &lt;p&gt;It is then absolutely important that the stakeholders leave what the developers are currently working on alone during an iteration. They can come back to the bag and play with work items, but what the software team is working on is sacred, at least until the end of the iteration.&lt;/p&gt;  &lt;p&gt;At the end of every iteration, when the stakeholders have a chance to try out their newest release. Then they will have a chance to introduce changes in the personal goals. Each change can then be pulled from the bag by the developers, perhaps with a higher priority than other regular features. &lt;/p&gt;  &lt;p&gt;As this process advances in time, stakeholders will probably find themselves asking for change during iterations. This is fine, as long as the change doesn't affect what the developers are currently working on. Changes then go in the bag and await the next pull.&lt;/p&gt;  &lt;p&gt;Now, I've never played the bagpipes but I'm pretty confident that that what I've described further up is approximately how they work. In the same way, I've never implemented this process, but is sure looks nice on paper! I've also been called lots of names, but as a programmer, being compared to compressed air flowing through a pipe is a first, I must admit.&lt;/p&gt;  &lt;p&gt;This process has a lot of potential and I'd like to keep defining it. Unfortunately, my current work conditions prevent me from experimenting on it in the short term, but rest assured that as soon as I can claim ownership of a project, I will definitely use the &amp;quot;Bag and the Kanban&amp;quot; model and see how far is takes me. In the meantime, I must realize that it is just an idea.&lt;/p&gt;  &lt;p&gt;In my next post, I will use what I've learned in a session given at Kaizenconf on activity modeling to go into more details about how to fill the bag.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4015078625407292958-8107162232081653186?l=blog.lonestardeveloper.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.lonestardeveloper.com/feeds/8107162232081653186/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4015078625407292958&amp;postID=8107162232081653186" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8107162232081653186?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4015078625407292958/posts/default/8107162232081653186?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LoneStarDeveloper/~3/T9vVNiKe-B4/bag-and-kanban-part-2.html" title="The Bag and the Kanban, part 2" /><author><name>Louis</name><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00666161247752643612" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.lonestardeveloper.com/2008/11/bag-and-kanban-part-2.html</feedburner:origLink></entry></feed>
