It is argued that program development is manipulation of theories, and a case is presented for this position. Programs do not manipulate real-world objects but only their symbolic representations. Program development is argued to be best described, explained, and understood in a syntactical manner without resource to other entities. Supporting this position are a theory of abstract data types and a methodology for program development. The former offers a simple treatment of specifications, implementation, parameterization and errors. The latter is oriented toward the smooth construction of verifiable program.