System planners, architects, and developers often make the same mistakes on grand scales, but we usually stay with familiar approaches, especially under deadline pressures. Engineers and managers embrace the concept of process improvement, yet they rarely take time (or have the privilege of taking the time) to consider how something that has worked in the past could be improved. It is equally rare for them to make the effort to change plans and processes to benefit from mistakes. This article explores several high-level lessons learned, mostly on large system developments that were not always successful. The lessons concern project difficulties caused by thinking that's stuck in the present; excessive faith in code reuse; failure to see the big picture; absence of independent failure analysis; and estimation processes driven by fear and ignorance.