For a prototype to be effective, the following must be true:
If you write a program that is fully functional and you don't throw it away, it isn't a prototype—by definition. Regardless of what you call it or what you think it is, it is in reality production code. Furthermore, prototyping is essentially an economic activity. The only reason to prototype is to save time and money. Consequently, an effective prototype must save more time and money than it costs to create. This is where ineffective prototyping efforts usually fail. Lastly, the prototype must have clear, realistic goals, such as any of the goals I mentioned earlier. Specific task-oriented prototypes are much more likely to produce useful information than unbounded prototypes. For a prototype to be effective, make sure you have a good reason for doing it.