Optimization of applications should not be a final step in project development, but rather an ongoing design philosophy that begins from the planning stages all the way through completion. By thinking about the optimal algorithms and data structure designs early on, greater performance benefits can be realized with less work by the time the product is mature. Getting into this mindset requires being aware of everything from computational complexity of algorithms, to the data structure design and implementation, and the proper use of parallelization.