Typing the evolution of variational software - Afonso, Luís Carvalho (2018)
[Excerpt] Maintaining multiple versions of a software system is a laborious and challenging task, which is many times a strong requirement of the software development process. Such hurdle is justified by needs of backward compatibility with libraries or existence of legacy equipment with particular constraints. It is also an intrinsic requirement of software product lines that target multiple target platforms, service, or licensing levels [7]. A crucial example of a high variability context is an operating system where hundreds of variants need to be maintained to cope with all the different target architectures [1]. We find another important example in mobile applications, where server and client code need to be updated in sync to change structure of the interface or the semantics of webservices. However, it is always the case that older versions of server code must be maintained to support client devices that are not immediately updated. The soundness of a unique and common code corpus demands a high degree of design and programming discipline [8], code versioning, branching and merging tools [12], and sophisticated management methods [11, 9]. For instance, in looselycoupled service-oriented architectures, where the compatibility guaranties between modules are almost non-existent, special attention is needed to maintain the soundness between multiple versions of service end-points (cf. Twitter API [13]). [...]