<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.lostechies.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Joe Ocampo (AgileJoe)</title><link>http://www.lostechies.com/blogs/joe_ocampo/default.aspx</link><description>Answering all world issues and questions with, &amp;quot;...it depends...&amp;quot;</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>What are you solving for?</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2009/06/04/what-are-you-solving-for.aspx</link><pubDate>Fri, 05 Jun 2009 03:46:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21531</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=21531</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=21531</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2009/06/04/what-are-you-solving-for.aspx#comments</comments><description>&lt;p&gt;Exactly!&lt;img style="margin:0px 0px 10px 15px;display:inline;" src="http://www.library.jhu.edu/images/rsc/subjectguides/svmath_problem.jpg" width="273" align="right" height="195" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;I am always amazed of how much software is created with the intention of solving a business problem, only to be deployed to production and not deliver any value to the organization.&lt;/p&gt;
&lt;p&gt;Some will argue that this is what the short feedback cycles of most Agile methodologies provide. They give you insight from the customer directly, to determine if you are solving their problem but this is where software development is an immature industry. For example:&lt;/p&gt;
&lt;p&gt;I always like to give the example of the patient that visits the doctors office complaining that his arm has been hurting after falling off his ladder.&amp;nbsp; He has iced it over, rested it and has even went to far as to self medicate in an effort to subdue the symptoms. The patient then proceeds to tell the doctor that he thinks he must have bruised his rotator cuff and is wondering what his options are to help with this self diagnosis. After a couple of minutes of the doctor looking over a couple of x-rays, the doctor turns to the patient and says, &amp;ldquo;Your problem isn&amp;rsquo;t your arm, it&amp;rsquo;s your back. You have damage to one of your vertebrae that is causing you to feel pain in your arm.&amp;rdquo;&amp;nbsp; &lt;img style="margin:10px 15px 0px 0px;display:inline;" src="http://tbn1.google.com/images?q=tbn:PD81iLBFo1gbqM:http://www.ourfunlife.com/health/xray.jpg" width="163" align="left" height="196" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;If this were software development we would have already amputated his arm and given him a new bionic one that would enable him to lift a small car.&amp;nbsp; All the while not solving the root issue but boy what a wonderful technical achievement we would have created.&lt;/p&gt;
&lt;p&gt;Joe are you telling me that we shouldn&amp;rsquo;t listen to the customer? NO! Just like a &amp;ldquo;good&amp;rdquo; doctors listens attentively to his patients concerns, carefully weighing every fact of the case. He reserves his diagnosis until he has ran several test and determined if the &amp;quot;data&amp;rdquo; supports his conclusions. He relies on years of experience and training in order to come up with the best remedy for that diagnosis.&lt;/p&gt;
&lt;p&gt;So ask yourself are you solving the symptom, or are you curing the illness?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21531" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Project+Coaching+_2600_amp_3B00_+Management/default.aspx">Agile Project Coaching &amp;amp; Management</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/lean/default.aspx">lean</category></item><item><title>LosTechies welcomes Sharon Cichelli "Girl Writes Code"</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2009/06/02/lostechies-welcomes-sharon-cichelli-quot-girl-writes-code-quot.aspx</link><pubDate>Tue, 02 Jun 2009 04:39:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:21440</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=21440</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=21440</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2009/06/02/lostechies-welcomes-sharon-cichelli-quot-girl-writes-code-quot.aspx#comments</comments><description>&lt;p&gt;I am proud to announce that &lt;a href="http://www.lostechies.com/blogs/sharoncichelli/default.aspx"&gt;Sharon Cichelli&lt;/a&gt; has graciously agreed to join LosTechies!&amp;nbsp; We are all looking forward to her perspective and insights into software development.&amp;nbsp; Sharon is an active member of the Austin .NET users community.&amp;nbsp; Her passion for software is equally balanced by her passion to see the bigger picture.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Welcome Sharon!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=21440" width="1" height="1"&gt;</description></item><item><title>Setting up Ubuntu Jaunty for Ruby and Rails development  </title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2009/05/06/setting-up-ubuntu-jaunty-for-ruby-and-rails-development.aspx</link><pubDate>Wed, 06 May 2009 15:06:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:20851</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=20851</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=20851</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2009/05/06/setting-up-ubuntu-jaunty-for-ruby-and-rails-development.aspx#comments</comments><description>&lt;p&gt;Getting Ruby setup on Ubuntu &amp;ndash; Jaunty&lt;/p&gt;
&lt;p&gt;&lt;b&gt;UPDATED: Added RSpec for Rails as well&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here are some quick steps to get you up and running with Ruby on Ubuntu, Take about 15 minutes depending on your internet connection.&lt;br /&gt;&lt;br /&gt;Step 1: The first thing you need to do is update the packages in Ubuntu open the terminal window (Applications Menu | Accessories | Terminal) and type in the following commands.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp; sudo aptitude update&lt;br /&gt;&amp;nbsp;&amp;nbsp; sudo aptitude dist-upgrade&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 2: The next package will insure you have everything you need in order to build ruby packages on your system.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family:courier new,courier;"&gt; sudo aptitude install build-essential&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 3: Type in the following command to install Ruby NOTE: this is all ONE command&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo aptitude install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 libreadline-ruby1.8 libruby1.8 libopenssl-ruby&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 4: Type in the following command to install SQLite3 NOTE: ONE command&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo aptitude install sqlite3 libsqlite3-ruby1.8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 5: Install Ruby Gems NOTE: Multiple commands&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp; wget http://rubyforge.org/frs/download.php/55066/rubygems-1.3.2.tgz&lt;br /&gt;&amp;nbsp;&amp;nbsp; tar xvzf rubygems-1.3.2.tgz&lt;br /&gt;&amp;nbsp;&amp;nbsp; cd rubygems-1.3.2&lt;br /&gt;&amp;nbsp;&amp;nbsp; sudo ruby setup.rb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;b&gt;!! You should get an error stating that Ruby command not found !!&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 6: creating the ruby symlink (symlink stands for symbolic link, windows user can think of it like a shortcut)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp; sudo ln -s /usr/bin/ruby1.8 /usr/local/bin/ruby&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 7: Install ruby gems NOTE: you should be in the directory rubygems-1.3.2 when you run this command&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family:courier new,courier;"&gt; sudo ruby setup.rb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 8: We need to create the remaining symlinks for ruby utilities NOTE: Multiple commands&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo ln -s /usr/bin/gem1.8 /usr/local/bin/gem&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo ln -s /usr/bin/rdoc1.8 /usr/local/bin/rdoc&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo ln -s /usr/bin/ri1.8 /usr/local/bin/ri&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo ln -s /usr/bin/irb1.8 /usr/local/bin/irb&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Installing Rails&lt;/h3&gt;
&lt;p&gt;Step 9: Install Rails&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo gem install rails --no-rdoc --no-ri&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 10: Create a test project NOTE: Multiple commands&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cd ~&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir apps&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cd apps&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mkdir rails_apps&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cd rails_apps&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rails testapp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 9: Start Webrick web server in your testapp directory&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ./script/server&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 11: Open up Firefox and navigate to http://localhost:3000, you should see a page with the text:&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Welcome aboard&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; You&amp;rsquo;re riding Ruby on Rails!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Step 12: Install Rspec&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gem install rspec&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Installing source control&lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;Step 13: Install subversion&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo aptitude install subversion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 14: Install Git because you are going to use plugins from GitHub&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo aptitude install git-core&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 15: Install Git-svn&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sudo aptitude install git-svn&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 16: Add SVN Like Shortcuts to Git&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global alias.st status&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global alias.ci commit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global alias.co checkout&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global alias.br branch&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 17: configure the global user for Git&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global user.name &amp;quot;Put your full name here&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global user.email you@rackspace.com&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Step 18: colorize the output for Git&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family:courier new,courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global color.branch auto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global color.diff auto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global color.interactive auto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; git config --global color.status auto&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Installing RSpec for Rails&lt;/h3&gt;
&lt;p&gt;I want to put a disclaimer here that this is my preferred way of installing RSpec from GitHub. It is not the only way.&lt;/p&gt;
&lt;p&gt;Step 19: Navigate to the root of your Rails project. I am assuming that in this case it will be &amp;quot;testapp&amp;quot;&lt;/p&gt;
&lt;p&gt;Step 20: Install Rspec for Rails from GitHub as Git submodules. NOTE: Multiple commands&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;git submodule add git://github.com/dchelimsky/rspec.git vendor/plugins/rspec&lt;/span&gt;&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;git submodule add git://github.com/dchelimsky/rspec-rails.git vendor/plugins/rspec-rails&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Step 21: Run the rspec generators, this will enable the rspec_* controller, scaffold, model generators&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;ruby script/generate rspec&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This is going to drive you nuts if you have to remember to do this for every rails project you create so I created a simple bash script.&amp;nbsp; Actually the contains more than the bash script it also has the aliases that I use for Rails development.&lt;/p&gt;
&lt;p&gt;Step 22: Navigate to your home diretory&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;cd ~&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Step 23: Create the .rails_aliases file&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;gedit .rails_aliases &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Step 24: In gedit copy the following text to the .rails_aliases file&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:courier new,courier;"&gt;alias ror-doc-spec=&amp;#39;open -a Firefox doc/plugins/rspec-rails/index.html&amp;#39;&lt;br /&gt;alias ror-doc=&amp;#39;open -a Firefox&amp;#39;&lt;br /&gt;alias ror-scaffold=&amp;#39;ruby script/generate rspec_scaffold&amp;#39;&lt;br /&gt;alias ror-controller=&amp;#39;ruby script/generate rspec_controller&amp;#39;&lt;br /&gt;alias ror-model=&amp;#39;ruby script/generate rspec_model&amp;#39;&lt;br /&gt;alias ror-git-customerror=&amp;#39;script/plugin install git://github.com/gumayunov/custom-err-msg.git&amp;#39;&lt;br /&gt;alias ror-console=&amp;#39;ruby script/console&amp;#39;&lt;br /&gt;alias rapps=&amp;#39;cd ~/apps/rails_apps&amp;#39;&lt;br /&gt;alias ror-serv=&amp;#39;ruby script/server&amp;#39;&lt;br /&gt;alias ror-logtail=&amp;#39;tail -f log/development.log&amp;#39;&lt;br /&gt;&lt;br /&gt;# Configures a rails app to use rspec&lt;br /&gt;specrails(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; git submodule add git://github.com/dchelimsky/rspec.git vendor/plugins/rspec&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; git submodule add git://github.com/dchelimsky/rspec-rails.git vendor/plugins/rspec-rails&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ruby script/generate rspec&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Step 25: Save the file and close gedit&lt;/p&gt;
&lt;p&gt;Step 26: Open your .bashrc file from the terminal window&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;gedit .bashrc&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Step 27: Add the reference to your .rails_aliases file in your .bashrc at the top of the file add the following line:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;source ~/.rails_aliases&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Step 28: Save the file and exit gedit&lt;/p&gt;
&lt;p&gt;Now if you want to add RSpec to any rails project you simply navigate to the root of a rails project and type:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;specrails&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you want to add a controller with RSpec specs you simply have to type:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;span style="font-family:courier new,courier;"&gt;ror-controller BlogPost title:string author:string content:text ...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Hope this helps! Happy coding!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=20851" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Ruby/default.aspx">Ruby</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/rails/default.aspx">rails</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/ubuntu/default.aspx">ubuntu</category></item><item><title>Role Storming</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/10/28/role-storming.aspx</link><pubDate>Wed, 29 Oct 2008 03:06:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:5724</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=5724</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=5724</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/10/28/role-storming.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;UPDATE: This excercise is ideal for large projects with many SME&amp;#39;s in the room. &amp;nbsp;In this case I was building a Loan Orgination System for a bank with 10+ SME&amp;#39;s in the room that were all arguing with each other about the Persona&amp;#39;s and thier behaviors this took two days to do but the outcome was well worth the effort. If you have 1-4 SME&amp;#39;s this is possibly overkill. &amp;nbsp;Be pragmatic not dogmatic.&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img width="385" height="257" style="float:right;margin-top:5px;margin-bottom:5px;" src="http://farm4.static.flickr.com/3236/2743011951_abf5d55723.jpg?v=0" alt="Scott Butner&amp;#39;s Flicker photostream" /&gt;&lt;/p&gt;
&lt;p&gt;Occasionally I am brought in to facilitate story break down sessions. I have to admit that this is one of the more enjoyable aspects for me when dealing with large Agile project because it allows me to learn a ton of information about the business domain. &lt;/p&gt;
&lt;p&gt;One of the first exercises I go through is a Roles Storm. This is an exercise that gets the customer to think about the different types of behaviors that certain roles and personas can perform in their software that they are asking you to build. This exercise helps me to hold story authoring sessions in the future. &lt;/p&gt;
&lt;p&gt;I try to focus the discussion towards the lowest level persona that does something. The template of the exercise is very simple: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A {Persona/Role} can &amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this case I will use the &amp;ldquo;Loan Rep&amp;rdquo; persona. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Loan Rep  &lt;/p&gt;
&lt;p&gt;- can view their own pipeline &lt;/p&gt;
&lt;p&gt;- can order a credit report&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once we establish the lowest common denominator you simply move up the chain: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A Processor &lt;/p&gt;
&lt;p&gt;- can do everything a Loan Rep can do and  &lt;/p&gt;
&lt;p&gt;- can upload to desktop originator and loan prospector&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As you can see I am able to start identifying lots of domain concepts. DO NOT try to dive deep with this exercise. Its focus is around brainstorming of Personas and Roles only. Let the customer do most of the talking. Do not let this turn into a technical discussion. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WARNING: This list does NOT contain stories, it contains concepts for stories but it does NOT contain stories!!!!&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;Preparation time for this exercise is a few minutes but the event usually last at least a full day. &lt;/p&gt;
&lt;p&gt;In the end you end up with a list that looks something like this: &lt;/p&gt;
&lt;h3&gt;Roles&lt;/h3&gt;
&lt;h4&gt;Back Office (Centralized Admin)&lt;/h4&gt;
&lt;h5&gt;Super User&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can do what the help desk manager and business admin can do,  &lt;/li&gt;
&lt;li&gt;can defines profiles,  &lt;/li&gt;
&lt;li&gt;can maintains universal system tables,  &lt;/li&gt;
&lt;li&gt;has access to the entire application,  &lt;/li&gt;
&lt;li&gt;can delete loan records from the system, (flag to stop display of record in any pipeline view &amp;ndash; only available to admin and can be identified on reports.)  &lt;/li&gt;
&lt;li&gt;can update mortgage center home page content,  &lt;/li&gt;
&lt;li&gt;can create admin users, &lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Help Desk Manager&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can do what a team lead can do,  &lt;/li&gt;
&lt;li&gt;can be given the permission to delete loan records from the system,  &lt;/li&gt;
&lt;li&gt;&amp;lt;revisit&amp;gt; can reset loan events, &lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Help Desk Team Lead&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can do what a help desk user can do  &lt;/li&gt;
&lt;li&gt;can add and maintain users,  &lt;/li&gt;
&lt;li&gt;can create and maintain loan centers, (full name of lender in table &amp;ndash; online view would be an abbreviated version)  &lt;/li&gt;
&lt;li&gt;can maintain peer level admin profiles or lower,  &lt;/li&gt;
&lt;li&gt;can pull lead between reps and processors within a loan center,  &lt;/li&gt;
&lt;li&gt;can push lead and loan records to other loan centers, &lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Help Desk&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can add and maintain mortgage center users,  &lt;/li&gt;
&lt;li&gt;has system wide read only access,  &lt;/li&gt;
&lt;li&gt;can invoke a system wide search &lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Business Admin (Centralized)&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can add and maintain loan programs and fee schedules,  &lt;/li&gt;
&lt;li&gt;&amp;lt;revisit&amp;gt; can create and maintain printable documents,  &lt;/li&gt;
&lt;li&gt;&amp;lt;revisit&amp;gt;can maintain dropdown tables (ex. Marketing codes, loan conditions),  &lt;/li&gt;
&lt;li&gt;can add new contact types and global contacts. &lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Loan Office Admin (Loan Center)&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can pull lead between reps and processors within their loan center(s),  &lt;/li&gt;
&lt;li&gt;can push lead and loan records to other loan centers,  &lt;/li&gt;
&lt;li&gt;can modify user permissions within their specified role within their loan center,  &lt;/li&gt;
&lt;li&gt;can make a user inactive or active within their loan center,  &lt;/li&gt;
&lt;li&gt;can make user available or unavailable within their loan center,  &lt;/li&gt;
&lt;li&gt;&amp;lt;revisit&amp;gt; shared roles,  &lt;/li&gt;
&lt;li&gt;can be given access to assign loan to themselves, &lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Field Roles&lt;/h4&gt;
&lt;h5&gt;Loan Center Manager &lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can do everything a processor can do,  &lt;/li&gt;
&lt;li&gt;can pull lead between reps and processors within their loan center,  &lt;/li&gt;
&lt;li&gt;can push lead and loan records to other loan centers,  &lt;/li&gt;
&lt;li&gt;can modify user permissions within their specified role within their loan center (include permissions to access loan center pipeline)  &lt;/li&gt;
&lt;li&gt;can make a user inactive or active within their loan center,  &lt;/li&gt;
&lt;li&gt;can make user available or unavailable within their loan center  &lt;/li&gt;
&lt;li&gt;Can delete leads across loan centers and users (no credit ordered) &lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Processor&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can do everything a loan rep can do and  &lt;/li&gt;
&lt;li&gt;can upload to desktop originator and loan prospector,  &lt;/li&gt;
&lt;li&gt;can export FNMA 3.2 file,  &lt;/li&gt;
&lt;li&gt;can add and maintain conditions to a loan,  &lt;/li&gt;
&lt;li&gt;can submit loan package to lender,  &lt;/li&gt;
&lt;li&gt;can print all documents,  &lt;/li&gt;
&lt;li&gt;can add and update lender denial and counteroffer,  &lt;/li&gt;
&lt;li&gt;can view all teams pipelines within their loan center,  &lt;/li&gt;
&lt;li&gt;can edit any lead or application within their loan center,  &lt;/li&gt;
&lt;li&gt;can run reports for their loan center. &lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Loan Rep&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;can add and edit &amp;amp; delete their leads in the system but cannot delete an application (credit has been ordered),  &lt;/li&gt;
&lt;li&gt;can view their own pipeline,  &lt;/li&gt;
&lt;li&gt;can order credit,  &lt;/li&gt;
&lt;li&gt;can include and exclude liabilities from the 1003 section,  &lt;/li&gt;
&lt;li&gt;can complete full 1003,  &lt;/li&gt;
&lt;li&gt;can order appraisal,  &lt;/li&gt;
&lt;li&gt;can order title,  &lt;/li&gt;
&lt;li&gt;can add notes to conversation log,  &lt;/li&gt;
&lt;li&gt;can add contacts,  &lt;/li&gt;
&lt;li&gt;can create rate locks,  &lt;/li&gt;
&lt;li&gt;can print 3 day disclosures,  &lt;/li&gt;
&lt;li&gt;can select loan programs and fee schedules,  &lt;/li&gt;
&lt;li&gt;can print the 1003 blank or otherwise,  &lt;/li&gt;
&lt;li&gt;can import 1003,  &lt;/li&gt;
&lt;li&gt;can view and print rate sheets,  &lt;/li&gt;
&lt;li&gt;can flag loan as withdrawn, &lt;/li&gt;
&lt;li&gt;&amp;lt;revisit&amp;gt; task creation and assignment,  &lt;/li&gt;
&lt;li&gt;can submit lead to processor,  &lt;/li&gt;
&lt;li&gt;can push lead to another user,  &lt;/li&gt;
&lt;li&gt;can collect and record upfront fees,  &lt;/li&gt;
&lt;li&gt;can run reports for their pipeline,  &lt;/li&gt;
&lt;li&gt;can make themselves available or unavailable  &lt;/li&gt;
&lt;li&gt;can be given permission to pull from loan center pipeline (public queue) &lt;/li&gt;
&lt;/ol&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=5724" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Teams/default.aspx">Agile Teams</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Project+Coaching+_2600_amp_3B00_+Management/default.aspx">Agile Project Coaching &amp;amp; Management</category></item><item><title>Managing changes in scope and direction in an agile projects</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/10/12/managing-changes-in-scope-and-direction-in-an-agile-projects.aspx</link><pubDate>Sun, 12 Oct 2008 15:35:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:5378</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=5378</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=5378</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/10/12/managing-changes-in-scope-and-direction-in-an-agile-projects.aspx#comments</comments><description>&lt;p&gt;I was recently asked the following question, “How do you best manage changes in scope and direction in an agile project?” &lt;p&gt;Embracing change is the quintessential backbone of Agile.&amp;nbsp; How to manage it is a whole other story. ;)&lt;/p&gt; &lt;p&gt;The difficult aspect of this paradox is to understand the context of the change.&amp;nbsp; When I coach people on change I tend to draw a metaphor to building things with Lego’s. In this particular context the change is centered around misguided direction that results in the production team wasting time building the wrong thing.&lt;/p&gt; &lt;p&gt;In this example the product owner has asked you to make a snow man out of Lego’s. We go through preliminary analysis with the team (Development, BA, QA, Product Owner) and determine these high level features and their corresponding complexity ratings:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Head&amp;nbsp; 400&lt;/li&gt; &lt;li&gt;Body 200&lt;/li&gt; &lt;li&gt;Bottom 300&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;br /&gt;This will give us a ballpark of the project size and we can infer from prior Sprints that the team is capable of producing 50 points every 3 week Sprint.&lt;/p&gt; &lt;p&gt;So it will take 18 Sprints and a total of 54 weeks for the team to complete this work.&amp;nbsp; Of course this is a best case scenario. I usually factor in reserve time as well but this is another discussion.&lt;/p&gt; &lt;p&gt;The team starts with the Head because the Product Owner and the team both believe this is the most complex aspect of the project. They break the head feature into several epics (master level) stories. (Remember we are working with Lego’s here).&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Hat 150&lt;/li&gt; &lt;li&gt;Skull 100&lt;/li&gt; &lt;li&gt;Eyes 60&lt;/li&gt; &lt;li&gt;Nose 60&lt;/li&gt; &lt;li&gt;Mouth 60&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I can go on and on but the point is that the team ends up building the head of the snowman. Now for some curve balls that I know never happen in real life.&lt;/p&gt; &lt;p&gt;The Product Owner is not really the end customer.&amp;nbsp; They are acting as a proxy for field reps that are actually capturing the customer demand for the products that IT creates.&amp;nbsp; When the product owner shows the working head of the snow man to the field reps it goes something like this, &lt;/p&gt; &lt;p&gt;“That is great if we were wanting a traditional snowman but we were thinking of something more like Sponge Bob dressed up as a snowman”&lt;/p&gt; &lt;p&gt;Based on this news, the team just wasted 23 weeks’ worth of development.&amp;nbsp; But you do have intangible gains:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;the team has learned how to work together  &lt;li&gt;the team members have a much greater knowledge of making eyes, noses and mouths with Lego’s.  &lt;li&gt;the team matrix as a whole has a much more holistic foundation for issue and problem solving  &lt;li&gt;Agile is no longer a buzz word but an implemented methodology&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The challenges now revolve around the Scrum Master or the person in charge of the project to insure that the teams momentum and self image are kept intact. Like I have always said Agile is 70% people and 30% software. The focus has to be on the team dynamics in order to create a cooperative and collaborative atmosphere.&lt;/p&gt; &lt;p&gt;The focus should now be this:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;We are going to have to refactor the head to look more like Sponge Bob.  &lt;li&gt;The team should focus on what components they can reuse when gauging complexity ratings.  &lt;li&gt;Don’t panic and just approach this as if it simply a knowledge gain exercise&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;You hold a new project planning meeting similar to the first one you held and come up with these high level features:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Head/Body 800&lt;/li&gt; &lt;li&gt;Legs 300&lt;/li&gt; &lt;li&gt;Arms 200&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;You don’t want to dive any deeper at this point.&amp;nbsp; The purpose is to rebroadcast the scope change from a project time line perspective. Now you have a project that was originally projected at 900 points, explode to a project with 23 weeks down the drain and a new projection of 1300 points (that’s including reuse!)&amp;nbsp; At this point you have not wasted any time developing anything new, you have simply reanalyzed the scope change.&amp;nbsp; You take your projection to the Product Owner and have them make the decision.&amp;nbsp; One of two things usually happens, one they cancel the project or two they embrace the new plan. &lt;/p&gt; &lt;p&gt;In most cases this is what usually happens. The product owner doesn’t like either one of the time lines and is completely frustrated.&amp;nbsp; They go on and on about that they need it by a certain time frame etc.&amp;nbsp; Usually I negotiate at this point. &lt;/p&gt; &lt;p&gt;“You know we can’t create the sponge bob but would you be willing to work with my team and their estimates on a similar product offering in that time frame?”&lt;/p&gt; &lt;p&gt;When it is all done you end up negotiating building a Christmas “Plankton” for the end customer.&amp;nbsp; It doesn’t sell at the volume that the SpongeBob would have but it does bring in revenue.&amp;nbsp; The happy ending for the story is that “TRUST” was established between the development organization and the product teams. In fact trust is so high that they want to start working on the SpongeBob surfer dude for next summer.&lt;/p&gt; &lt;p&gt;I know this was very long winded but I wanted to give you a context for the thought of scope change. Things happen on projects that cannot be forecasted at times. The important aspect of all this is not to panic. Knee jerk reaction is to go into a blame game state. This creates an unhealthy atmosphere and does not focus on producing a value stream. Instead use Agile to help facilitate a discussion around the scope that will drive towards success. &lt;/p&gt; &lt;p&gt;When I am introducing Agile to a team I spend at least an hour on the concept of “Embracing change”. I ask the following questions: &lt;ul&gt; &lt;li&gt;· What does embrace mean to you?&lt;/li&gt; &lt;li&gt;· Does embracing change mean all the time or only sometimes?&lt;/li&gt; &lt;li&gt;· If you embrace something is there a possibility that you can get hurt or have negative emotions?&lt;/li&gt; &lt;li&gt;· If you do experience the “feeling” of hurt, how are you going to deal with it in a way that you do not negatively affect the atmosphere and harmonics of the team?&lt;/li&gt; &lt;li&gt;· What is your responsibility as a team member to insure embracement of change is being met?&lt;/li&gt; &lt;li&gt;· Do you still want to do this?&lt;/li&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=5378" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Teams/default.aspx">Agile Teams</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Project+Coaching+_2600_amp_3B00_+Management/default.aspx">Agile Project Coaching &amp;amp; Management</category></item><item><title>LosTechies welcomes Derick Bailey</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/10/07/lostechies-welcomes-derick-bailey.aspx</link><pubDate>Tue, 07 Oct 2008 18:52:14 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:5304</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=5304</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=5304</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/10/07/lostechies-welcomes-derick-bailey.aspx#comments</comments><description>&lt;p&gt;We would like to welcome &lt;a href="http://www.lostechies.com/blogs/derick_bailey/"&gt;Derick Bailey&lt;/a&gt; to the LosTechies blogging community! &lt;/p&gt; &lt;p&gt;Some of us had the opportunity to meet Derick at &lt;a href="http://www.lostechies.com/blogs/chad_myers/archive/2008/09/15/announcing-pablo-s-days-of-tdd-in-austin-tx.aspx"&gt;Pablo&amp;#39;s Day of TDD&lt;/a&gt; and were impressed with his passion and commitment to modern&amp;nbsp; day software development. He is able to take low level constructs and communicate at a high enough level to where ideas that appeared to be esoteric suddenly make sense. &lt;p&gt;We are pleased to have him on board and know his passion will help other developers to find answers to questions or figure out new technologies as all the LosTechies bloggers strive to do. &lt;p&gt;Welcome Derick!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=5304" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Lostechies/default.aspx">Lostechies</category></item><item><title>LosTechies Welcomes Scott C Reynolds!</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/09/03/lostechies-welcomes-scott-c-reynolds.aspx</link><pubDate>Thu, 04 Sep 2008 03:43:07 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:4781</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=4781</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=4781</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/09/03/lostechies-welcomes-scott-c-reynolds.aspx#comments</comments><description>&lt;p&gt;Captivated by his dashing good looks and over all sex appeal, LosTechies is pleased to welcome &lt;a href="http://www.lostechies.com/blogs/scottcreynolds/default.aspx" target="_blank"&gt;Scott C Reynolds&lt;/a&gt; to our happy family. &lt;p&gt;We are pleased to have him on board and know his passion will help other developers to find answers to questions or figure out new technologies as all the LosTechies blogger&amp;#39;s strive to do. &lt;p&gt;Welcome Scott!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=4781" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Lostechies/default.aspx">Lostechies</category></item><item><title>Need to get something off my chest</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/08/26/need-to-get-something-off-my-chest.aspx</link><pubDate>Wed, 27 Aug 2008 02:56:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:4643</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>36</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=4643</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=4643</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/08/26/need-to-get-something-off-my-chest.aspx#comments</comments><description>&lt;p&gt;For the most part I have been out of pocket from the .Net community over the last 6 months due to new obligations I have taken on. These new obligations have given me the opportunity to explore other communities outside of .Net such as Java, Python and Ruby. All these groups have their quirks but the some things they do have is an expressive community that welcomes innovation and alternative view points.&amp;nbsp; Where as the .Net community I feel my view points and belief structure are contrary to the majority, so I don&amp;#39;t *feel* part of community so much as I *feel* a part of a small rebel faction (which is kind of thrilling in a StarWars kind of way).&lt;/p&gt;
&lt;p&gt;As a community we strive to make better software for our fellow developer.&amp;nbsp; To make our lives simpler and more productive.&amp;nbsp; As a community we believe in open source software for the betterment of the community. Which brings me to my issue.&lt;/p&gt;
&lt;p&gt;I may get flamed for this but maybe I just need to get my hand slapped to settle me down.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;As you may know Jimmy Bogard and I have a an open source BDD framework named NBehave. Jimmy, mainly has been working on this off and on and we have learned a great deal about BDD in that time frame.&amp;nbsp; We have experimented with various ideas that have been cultivated in the BDD community and are striving for best practices.&amp;nbsp; There are directions that we would like to take the framework&amp;nbsp; but we have not had time to move it in a certain direction just yet.&amp;nbsp; As an Open Source project we would love additional contributors to help us with the project and just get the community more involved, after all that is what open source is all about. &lt;/p&gt;
&lt;p&gt;The key concept here is community. If you have an idea that is similar to a project that is in an alpha state, shouldn&amp;#39;t you simply contribute to the project to help grow the idea? As a fledgling community should we not galvanize on concepts to bring greater acceptance to the masses?&amp;nbsp; Or are we mainly focused on becoming the new Rock Star programmer?&lt;/p&gt;
&lt;p&gt;Now the context of the issue. I came across a &lt;a href="http://monstersgotmy.net/post/2008/08/07/Surviving-a-Zombie-Apocalypse-Behavior-Driven-Development-Part-I.aspx" target="_blank"&gt;post today on BDD&lt;/a&gt;. Looks very similar to &lt;a href="http://www.lostechies.com/blogs/joe_ocampo/archive/2007/07/15/more-bdd-xbehave-madness.aspx" target="_blank"&gt;this post&lt;/a&gt; but instead of anonymous delegates it uses lambdas.&amp;nbsp; Cool idea and one that we are planning on implementing, oh wait we have that already. hmmmm??&lt;/p&gt;
&lt;p&gt;One of my issues with open source development revolves around the very nature of this context. Why as a community do we insist on reinventing the wheel? Take for instance unit test frameworks in general.&amp;nbsp; There is NUnit, MbUnit, xUnit and I am sure I am missing others.&amp;nbsp; The point is they all pretty much do the same thing, just a little differently. Was there a fall out between developers on a certain concept? Where they started at the same time and grew up in separate camps? I don&amp;#39;t know. &lt;/p&gt;
&lt;p&gt;There is nothing wrong with a little competition to spark innovation, I am all for that. But as a community should we at least communicate with one another to talk about concepts around frameworks that are so similar in nature? If you have conflicting view points on a particular direction then by all means create a new project but if the view points are the same then galvanize with the other projects to help strengthen the concepts and ideas around which the tool is being built, this will only strengthen the community.&lt;/p&gt;
&lt;p&gt;I am not the type of person to be married to my code.&amp;nbsp; I believe in dating it.&amp;nbsp; It&amp;#39;s ok if you want to change it, enhance it or delete it.&amp;nbsp; I don&amp;#39;t really care.&amp;nbsp; What I do care about is the concept and principles upon which the tool is meant to serve.&amp;nbsp; I am not in this industry for the notoriety or the prestige.&amp;nbsp; I simply want to create good software with the help of the community.&amp;nbsp; I love conversing with other developers on ideas or concepts. This is what truly drives me. &lt;/p&gt;
&lt;p&gt;I want to go on the record, that I do not think that the authors of StoryQ had ANY ill intentions or malice towards NBehave or other BDD frameworks. I am simply saying, why couldn&amp;#39;t the authors have contacted myself or Jimmy to help make NBehave better. The dialog would only have helped to strengthen view points and concepts.&lt;/p&gt;
&lt;p&gt;BTW I have contacted Jimmy on any of this so if you have flame don&amp;#39;t send it his way.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=4643" width="1" height="1"&gt;</description></item><item><title>How healthy is your code?</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/08/21/how-healthy-is-your-code.aspx</link><pubDate>Thu, 21 Aug 2008 18:56:42 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:4578</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=4578</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=4578</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/08/21/how-healthy-is-your-code.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;img style="margin:5px 0px 8px 8px;" height="164" src="http://farm1.static.flickr.com/168/476697582_b3a94a0013.jpg?v=0" width="245" align="right" alt="" /&gt; Technical Debt is not simply an Agile buzzword more than it is a fact of software development.&amp;nbsp; Just like any other debt it imposes negative ramifications on the software and significant loss is revenue.  &lt;p&gt;I hate to get touchy feely but I think what I am about to say holds the most weight when presented in this manner.  &lt;p&gt;If we look at our code as a living and breathing life form, we are responsible for its creation and well being.&amp;nbsp; As we hack through our code feverishly because of dead lines or time constraints we severely retard the health of our code.&amp;nbsp; Why do we allow this to happen?&amp;nbsp; Usually this is because we don’t have anything to monitor the cholesterol or blood sugar level of the code.&amp;nbsp; There is no external indicators that allow us to gauge the health of the code.  &lt;p&gt;Take for instance when I was in high school I use to love to play sports, any sport.&amp;nbsp; If it had a ball in it, I was there.&amp;nbsp; My mother told me to watch what I ate, make sure to eat lots of vegetables , exercise, etc.&amp;nbsp; Did I listen???? No!&amp;nbsp; I ate what ever I wanted and didn’t give it any thought because there wasn’t any immediate external visible signs of what was happening to me internally. I could leap, run and jump with the same intensity as I did when I was a child so why should I change?  &lt;p&gt;Now fast forward 20 years.&amp;nbsp; Well, I still love to play sports but I can’t play them&amp;nbsp; near the same intensity I had as a teenager.&amp;nbsp; My body hurts in places I never even knew could hurt. Jumping down off the kitchen counter causes my knees to buckle under the pressure of descending 3 feet! What I didn’t know is that I was incurring a health debt early on in my child hood that is having horrible compounding effects in my middle age.  &lt;p&gt;The same deteriorating effects happen with software, just at a much more rapid pace.&amp;nbsp; This deterioration&amp;nbsp; happens in front of our noses, we just don’t pay it any attention because there isn’t any external indication of the impact to health of our software. Or is there?  &lt;ul&gt; &lt;li&gt;Can you change your code and understand the side effect or worse are you afraid to change your code at all? &lt;/li&gt; &lt;li&gt;Can you *easily* change your code or do you spend sleepless nights adding the simplest of changes to your code? &lt;/li&gt; &lt;li&gt;Do you know how much of your code is tightly coupled? &lt;/li&gt; &lt;li&gt;Do you think that orthogonal principles are something that is only for enterprise projects? &lt;/li&gt; &lt;li&gt;When you run a code coverage tool do you throw the results away because there is so much red and not enough time? &lt;/li&gt; &lt;li&gt;Are you prioritizing defects as Critical, Important, High, Medium and Low; where Important and High account for 80% of the defects but are not taken care of because they are not in a critical state? &lt;/li&gt; &lt;li&gt;Do you follow ANY type of SDLC? &lt;/li&gt; &lt;li&gt;Do you attempt to include your customer or at least have a customer proxy to advocate concern and prioritize your work? &lt;/li&gt; &lt;li&gt;Is your code littered with comments such as, “we need to fix this”, “Don’t change this because I don’t know how I fixed this?”, “WTF?” &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Now the magnitude of how much each one of these questions effects technical debt is purely subjective.&amp;nbsp; The point I am trying to make is that your code is not in a healthy state and has the possibility of contracting a terminal illness that will lead to its death if you don’t take care of it now! &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=4578" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Teams/default.aspx">Agile Teams</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Project+Coaching+_2600_amp_3B00_+Management/default.aspx">Agile Project Coaching &amp;amp; Management</category></item><item><title>Grapevines and Agile make great Wine...</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/06/24/grapevines-and-agile-make-great-wine.aspx</link><pubDate>Tue, 24 Jun 2008 20:39:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:3812</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=3812</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=3812</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/06/24/grapevines-and-agile-make-great-wine.aspx#comments</comments><description>&lt;p&gt;I couldn&amp;#39;t resist the title.  &lt;p&gt;By this point in most of your careers you have been exposed to the grapevine exercise. This exercise is geared to show you how one thought through many control points gets distorted and misrepresented. I believe this is true for the majority of conversations out side of work but if leveraged properly can add tremendous benefit to an organization.  &lt;p&gt;Keith Davis did a study of the grapevine in 1953.&amp;nbsp; Keith Davis stated  &lt;blockquote&gt; &lt;p&gt;&amp;quot;the grapevine is a natural part of a company&amp;#39;s total communication system...it is a significant force within the work group, helping to build teamwork motivate people, and create corporate identity.&amp;quot; &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;This type of discussion medium is prevalent and natural to the greater society. Just think about what happens in your homes.  &lt;p&gt;In most homes there isn’t a plan written down for how to do the budget, there isn’t a process on how discussions at the dinner table will be deliberated. There are guidelines but these guidelines are mutually agreed upon in open discussion. In most homes these types of forums are left open and honest, focus is on content then exactness.  &lt;p&gt;Organically barriers are established but periodically they are revisited (usually by teenagers) to test their validity.&amp;nbsp; The content however is “I heard...”, “Did you know...”, “Today at work...”.&amp;nbsp; Nothing of empirical substance but enough to spark decisions in the house hold.&amp;nbsp; If we are wrong we readjust and go on.  &lt;p&gt;Some of us however need more control in order to FEEL safe. Some of us feel that the more we pursue exactness the better our decisions will be. Issues arise when this personality type forces others to fall in line with this thought process.  &lt;p&gt;Several heavy weight methodologies have attempted to control discussion and thought through various bureaucratic mechanism. While some have the perception of control, few if any, have ever been able to achieve this.  &lt;p&gt;The Agile Manifesto tells us that we should value Individuals and interactions over processes and tools.&amp;nbsp; &lt;p&gt;So with this philosophical mindset we must propagate fluid communication and document or create processes around communication when “absolutely necessary.”  &lt;p&gt;Take a moment and evaluate “absolutely necessary,” this implies that you have exhausted all low friction practices to promote communication. Then and only then do you investigate a tool or a process to govern communication.  &lt;p&gt;If you do come up with a process or tool please take the time to put in place some type of 6 week reevaluation period to determine if whatever avenue you are pursuing is proving to beneficial and not wasteful.  &lt;p&gt;How does this have anything to do with the grapevine paradox? Well, you have to remember that people are people, rather then trying to change their innate ability to communicate openly, embrace it!  &lt;p&gt;I would venture to argue that the majority of individual you interact with daily would welcome open communication over documentation.&amp;nbsp; There are the few that do&amp;nbsp; so if your organization is composed of this type of individual you must respect their needs and give them what they need to be successful. But weigh it in contrast to the majority.  &lt;p&gt;Take the grapevine paradox and embrace it by facilitating open communication such as daily stand-ups, fishbowl discussions, innovation games, collaborative retrospectives and development lab architectural discussions. The emphasis is on the openness which breeds transparency.  &lt;p&gt;Let us not forget that People communicating successful to accomplish a common goal are what determine project success not charts or graphs but people.  &lt;p&gt;Simple in concept but often overlooked. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=3812" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Teams/default.aspx">Agile Teams</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Project+Coaching+_2600_amp_3B00_+Management/default.aspx">Agile Project Coaching &amp;amp; Management</category></item><item><title>Matrix Resource Management and Agile</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/06/23/matrix-resource-management-and-agile.aspx</link><pubDate>Mon, 23 Jun 2008 20:03:41 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:3788</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=3788</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=3788</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/06/23/matrix-resource-management-and-agile.aspx#comments</comments><description>&lt;p&gt;I have been having an ongoing discussion lately concerning matrix management styles and how they conflict with Agile Project Management. &lt;p&gt;If you look at the traditional &amp;quot;Iron Triangle&amp;quot;, resources are estimated, in that change is expected in the resource allocation depending upon task and assignment. &lt;p&gt;&lt;a href="http://www.lostechies.com/blogs/joe_ocampo/WindowsLiveWriter/MatrixResourceManagementandAgile_E1B7/clip_image002_2.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="377" alt="clip_image002" src="http://www.lostechies.com/blogs/joe_ocampo/WindowsLiveWriter/MatrixResourceManagementandAgile_E1B7/clip_image002_thumb.png" width="640" border="0" /&gt;&lt;/a&gt; &lt;p&gt;In Agile resources are fixed throughout the duration of the project and features are variable. &lt;p&gt;This is a clear delineation into the approach of Agile resource management. Traditional matrices were based off of manufacturing models that do not lend themselves to effectively managing knowledge-based work such as software development. &lt;p&gt;Manufacturing management relies on technicians to be trained at various activities in their line of work. These activities rarely, if ever, change. So, mastery of these activities increases dramatically with repetition. This is not a bad thing, since tremendous value is gained through the repetition for the business. From a management perspective it is very easy to assign different work streams to one person since the proficiency level of the work environment is not built upon change or adaptability but on repetition and skill mastery. &lt;p&gt;Knowledge-based resource management understands that knowledge workers are trained professional but the context domain on which their skills are applicable is in a constant dynamic state. Therefore, this forces the knowledge worker to pursue greater levels of training and reconstitute positions of ideology based on experience. This is the benefit of the organization that employs knowledge workers. &lt;p&gt;The fluidity of communication and thought surrounding a project (especially a software project) forces the knowledge worker to gain greater depth in the problem domain so that they may better serve the business in providing services. &lt;p&gt;This idea is compounded when you start to manage teams of knowledge workers. The term, &amp;quot;two minds are better the one&amp;quot;, shines in this environment. As knowledge teams ensure business value is rendered and investiture in the project increases, the thoughts and ideas of the whole out weight that of the individual. &lt;p&gt;As matrix management encroaches upon Agile management the philosophical view points on resource allocation are contrary to each other. Consider the following: &lt;p&gt;Organization: Gloop Org &lt;p&gt;• Developer UberBob – Is assigned to &lt;ul&gt; &lt;li&gt;Project A @ 25% of his time&lt;/li&gt; &lt;li&gt;Project B @ 65% of his time&lt;/li&gt; &lt;li&gt;Project C @ 10% of his time&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I know this NEVER happens but work with me. The Gloop organization is wanting to move toward a more Agile development approach but is not willing to give up it&amp;#39;s matrix model just yet. &lt;p&gt;• Project A is in the planning stages and several meetings have been setup to discuss how the new billing system is going to work. &lt;p&gt;• Project B is knee deep in the second release and velocity has been established for each iteration. The new warehouse system is underway. &lt;p&gt;• Project C is just finishing up but automated testing wasn&amp;#39;t followed so the team is mainly focusing on defect removal. Defect backlog is high. &lt;h3&gt;Monday:&lt;/h3&gt; &lt;p&gt;Bob comes to work and is perplexed to what standup he has to attend since he has input to each one of the projects he is on. He has already been dealing with this dilemma for the past couple of months as he spends the latter part of his day creating emails to send to the project managers of the standup he will not be attending. &lt;p&gt;The project managers do their best to convey Bob&amp;#39;s work and impediments but usually Bob has to follow up with team members throughout the day to determine what he missed and what issues he has to solve due to the breakdown in communication.  &lt;p&gt;In Project B, Bob is working heavily on how the conveyor system is going to determine what gates to open to ship the merchandise. There is an issue, however, that the team has to figure out because the communication protocol isn&amp;#39;t fully supported for the gating system as originally thought. Several meetings are planned in the afternoon with the development team to discuss the correct course of action. &lt;p&gt;In Project A, they are still going through several domain modeling sessions to flush out how the billing system is going to work. The billing system model for Gloob is unique and is how the company maintains it&amp;#39;s competitive advantage. They are going to go over the complexities of this system in the afternoon. &lt;p&gt;In Project C the defects are just getting out of hand. There are several show stopping defects and the team is going to have to determine how they are going to solve these issues before going to production. They are going to get back to Bob on when the meeting is going to be held. &lt;p&gt;I am not going to go into what happens here but magically Bob is able to pull a miracle and make it to each meeting but he has to sacrifice time and only go partially to each meeting and rely on the meeting minutes to catch him up to speed. &lt;p&gt;Bob is an awesome developer, he is prideful about everything he does, and works late hours to overcome all the impediments his projects go through daily. The issues surmount when the communication breaks down. &lt;p&gt;What Bob didn&amp;#39;t know was after he left the Billing System meeting they went into a critical discussion on how the system calculates interest. His fellow teammates estimated that feature at taking days, but in reality with Bob&amp;#39;s experience, it will take months. In the warehouse system the Product owner came in and changed the backlog since the “gate issue” is going to take longer to flush out. So they added other value stories above the gate. But Bob doesn&amp;#39;t know this and is planning on staying late to figure out how to solve the gate issue. Bob was unable to really bring any value to the defect discussion since he came in at the tail end of the meeting. Bob&amp;#39;s teammates weren&amp;#39;t too happy with him for missing the defect meeting. &lt;h3&gt;End of Monday…&lt;/h3&gt; &lt;p&gt;I know this never happens in the real world but it is very possible (I say that tongue in cheek). All these projects are at risk because of the matrix model. Knowledge workers need to focus on one context at a time so that we harness the power of their collective thought. &lt;p&gt;By fixing the resources on a given project and dedicating them throughout, you gain momentum and predictability of effort. Matrix models disrupt communication continuity as well as iteration velocity. As you mix and match resource from project to project every week, you might as well throw whatever velocity you have been tracking out the window as the team dynamics have been disrupted. If you simply perform a one for one swap of personnel you cannot expect output not to be disrupted. &lt;p&gt;I want to make sure that everyone understands that I am not saying that matrix management doesn’t work. I have seen it work on extremely large RUP projects that lasted several years. My definition of “work” is slightly skewed because the project was less then stellar but the work effort was as fluid as RUP can be. &lt;p&gt;My argument solely revolves around matrix management and Agile. You can do it but the experience of true Agile will be lost. The people aspect of Agile, which to me is the most critical, will be damaged due to constantly managing frustration based around priority and delegation. &lt;p&gt;I have always said this and continue to say this, “Agile refocuses management to concentrate on people aspect of leadership. By focusing on increasing quality of life for the employee and increasing knowledge share, the benefits are tremendous!”&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=3788" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Teams/default.aspx">Agile Teams</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Project+Coaching+_2600_amp_3B00_+Management/default.aspx">Agile Project Coaching &amp;amp; Management</category></item><item><title>My issues with the term "Scrum Master"</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/06/07/my-issues-with-the-term-quot-scrum-master-quot.aspx</link><pubDate>Sat, 07 Jun 2008 21:54:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:3606</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>16</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=3606</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=3606</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/06/07/my-issues-with-the-term-quot-scrum-master-quot.aspx#comments</comments><description>&lt;p&gt;A few years ago I was very excited at the possibility of becoming a Scrum master.&amp;nbsp; At the time I had been an avid XP practitioner for a little over two years.&amp;nbsp; I had read several books on the Scrum but viewed it as simply Yet Another Agile Methodology (YAAM) with a focus more on the project management.&amp;nbsp; I thought to myself that I must have been missing something.&amp;nbsp; How can something as simple as this methodology be taking off like wild fire in the corporate arena?&amp;nbsp; I figured that a Scrum Master class would shed light on this dilemma of mine.&lt;br /&gt;&lt;br /&gt;Day 1 of Scrum Master training, typical PowerPoint presentation with lots of slides telling you how great Scrum is and different scenarios where Scrum has been applied. Still no epiphany.&amp;nbsp; The day goes on and we get to do hands on Sprint planning meetings, we emphasize the importance of the Daily Scrum. OK been there already, understand the importance feedback, still nothing ground breaking. Next we talk about value stream prioritization from the perspective of the Product Owner.&amp;nbsp; People are asking lots of questions on what do you do…etc.&amp;nbsp; Lots of dialog but still nothing earth shattering.&amp;nbsp; Next we discuss organic team composition, something that is near and dear to my heart but we spend around 20 minutes on this topic basically saying let the team self organize to gain the greatest value. On to retrospectives, very enlightening, nothing really new, there isn’t one way to do a retrospective, several books are recommended.&amp;nbsp; And this is the end of Day 1.&lt;br /&gt;&lt;br /&gt;Day 2 we actually go though an entire mock release.&amp;nbsp; We form up into 5 person teams. Each of us assumes various roles such as Product Owner, Scrum Master, and the development team.&amp;nbsp; We go through the Sprint Planning session and prioritize a backlog with the product owner learning several techniques on how to gain insight into how the backlog is being prioritized. Now we start our first development cycle that is time boxed to 5 minutes. Team self organizes and pulls stories from the backlog to work on.&amp;nbsp; At the end of 5 minutes we do our daily Scrum.&amp;nbsp; We talk about what we did, what we are going to do and are there any impediments in our way. We go through several cycles with some of them trying to be sabotaged by the instructors with various impediments that the team manages to overcome. At the end of the Sprint we demonstrate the final product to the Product Owner (in this case it was a magazine) they make suggestions and reprioritize the backlog.&amp;nbsp; We then hold a Sprint retrospective and talk about what worked, what didn’t work, and where we could improve. On to the next sprint to start the whole process again.&lt;br /&gt;&lt;br /&gt;At the end of Day 2 we had a feedback session about how the class went.&amp;nbsp; We talked about what we learned and ways on which to improve the class.&amp;nbsp; For me it was nothing more of a confirmation of what I had already been practicing but there was something that was missing, more on that later.&lt;br /&gt;&lt;br /&gt;Now the scary part! Towards the end of the class we signed several sheets of paper and 30 minutes later I was awarded the title of, “Scrum Master”! What I didn’t tell you is that the class was filled with individuals with out any software development background.&amp;nbsp; Here is a list of some of the titles that where in the meeting.&amp;nbsp; Vice Presidents, CIO’s, Project Managers, Product Mangers, Developers and a Financial Analyst.&amp;nbsp; All of these individuals could now place, the title of Certified Scrum Master on their resume and wreak havoc to any organization that would give them the power.&lt;br /&gt;&lt;br /&gt;It is not that I have a problem with Scrum so much as it is I have a problem with title, “Scrum Master”. The word “master” implies that this person has attained a level of mastery of everything related to scrum though experience, experimentation and trial.&amp;nbsp; I would have preferred the term “Scrum Apprentice” to “Scrum Master”.&lt;br /&gt;&lt;br /&gt;Scrum is very instrumental at getting an organization to adopt Agile.&amp;nbsp; I have a post about this calling out that, “&lt;a href="http://www.lostechies.com/blogs/joe_ocampo/archive/2007/09/08/scrum-the-gateway-drug-to-true-agility.aspx"&gt;Scrum is the gateway drug to Agile”&lt;/a&gt;.&amp;nbsp; If you choose to adopt Scrum your organization you will gain greater insight into its culture.&amp;nbsp; This insight is not always welcomed as it will expose many of your organization process and personnel related issues.&amp;nbsp; How you choose to deal with these issues will determine how successful your project will be.&lt;br /&gt;&lt;br /&gt;Personally speaking Scrum cannot be practiced on its own.&amp;nbsp; Scrum lacks software engineering disciplines and practices, this is where XP excels.&amp;nbsp; By combining both methodologies into one ecosystem you have a very powerful foundation to build on.&lt;br /&gt;&lt;br /&gt;If you do decide to go down this path make sure to ask for the Scum Masters list of impediments and how they overcame them.&amp;nbsp; Also ask about what they have learned from their mistakes.&amp;nbsp; This will give you an idea on the level of experience the individual has running Scrum Projects.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=3606" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Agile+Project+Coaching+_2600_amp_3B00_+Management/default.aspx">Agile Project Coaching &amp;amp; Management</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Scrum/default.aspx">Scrum</category></item><item><title>Twittering from the command line</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/05/21/twittering-from-the-command-line.aspx</link><pubDate>Wed, 21 May 2008 04:47:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:3309</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=3309</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=3309</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/05/21/twittering-from-the-command-line.aspx#comments</comments><description>&lt;p&gt;So I was experimenting with Twitter last night and started to use their RESTful services from the command line.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Why you may ask? Well sometimes I just want to tweet something quickly and I don&amp;#39;t want to bother with opening a client or web page.&amp;nbsp; So I through together this simple bash script.&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;tweet()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; curl -u &amp;lt;username&amp;gt;:&amp;lt;password&amp;gt; -d status=&amp;quot;$1&amp;quot; http://twitter.com/statuses/update.xml&lt;br /&gt;&amp;nbsp; } &lt;/font&gt;&lt;/p&gt;&lt;p&gt;Simply add this to your &lt;b&gt;.bash_profile &lt;/b&gt;and you can tweet from the command line all day.&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;tweet &amp;quot;Tweeting from the command line is awesome!&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I love RESTful services despite popular belief.&amp;nbsp; :-)&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=3309" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Tools/default.aspx">Tools</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Twitter/default.aspx">Twitter</category></item><item><title>JUnit 4 TestSuite Declaration</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/04/14/junit-4-testsuite-declaration.aspx</link><pubDate>Tue, 15 Apr 2008 02:35:00 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:2919</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=2919</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=2919</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/04/14/junit-4-testsuite-declaration.aspx#comments</comments><description>&lt;p&gt;This is mainly for my own reference but if it helps people out there great!&amp;nbsp; The documentation on this aspect of JUnit is very poor.&lt;/p&gt; &lt;div&gt;&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;"&gt;package agalliao.wealthManagment.domain;&lt;br /&gt;&lt;br /&gt;import org.junit.runner.RunWith;&lt;br /&gt;import org.junit.runners.Suite;&lt;br /&gt; &lt;br /&gt;@RunWith(Suite.&lt;span&gt;class&lt;/span&gt;)&lt;br /&gt;@Suite.SuiteClasses({&lt;br /&gt;  investmentTests.&lt;span&gt;class&lt;/span&gt;,&lt;br /&gt;  catalogTests.&lt;span&gt;class&lt;/span&gt;,&lt;br /&gt;  markerTests.&lt;span&gt;class&lt;/span&gt; &lt;br /&gt;})&lt;br /&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; AllTests {&lt;br /&gt;    &lt;span&gt;// why on earth I need this class, I have no idea! &lt;/span&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=2919" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/JUnit/default.aspx">JUnit</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Java/default.aspx">Java</category></item><item><title>PTOM: OCP revisited in Ruby</title><link>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/03/30/ptom-ocp-revisited-in-ruby.aspx</link><pubDate>Mon, 31 Mar 2008 02:54:43 GMT</pubDate><guid isPermaLink="false">ded273ab-9e87-4979-8222-e4e2e46f1b46:2726</guid><dc:creator>Joe Ocampo</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/rsscomments.aspx?PostID=2726</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://www.lostechies.com/blogs/joe_ocampo/commentapi.aspx?PostID=2726</wfw:comment><comments>http://www.lostechies.com/blogs/joe_ocampo/archive/2008/03/30/ptom-ocp-revisited-in-ruby.aspx#comments</comments><description>&lt;p&gt;I was playing with some &lt;a title="Ruby" href="http://www.ruby-lang.org/en/" target="_blank"&gt;Ruby&lt;/a&gt; code this weekend and thought I would show some &lt;a href="http://www.objectmentor.com/resources/articles/ocp.pdf" target="_blank"&gt;OCP&lt;/a&gt; with &lt;a title="Ruby" href="http://www.ruby-lang.org/en/" target="_blank"&gt;Ruby&lt;/a&gt;.  &lt;p&gt;For more of an in-depth discussion on OCP please read &lt;a href="http://www.lostechies.com/blogs/joe_ocampo/archive/2008/03/21/ptom-the-open-closed-principle.aspx" target="_blank"&gt;my previous post&lt;/a&gt;.  &lt;p&gt;Now the first thing I want to point out is that dynamic languages are naturally by default open for extension. Since the types are dynamic, there are no fixed (static) types. The enables us to have awesome extensibility. It is the closure part of the equation that really scares me more than anything else. If you really aren’t careful when you are programming with dynamic languages you can quickly make a mess of things. This doesn’t take away from the power of a dynamic language you just have to exercise greater care that is all.  &lt;p&gt;So let’s use our OCP scenario template again and apply them to the example scenario.  &lt;p&gt; &lt;ul&gt; &lt;li&gt;The &lt;b&gt;&lt;i&gt;ProductFilter&lt;/i&gt;&lt;/b&gt; is responsible for &lt;b&gt;&lt;i&gt;filtering products&lt;/i&gt;&lt;/b&gt; by &lt;b&gt;&lt;i&gt;color&lt;/i&gt;&lt;/b&gt;  &lt;li&gt;The &lt;b&gt;&lt;i&gt;ProductFilter&lt;/i&gt;&lt;/b&gt; is responsible for &lt;b&gt;&lt;i&gt;filtering products&lt;/i&gt;&lt;/b&gt; by &lt;b&gt;&lt;i&gt;size&lt;/i&gt;&lt;/b&gt;  &lt;li&gt;The &lt;b&gt;&lt;i&gt;ProductFilter&lt;/i&gt;&lt;/b&gt; is responsible for &lt;b&gt;&lt;i&gt;filtering products&lt;/i&gt;&lt;/b&gt; by &lt;b&gt;&lt;i&gt;color and size&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Let’s go ahead and create the ProductFilter first.&lt;br /&gt; &lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ProductFilter
    
    attr_reader :products
    
    def initialize(products)
        @products = products
    end
    
    def by(filter_spec)
        
    end
end&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For those that have never created a class in Ruby let me breakdown the syntax structures. 
&lt;p&gt;&lt;b&gt;class &lt;/b&gt;keyword is used to define a class followed by the name of the class. It is important to note that class names must be start with an uppercase letter. The uppercase letter signifies to the &lt;a title="Ruby" href="http://www.ruby-lang.org/en/" target="_blank"&gt;Ruby&lt;/a&gt; interpreter that this is constant, meaning that whenever the term “ProductFilter” comes up it will always reference this class structure. 
&lt;p&gt;&lt;b&gt;attr_reader&lt;/b&gt; keyword used to signify a read only accessor (read only property). The property name follows the colon. 
&lt;p&gt;&lt;b&gt;def &lt;/b&gt;keyword is used to declare a method block. The “initialize” method is the same as the constructor method in C#. 
&lt;p&gt;The&lt;strong&gt; @&lt;/strong&gt; symbol denotes an instance variable. Notice that the “products” read accessor is never typed but is assigned in the constructor through @products reference. The instance variable @products is assigned to the products parameter variable that is passed into the constructor. 
&lt;p&gt;Now that we are talking about products we have to create the actual product class.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Product
    attr_accessor :color
    attr_accessor :size
    
    def initialize(color, size)
        @color = color
        @size = size
    end
end&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nothing fancy here, just a class with two read/write accessors Color and Size. 
&lt;p&gt;If you remember from my previous post I was using a template pattern to serve as the basis for extending the behavior of my filter class. Well I am going to do the same thing here (kind of) and define an Item_color_filter_spec class.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Item_color_filter_spec
    attr_accessor :color
    
    def initialize(color)
        @color = color
    end
    
    def apply_to(items)
        
    end
end&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now I have a class that accepts a color and has an “apply_to” method that accepts “items”. I have left out the implementation code of this method on purpose. 
&lt;p&gt;The next thing I am going to do is create an array of products I can use against the ProductFilter class. &lt;a title="Ruby" href="http://www.ruby-lang.org/en/" target="_blank"&gt;Ruby&lt;/a&gt; makes this pretty painless: &lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;products = [
    Product.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Large&amp;quot;&lt;/span&gt;),
    Product.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Large&amp;quot;&lt;/span&gt;),
    Product.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Medium&amp;quot;&lt;/span&gt;),
    Product.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Small&amp;quot;&lt;/span&gt;),
    Product.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Large&amp;quot;&lt;/span&gt;),
    Product.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Yellow&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Small&amp;quot;&lt;/span&gt;),
]&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So what’s going on here? I declared a variable called “products” and assigned it to array by using the square braces “[ ]”. Yup that simple! 
&lt;p&gt;What you may have noticed is that I actually instantiated several new products in the array. To instantiate a class you simply use the “new” method that is part of the Object class that all objects in &lt;a title="Ruby" href="http://www.ruby-lang.org/en/" target="_blank"&gt;Ruby&lt;/a&gt; inherit from similar to C#. 
&lt;p&gt;Now that I have a collection of products I am going to give to my product filter class.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;product_filter = Product_Filter.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(products)&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the example below I am going to filter all the “Blue” products.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;blue_products = product_filter.by(Item_color_filter_spec.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;))&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;At this point I am creating a new “Item_color_filter_spec” and giving the color “Blue” as the color to filter on. The ProductFilter class would then simply call the “apply_to” method on the “Item_color_filter_spec”. 
&lt;p&gt;If you ran the code at this point nothing would happen because we haven’t actually written our filter code yet. So to do that we are going to modify the “apply_to” method of our “Item_color_filter_spec” class with the following code.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;def apply_to(items)
    items.select{|item| item.color == @color}
end&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the code above the “apply_to” method is expecting an array of items to be passed in. We then call the “select” method on the array class and pass in a filter “proc” by enclosing the statement in curly braces {} (In Ruby a “proc” is an object that holds a chunk of code but more on this later). The pipe block “||” is used to signify parameters to the proc similar to the parameters of a method. After the pipe block is the actual statement that is executed. We are trusting that the “select” method of the array object is going to enumerate over each object (product) it contains and pass it into Proc. Once in the Proc we simply determine if the color of product matches the instance variable “@color” of the “Item_color_filter_spec” in this case the color “blue”. When the Proc evaluates to true it passes the item to an array that the select method returns.&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can possibly equate a “proc” to a &lt;a href="http://msdn2.microsoft.com/en-us/library/bb397687.aspx" target="_blank"&gt;lambda expression&lt;/a&gt; in C#.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;(Normally I would have used &lt;a href="http://rspec.info/" target="_blank"&gt;rSpec&lt;/a&gt; to govern everything I am doing but I didn’t want to explain BDD as well. I wanted to focus on the Ruby language in general.) 
&lt;p&gt;Now if you run the code you will have three products in the “blue_products” variable. How do you know? Well let’s iterate over it by using the following code.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;blue_products.each &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |product|
    puts(product.color)
end&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now remember “blue_products” is an array object. The array object has an “each” method (as do other objects in Ruby) that accepts a “proc” object. The “proc” block is denoted by the “do” keyword and terminated with the “end” keyword. In our block we expecting that the array objects “each” method is going to give us a product. As the each method iterates over each product it passes it to the “proc” and we simply tell Ruby to write it to the screen using the “puts” method. The result of this small statement block in the following:&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;Blue

Blue

Blue
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So there you have it 3 blue products! 
&lt;p&gt;I know, nothing special right? Well now let’s play with some &lt;a title="Ruby" href="http://www.ruby-lang.org/en/" target="_blank"&gt;Ruby&lt;/a&gt; sweetness! 
&lt;p&gt;That sure is a lot effort to filter a product by color. Imagine if you had to keep adding different color filters. You would have to create several “color filter specs” over and over again. That is dull and most static languages have played this out! So let’s use some Ruby Lambda’s to accomplish the same thing as the “color filter spec” 
&lt;p&gt;We are going to create a filter spec that filters all products that are yellow. 
&lt;p&gt;Remember I told you that Ruby views all uppercase variable names as constants; well we are going to harness the power of this convention and create a constant to hold the reference to the lambda. After all &lt;a href="http://en.wikipedia.org/wiki/Don&amp;#39;t_repeat_yourself" target="_blank"&gt;DRY&lt;/a&gt; principles still apply here.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;YELLOW_COLOR_FILTER_SPEC = lambda &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |products|
    products.select{|product| product.color == &lt;span style="color:#006080;"&gt;&amp;quot;Yellow&amp;quot;&lt;/span&gt;}
end&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nothing in the code block above should be foreign at this point except for the “lambda” key word. What the “lambda” keyword does is tell the Ruby interpreter to assign the “Proc” to the constant “YELLOW_COLOR_FILTER_SPEC”. 
&lt;p&gt;We have to now modify our ProductFilter class to accept a Proc object. All you have to do is add the following method to the ProductFilter class.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;def by_proc(&amp;amp;filter_spec_proc)
    filter_spec_proc.call(@products)
end&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This method has a parameter named “filter_spec_proc” but if you notice there is an ampersand preceding its declaration. This tells the Ruby interpreter to expect a Proc object to be passed in. Since we are expecting a Proc object all we have to do is use the &amp;quot;call&amp;quot; method and pass the products instance variable to the Proc. 
&lt;p&gt;Now let’s wire the whole thing together.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;yellow_products = product_filter.by_proc(&amp;amp;YELLOW_COLOR_FILTER_SPEC)&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pretty simple about the only thing you have to remember is that you have to place the ampersand before the Proc constant when you call the “by_proc” method on the ProductFilter class. 
&lt;h4&gt;But wait there is more!&lt;/h4&gt;
&lt;p&gt;Our ProductFilter class now has a method that accepts a Proc object. In our previous example we passed it a constant that referenced a lambda Proc block. But since it accepts a Proc we can simply write the block in line with the method call like this. 
&lt;p&gt;With our new found knowledge lets filter all the “Red” products.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;red_products = product_filter.by_proc &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |products|
        products.select{|product| product.color == &lt;span style="color:#006080;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;}
    end&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Parenthesis are optional in Ruby when you call a method. 
&lt;p&gt;Pretty nice huh? 
&lt;p&gt;Now for something really freaky for all you static type people! 
&lt;p&gt;Lets say you aren’t dealing with products anymore and you are dealing with Cars. 
&lt;p&gt;cars have 4 wheels but they also have color don’t they. Gee it would be nice if we could filter the Cars just like we are able to filter the Products. Wait! We can, we already wrote it! 
&lt;p&gt;We have that “Item_color_filter_spec” class. We could use the ProductFilter class but that class already has a purpose but the “Item_color_filter_spec” is pretty agnostic.&lt;br /&gt;
&lt;div&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Car
    attr_accessor :color
    def initialize(color)
        @color = color
    end
end

cars = [
    Car.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;),
    Car.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;),
    Car.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Red&amp;quot;&lt;/span&gt;),
    Car.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;)
]

blue_filter = Item_color_filter_spec.&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;(&lt;span style="color:#006080;"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt;)
blue_cars = blue_filter.apply_to(cars)&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Wow talk about reuse!!! 
&lt;p&gt;How is this possible? Well remember types do not exist in Ruby. There are objects but objects are &lt;a href="http://en.wikipedia.org/wiki/Duck_typing" target="_blank"&gt;duck typed&lt;/a&gt; when you ask them to perform an action. Meaning if it walks like a duck or quacks like a duck it must be a duck. The “Item_color_filter_spec” only cares that it is passed an array of objects. It is then going to iterate over the array of objects and call the “color” accessor on each object to check for equality against the instance variable that was passed in through the constructor. It doesn’t care if the array contains cars, products or both; just that whatever object it is has to have an accessor of &amp;quot;color.&amp;quot; 
&lt;p&gt;I know this is a ton on information to digest all at once but I am just very passionate about the Ruby language. I see tremendous potential in its future especially with its entrance into the .Net space through the &lt;a href="http://www.ironruby.net/" target="_blank"&gt;IronRuby&lt;/a&gt; project. I can easily see it over throwing the Visual Basic crowd once it becomes more main stream in the .Net community.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://www.lostechies.com/aggbug.aspx?PostID=2726" width="1" height="1"&gt;</description><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/Ruby/default.aspx">Ruby</category><category domain="http://www.lostechies.com/blogs/joe_ocampo/archive/tags/PTOM/default.aspx">PTOM</category></item></channel></rss>