1 Introduction
Software module clustering is an important and challenging problem in software engineering. It is widely believed that a well-modularized software system is easier to develop and maintain [8], [27], [29]. Typically, a good module structure is regarded as one that has a high degree of cohesion and a low degree of coupling [8], [27], [29]. Sadly, as software evolves, its modular structure tends to degrade [17], necessitating a process of restructuring to regain the cognitive coherence of previous incarnations. This paper is concerned with automated techniques for suggesting software clusterings, delimiting boundaries between modules that maximize cohesion while minimizing coupling.