Tightly coupled and interdependent systems inhibit productivity by requiring developers to carefully coordinate their changes, even when modifying subsystems that should be independent of one another. Poor architectural decisions frequently lead to the presence of large, change-prone source files that are at the center of complexes of technical debt. This kind of technical debt quickly incurs interest both through coordination costs and error-proneness. In this paper, we present a new approach for decomposing these ``large-active'' files to pay down critical technical debt. We package our approach as a refactoring recommendation system. Each recommendation is determined by analyzing patterns of co-change and mutual dependency among files. Each recommendation corresponds to a responsibility the large-active file has in relation to the rest of the system. By moving recommended functionality from the large-active file into smaller files, developers can reduce the impact of a debt-laden file and clarify its essential responsibilities. A key advantage of this approach over prior work is that we better focus effort; we avoid spending developer effort refactoring code that is only superficially problematic. We achieve this by incorporating revision history into both determining and ranking recommendations. Each recommendation corresponds to some change-prone responsibility. We present some examples of this approach in action and outline our future plans.
翻译:紧密结合和相互依存的系统通过要求开发商仔细协调其变化从而抑制生产力,即使在修改应彼此独立的子系统时,也要求开发商仔细协调其变化,从而抑制生产力; 建筑决定不完善,往往导致出现大量易变源文件,而这些源文件处于复杂的技术债务的中心。 这种技术债务通过协调成本和易出错而迅速引起兴趣。 在本文件中,我们提出了一个新的方法,将这些“超活跃”的文档拆解,以支付关键技术债务。 我们把我们的方法包装成一个重构建议系统。 每项建议都是通过分析文件之间相互变化和相互依赖的模式来确定的。 每条建议都对应一个大型文件与系统其余部分有关的责任。通过将所建议的功能从大型文件移到较小的文件,开发商可以减少债务拉动文件的影响,并澄清其基本责任。 与以前工作相比,这一方法的主要优点是我们更好地集中努力; 我们避免花费开发者的努力重订代码,但只是表面问题。 我们通过将一些修订历史纳入确定和排序建议中来达到这个目的。