There are several things you can learn from a simple, initial version:<p>-how users actually use your product. The best way to do this is to actually watch them go through your product (either through logging or through usability tests). The things you think are important right not might not be important to the average user.<p>-where your scalability bottlenecks are. I'm not talking about the obvious ones, I'm talking about ones you can't predict because the real world is hitting you with 100x more traffic than you can simulate.<p>-better architecture in general. Let's say you have an app that is transferring stuff over the network. You have to manage your buffers, deal with encryption, compression, disk IO, stuff like that. If you are dealing with multiple problems you haven't tackled before, you may not come up with the simplest, easiest to maintain design. But, once you've solved the blocking problems (how do I use these new libraries?), you are better prepared to handle higher level problems (Is there a simpler buffer design that lets me reduce the number of copies I do?)