1) Examine the source code and guess where bottle necks might be expected
2) Using a profiling tool, identify any genuine hot spots
3) Identify possible improvements (algorithms, custom memory allocation, caching, etc) and measure their effectiveness.
Reinforces when and when not to attempt optimisation; kinds of performance tuning