{'fraction_non_alphanumeric': 0.017790262172284643, 'fraction_numerical': 0.0, 'mean_word_length': 5.266862170087976, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
Methods for self-organizing distributed software

A current research trend in Software Engineering concerns the development of new techniques to deal intelligently and efficiently with the design of complex and distributed systems that are able to evolve overtime and adapt to rapid changes of their requirements. Runtime evolution is mainly achieved by instrumenting the system with a conceptually centralized controller that is able to monitor the system execution, analyze the opportunities for evolution, plan the evolution, and, finally, executing it by transforming in some way the controlled system. While this approach makes sense in most cases, when system decentralization is significant, it could not be feasible for scalability issues.
 An interesting class of approaches that replaces the conceptually centralized intelligence with a completely decentralized solution is the one based on self-organization inspired by the natural world. In nature, it often happens that a global behavior emerges from simple and local decisions made autonomously by each element of the system (think, for example, of the ability of an ants colony to quickly find the shortest path to the food). Applying the same idea to software systems, we have that each system component becomes an autonomous entity able to perform local actions affecting its state, behavior, and the relationships it holds with its neighbors. While the proposals for decentralized self-organization available in the literature appear to be very interesting, in most cases, they are still only defined in terms of analytical or simulative models.
 We argue that applying self-organization approaches to real running systems is a non-trivial task as it has to account for problems such as synchronization issues, race conditions, loss of messages and the like.
 In this talk we introduce the concept of self-organization and present some examples of applications in various domains, ranging from energy saving to cloud computing optimization. Moreover, we try to offer a roadmap to the definition of some design guidelines that support the adoption of self-organization.