Developing software for highly scalable systems with nearly a million processors or cores raises unique challenges. To succeed, application developers must reconsider both their code's structure and the tools they use to develop, tune, and run that code. Petascale systems aren't just bigger versions of the current terascale systems. The degree of concurrency as well as increasingly complex processors means that existing algorithmic and software approaches no longer work. Although a few applications might be nearly ready for petascale systems, others need more extensive changes to exploit the system's scale and power. To ensure that applications are ready, we must reexamine everything in light of the system's massive size. Still, the situation isn't as grim as that sounds. Researchers are creating new tools to develop, debug, and tune applications that rely on adaptively determining and grouping behavior, as well as creating new programming models and languages that could enhance scalability by reducing communication overhead. Petascale system size and complexity can force developers to use well-designed components, both in the applications themselves and in the tools and middleware they use to develop them. Ultimately, while applications must adapt to petascale systems, the changes required is relatively modest and software tools can available to help.