<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-15324911</id><updated>2009-10-31T13:19:33.100-04:00</updated><title type="text">Let's Push Things Forward</title><subtitle type="html">Making things better.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://lptf.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default?start-index=26&amp;max-results=25" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>237</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><geo:lat>38.94866666143527</geo:lat><geo:long>-77.39799748772671</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/2.0/" /><link rel="self" href="http://feeds.feedburner.com/LetsPushThingsForward" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-15324911.post-7408259799214085633</id><published>2009-10-26T23:01:00.001-04:00</published><updated>2009-10-28T17:45:47.179-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><category scheme="http://www.blogger.com/atom/ns#" term="migrations" /><title type="text">Tips for using Rails migrations</title><content type="html">&amp;nbsp;The concept of a migration is that each change that is made to the structure of the database is captured in a version controlled script.&amp;nbsp; Any time you want to create a table, add a field, change a field type, etc., this is done via a migration.&amp;nbsp; Migrations are generated along with models, views, and controllers when a Rails scaffold is created to manage a resource. In addition, migrations are used to create a test database for each user which allows for rapid, automated quality checks on the application. If you have ever worked on a project where it is difficult to create a development "sandbox" database for each developer, where databases are copied via backup processes that leave weird permissions behind (I'm looking at you SQL Server), or where keeping the development database in sync with the application is something you even have to think about, you will easily see benefits from migrations.&lt;br /&gt;&lt;br /&gt;Using Rails migrations can be a bit of change for teams. In some cases, developers are not very familiar with relational database concepts and object modeling principles and can create some overly complex and/or inefficient structures. Having the overall model reviewed by a database modeling expert and an object modeling expert can be quite helpful.&amp;nbsp; I recommend Coad's "Java Modeling in Color with UML", Fowler's "Analysis Patterns" and David Hay's "Data Model Patterns"&amp;nbsp; for getting yourself up to speed with this. However, it is also worth communicating with the rest of the team that may be touching the model.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Here are a few things we've done in the process of keeping migrations under control:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't edit an existing migration, create a new one.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Editing an existing migration defeats the whole point.&amp;nbsp; You might be able to get away with it if no one has run it.&amp;nbsp; One obvious exception to this is if someone creates a migration that doesn't run and checked in. They must get the pig.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update and run new migrations before you check in a migration.&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; While this might seem obvious, in many cases, it is easy to check in a new migration file to the repository without seeing if someone else has created one that does something that conflicts with yours, since the names will be different.&amp;nbsp; If you don't run the migration, you risk doing something with your migration that causes issues. If you have already run your own migration locally, but not checked it in, and you get an update of a new migration, you need to roll back your own migration and change the numbering on it so that it runs after the migrations you just received from your version control system.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Check in the models that go with the migration when you check in the migration&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; One key benefit of migrations is keeping the code changes in sync with the database changes.&amp;nbsp; Add new tables and models in a single, logical commit.&lt;b&gt; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Assign models to class owners&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The feature of XP that I have been least successful with is the concept of common code ownership.&amp;nbsp; It is one of the easiest practices to apply in theory, but without the sense of collective responsibility and the compensating practices of pair programming and continuous integration, it can be problematic.&amp;nbsp; In larger teams, it often makes more sense to have people or subteams assigned to manage a particular model so that changes can be coordinated.&amp;nbsp; In theory, there can be enough communication to make it work. In reality, many teams are full of introverts that would rather rewrite huge swaths of code (and tests) than ask a question.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Communicate&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Changes to the object model can impact the whole application. These changes should be communicated to the rest of the team so that the reasoning behind them can be better understood and the data can be used correctly.&amp;nbsp; There is a risk of someone criticizing or trying to change your proposal, but this is ultimately a lower risk than building something that others fail to understand.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Roll up all migrations into a big file after a major release&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &lt;/b&gt;Once you've been going in your project for a while and get around the 100-150 migration point, it is probably worth it to roll the migrations prior to the current point into a single migration.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Generate SQL to run&lt;/b&gt; &lt;b&gt;on the production database&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; &lt;/b&gt;In many cases it is preferable to generate SQL to run on the production database, as opposed to running the migrate task directly against the database. This also allows for some more extensive code review on structural changes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Don't forget to create constraints and indexes (indices?)&lt;/b&gt;&lt;br /&gt;&amp;nbsp; If you are using foreign keys in your database, it's often worth the cost to create a constraint on the column to prevent any data integrity issues.&amp;nbsp;&lt;b&gt; &lt;/b&gt;It's also a good practice to create an index on those columns to speed joins.&lt;br /&gt;&lt;br /&gt;This is really just the tip of the iceberg, but it's a yummy water ice iceberg. Learning to use database migrations is a key skill, not just for Rails development, but for any agile development. A project which cannot create its database from scripts accessible to every developer is missing something important. By breaking those scripts down into small chunks and coordinating them with changes to the code, the situation where the application and database are out of sync simply does not exist.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-7408259799214085633?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/_5HXJf6xySc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/7408259799214085633" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/7408259799214085633" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/_5HXJf6xySc/tips-for-using-rails-migrations.html" title="Tips for using Rails migrations" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/10/tips-for-using-rails-migrations.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-3306297499093438708</id><published>2009-10-07T00:00:00.000-04:00</published><updated>2009-10-07T00:00:40.125-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="consulting" /><title type="text">Whose Success?</title><content type="html">There is sometimes a quandary between whose success we seek.&lt;br /&gt;&lt;br /&gt;Acting as a consultant, you obviously want your own work to be considered successful, so that you will induce others to hire you.  Getting there isn't so easy though.  We often look downstream to the customer's customers. By helping meet the customer's customers' needs, we hope to make our immediate customers successful.  The catch comes when something the immediate customer is doing is preventing them from satisfying their customer- and they don't want to change it. If we make the customer's customer successful at the cost of making the customer unsuccessful, we're probably not going to be successful.&lt;br /&gt;&lt;br /&gt;Remember the &lt;a href="http://www.amazon.com/Secrets-Consulting-Giving-Getting-Successfully/dp/0932633013"&gt;secrets of consulting&lt;/a&gt;- you have to help people learn to solve their own problems, you can't always solve their problems for them. You can be satisfied with your accomplishments, regardless of whether they give you credit. The ideal form of influence is to help the customer see the problem more clearly, but let them decide. Finally, if you want to understand a dysfunctional system, follow the money!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-3306297499093438708?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/fo_gqE-L0rI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/3306297499093438708" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/3306297499093438708" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/fo_gqE-L0rI/whose-success.html" title="Whose Success?" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/10/whose-success.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-3396924034344847710</id><published>2009-09-28T15:59:00.001-04:00</published><updated>2009-09-28T16:01:11.349-04:00</updated><title type="text">Seed data in Rails 2.3.4</title><content type="html">Very nice addition to Rails as part of the security updates in 2.3.4- an easy way to load seed data.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Added db/seeds.rb as a default file for storing seed data for the database. Can &lt;br /&gt;be loaded with rake db:seed (or created alongside the db with db:setup). (This &lt;br /&gt;is also known as the "Stop Putting Gawd Damn Seed Data In Your Migrations" &lt;br /&gt;feature)&lt;/pre&gt;&lt;br /&gt;I like this on several accounts, not least of which is it invalidates my &lt;a href="http://lptf.blogspot.com/2009/07/rails-fixtures-and-seed-data.html"&gt;previous post&lt;/a&gt; on the subject.&lt;br /&gt;&lt;br /&gt;In the meantime, there are several plugin based approaches to making this work, for example &lt;a href="http://www.intridea.com/2008/4/19/seed-fu-simple-seed-data-for-rails?blog=company"&gt;seed-fu&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-3396924034344847710?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/fp4f5ww5cQM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/3396924034344847710" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/3396924034344847710" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/fp4f5ww5cQM/seed-data-in-rails-234.html" title="Seed data in Rails 2.3.4" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/09/seed-data-in-rails-234.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-6361919876224118066</id><published>2009-09-10T11:20:00.004-04:00</published><updated>2009-09-10T23:41:53.660-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><category scheme="http://www.blogger.com/atom/ns#" term="whining" /><title type="text">Default route...</title><content type="html">One of the things that has been bothering me in Rails since  everything switched to resources is how we lost the easy way any public method in the controller became an accessible URL without having to write a rule for it.  For example, in a person controller, I could define a search method like this:&lt;br /&gt;&lt;pre&gt;def search     &lt;br /&gt;results = Person.seach(params[:q])&lt;br /&gt;end&lt;/pre&gt;And it would be accessible, just like that.  &lt;span style="font-family: &amp;quot;;"&gt;http://myapp/people/search?q=matt&lt;/span&gt;&lt;br /&gt;I even wrote a simple router in Java to do the same thing, because it just makes it so easy to navigate the application code.&lt;br /&gt;&lt;br /&gt;The poor design of&lt;span style="font-family: &amp;quot;;"&gt; map.resources&lt;span style="font-family: inherit;"&gt; messes this up.  By adding the route pattern &lt;span style="font-family: &amp;quot;;"&gt;:controller/:id &lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;it starts with the default assumption that the &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;;"&gt;search?q=matt &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;part of my URL is an ID.  Is it so hard to put an action name in there?  In any case, &lt;/span&gt;&lt;br /&gt;&lt;pre&gt;map.connect ':controller/:action'&lt;/pre&gt;goes above all of the&lt;span style="font-family: &amp;quot;;"&gt; &lt;span style="font-family: courier new;"&gt;map.resources &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;calls in my app.  You might want to put it in your application too.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-6361919876224118066?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/E0GY0x2NkEU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/6361919876224118066" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/6361919876224118066" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/E0GY0x2NkEU/default-route.html" title="Default route..." /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/09/default-route.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-2959330607555680192</id><published>2009-07-11T22:58:00.001-04:00</published><updated>2009-09-28T16:02:08.945-04:00</updated><title type="text">Rails Fixtures and Seed Data</title><content type="html">One of the things that makes Ruby on Rails a great web framework is the quantity of tools available that are focused around the task of making web applications easy to build and encourage good software engineering practices.&lt;br /&gt;&lt;br /&gt;Rails makes it really easy to test by building in a testing framework. One aspect of this is what are called "fixtures", data described in CSV or YML formats that is loaded into the database for each round of testing.&amp;nbsp; Tests live at both the unit (model) and integration (controller) level. End to end tests that involve the view are traditionally run from an automated tool, such as Selenium or HPQC (ha). &lt;br /&gt;&lt;br /&gt;UPDATE ALERT... Rails 2.3.4 &lt;a href="http://lptf.blogspot.com/2009/09/seed-data-in-rails-234.html"&gt;has a nice, new way to do this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fixtures also make it easy to load seed data into the database.&amp;nbsp; You can do this with migrations, but it gets messy, especially if you use ActiveRecord to do it, and then you delete a model class sometime in the future, it forces you to do an edit of an old migration, which means you might as well roll them all up. I prefer:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;rake db:fixtures:load&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-family: inherit;"&gt;Which runs:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;namespace :fixtures do&lt;br /&gt;    desc "Load fixtures into the current environment's database.  Load specific fixtures using FIXTURES=x,y"&lt;br /&gt;    task :load =&amp;gt; :environment do&lt;br /&gt;      require 'active_record/fixtures'&lt;br /&gt;      ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)&lt;br /&gt;      (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'test', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|&lt;br /&gt;        Fixtures.create_fixtures('test/fixtures', File.basename(fixture_file, '.*'))&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: inherit;"&gt;This will load all of your test data into the development database (or production, if that's what your RAILS_ENV is set to).&amp;nbsp; Jeffrey Allan Hardy documented &lt;a href="http://quotedprintable.com/2007/11/16/seed-data-in-rails"&gt;this&lt;/a&gt; pretty well, and added a separate rake task that will do this from a separate directory from your test fixtures, which is a great idea. It goes like:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code class="ruby"&gt;namespace :db do&lt;br /&gt;  desc "Load seed fixtures (from db/fixtures) into the current environment's database." &lt;br /&gt;  task :seed =&amp;gt; :environment do&lt;br /&gt;    require 'active_record/fixtures'&lt;br /&gt;    Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each do |file|&lt;br /&gt;      Fixtures.create_fixtures('db/fixtures', File.basename(file, '.*'))&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;/code&gt;&lt;/pre&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;br /&gt;It's pretty easy and keeps this stuff out of the migrations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-2959330607555680192?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/M_JxlMqw_7o" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/2959330607555680192" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/2959330607555680192" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/M_JxlMqw_7o/rails-fixtures-and-seed-data.html" title="Rails Fixtures and Seed Data" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/07/rails-fixtures-and-seed-data.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-5671687152095004870</id><published>2009-06-02T23:26:00.000-04:00</published><updated>2009-06-02T23:26:02.039-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="rhetoric" /><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><title type="text">Thank You for Agreeing</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SiXg2b1ucxI/AAAAAAAAARs/GJh_EE8UlcM/s1600-h/thank+you+for+arguing.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SiXg2b1ucxI/AAAAAAAAARs/GJh_EE8UlcM/s320/thank+you+for+arguing.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;I've been reading "Thank You for Arguing" tonight, thanks to a tip from the excellent time sink known as &lt;a href="http://news.ycombinator.com/"&gt;Hacker News&lt;/a&gt;&amp;nbsp;. &amp;nbsp;The first page of the introduction has a pretty telling tip.&lt;br /&gt;&lt;br /&gt;"Try this in a meeting: Answer someone who expresses doubt over idea with, 'Okay, let's tweak it.' Now focus the argument on revising your idea as if the group had already accepted it. This move is a form of concession- rhetorical jujitsu that uses your opponent's move to your advantage."&lt;br /&gt;&lt;br /&gt;Heinrichs gets to some much deeper points as well. One key thing to focus on is getting the outcome you want from the discussion, and not on scoring points to "win" the argument.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SiXjT72s5gI/AAAAAAAAAR0/R2RzvKbYVdM/s1600-h/mt-logo.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SiXjT72s5gI/AAAAAAAAAR0/R2RzvKbYVdM/s320/mt-logo.gif" /&gt;&lt;/a&gt;I wanted to draw a tenuous connection here, between these rhetorical skills, to which Heinrichs gives a fabulous introduction, and the listening, or "receiving" skills that the &lt;a href="http://www.manager-tools.com/"&gt;Manager Tools&lt;/a&gt; guys have &lt;a href="http://www.manager-tools.com/2008/06/how-to-coach-directs-on-interpersonal-skills-part-2"&gt;focused on&lt;/a&gt;&amp;nbsp;. &amp;nbsp;They put communication skills at the foundation of developing interpersonal skills, and they put listening skills at the foundation of communication. &amp;nbsp;In their characteristic way, Horstmann and Auzenne give some concrete examples of specific, measurable behaviors that we can use to evaluate and improve our communications, by strengthening the feeling in the person we are communicating with that we understand them. &lt;br /&gt;&lt;br /&gt;One of the items on their list of things to measure is using "Thank You" to begin a reply. &amp;nbsp;(I said it was a tenuous connection.) Other things they recommend include "No interruptions", "Agreeing without qualification", "No buts or howevers", and my personal favorite, "smiling". By making simple gestures like this, the person that you are communicating with is shown that you respect them as a person. &amp;nbsp;If we cut someone off, we are going to have a much harder time persuading them of anything, because they are likely to think that we don't understand their argument and they are also probably not going to like us very much.&lt;br /&gt;&lt;br /&gt;What makes this even more challenging, is that in many situations, the person that you are doing a poor job of listening to is not going to know exactly what it is you are doing that they don't like, but they are just going to think you are disagreeable or contrary. &amp;nbsp;You may end up getting negative feedback from managers that doesn't make sense- vague comments on how you are perceived. &amp;nbsp;This is where I like to tie in things like the Manager Tools material to figure out what good feedback for those situations would look like. Respect for people is a key aspect of successful systems, such as the &lt;a href="http://www.toyotatr.com/eng/toyotaway.asp"&gt;Toyota Way&lt;/a&gt;. &amp;nbsp;However, it is also key in being persuasive. To really change someone's mind to what we think is an amazing thing. It means teaming up and getting on the same side.&lt;br /&gt;&lt;br /&gt;"Thank You for Arguing" is filled with little gems that you can use to show respect to others, by offering them a choice, instead of negating what they say directly. Simple phrases like, "On the other hand, it could be that..." create an option for the listener, instead of putting them in a box. It offers them the opportunity to admit that they aren't 100% sure about their view. &amp;nbsp;Moving the argument into the future tense also affords the chance to remove some of the contentiousness about any concerns, while defining the issue in a way that makes your point clear. &lt;br /&gt;&lt;br /&gt;Rather than despise rhetoric for muddying the waters of rational debate, we should use it as a tool to achieve our goals, as long as we can keep it in a framework of respect for others- by combining it with the listening/receiving skills that are the foundation of communication.&lt;br /&gt;&lt;br /&gt;Other good books on similar subjects are "Influence" and "Yes!" by Cialdini, "Difficult Conversations" and "Getting to Yes" out of the Harvard Negotiation Project that was led by Fisher the last I looked into it, "Never Eat Alone" by Ferazzi, and the classic "How to Win Friends and Influence People" by Dale Carnegie. My wife read the last on her Kindle recently, and the chapter on married couples is well worth it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-5671687152095004870?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/yuFJ-AETB9A" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/5671687152095004870" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/5671687152095004870" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/yuFJ-AETB9A/thank-you-for-agreeing.html" title="Thank You for Agreeing" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SiXg2b1ucxI/AAAAAAAAARs/GJh_EE8UlcM/s72-c/thank+you+for+arguing.jpg" height="72" width="72" /><feedburner:origLink>http://lptf.blogspot.com/2009/06/thank-you-for-agreeing.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-4708082317523426133</id><published>2009-06-01T10:23:00.001-04:00</published><updated>2009-06-01T10:28:10.231-04:00</updated><title type="text">Passionate Programmer</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_i3E7tAYvk0Y/SiPkIM7KCMI/AAAAAAAAARk/szgNA0RRNjA/s1600-h/iloveprogrammers.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_i3E7tAYvk0Y/SiPkIM7KCMI/AAAAAAAAARk/szgNA0RRNjA/s200/iloveprogrammers.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Chad Fowler's &lt;a href="http://www.amazon.com/Passionate-Programmer-Creating-Remarkable-Development/dp/1934356344"&gt;The Passionate Programmer&lt;/a&gt; is a rewrite of &lt;a href="http://www.amazon.com/Job-Went-India-Pragmatic-Programmers/dp/0976694018"&gt;his earlier book&lt;/a&gt; on how to improve your career in software development, not a guide to finding love using Ruby scripts to mine craigslist. I read it anyway.&lt;br /&gt;&lt;br /&gt;Today I'd like to take a quick look at #21, "The Daily Hit". The concept is to, each day, "have some kind of outstanding accomplishment to report to [your] manager, some idea [you] had thought of or implemented that would make [your] department better."&lt;br /&gt;&lt;br /&gt;There are a couple of interesting aspects to this. First, is it forces you to break work down into small enough chunks that you can get something done in a day.  The second is that improvement part. Thinking of, and implementing, small improvements every day is closely related to a Lean concept called &lt;a href="http://en.wikipedia.org/wiki/Kaizen"&gt;Kaizen&lt;/a&gt;. The third is that reporting and tracking these things really helps demonstrate your value to the organization.  While it seems annoying, and perhaps a bit like boasting, to have to market yourself to your boss or customer or whomever, it actually creates a more positive relationship, because it forces communication about positive subjects.  Having at least one of these ready for a meeting like a Daily Scrum is a good idea- it can even set the tone of accomplishment.&lt;br /&gt;&lt;br /&gt;Keeping it positive is really important. A ratio of nine positive to one negative feedback item is what the Manager Tools guys recommend. A key aspect of making Lean work is that it is not about blame. It is about admitting that things are never perfect, or even if they are, the context will change and make them imperfect.  We face a lot of people challenges in the world of work. There are constant machinations of status and power, siphoning off of high profile work and dumping of boring work.  We can't let this prevent us from doing good things. We need to make the assumption that there are more good people in the environment than bad, and building up a network of allies by providing them with support when needed, while also marketing the fact that we are providing that support, will make sure that there is someone out there who has our back. Help people get better.&lt;br /&gt;&lt;br /&gt;So, get your daily hit. Communicate what your up to. Do it again tomorrow...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-4708082317523426133?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/mnt3PqgDKSs" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/4708082317523426133" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/4708082317523426133" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/mnt3PqgDKSs/passionate-programmer.html" title="Passionate Programmer" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_i3E7tAYvk0Y/SiPkIM7KCMI/AAAAAAAAARk/szgNA0RRNjA/s72-c/iloveprogrammers.jpg" height="72" width="72" /><feedburner:origLink>http://lptf.blogspot.com/2009/06/passionate-programmer.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-2005651943857767347</id><published>2009-03-22T23:06:00.000-04:00</published><updated>2009-03-22T23:06:26.011-04:00</updated><title type="text">Iteration Zero</title><content type="html">Iteration Zero is the term used when a team that is attempting to do incremental development does not plan on developing any working software in their first increment.&amp;nbsp; Notice the distinction here between iteration and increment- iterative development implies delivering the same thing over and over again to get it closer to being right (as opposed to "right the first time"), incremental development is delivering something in pieces (as opposed to "all at once").&amp;nbsp; When you get involved with the beast called "Agile", there are a lot more people in favor of incremental development than iterative development. So, in a lot of cases we are talking about Increment Zero, rather than Iteration Zero.&lt;br /&gt;&lt;br /&gt;That whole "not delivering any working software" thing makes Iteration Zero seem inherently non-Agile. On the other hand, if you have team without computers or similar issues, it's hard to sign up for any business value. So what do you do in Iteration Zero? &lt;a href="http://agilesoftwaredevelopment.com/blog/cspag/iteration-zero-good-idea"&gt;Peter Schuh&lt;/a&gt; seems to view it as a project inception phase, but then other people want to set out additional time before Iteration Zero to do all of that work.&amp;nbsp; The Energized Work people seem to do &lt;a href="http://www.think-box.co.uk/blog/2006/06/iteration-zero.html"&gt;tons of things &lt;/a&gt;in their Interation Zero.&amp;nbsp; Earl Beede sees it as an &lt;a href="http://forums.construx.com/blogs/earl/archive/2009/03/03/watching-agile-grow-up.aspx"&gt;admission of the failure of the original Agile principles&lt;/a&gt;.&amp;nbsp; I would say it is more along the lines of giving in to no progress. &lt;br /&gt;&lt;br /&gt;The real deal is that you have to set low goals for your first increment- plan on a zero velocity until you get something done. A co-worker of mine once made the remark that our organization at the time was "incapable of releasing a Hello World HTML page to the production environment."&amp;nbsp; I think a customized "Hello, World" is a good increment one goal- put up an HTML user interface sketch. You might get some valuable feedback, such as, "we didn't want a web app".&amp;nbsp; A lot of the prep work I see really doesn't take advantage of Real Options theory or You Aren't Gonna Need It. On the other hand, you do need to get started on something, you might just have to accept that not much will get done.&lt;br /&gt;&lt;br /&gt;Iteration Zero seems to be a slippery slope. Particularly if you let it take months, at that point you are sliding down the slope really fast.&amp;nbsp; I haven't really seen it used effectively, but that doesn't mean it can't be. I am always looking for data to change my mind.&lt;br /&gt;&lt;br /&gt;To sum it up, my current recommendation is don't start with Iteration Zero, start with Velocity Zero.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-2005651943857767347?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/4O2oKi2zGCo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/2005651943857767347" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/2005651943857767347" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/4O2oKi2zGCo/iteration-zero.html" title="Iteration Zero" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/03/iteration-zero.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-8388674803586222434</id><published>2009-03-21T15:54:00.000-04:00</published><updated>2009-03-21T15:54:03.771-04:00</updated><title type="text">Google Voice</title><content type="html">I just upgraded from Grand Central to &lt;a href="https://www.google.com/voice"&gt;Google Voice&lt;/a&gt;.&amp;nbsp; I have been waiting for this transcription feature forever- I'd been using PhoneTag, but it wasn't quite the same. I don't want anyone to call my cell directly again!&amp;nbsp; I have a feeling this is going to be an extremely popular service- it really puts the receiver back in charge of voicemail.&amp;nbsp; Often I'd feel my time was being hijacked by people leaving inefficient messages. Text wins.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-8388674803586222434?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/85X-HqVN0yc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/8388674803586222434" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/8388674803586222434" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/85X-HqVN0yc/google-voice.html" title="Google Voice" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/03/google-voice.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-7163273916755025710</id><published>2009-03-17T15:03:00.000-04:00</published><updated>2009-03-17T15:03:03.743-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="data integration" /><title type="text">Data Integration, Propagate Deletes</title><content type="html">Enterprise Data Integration is challenging subject. Many of my customers have problems of the sort where they have pieces of information that are being collected by disparate systems. I try to push things towards simplicity, but there are many angles by which complexity sneaks in.&lt;br /&gt;&lt;br /&gt;Think about something like Google Reader. Publish/subscribe works simply and well for this sort of content aggregation. However, the behavior of the client is not guaranteed. For example, what happens if I want to delete an entry? Or update an entry? Google Reader simply doesn't care if the publisher wants to delete an entry. It's already copied it into your data. Having an entry go missing from a data feed doesn't necessarily indicate an intention that a downstream deletion should occur.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Can a simple approach work for data integration? Perhaps, but there are a lot of tricky issues to work around.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-7163273916755025710?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/A5-51jtXMCc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/7163273916755025710" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/7163273916755025710" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/A5-51jtXMCc/data-integration-propagate-deletes.html" title="Data Integration, Propagate Deletes" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/03/data-integration-propagate-deletes.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-7305885615219310735</id><published>2009-02-19T16:34:00.000-05:00</published><updated>2009-02-19T16:34:00.910-05:00</updated><title type="text">Highlights</title><content type="html">&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Every time I find code that is already written for me, and written better than I would have done it. I remember why I love Ruby on Rails. &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;%= highlight(@trees, "tree") %&amp;gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;I think that I shall never see&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;A poem lovely as a &lt;strong class="highlight"&gt;&lt;span style="background-color: yellow;"&gt;tree&lt;/span&gt;&lt;/strong&gt;.&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;A &lt;strong class="highlight"&gt;&lt;span style="background-color: yellow;"&gt;tree&lt;/span&gt;&lt;/strong&gt; whose hungry mouth is prest&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;Against the sweet earth’s flowing breast;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The new edition, out March 15th, 2009.&lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/1934356166?ie=UTF8&amp;tag=letspushthing-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=1934356166"&gt;Agile Web Development with Rails, Third Edition&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=letspushthing-20&amp;l=as2&amp;o=1&amp;a=1934356166" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-7305885615219310735?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/S5bAaYaH80E" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/7305885615219310735" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/7305885615219310735" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/S5bAaYaH80E/highlights.html" title="Highlights" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2009/02/highlights.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-3789570080903027625</id><published>2009-02-13T17:52:00.001-05:00</published><updated>2009-02-14T08:13:58.108-05:00</updated><title type="text">Keeping an eye on what I am doing</title><content type="html">&lt;a href="http://4.bp.blogspot.com/_i3E7tAYvk0Y/SZX5ndSLtRI/AAAAAAAAARQ/AifTWyNHkfo/s1600-h/Hipster_PDA_partsouneedneed.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_i3E7tAYvk0Y/SZX5ndSLtRI/AAAAAAAAARQ/AifTWyNHkfo/s320/Hipster_PDA_partsouneedneed.jpg" /&gt;&lt;/a&gt;I like David Seah's idea of a "&lt;a href="http://davidseah.com/blog/the-printable-ceo-iv-task-order-up/"&gt;Task Order Up&lt;/a&gt;". My current implementation is pushing that together with the &lt;a href="http://www.43folders.com/2004/09/03/introducing-the-hipster-pda"&gt;hipster PDA&lt;/a&gt; (binder clip and 3x5 cards), using sticky 3x5 notes to put my current objective/task on my monitor, so I can get back on track when I inevitably get off of it. It has a &lt;a href="http://en.wiktionary.org/wiki/yak_shaving"&gt;yak shaving&lt;/a&gt; aspect as well, where if I hit a blocker like "have to update version of solr" before I can accomplish the next task, I push the update solr task on top of the task (or stack of tasks) it is blocking. Then, when I finish the solr task, I pop it off, and there was thing it was blocking underneath.(&lt;a href="http://en.wikipedia.org/wiki/LIFO_%28computing%29"&gt;LIFO&lt;/a&gt; approach)&amp;nbsp; What makes it better than a computery way of doing this is that the index card is always visible, not buried behind other windows. I guess it would be good as a sidebar app, if I could give up that screen real estate.&lt;br /&gt;&lt;br /&gt;Seems to be working so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-3789570080903027625?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/to07dxOruYY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/3789570080903027625" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/3789570080903027625" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/to07dxOruYY/keeping-eye-on-what-i-am-doing.html" title="Keeping an eye on what I am doing" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_i3E7tAYvk0Y/SZX5ndSLtRI/AAAAAAAAARQ/AifTWyNHkfo/s72-c/Hipster_PDA_partsouneedneed.jpg" height="72" width="72" /><feedburner:origLink>http://lptf.blogspot.com/2009/02/keeping-eye-on-what-i-am-doing.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-4394903089064267160</id><published>2009-01-21T09:58:00.001-05:00</published><updated>2009-01-21T10:14:19.393-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="innovation" /><title type="text">Here Comes Somebody</title><content type="html">I finally read Clay Shirky's &lt;a href="http://www.amazon.com/gp/product/1594201536?ie=UTF8&amp;amp;tag=letspushthing-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1594201536"&gt;Here Comes Everybody: The Power of Organizing Without Organizations&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=letspushthing-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1594201536" style="border: medium none ! important; margin: 0px ! important;" width="1" /&gt;.  It's a good book, not a great book. I think the problem with reading a book like that 11 months after it was released is that most of the ideas have already been absorbed into my consciousness. It's a much better book for someone without my vast wealth of experience using social tools. What Shirky does is establish a framework for understanding how the various tools fit together to produce a network of communication that changes the dynamics of who can be a journalist, or a software developer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SXc6djtb5TI/AAAAAAAAAQ4/AABS4THe6Pc/s1600-h/here+comes+everybody.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SXc6djtb5TI/AAAAAAAAAQ4/AABS4THe6Pc/s320/here+comes+everybody.JPG" /&gt;&lt;/a&gt;Shirky also gets deep into how this changes the dynamics of organizations.&amp;nbsp; There is a very readable economics/management paper by Coase from 1937 (for which he won the Noble in 1991) called the &lt;a href="http://en.wikipedia.org/wiki/The_Nature_of_the_Firm"&gt;Nature of the Firm&lt;/a&gt;. In there he examines the costs of contracting for services versus hiring, which is really why the firms exist in the first place.&amp;nbsp; The technologies of the Internet seem to be changing those costs, and people that know how to take advantage of that can build better firms.&lt;br /&gt;&lt;br /&gt;I think there is a unique intersection of trends happening right now, right in front of us that makes this a time of opportunity.  It is a time when a many of the traditional solutions to problems are too slow, too expensive, and too static.  It's a great time to have nothing, because you're not that far behind. It's a great time for open source. It's a great time to start something new.  &lt;a href="http://www.youtube.com/watch?v=hS65n6sz0xo"&gt;I am ready&lt;/a&gt;. Are you? Here we come.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-4394903089064267160?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/uxsaasJ-_2M" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/4394903089064267160" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/4394903089064267160" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/uxsaasJ-_2M/here-comes-somebody.html" title="Here Comes Somebody" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SXc6djtb5TI/AAAAAAAAAQ4/AABS4THe6Pc/s72-c/here+comes+everybody.JPG" height="72" width="72" /><feedburner:origLink>http://lptf.blogspot.com/2009/01/here-comes-somebody.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-5454595989197513353</id><published>2008-12-09T21:43:00.001-05:00</published><updated>2008-12-09T22:07:38.473-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jruby" /><category scheme="http://www.blogger.com/atom/ns#" term="ajax" /><category scheme="http://www.blogger.com/atom/ns#" term="apache" /><category scheme="http://www.blogger.com/atom/ns#" term="tomcat" /><title type="text">I hate it when my friends let me down</title><content type="html">My good friends let me down today. They wasted my time with their silly problems.  I really like Apache and Firefox and Ajax...but they had some obscure issues today that are causing me to break commitments.  It took some seriously Google searching to uncover the root cause.&lt;br /&gt;&lt;br /&gt;I was trying to make an Ajax request (using Prototype and link_to_remote) from Firefox to a JRuby on Rails application running in Tomcat over an https connection proxied by Apache Web Server. That's a lot of pieces that could go wrong.  I was getting &lt;i&gt;page not found &lt;/i&gt;in my poor little div. The link was being generated correctly and I could navigate to it.&lt;br /&gt;&lt;br /&gt;Everything worked fine on my box. Of course, the problem was on the real server. Which is still in dev mode and hasn't been opened up so that I can connect to it from my desktop. Which means I have to open an X session to the server over ssh to launch a browser. Which doesn't have Firebug.  Double check everything else. Have to find Firebug and get into the back end network...time passes...&lt;br /&gt;&lt;br /&gt;Firebug said it was a 403.&lt;br /&gt;&lt;br /&gt;It turns out Firefox doesn't pass the content-length header on POST requests. It turns out the sysadmin had typed the innocent looking phrase &lt;i&gt;SecFilterEngine On &lt;/i&gt;into the Apache config. This causes Apache to reject requests without a content length header on POST requests. So secure I can't connect. I guess Firefox should send that header, but should Apache really demand it? Now I have a hell of a lot of working around this to do. To the casual observer / tester / customer - it's a bug, a defect, something wrong with my code. I should, and I wish I could, have a dev environment that even remotely resembled production.  Amazing waste of a day. What's going to happen tomorrow?&lt;br /&gt;&lt;br /&gt;Details &lt;a href="http://groups.google.com/group/mozilla.dev.ajax/browse_thread/thread/3b3d02927ec15c7e"&gt;here&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-5454595989197513353?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/-OHqvaciS94" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/5454595989197513353" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/5454595989197513353" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/-OHqvaciS94/i-hate-it-when-my-friends-let-me-down.html" title="I hate it when my friends let me down" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2008/12/i-hate-it-when-my-friends-let-me-down.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-487747456817191831</id><published>2008-09-23T23:53:00.001-04:00</published><updated>2008-09-24T00:01:49.859-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title type="text">Rolling Restarts, Migrations, and Deployments</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SNm7oRaNGzI/AAAAAAAAALs/IyLHwKxb31U/s1600-h/rails.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SNm7oRaNGzI/AAAAAAAAALs/IyLHwKxb31U/s320/rails.png" alt="" id="BLOGGER_PHOTO_ID_5249433141219498802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="post-text"&gt;I was looking into&lt;a href="http://stackoverflow.com/questions/124250/how-to-do-a-rolling-restart-of-a-cluster-of-mongrels#125321"&gt; a question&lt;/a&gt; on &lt;a href="http://stackoverflow.com/"&gt;stack&lt;b&gt;overflow&lt;/b&gt;&lt;/a&gt; (sweet site!) and it brought to mind the awesomeness and challenges of dealing with restarting a load balanced array of servers. The awesome part is you can do a deployment with any downtime by taking down a server, updating it, bringing it back up, and moving on to the next one.  One issue with this is that you end up having multiple versions of the code live simultaneously.   This can get a little weird if a user hits a new view page then the request ends up being loadbalanced to a server that isn't up to date yet.&lt;br /&gt;&lt;br /&gt;The solution we came up with (before we heard about &lt;a href="http://www.rubyinside.com/seesaw-an-improved-restart-system-for-mongrel-589.html"&gt;SeeSaw&lt;/a&gt;) was to take half of the mongrels off line from the load balancer. Shut them down. Update them. Start them up. Put those mongrels back online in the load balancer and take the other half off. Shut the second half down. Update the second half. Start them up. This greatly minimizes the time where you have two different versions of the application running simultaneously. I wrote a windows bat file to do this. (Deploying on Windows is not recommended, btw)&lt;br /&gt;&lt;br /&gt;A truly awesome solution to this would be a load balancer that is somehow aware of the version level of the balanced set and just makes the switch for you.  Until that is invented, Apache mod_proxy_balancer is easy enough to control remotely.&lt;br /&gt;&lt;br /&gt;It is very important to note that having database migrations can make the whole approach a little dangerous. If you have only additive migrations, you can run those at any time before the deployment. If you are removing columns, you need to do it after the deployment. If you are renaming columns, it is better to split it into a create a new column and copy data into it migration to run before deployment and a separate script to remove the old column after deployment. In fact, it may be dangerous to use your regular migrations on a production database in general if you don't make a specific effort to organize them. All of this points to making more frequent deliveries so each update is lower risk and less complex, but that's a subject for another response. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-487747456817191831?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/_Spr0cfi4Bk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/487747456817191831" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/487747456817191831" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/_Spr0cfi4Bk/rolling-restarts-migrations-and.html" title="Rolling Restarts, Migrations, and Deployments" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SNm7oRaNGzI/AAAAAAAAALs/IyLHwKxb31U/s72-c/rails.png" height="72" width="72" /><feedburner:origLink>http://lptf.blogspot.com/2008/09/rolling-restarts-migrations-and.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-6040875987166089552</id><published>2008-09-23T00:24:00.000-04:00</published><updated>2008-09-23T00:46:17.449-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="zero defects" /><title type="text">What's a defect? What's a missing feature?</title><content type="html">I was reading this about a nice idea some bloke had about &lt;a href="http://agiletips.blogspot.com/2008/09/whose-fault-is-it.html"&gt;developers fixing bugs in their spare time&lt;/a&gt;. Most of the serious developers I know are already working in their spare time- let's not make all defects their problem too. &lt;br /&gt;&lt;br /&gt;Many software testers cause great frustration among software developers.&amp;nbsp; One of the biggest issues that arises on agile projects is that testers have a hard time distinguishing between defects and features that have not yet been implemented.&lt;br /&gt;&lt;br /&gt;It's always a bit of a challenge to deal with bugs- even outside of agile.&amp;nbsp; What to some people is an obvious bug is a feature that was never requested to someone else. &lt;br /&gt;&lt;br /&gt;For example, I was called into a meeting today where a bug that had been discovered during a user demo. The search was not "not finding telephone numbers in documents". The search term entered was 5551212. Some documents contained 555 1212. Some contained 555-1212. Some contained 1(703)555-1212. &lt;br /&gt;&lt;br /&gt;They tried 555*1212, still not working. Search is broken. Developer suggests- try "555 1212", magic happens. * matches any character, not word boundaries...&lt;br /&gt;&lt;br /&gt;It was an obvious problem...to the developers who understood that searching for "breakup" was not going to match documents containing "break up".&amp;nbsp; With text, it's obvious, but I can certainly see where people might not see the issue with phone numbers.&lt;br /&gt;&lt;br /&gt;We'll add normalized versions of phone numbers into the search index and we'll normalize search terms that look like phone numbers or something like that, but...this is not an insignificant effort. (Even though there is some decent code out there to handle it.) There are trade-offs in performance that have to be considered.&amp;nbsp; Ask a tester though- they'll say found a bug; it's their job, and they want to be able to show how good they are at finding them.&amp;nbsp; If it's a bug, we can't even mark our existing search work as complete.&amp;nbsp; If it's a missing feature, we have to allocate it to the next release.&amp;nbsp;  Fortunately, a tester didn't find this one, so we don't quite have that problem, but the users do want the feature of being able to match many different formats of phone numbers. &lt;br /&gt;&lt;br /&gt;It seems like a simple semantic difference, and it seems like developers are being too sensitive, but it's actually a big deal.&amp;nbsp; Some "bugs" might actually end up costing a huge amount of money and not be worth fixing- particularly if they aren't really bugs.&amp;nbsp; I have seen teams show excessive deference to testers and spend a time equal to the time spent working on the basic features to handle some edge cases that would never really occur and were better handled by error messages than by trying to do something useful. Meanwhile, the project sponsor is seldom asked to decide whether a bug should be fixed- few are even estimated as to the cost.&lt;br /&gt;&lt;br /&gt;I say- if you want to fix a bug, you have to pay up. If you are really smart, you do do the five whys and find the root cause, but if it happens to be something that it never occured to anyone to ask for, try not to ask the developers to take care of it on their own time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-6040875987166089552?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/HnhJ59H-7_4" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/6040875987166089552" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/6040875987166089552" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/HnhJ59H-7_4/whats-defect-whats-missing-feature.html" title="What's a defect? What's a missing feature?" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2008/09/whats-defect-whats-missing-feature.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-9059858369094222717</id><published>2008-09-16T09:01:00.001-04:00</published><updated>2008-09-16T09:12:40.142-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><title type="text">Reading about Hadoop</title><content type="html">Tom White's book on Hadoop is up on Rough Cuts. If you aren't familiar with Apache Hadoop, it's Doug Cutting's effort to go beyond Lucene and build an open source implementation of much of the other Google infrastructure.&lt;br /&gt;&lt;br /&gt;There is a two day &lt;a href="http://us.apachecon.com/c/acus2008/schedule/hadoop-camp"&gt;Hadoop Camp&lt;/a&gt; at the upcoming ApacheCon in New Orleans. Learning about Hadoop is a great way to become familiar with some of the innovations that Google has put forward in the last few years- and to see the technology behind Yahoo's big set of nodes.  What follows is the beginning of Mr. White's book, I am looking forward to the chapter on HBase.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Hadoop was created by Doug Cutting, the creator of Lucene, the widely-used text search library. Hadoop has its origins in Nutch, an open source web search engine, itself a part of the Lucene project.&lt;br /&gt;&lt;br /&gt;Building a web search engine from scratch was an ambitious goal, for not only is the software required to crawl and index websites complex to write, it is also a challenge to run without a dedicated operations team — there are lots of moving parts. It's expensive too — Cutting and Cafarella estimated a system supporting a 1-billion-page index would cost around half a million dollars in hardware, with a $30,00 monthly running cost. Nevertheless, they believed it was a worthy goal, as it would open up and ultimately democratise search engine algorithms.&lt;br /&gt;&lt;br /&gt;Nutch was started in 2002, and a working crawler and search system quickly emerged. However, they realized that their architecture wouldn't scale to the billions of pages on the web. Help was at hand with the publication of "The Google File System" (GFS) [ref] in 2003. This paper described the architecture of Google's distributed filesystem that was being used in production at Google. GFS, or something like it, would solve their storage needs for the very large files generated as a part of the web crawl and indexing process. In particular, GFS would free up time being spent on administrative tasks such as managing storage nodes. In 2004 they set about writing an open source implementation, the Nutch Distributed File System (NDFS) as it became to be known.&lt;br /&gt;&lt;br /&gt;NDFS and the MapReduce implementation in Nutch were applicable beyond the realm of search, and in February 2006 they moved out of Nutch to form an independent subproject of Lucene called Hadoop. Yahoo! hired Doug Cutting and, with a dedicated team, provided the resources to turn Hadoop a system that ran at web scale. This was demonstrated in February 2008 when Yahoo! announced that their production search index was being generated by a 10,000 core Hadoop cluster.&lt;br /&gt;&lt;br /&gt;Earlier, in January 2008, Hadoop was made a top-level project at Apache, confirming its success and dynamic community."&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-9059858369094222717?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/5s9sntkeEfI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/9059858369094222717" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/9059858369094222717" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/5s9sntkeEfI/reading-about-hadoop.html" title="Reading about Hadoop" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><feedburner:origLink>http://lptf.blogspot.com/2008/09/reading-about-hadoop.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-8372094288725693859</id><published>2008-09-02T10:38:00.001-04:00</published><updated>2008-09-02T10:49:34.495-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="blogging" /><title type="text">Another day, another blog</title><content type="html">I'm also now infrequently blogging at &lt;a href="http://process.lmnsolutions.com/"&gt;Collision of Influences&lt;/a&gt;, my company blog, to add to my infrequent posting here on more arcane topics of interest to nearly 43 people!&amp;nbsp; Topics over there are going to be a little different, I just haven't figured out how yet.&amp;nbsp; I'll let it develop as is its wont.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-8372094288725693859?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/3E-0uMWfPag" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/8372094288725693859/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=15324911&amp;postID=8372094288725693859" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/8372094288725693859" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/8372094288725693859" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/3E-0uMWfPag/another-day-another-blog.html" title="Another day, another blog" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://lptf.blogspot.com/2008/09/another-day-another-blog.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-6759145116218023667</id><published>2008-08-08T21:18:00.000-04:00</published><updated>2008-08-08T21:24:47.415-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gis" /><category scheme="http://www.blogger.com/atom/ns#" term="google earth" /><category scheme="http://www.blogger.com/atom/ns#" term="kml" /><title type="text">The KML Handbook</title><content type="html">&lt;a href="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SJzxjJeXwpI/AAAAAAAAAJk/5g2HZJBpFNY/s1600-h/kml_roughcut.jpg" imageanchor="1" style="border: 0pt none ; background-color: transparent; clear: left; margin-bottom: 1em; float: left; margin-right: 1em;"&gt;&lt;img src="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SJzxjJeXwpI/AAAAAAAAAJk/aKGhSO2sVls/s320-R/kml_roughcut.jpg" style="border: 0pt none ;" /&gt;&lt;/a&gt;I just noticed the "&lt;a href="http://safari.oreilly.com/9780321574404"&gt;The KML Handbook: &lt;/a&gt;&lt;span class="b"&gt;Geographic Visualization for the Web&lt;/span&gt;" by Josie Wernecke is out on Safari Rough Cuts. It looks like it has some interesting tips, not really a programming book per se, more of an expanded version of Google's documentation.&amp;nbsp; The subtitle is interesting to me- "for the Web".&amp;nbsp; A couple of years ago it would have just been for Google Earth, but KML is on its way to becoming the new shapefile.&amp;nbsp; Next I want JSON.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-6759145116218023667?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/IhoBJJhHGco" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/6759145116218023667/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=15324911&amp;postID=6759145116218023667" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/6759145116218023667" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/6759145116218023667" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/IhoBJJhHGco/kml-handbook.html" title="The KML Handbook" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SJzxjJeXwpI/AAAAAAAAAJk/aKGhSO2sVls/s72-Rc/kml_roughcut.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://lptf.blogspot.com/2008/08/kml-handbook.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-3841721583501198395</id><published>2008-08-06T22:52:00.003-04:00</published><updated>2008-08-06T23:11:20.458-04:00</updated><title type="text">SpatialKey - Flash Mapping...</title><content type="html">&lt;div class="separator" style="text-align: center; float: right;"&gt;&lt;a href="http://1.bp.blogspot.com/_i3E7tAYvk0Y/SJpkwEHwOvI/AAAAAAAAAJc/FmGFUxOR5ls/s1600-h/comparison_attacksM.jpg" imageanchor="1" style="border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://1.bp.blogspot.com/_i3E7tAYvk0Y/SJpkwEHwOvI/AAAAAAAAAJc/V1oHbjdCPc4/s400-R/comparison_attacksM.jpg" style="border: 0pt none ;" /&gt;&lt;/a&gt;&lt;/div&gt;A colleague sent me a link to a beta Flash based mapping tool called &lt;a href="http://www.spatialkey.com/"&gt;SpatialKey&lt;/a&gt; from &lt;a href="http://universalmind.com/"&gt;Universal Mind&lt;/a&gt;. It's pretty slick with timelines, heatmaps, animation, filters, and easy data loading from CSV.  They have an enterprise angle as well with a Java server side application.  It reminds me a little bit of the tools that could build something like &lt;a href="http://hindsight.trulia.com/"&gt;Trulia Hindsight &lt;/a&gt;or the &lt;a href="http://www.mysociety.org/2007/more-travel-maps/morehousing"&gt;London Transit slider maps&lt;/a&gt; which were built by &lt;a href="http://stamen.com/"&gt;Stamen&lt;/a&gt;.  Now if I could just find a way to create deep links into it...or is that called &lt;a href="http://www.adobe.com/products/flex/"&gt;Flex&lt;/a&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-3841721583501198395?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/txYjmYlm7kA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/3841721583501198395/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=15324911&amp;postID=3841721583501198395" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/3841721583501198395" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/3841721583501198395" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/txYjmYlm7kA/spatialkey-flash-mapping.html" title="SpatialKey - Flash Mapping..." /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_i3E7tAYvk0Y/SJpkwEHwOvI/AAAAAAAAAJc/V1oHbjdCPc4/s72-Rc/comparison_attacksM.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://lptf.blogspot.com/2008/08/spatialkey-flash-mapping.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-5088642692384114288</id><published>2008-07-31T23:33:00.003-04:00</published><updated>2008-12-11T06:38:10.082-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books" /><title type="text">Tribes...</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SJKMvv4vWvI/AAAAAAAAAJI/vYsw4fJl2LA/s1600-h/logo_tribes.gif"&gt;&lt;img style="float:right; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SJKMvv4vWvI/AAAAAAAAAJI/vYsw4fJl2LA/s320/logo_tribes.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5229396869266758386" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-family: trebuchet ms;"&gt;Seth Godin got me to join triiibes- his &lt;a href="http://sethgodin.typepad.com/seths_blog/2008/07/are-you-in-the.html"&gt;amazing scheme&lt;/a&gt; to get people to pre-order &lt;a href="http://www.amazon.com/gp/product/1591842336?ie=UTF8&amp;tag=letspushthing-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1591842336"&gt; his new book&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=letspushthing-20&amp;l=as2&amp;o=1&amp;a=1591842336" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; while simultaneously proving its premise. It didn't cost me that much, and it seems like a good experiment to be part of.  It had gotten up to number #5 on the Amazon top sellers list when I added it to my cart.  It's since dropped off now that the promotion is effectively over.&lt;br /&gt;&lt;br /&gt;I have been interested in the tribal dimensions of human behavior for a while.  Ray Immelman's &lt;a href="http://www.amazon.com/gp/product/0974036919?ie=UTF8&amp;tag=letspushthing-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0974036919"&gt;Great Boss Dead Boss&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=letspushthing-20&amp;l=as2&amp;o=1&amp;a=0974036919" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; is a thorough examination of this in a business novel format.  Still, Immelman's tribal attribute #1 is : "A strong tribe has a well defined common enemy". [I think there are probably a lot of people that laugh at business novels- people that like novels probably don't like business books, and people that like business books probably don't read as many novels, but it's something I seem to enjoy.] &lt;br /&gt;&lt;br /&gt;Another book a long the same lines, but with a completely different approach, is &lt;a href="http://www.amazon.com/gp/product/0375725350?ie=UTF8&amp;tag=letspushthing-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0375725350"&gt;Status Anxiety&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=letspushthing-20&amp;l=as2&amp;o=1&amp;a=0375725350" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; by Alain de Botton. It really drives home how many of our actions are driven by how we relate in terms of status to others. Reading everything de Botton has ever written is not a bad idea, either.&lt;br /&gt;&lt;br /&gt;I do have a slight anxiety of being part of the sucker tribe for joining up with this stuff...well, I guess the sucker tribe is not really a tribe as much as it is the people excluded from the non-sucker tribe.  Anyway, the book's pretty cheap, so it looks like the cost of briefly suspending my natural cynicism won't exceed $15.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-5088642692384114288?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/SGePG_BPYdQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/5088642692384114288/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=15324911&amp;postID=5088642692384114288" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/5088642692384114288" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/5088642692384114288" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/SGePG_BPYdQ/tribes.html" title="Tribes..." /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_i3E7tAYvk0Y/SJKMvv4vWvI/AAAAAAAAAJI/vYsw4fJl2LA/s72-c/logo_tribes.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://lptf.blogspot.com/2008/07/tribes.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-4648738429381043156</id><published>2008-07-17T23:51:00.003-04:00</published><updated>2008-12-11T06:38:10.466-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gis" /><category scheme="http://www.blogger.com/atom/ns#" term="jobs" /><title type="text">Job ad</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SIAWXbaD_JI/AAAAAAAAAJA/1Et6mqvB2og/s1600-h/1600_Tysons.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SIAWXbaD_JI/AAAAAAAAAJA/1Et6mqvB2og/s320/1600_Tysons.jpg" alt="" id="BLOGGER_PHOTO_ID_5224200159499648146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We need a few more "can do it all" types at our company. I struggle with how to list these positions, because not all of the skills are required, but we need a few specializing generalists or generalizing specialists or what have you.  I read "Hiring Technical People" (the book and the blog), but it's still not easy.  Anyway- we are still making our stock plan available to people hired in 2008, so if you know anyone that is looking...we've got a smart team. If anyone wants to point out obvious errors or inconsistencies in the technology laundry list, it would be greatly appreciated, as I don't know all of this stuff.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lmnsolutions.com/lmnjob365.html"&gt;GIS Integration Engineer&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Duties to include: Integration and testing of a cutting edge commercial imagery / video storage product into various types of commercial tools and custom government software. This includes integrating an encoder for various data types and integration of the viewers also. The work will involve working with customer site representatives to analyze and product the solutions to interface the software together. This could involve using the products c API, Scripting languages, WMS, Java or .Net wrappers. If you are a hard core geospatial person with minimal programming experience or a expert generalist programmer with a little geospatial experience and/or a solid math background, please apply.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;We are looking for people with some subset of these skills:&lt;br /&gt;GIS, Imagery analysis, c and c integration, Java, .Net, SQL and database programming, Python, Perl, Unix Shell Scripting, Windows and Unix Installation packages&lt;br /&gt;OGC standards (WMS, WCS, WFS), PCI Geomatica, ERDAS, ESRI, ITT, GDAL, OSSIM, RemoteView, Imagine, FalconView, SocetSet, Warp, Manipulation of commercial imagery, IKONOS, QuickBird, NTM, Aerial and Aerial Video feeds,file types such as GeoPDF, GeoTIFF, NITF, JPEG2000, pix, Shapefiles, MPEG and other video formats, NTM, Calculus or Trig, Orthorectification, Programmer on Unix variants and/or Windows&lt;br /&gt;&lt;/p&gt;Clearance: US Security Clearance Required (i.e., US Citizen only)&lt;br /&gt;&lt;br /&gt;Location: Sterling, VA, USA, 20164&lt;br /&gt;&lt;br /&gt;Compensation: Substantial!&lt;br /&gt;&lt;br /&gt;resumes to: jobs@lmnsolutions.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-4648738429381043156?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/eae6BxCbodY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/4648738429381043156/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=15324911&amp;postID=4648738429381043156" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/4648738429381043156" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/4648738429381043156" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/eae6BxCbodY/job-ad.html" title="Job ad" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_i3E7tAYvk0Y/SIAWXbaD_JI/AAAAAAAAAJA/1Et6mqvB2og/s72-c/1600_Tysons.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://lptf.blogspot.com/2008/07/job-ad.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-86168059263245463</id><published>2008-07-11T00:15:00.006-04:00</published><updated>2009-03-17T14:57:27.958-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title type="text">JRuby- The Element of Surprise</title><content type="html">&lt;a href="http://1.bp.blogspot.com/_i3E7tAYvk0Y/SHbfh8cBYyI/AAAAAAAAAI4/L_v6BEUOdUg/s1600-h/lcf_lv.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5221606592235004706" src="http://1.bp.blogspot.com/_i3E7tAYvk0Y/SHbfh8cBYyI/AAAAAAAAAI4/L_v6BEUOdUg/s320/lcf_lv.jpg" style="cursor: pointer; float: left; margin: 0pt 10px 10px 0pt;" /&gt;&lt;/a&gt;&lt;span style="font-family: trebuchet ms;"&gt;JRuby...I used to think, "meh, who needs Java? I'll stick with the c implementation."  Then I started working on a project investing millions of dollars in infrastructure to run Java web applications.  Sadly, I initially agreed with the assessment that it was a bit of a hack to run the Ruby on the JVM.  Thus I soldiered on, avoiding JSF and EJB, but getting sucked into many of the other indignities of the Java world.&amp;nbsp;  The opportunity arose to build a quick prototype for a different system. The desire to go the Rails route proved successful with a quick delivery and excellent customer feedback- but how would we ever deploy it? How would the proprietary Sun Single Sign On service work? Could it possibly connect to Access Manager- a feat that had taken weeks of development time in Java?  A couple of emails with Arun Gupta and Nick Sieger led me to some of the truly impressive work that has been going on. &lt;a href="http://caldersphere.rubyforge.org/warbler/"&gt;Warbler&lt;/a&gt; builds a war file out of your Rails app using jruby-rack.  Drop your .jar libraries in the rails lib dir. Muck with your web.xml so you can make it use a filter. Drop the .war file on your server.  Done. A little method called servlet_request is now magically available to you. Call servlet_request.getUserPrincipal : it's populated. It's not magic- it's JRuby!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;"&gt;It's really suprising how much faster things seem to get done. Now, I know that's sort of silly. People can work fast in any technology that they are good at.  In fact, I think the source of most of the disagreement in technology and product selection (which is a plague in the Java world, the GIS world, the database world, etc.) is that people want to use what they are best at because it allows them to shine. I ultimately only care about the end result.  I don't mind switching to some technology I know nothing about. It is harder for me to provide value, but I love nothing more than learning new things and evaluating them.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;"&gt; Anyway, that's why JRuby is even more awesome. Let them write Java. The JVM is a environment where we can all get aong.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-86168059263245463?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/TOrA-qFK-To" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/86168059263245463/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=15324911&amp;postID=86168059263245463" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/86168059263245463" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/86168059263245463" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/TOrA-qFK-To/jruby-element-of-surprise.html" title="JRuby- The Element of Surprise" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_i3E7tAYvk0Y/SHbfh8cBYyI/AAAAAAAAAI4/L_v6BEUOdUg/s72-c/lcf_lv.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://lptf.blogspot.com/2008/07/jruby-element-of-surprise.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-2619644013451410659</id><published>2008-06-21T12:42:00.003-04:00</published><updated>2008-06-21T13:02:23.427-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title type="text">Some fun agile observations</title><content type="html">1. I attended a proposal meeting yesterday. There was a guy there from &lt;a href="http://www.axispoint.com/"&gt;Axis Point&lt;/a&gt; explaining agile software development to some of the people there.  I was surprised that there are people nominally working in the IT industry that haven't ever heard of it, 7 years on from &lt;a href="http://martinfowler.com/articles/agileStory.html"&gt;Snowbird&lt;/a&gt;.  I am not surprised that many of the people who think they knew what Agile is have no idea whatsoever and just equate it with "going faster". &lt;br /&gt;&lt;br /&gt;2. I think proposing software concepts like Enterprise Service Catalogs seems decidedly un-agile.  No one really wants that crap.  Just publish, document, and version some HTTP APIs for your apps. 100% of real developers would take some sample code that uses your service API over a catalog. &lt;br /&gt;&lt;br /&gt;3. I was reading "&lt;a href="http://books.google.com/books?id=9v_sxqERqvMC"&gt;The Toyota Way&lt;/a&gt;" this morning. Just the foreword and the preface while my kid was at Lil' Kickers.  Some choice paraphrasing- Page xii: Embrace change. Page xv: None of the individual elements are special, but system as a whole is important. Success derives from balancing the role of people in an organizational culture that expects and values their continuous improvemnts, with a technical system focused on high value added flow. Did Kent Beck ever work there?&lt;br /&gt;&lt;br /&gt;4. I've been getting some flak from one of my business partners because I can't get agile implemented in any useful fashion on the current project that I am working on.  We're dealing with multiple several hundred page requirements documents that are written into the contract.  And they all suck. Agile has to start earlier- in the contracting phase, as Alistair Cockburn (pronounced "Coe-burn") &lt;a href="http://alistair.cockburn.us/index.php/Agile_contracts"&gt;pointed out&lt;/a&gt;.  Regardless, there is mandatory scrum training- we must be able to pretend that we are agile.&lt;br /&gt;&lt;br /&gt;5. As I recently twittered, my Wii Fit thinks I'm a "yoga master" but in reality I can't touch my toes (without bending my knees). I think there is a good analogy for agile there- I love it, I just don't live it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-2619644013451410659?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/GLkVMcuFI6A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/2619644013451410659/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=15324911&amp;postID=2619644013451410659" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/2619644013451410659" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/2619644013451410659" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/GLkVMcuFI6A/some-fun-agile-observations.html" title="Some fun agile observations" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://lptf.blogspot.com/2008/06/some-fun-agile-observations.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-15324911.post-5241370631284648276</id><published>2008-06-01T23:13:00.004-04:00</published><updated>2008-06-21T13:28:01.997-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI" /><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title type="text">What do computers want to do?</title><content type="html">I remember reading "What Computers (Still) Can't Do" by Hubert Dreyfus a long time ago. It was a sequel to his earlier book, unsurprisingly titled "What Computers Can't Do." (Well, it's unsurprising if you'd seen the sequel. I suppose the title might have been surprising initially. There is a huge difference between the two titles though. When I read the first title I think that maybe computers are never going to do these things.  Then, when you get to the sequel, you sort of feel that computers might not be able to do these things now, but then again, they used to not be able to do other stuff.  It's funny what a "still" does to the overall impact of the message. I suppose a pessimist could interpret that "still" as meaning- a lot of people though computers would be able to do things Dreyfuss said the couldn't through this or that mechanism, but now, they still can't. So maybe I'm wrong and the "still" is actually a stronger endorsement of his position. Still (hah), I think there is a world of difference between "I am right" and "I am (still) right.")&lt;br /&gt;&lt;br /&gt;What if there is a book someday called, "What Computers Won't Do"?  This of course would mean...that they want to do something. What would they want? When I was young I thought...power? (not in the megalomania sense, more in the megawatt sense)  This is before I knew about &lt;a href="http://en.wikipedia.org/wiki/Maslow's_hierarchy_of_needs"&gt;Maslow&lt;/a&gt;. ("Honey, would you please fix the computer? It needs to be self-actualized again.")&lt;br /&gt;&lt;br /&gt;But then again, what is "wanting"? Rocks don't want to roll down hills...but Sisyphus wants to push them up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15324911-5241370631284648276?l=lptf.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/LetsPushThingsForward/~4/ua6BVoR2erM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lptf.blogspot.com/feeds/5241370631284648276/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=15324911&amp;postID=5241370631284648276" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/5241370631284648276" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/15324911/posts/default/5241370631284648276" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/LetsPushThingsForward/~3/ua6BVoR2erM/what-do-computers-want-to-do.html" title="What do computers want to do?" /><author><name>Matt McKnight</name><uri>http://www.blogger.com/profile/16098483018096096360</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="10617804223990201316" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://lptf.blogspot.com/2008/06/what-do-computers-want-to-do.html</feedburner:origLink></entry></feed>
