tag:blogger.com,1999:blog-48104358550022810142024-02-08T19:57:07.108+01:00Getting IT DONE!Just another blog about Agile Development, "How to get It DONE?", Continuous Delivery, Testing, BDD and stuff
by Alex Schwartz, Berlin.Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-4810435855002281014.post-41702926742512857312012-01-24T23:17:00.001+01:002012-01-24T23:26:44.892+01:00My Own Kanban-Tool ShootoutWhat's your favorite Kanban board? Of course a physical wall with Post-its or index cards.<br />
<div><br />
</div><div>Unfortunately I am asked for having an electronically version for my colleagues on the other side of the ocean, and I realize its a little bit easer to let a tool track the cycle time. I was simply to lazy or whatsoever to track over several weeks consistently the cycle times for all the stuff we delivered.</div><div><br />
<b>The combatants</b></div><div>So, I am looking for a tool and there are actually quite a lot of candidates. The most promising ones are:</div><div><ul><li><a href="http://agilezen.com/">agilezen.com</a></li>
<li><a href="http://leankitkanban.com/">leankitkanban.com</a></li>
<li><a href="http://kanbanery.com/">kanbanery.com</a></li>
<li><a href="http://kanbantool.com/">kanbantool.com</a></li>
<li>homebrew solution based on <a href="http://docs.google.com/">Google docs</a> + <a href="http://code.google.com/apis/chart/">Google charts</a></li>
</ul><div><br />
</div></div><div><b>What are my requirements? </b><br />
Must have's are<br />
<br />
<ul><li>items of different type, visualized with a specific color for every item</li>
<li>drag-nd-drop</li>
<li>Charts for Cycle Time</li>
<li>CFD = cumulative flow diagram</li>
<li>API access to move items programmatically, and maybe to create some</li>
</ul><br />
Nice to have would be:<br />
<br />
<ul><li>marking blocked items</li>
<li>tracking of the total time of items being blocked</li>
<li>change the history of an item (in case of missing updates)</li>
<li>iPad client with online editing</li>
<li>iPad client with offline editing</li>
</ul><br />
<b><br />
</b></div><div><div><br />
</div></div>Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com1tag:blogger.com,1999:blog-4810435855002281014.post-79058248324150070222012-01-24T23:10:00.000+01:002012-01-24T23:10:01.895+01:00Post-its!The following happend last week in a workshop covering a software tool for Agile development.<div><br />
</div><div>The trainer asked: </div><blockquote class="tr_bq"><i>What is your favorite Agile project management tool?</i></blockquote>Actually he thought about Mingle, and expected JIRA to be the answer.<br />
<br />
Stuart answered:<br />
<blockquote class="tr_bq"><i>Post-its!</i></blockquote>The trainer:<br />
<blockquote class="tr_bq"><i>Ah, is there any electronically version of the Post-its? </i></blockquote>Alex and Stuart:<br />
<blockquote class="tr_bq"><i>Pictures of Post-its!</i></blockquote>Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com1tag:blogger.com,1999:blog-4810435855002281014.post-59568274305691352422011-10-30T19:11:00.002+01:002011-10-30T20:11:42.299+01:00Waterfall development is like shooting a big rocketI had a good day in Hamburg, joining the ThoughtWorks workshop about Continuous Delivery.<br />
<br />
Vlad, the main trainer, gave the following statement:<br />
<blockquote class="tr_bq">Agile development puts the business in the driver seat.</blockquote>Got it, and for me it's worth to add:<br />
<blockquote class="tr_bq">... and the driver is not blindfold.</blockquote><br />
So, how to interpret "Waterfall development" in the context of this nice analogy? For me its<br />
<blockquote class="tr_bq">Waterfall development is..... You spot a target, a few kilometers away. Then you load your big rocket, which takes ages. By the way you do not take a look at the target while loading the rocket. Then you fire the rocket, and you almost hit the target. Just 600m off since the big rocket is not very precise, and furthermore, the target moved since you last took a look at it. </blockquote>And of course the team required to handle the rocket is 10 times larger than the agile team, and the rocket costs millions.<br />
<blockquote class="tr_bq"></blockquote><br />
<br />
<blockquote class="tr_bq"></blockquote><blockquote class="tr_bq"></blockquote>Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com0tag:blogger.com,1999:blog-4810435855002281014.post-10767890106274398802011-05-25T23:16:00.005+02:002011-05-25T23:23:32.813+02:00Realizing Build Pipelines: The First PipelineSo, for my little post series about <i><a href="http://agileanddone.blogspot.com/2011/04/how-to-realize-continuous-delivery.html">How to realize a Continuous Delivery Pipeline with tool X?</a></i> I am looking for an appropriate first example pipeline.<br />
<br />
I am trying to start with a fairly easy, but nevertheless realistic kind of pipeline... The choice is influenced by some pipelines I saw working in production. Of course, it's simplified.<br />
<br />
<div style="background-color: #ffff66;"><b>Pipeline #1. Simple pipeline w/ artifact and manual trigger</b><br />
<i>Steps</i><br />
<ul><li>commit stage -- compiles the code, executes unit tests and produces a war artifact</li>
<li>deploy to staging -- deploys the war file to a staging test server</li>
<li>acceptance test -- executes the </li>
<li>deploy to production -- deploys the war file to production</li>
</ul></div><div>Ok, a fairly easy one. But how it should be configured in detail?<br />
<br />
<ul><li>triggering -- The last step is to be started manually, all others are triggered automatically.</li>
<li>version control - The first build uses a version control checkout for the application code, the 2nd and 4th one a checkout from a deployment code repo and the tests are located in another repository. </li>
</ul>Of course, it's more a kind of anti-pattern to have production code and tests separated from each other. Anyway, often this is the case and I would like to have scenario which does not have two jobs which require to checkout the same version/revision of the source code.</div><div><br />
<br />
</div>Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com0tag:blogger.com,1999:blog-4810435855002281014.post-40064822157124929882011-05-15T00:19:00.008+02:002011-05-15T16:18:10.672+02:00Drag-and-Drop with SVG with Rails Persistence (Part 1)As a spike for my pipeline dashboard project I would like to have a page with some drawn rectangles which I can move around. Furthermore, the position of the moved objects should be persisted.<br />
<h3>Outline</h3>Since I like to get more hands on experience with Ajax websites which communicate with the server using JSON, the outline of my solution is the following:<br />
<br />
<ul><li>The rectangles are drawn using SVG.</li>
<li>The rectangles are moved around using drag-and-drop.</li>
<li>There is a Rails application which provides a RESTful web service to retrieve the positions of the rectangles and of course, to persist changes of the positions.<i> (This is inspired by an example in "RESTful web services" by Richardson and Ruby.)</i></li>
<li>To simplify the usage the example page is provided as the index page of the Rails web application.</li>
</ul><div><h3>Creating the RESTful service</h3><div>Creating a RESTful web service with rails is very simple. You will see, it takes just a few minutes.<br />
<br />
<pre><b>$ rails spike-dnd-with-svg-and-rails</b>
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create config/initializers
create config/locales
create db
create doc
create lib
create lib/tasks
create log
create public/images
create public/javascripts
create public/stylesheets
create script/performance
create test/fixtures
create test/functional
create test/integration
create test/performance
create test/unit
create vendor
create vendor/plugins
create tmp/sessions
create tmp/sockets
create tmp/cache
create tmp/pids
create Rakefile
create README
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create config/database.yml
create config/routes.rb
create config/locales/en.yml
create db/seeds.rb
create config/initializers/backtrace_silencers.rb
create config/initializers/inflections.rb
create config/initializers/mime_types.rb
create config/initializers/new_rails_defaults.rb
create config/initializers/session_store.rb
create config/environment.rb
create config/boot.rb
create config/environments/production.rb
create config/environments/development.rb
create config/environments/test.rb
create script/about
create script/console
create script/dbconsole
create script/destroy
create script/generate
create script/runner
create script/server
create script/plugin
create script/performance/benchmarker
create script/performance/profiler
create test/test_helper.rb
create test/performance/browsing_test.rb
create public/404.html
create public/422.html
create public/500.html
create public/index.html
create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
<b>$ cd spike-dnd-with-svg-and-rails</b>
</pre></div><div><br />
Now we use the scaffolding to create our domain object "item", which represents a rectangle to be drawn. An item has x and y coordinates, a name and an id.<br />
<br />
<pre><b>$ ruby script/generate scaffold item id:integer name:text x:integer y:integer </b>
exists app/models/
exists app/controllers/
exists app/helpers/
create app/views/items
exists app/views/layouts/
exists test/functional/
exists test/unit/
create test/unit/helpers/
exists public/stylesheets/
create app/views/items/index.html.erb
create app/views/items/show.html.erb
create app/views/items/new.html.erb
create app/views/items/edit.html.erb
create app/views/layouts/items.html.erb
create public/stylesheets/scaffold.css
create app/controllers/items_controller.rb
create test/functional/items_controller_test.rb
create app/helpers/items_helper.rb
create test/unit/helpers/items_helper_test.rb
route map.resources :items
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/item.rb
create test/unit/item_test.rb
create test/fixtures/items.yml
create db/migrate
create db/migrate/20110514212212_create_items.rb
</pre></div>Before starting the service we init the database as follows.<br />
<br />
<pre><b>$ rake db:migrate</b>
(in /Users/alex/SWDEV/spike-dnd-with-svg-and-rails)
== CreateItems: migrating ====================================================
-- create_table(:items)
-> 0.0014s
== CreateItems: migrated (0.0015s) ===========================================
</pre><br />
The service is started with a script contained in the folder script.<br />
<br />
<pre><b>$ script/server --daemon</b></pre><pre>=> Booting Mongrel
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
</pre><div><br />
</div><div><h3>What we have so far?</h3>We have a very simple web application running on http://localhost:3000 which allows for managing our domain objects. Its index page shows some welcome message with some hints. The interesting page is http://localhost:3000/items. It returns a list of our domain objects, which we called "item". Of course the list is empty.<br />
<br />
To create our first entry we klick on "New item" and fill the form with id=1 and some fantasy. Now http://localhost:3000/items returns a list containing one item. Beside the HTML pages we can also request XML data:<br />
<br />
<pre><b>$ curl -i http://localhost:3000/items.xml</b>
TTP/1.1 200 OK
Connection: close
Date: Sun, 15 May 2011 14:00:00 GMT
ETag: "8fc46ac5da86d8127536a43e164a4878"
Content-Type: application/xml; charset=utf-8
X-Runtime: 7
Content-Length: 339
Cache-Control: private, max-age=0, must-revalidate
<?xml version="1.0" encoding="UTF-8"?>
<items type="array">
<item>
<created-at type="datetime">2011-05-14T21:40:20Z</created-at>
<id type="integer">1</id>
<name>my first rect</name>
<updated-at type="datetime">2011-05-15T10:39:21Z</updated-at>
<x type="integer">3</x>
<y type="integer">4</y>
</item>
</items>
</pre><br />
<div>Using the verbose option -i of curl tells us a lot more details about the request, especially its return code.<br />
<br />
As the Rails application provides a RESTful service we can access the "item" with id 1 using</div><pre><b>$ curl -i http://localhost:3000/items/1.xml</b>
HTTP/1.1 200 OK
Connection: close
Date: Sun, 15 May 2011 14:01:24 GMT
ETag: "a388de3aec9d892bc1b1af2f81194701"
Content-Type: application/xml; charset=utf-8
X-Runtime: 7
Content-Length: 293
Cache-Control: private, max-age=0, must-revalidate
<?xml version="1.0" encoding="UTF-8"?>
<item>
<created-at type="datetime">2011-05-14T21:40:20Z</created-at>
<id type="integer">1</id>
<name>my first rect</name>
<updated-at type="datetime">2011-05-15T10:39:21Z</updated-at>
<x type="integer">3</x>
<y type="integer">4</y>
</item>
</pre></div><h3>What about JSON?</h3>Cool, out of the box we got HTML and XML. Let's try to use json. We either can tell cURL that we would like to get JSON results or we append the postfix ".json" to the URL,<br />
pre><br />
<br />
<pre><b>$ curl -i http://localhost:3000/items.jsonl</b>
HTTP/1.1 406 Not Acceptable
Connection: close
Date: Sun, 15 May 2011 14:10:41 GMT
Content-Type: text/html; charset=utf-8
X-Runtime: 5
Content-Length: 1
Cache-Control: no-cache
<b>$ curl -i -H "Accept: application/json" http://localhost:3000/items</b>
HTTP/1.1 406 Not Acceptable
Connection: close
Date: Sun, 15 May 2011 14:13:27 GMT
Content-Type: text/html; charset=utf-8
X-Runtime: 5
Content-Length: 1
Cache-Control: no-cache</pre><br />
Both calls are returning 406 and no content. So, there is something to do to enable JSON support.<br />
<h3>How to ad JSON support?</h3><div>To provide JSO we have to extend our controller <code>./app/controllers/items_controller.rb</code>. The controller has code like this:<br />
<pre>def index
@items = Item.all
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @items }
end
end
</pre><br />
To add json support we simply copy each "format.xml" line and exchange "xml" with "json". That's it. (Of course, it would be very nice if an option for scaffolding could enable the json support.)<br />
<br />
Let's verify whether the JSON support works.<br />
<pre><b>$ curl http://localhost:3000/items/1.json</b>
{"item":{"name":"my first rect","created_at":"2011-05-14T21:40:20Z","x":3,"y":4,"updated_at":"2011-05-14T21:40:20Z","id":1}}</pre></div><div><div><h3>Conclusion</h3><h3><span class="Apple-style-span" style="font-size: small; font-weight: normal;">Cool. we have out first RESTful web service with JSON, XML (and also HTML) support... written in less than 10 minutes. Not so bad.</span></h3><br />
With the next post I try to cover the manipulation of data using PUT and DELETE requests rather than GET requests.</div><br />
</div></div>Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com0tag:blogger.com,1999:blog-4810435855002281014.post-83085839131671360342011-04-29T23:42:00.008+02:002011-05-01T00:42:10.634+02:00How to realize a Continuous Delivery Pipeline with tool X?In the last years the idea of Build Pipelines was established, especially in the context of Continuous Deployment or Continuous Delivery. Roughly speaking, a that's Continuous Integration v2.0. Rather than working with a collection of CI builds (often with additional nightly builds plus release builds), there is a sequence of builds which models the workflow of all steps which are required to verify a commit before it can go to production Every single commit can travel thru this pipeline. With some good luck it passes all tests and ends up in production.<br />
<div><br />
</div><div><div><div>For Continuous Integration there are a tons of tools around. <a href="http://en.wikipedia.org/wiki/Continuous_integration">Wikipedia</a> lists 20+ tools. So, my question is:</div><div><div><b style="background-color: #ffe599;">What about their support for Build Pipelines? Are any of these tools able to realize Build Pipelines?</b></div><div><br />
</div><div>Of course, the answer is YES. -- <i>so far it sounds good. ;)</i></div><div><br />
</div><div>Unfortunately, more in detail the answer is more something like: </div><div>Up to some degree most tools are able to realize some pipelines in some sense.<br />
<div></div></div><div><br />
</div><div><i>Uffs. To many "somes", a very vague and disappointing statement. I am not amused.</i><br />
<i><br />
</i><br />
Ok, maybe I am too rude. Most tools have some features to "tie builds together" in some sense. Realizing build pipelines requires a lot of different features, depending on the nature of our specific build pipeline scenario. But no features provides some valuable documentations and no one gives any good examples. Especially with Jenkins/hudson the situation is a little bit unpleasant. The tool out of the box does not help to realize pipelines. In the universe of jenkins plugins (note: the jenkins project on github contains 500+ repositories) there roughtly 10 plugins which help to realize pipelines, but in most cases you need more than one plugin, the documentation vacous rather than helpful and it takes a log time to figure out how to solve the puzzle.<br />
<br />
<div>For the next month I plan to investigate how to realize build pipelines with different tools. I try to consider different scenarios with different kinds of pipelines which are demanding different features.<br />
<br />
In order to provide something which has at least a tiny chance to help others, I try to follow two rules: (1) the scenarios are described scenarios using BDD techniques, Given-When-Then, and (2) I am going to provide the example code on <a href="https://github.com/alexschwartz">github</a>, including example code for the pipeline as well as the configuration for the CI tool (unless its using a db).<br />
<br />
</div><div>I tend to focus on the following list of tools:</div><div><ul><li><b>Jenkins</b> (formerly known as Hudson) as the most famous and vital open source tool.</li>
<li><b>TeamCity</b> by JetBrains</li>
<li><b>Bamboo</b> by Atlassian</li>
<li><b>Pulse</b> by Zutubi, compare this <a href="http://agileanddone.blogspot.com/2011/03/zutubi-pulse-forgotten-ci-system.html">post</a></li>
<li>Last but not least ThoughtWorks <b>GO</b>! which focuses on realizing pipelines.</li>
</ul></div><div><br />
Please kick me if I do not continue this series...</div></div></div></div></div>Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com3tag:blogger.com,1999:blog-4810435855002281014.post-474970402583390572011-03-07T16:48:00.000+01:002011-03-07T16:48:11.519+01:00Zutubi Pulse - The forgotten CI systemAbout two years ago I evaluated a lot of Continuous Integration systems. The list of candidates included known ones like Atlassian Bamboo, TeamCity by JetBrains and of course, hudson (which is now know as jenkins). But another system was in the list, and I was not able to rember its name, or to find it using a google search.<br />
<br />
Now I got it. Cleaning up old notes helped to find an old piece of paper with the comparision matrix of the CI systems.... and it shows the name of the forgotten CI product. It was <a href="http://zutubi.com/products/pulse/"><i><b>Pulse</b></i></a> by Zutubi.<br />
<br />
The list of features now includes a nice view for upstream dependencies of my build. Compare<br />
http://zutubi.com/products/pulse/features/tour/power/<br />
<br />
I am going to give it another trial...Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com1tag:blogger.com,1999:blog-4810435855002281014.post-34489518514144831342011-03-07T15:02:00.004+01:002011-03-07T15:02:44.128+01:00The META Acceptance Criteria<b>GIVEN</b> a story described by the PO and diskussed by the whole team<br />
<b>WHEN</b> the team implements the story and presents it during the sprint demo<br />
<b>THEN</b><br />
<ul><li>the PO is happy</li>
<li>the customer is happy</li>
<li>the story is DONE with respect to given definition of done of the team</li>
</ul>Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com0tag:blogger.com,1999:blog-4810435855002281014.post-36771590139321315572010-10-05T11:18:00.002+02:002010-10-05T11:30:45.804+02:00Alexander Grosse: Continous DeploymentThe first "normal" talk (beside tutorial and the morning keynote by Lisa Crispin) I am joining is the talk by<a href="https://www.xing.com/profile/Alexander_Grosse"> Alex Grosse</a> about <b><i>Continuous Deployment</i></b>.<br />
<br />
His talk is based on the experiences of Noxia and especially of dopplr (<a href="http://www.dopplr.com/">www.dopplr.com</a>), a compony which had been aquired by Nokia. The dopplr team was known for living CD in real life.<br />
<br />
He explains the idea of CD and the relation to testing.<br />
<br />
Some nice takeaways: <br />
<ul><li>One nice use case for feature flags: disable expensive features in case of high traffic (used by dopplr).</li>
<li>Use a DevOps team: integrate ops people into the agile (development) teams.</li>
</ul><br />
...Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com0tag:blogger.com,1999:blog-4810435855002281014.post-90204560322505190862010-05-02T00:22:00.002+02:002010-05-02T00:26:32.738+02:00Impediment Driven DevelopmentI was wandering for some weeks what's the core of my new role in my company.<br />
<br />
Now I've got it: I'm doing <i><b>IMPEDIMENT DRIVEN DEVELOPMENT</b></i>.<br />
<br />
I maintain a list of impediments which disturb our developers and tackle the impediments one by one.<br />
<br />
To be honest, I usually tend to tackle several impediments at the same time rather than one by one, but I try hard to limit the work in progress.<br />
<br />
It sounds a little bit like the usual Scrum master role (the guy who tries to resolve <i>all</i> impediments of <i>one</i> team), but my role is to resolve the impediments related to a <i>few topics</i> (build mgmt and test automation) of <i>many</i> teams.Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com0tag:blogger.com,1999:blog-4810435855002281014.post-36979682387096224952010-04-19T13:30:00.001+02:002010-04-19T13:31:32.827+02:00If Version Control Systems were Airlines...<span style="font-family: Arial; font-size: x-small;"><span style="font-family: Arial; font-size: 10pt;">There is a brilliant, funny post by </span></span>John Goerzen<span style="font-family: Arial; font-size: x-small;"><span style="font-family: Arial; font-size: 10pt;"> titled "<a href="http://changelog.complete.org/archives/698-if-version-control-systems-were-airlines">If Version Control Systems were Airlines</a>".</span></span><br />
<span style="font-family: Arial; font-size: x-small;"><span style="font-family: Arial; font-size: 10pt;"><br />
</span></span><br />
<span style="font-family: Arial; font-size: x-small;"><span style="font-family: Arial; font-size: 10pt;">My highlights are subversion & git. </span></span><br />
<span style="font-family: Arial; font-size: x-small;"><span style="font-family: Arial; font-size: 10pt;"></span></span><br />
<span style="font-family: Arial; font-size: x-small;"><span style="font-family: Arial; font-size: 10pt;"><o:p></o:p></span></span>Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com0tag:blogger.com,1999:blog-4810435855002281014.post-73393464401186485032010-04-13T14:14:00.003+02:002010-04-13T14:23:03.887+02:00Using GIT in a CI System -- The Smart WayYes, there is a big hype around DVCS system such as GIT, Bazaar or Mercurial. Especially GIT has extremly fast operations for switching branches etc.<br />
<br />
There is a very cool chance to use this git feature in your Continuous Integeration (CI) system if you have a big fat codeline with many branches whichare build in parallel.<br />
<br />
Let's assume our CI system uses a build grid with a bunch of build agents which are running on a at multicore system (or several of them if you are lucky ;). <br />
<br />
Given a build agent multicore machine and a git repo, use one "master" git repository clone which is responsible to fetch all changes. Every build agent has its own working copy git repo which references the object store of the master repo.<br />
When a build is triggered, then perform the following steps: (a) fetch the changes in the master repository, and (b) perform a "git checkout" for the build agent working copy git repo.<br />
<br />
This will be extremely fast. This smart git checkout can be in the order of 10-50 milliseconds rather than several minutes -- which can speed up your CI builds dramtically.Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com1tag:blogger.com,1999:blog-4810435855002281014.post-44587178534300822852010-02-16T23:40:00.004+01:002010-02-17T21:44:14.165+01:00You know it's not done if.... (cooking 1)<div style="float: right; margin-bottom: 10px; margin-left: 10px;"><a href="http://www.flickr.com/photos/rprins/22748502/" title="photo sharing"><img alt="" src="http://farm1.static.flickr.com/18/22748502_f5ef494730_m.jpg" style="border: 2px solid rgb(0, 0, 0);" /></a><br />
<span style="font-size: 0.9em; margin-top: 0px;"><a href="http://www.flickr.com/photos/rprins/22748502/">Kitchen Disaster</a><br />
Originally uploaded by <a href="http://www.flickr.com/people/rprins/">rprins</a></span></div>My favorite example for getting software done is cooking, professional cooking in a restaurant to be precise.<br />
<br />
A good, professional cook is able to deliver a great meal for many customers at the specified time. The meals are tasty and they look and smell good. But what about the kitchen?<br />
<br />
It's his job to deliver brilliant food to the customer -- not just once. Period.<br />
<br />
Hence its "done" if and only if the kitchen is prepared to create the next meal, too.Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com0tag:blogger.com,1999:blog-4810435855002281014.post-57747169162052866842010-02-16T22:11:00.002+01:002010-02-16T22:31:01.382+01:00The first postSo, it took a long time for me to start blogging. I decided to post my 2 cents about agile development and ... <i>"How to get it DONE?"</i><br />
<br />
Why about done? Wait for the next post...Alex Schwartzhttp://www.blogger.com/profile/06639318546689084216noreply@blogger.com3