- Make it work.
- Make it elegant.
- Make it fast.
- Make it secure.
In more detail:
- Make it work - Your first pass is a proof, a vertical slice of all the functionality that proves that your idea is going to work in practice. But it’s probably an ugly mass of bailing wire and duct tape, with no error checking, incomplete specs, etc.
- Make it elegant - Now that you know it works (and you have a good grasp of the problem space and the solution), you can take the time to make your code clean, fully speced, with good class names, proper separation of concerns. In short, something that is readable by others, maintainable over time, that will withstand the earthquakes of change.
- Make it fast - Since your code is clear and understandable, you can now set to optimizing critical code paths. Snappy response time is critical to a good user experience.
- Make it secure - Once you’re certain that all the other concerns have been accounted for and you have something that is not going to be subject to major changes, you can audit the entire process and look for vulnerabilities, both in terms of access and abuse.
One caveat: do think a little bit about all the forthcoming steps in your initial design, and as you make changes. On step one you don’t want to cloud your head with excessive concerns about elegance, speed, or security: but you do want to know that it is possible for your design to be made elegant, fast, and secure in the future.