This paper explores some of the conceptual stumbling blocks underlying the software design and maintenence function. Situations created by modification of shared modules and libraries are discussed, with emphasis on the detection of unanticipated side effects. Problems resulting from the confusion of the effects of early versus late binding strategies are exposed. Considerations arising out of parallelism and interactions with events outside the program's control that do not exist in simple serial algorithms are addressed. The dualism inherent in cross-compiled and meta-compiled systems, where two different environments are contributing to the total effect, are explored.