
Very
important to Agile projects but often overlooked is getting working
software done
regularly and frequently. The definition of working software may vary
slightly between projects, but not much. Working software
is fully tested and ready to be
shipped to customers or deployed into production. That doesn't mean you
tried it a couple times and it ran without aborting. It means you created unit tests, QA
tests, and actually looked at output to prove it works. It isn't as
difficult as you think. In fact some teams deploy new
software into production every single day.

When we were managing our projects
by activity
we needed a way to guard our progress. The people who finished an
activity like analysis might not participate in design or coding. So we safe
guarded all progress by creating extensive documentation of what was
decided and what was done. We had people with authority sign the front
page to verify our efforts were going in the right direction.

An
Agile project has all activities going on all the time as needed. We can't
use documents with signatures to guard our progress. Instead Agile
teams rely on automated tests and working software to safe guard
progress. We show working software to our customer/product owner often
and accept changes to ensure our efforts continue in the right
direction. You can't empower your team to find its own solution using
documents with signatures, you need the intense feedback that working software provides.

Working
software is an Agile theme that affects everything you do. You will set
a project
heartbeat, but unless you produce working software each and
every
iteration your heart beat will be weak.
Honest plans are only possible if you have honest
estimates based on done meaning working. Iterative
planning adapts to changes, but good changes only come from customers
looking at and trying out a working incremental version of the system. A big part of your
project heartbeat is delivering working software into
production regularly and frequently.

One
common misconception about testing software is the cost. Most
developers only know two data points; no tests, and too many tests.
Finding bugs cost you something. If you don't test your software you
are essentially moving that cost to your users/customers. If you only
pay for fixing bugs but not finding them you save money. On the other
hand if you set out determined to test every possible input to your
software you will find the cost of testing rises exponentially as you
get close to 100% tested. Of these two data points not testing is
obviously cheaper.

But
there are two assumptions to this analysis that you may not be aware
of: You can not effectively increase software quality at the end of the
project and designing code to be testable changes the cost of testing
it.

You
want to present your customer/product owner with the best estimates
you can for planning. How
can someone choose between two possibilities without knowing the true
full
cost. If you have unknown costs to pay you won't be able to plan well.
Consider for example integration, if you have not integrated code in a
month you could easily spend days integrating and deliver late.
However, if you integrated ten minutes ago you know it won't be a
problem.

You
will be showing your software to your customers at the end of each
iteration, getting it working is required. You want to finish each
story to production ready. Shipping the software to production is a customer
decision, but developers must have the software ready to go.

Requirements
cost you something to get and you get what you pay for. Reducing the
cost of requirements by designating an intermediary or by being frugal
with an experts time leads to software that isn't worth much no matter
what you subsequently spend on development. The requirements you
get late in a project are usually the most valuable because the
customers have learned something about the system or have identified a
competitive advantage.

Graciously
accepting that the needs of the product owner can and will change even
late in the project is being honest about what needs to get done next.

An Agile
process
may
start out with guesses but quickly reaches realistic schedules by
measuring progress in small amounts.

Iterative
planning in combination with regularly scheduled product demonstrations
help the customer discover his problem's solution faster. The
changes you get from your customer late in a project are often the most
valuable.