What's the best way to assess programming?
Some related research
There has been some research into how to hire people: How do you select people that can do the job. The traditional methods rejects too many “good” people, and accepts too many “bad” people. It turns out that the best thing to do is to test them doing the job, and/or selecting for attitude.
Therefore to test programming you should test programming (I don't care how good an essayist my heart surgeon is).
Google is one of the companies that has done some research in this area. There will be others. I heard about this on BBC Radio4, so there may be some info on there web site (good luck finding it).
Some other suggestion

Open book: programming is not about memory (off line: to web pages downloaded before exam release).

Automated tests, for the coding section (tests written by the exam board). See test-first, and unit-testing.

Look at what can be assess automatically, assess the rest manually (I think there is an article in Hello World issue 3).

To avoid plagiarism: Give them materials to work with, be open book, use exam conditions (multiple small exams).

It was suggested by one teacher: “pupils are messing up in the early stages, this is trickling through and causing pupils to loose marks in later stages as well. Therefore divide the test into multiple sections, the output of section one is not the input of section two (exam board provide inputs for each section, a different problem, the confusion does not propagate).

Check for working code.

Check big-O (run-time, and code size).

Check for good-name (of methods, and variable), over comments.