Production-sized systems, particularly legacy software, can contain mi
llions of lines of code. Even a seemingly simple, small-ream project,
such as a spreadsheet, is quite complicated. Understanding, changing,
and repairing code in large systems is especially time-consuming and c
ostly. Knowledge of code decays as the software ages and the original
programmers and design ream move on ro new assignments. The design doc
uments are also usually out of date, leaving the code as the only guid
e to system behavior. It is tedious to reconstruct complex system beha
vior by analyzing code. Perhaps the most difficult software engineerin
g projects involve ''programming in the large.'' These large-team proj
ects, often in maintenance mode, require enhancements involving subtle
changes to complex legacy code written over many years. Under these c
ircumstances, programmer productivity is low, changes are more likely
to introduce errors, and software projects are often late. Software vi
sualization can help software engineers cope with this complexity whil
e increasing programmer productivity. Software is intangible, having n
o physical shape or size. After it is written, code ''disappears'' int
o files kept on disks. Software visualization tools use graphical tech
niques to make software visible by displaying programs, program artifa
cts, and program behavior. Pictures of the software can help slow know
ledge decay by helping project members remember-and new members discov
er-how the code works. Three basic properties of software can be visua
lized: software structure (as in directed graphs); runtime behavior (a
s in algorithm animation); and the code itself (as in pretty printers)
. Previous approaches to software visualization, although useful for s
mall projects, do not scale to the production-sized systems currently
being manufactured. The graphical techniques found in programming, pro
gram-visualization, and algorithm-animation environments target small
systems. Algorithm visualizations are usually handcrafted and require
the designer to understand the code before visualizing it, making this
technique infeasible for large systems or tasks involving programmer
discovery. The general strategy for large projects is to decompose the
project into modules, usually hierarchically, and display each module
individually. In practice, this decomposition is often the most diffi
cult aspect of the visualization. When software is decomposed, the ''b
ig picture'' is lost, often defeating the purpose of the visualization
. To address these shortcomings, the authors developed scalable techni
ques for visualizing program text, text properties, and relationships
involving program text, as text is the dominant medium for implementin
g large software systems. They have applied their tools to visualize c
ode version history, differences between releases, static properties o
f code, code profiling and execution hot spots, and dynamic program sl
ices. The systems presented are used daily within Bell Laboratories' d
evelopment community, helping software developers work on the SESS pro
duct, a real-time switching system containing millions of lines of cod
e developed over the past two decades by thousands of software enginee
rs. The initial developer feedback has been very positive.