Checkpoints
When I'm working on increments, some code-centric developers are surprised to see UI output classes front-loaded pretty heavily. After all, this code is comparatively simple; however, risk management is not about complex vs. simple, it's about risk. Complex code is certainly one particular kind of risk to manage on your project. However, in my experience, surprises arise during testing and these are key sources of risk; user acceptance testing (UAT) is certainly no exception.
UAT is a critical stage to manage in any project. Poor management of clients during UAT is a frequent cause of project failure (either too dismissive, or too eager to please). Irrational fear of UAT can lead to overly detailed requirements that straight-jacket the development team and cause project failure. In fact, each of these three items (dismissing client needs, pandering to client needs, and overly-detailed specs) probably each causes more project failures than complex construction challenges. That's clearly an important need which you should address in your risk management strategy.
This is where checkpoints come in. Increments are the smallest possible pieces you can define for thorough testing; they are project units that the development team can use to track its progress. However, there are frequently far too many increments to make good UAT checkpoints. A checkpoint is a particular stage of software development where you have sufficiently advanced the user experience (since the last checkpoint), that it is worth having the end users (and other stakeholders) perform UAT on those items.
While controlling scope creep is important, the earlier in a project that a client needs changes, the more flexible I'm willing to be. Anything that requires some design changes but doesn't change the effort or the timeframe necessary to complete the project is fine by me. In order to push projects and clients toward this goal automatically, I use a formal change management system that requires signatures and approvals; I also make sure to clearly document additional time and cost factors involved in the change documentation. Those are two things that most effectively counter a client's zeal for something new and force a more objective appraisal of whether they really want to make a formal request.
One of the best ways to ensure good UAT is to hit your checkpoints early. By front loading the application UI, you have to hard code responses to provide users with close to the full user experience, and get UAT check offs. Yet this completes checkpoints without coding most of the functionality behind it. Then all you have to do is construct the code which provides the full functionality dynamically behind the scenes which won't affect the application behavior. Thus well chosen and early checkpoints help to balance client satisfaction with a smooth development life cycle.
Defining Checkpoints
Just like increments, checkpoints involve tradeoffs. Too few checkpoints and you can run into nasty surprises when a lot of work that you've done is invalidated during a user acceptance test. However, too many checkpoints and the end users / clients can become frustrated, the development team can be held up due to missed appointments and rescheduled UATs, and there are more communications which open the door for more miscommunications.
Worse, the appropriate frequency of UAT will usually depend on the client. UAT is not a logical test, it is an acceptance test; you are asking a person to sign off on the work that's been done for them. This is not a wholly rational decision. The upshot is that you don't conduct UAT with the same frequency or in the same way from client to client, just as you would never communicate identically with every client.
A checkpoint is therefore a point in the application where a particular increment has been finished that completes some set of functionality which you want to present. As much as possible you would like the functions to be related, but in reality, checkpoints always involve a somewhat diverse group of capabilities. Frequently, I want the user experience (UX) designers and client managers to define these points, and / or the QA department. Just make sure to plan your UAT with your client in mind.
Quality Assurance (QA)
I strongly believe in QA departments, however, I disagree with the common practice that a program is finished and then turned over to QA. I believe that QA is something that happens throughout construction, and there are a number of development teams (especially in the agile community) that practice this as well. Therefore, managing hand over of work from the development team to QA is a critical workflow that quite literally demonstrates application progress, and checkpoints are the perfect time to make the handover. As the development team completes a checkpoint, push the current version of the application from the development server to the testing server where QA can quite literally tear it to pieces. Since this all happens on another server, the development team is in no way inhibited during their development (unless QA finds serious problems that require backtracking), and QA is not restrained by direct or indirect contact with the development team. This ensures the quality of your program and ensures that given any development emergency, you always have not only the original developer(s) of a section of code, but an entire QA team that can place an expert eye on the problem.