\documentclass{article}

\title{Revealing the Secrets of David Parnas}
\author{H. Conrad Cunningham\\  
\\ 
Department of Computer and Information Science \\ 
University of Mississippi}

\begin{document}

\maketitle
\bibliographystyle{IEEEannot}

\section*{}

Those of us in the fast-changing field of computing often dismiss anything written more than five years ago as obsolete.  Yet several decades-old papers by David L. Parnas \cite{britton-etal-1981,parnas-etal-1985,parnas-1972,parnas-1976,parnas-1978,parnas-1979} are as timely as those published in recent issues of the top journals. Parnas articulates the timeless software design concepts known as information hiding and abstract interfaces.

Most programmers would describe a module as a unit of code such as a subroutine or class. Parnas focuses on the programmers rather than the programs. He defines a \emph{module} as ``a work assignment given to a programmer or group of programmers'' as a part of a larger software development project \cite{parnas-1978}. His goals are to enable programmers to develop each module independently, change one module without affecting other modules, and comprehend the overall system by examining one module at a time \cite{parnas-1972}.

Programmers often design a software system by breaking the required processing into steps and making each step a module. Instead, Parnas uses information hiding to decompose the system into modules that satisfy his goals (2); each module keeps its own secret—a design decision about some aspect of the system (e.g., choice of a data structure). A module’s design decision can change but none of the other modules should be affected. If some aspect is unlikely to change, the design can distribute this knowledge across several modules and the interfaces among them.

Most programmers would define a module by listing the names, parameters, and return values--the \emph{operation signatures}--of its subprograms. Parnas again focuses on the programmers rather than the programs.  He defines the ``interface between two programs'' to consist ``of the set of assumptions that each programmer needs to make about the other program in order to demonstrate the correctness of his own program.'' \cite{parnas-etal-1985} In addition to an operation signature, these assumptions must specify the restrictions on data passed to the operation, the effect of the operation, and exceptions to the normal processing that may arise.

The interface of an information-hiding module must enable programmers to replace one implementation of the module by another without affecting other modules. This is called an abstract interface because it represents the assumptions common to all implementations of the module \cite{britton-etal-1981,parnas-1978}. It reveals the module's unchanging aspects but obscures aspects that may vary among implementations.

Information hiding and abstract interfaces underlie object-oriented programming, the predominant contemporary approach to programming. But programmers often oversimplify these concepts as merely hiding data representations inside classes \cite{weiss-2001}. A secret of a well-designed module is more than hidden data. It is any aspect that can change as the system evolves: processing algorithms used, hardware devices accessed, other modules present, and specific functional requirements supported \cite{parnas-etal-1985,parnas-1972,parnas-1979}.

Although 40 years have passed since Parnas first wrote about information hiding, programmers can still learn much from studying his papers carefully and can improve their software designs by applying his ideas systematically.

\section*{Acknowledgements}

The author and collaborators published some of these ideas previously \cite{cunningham-etal-2005,cunningham-etal-2004}.

\bibliography{ClassicParnasAnnotated}

\end{document}
