The possibility of building self-aware software fascinated computer scientist since the beginning of computer science. Research in AI, and in particular on software agents, agent system, computational reflection and reflective software delivered interesting results which moved towards the development of software systems with features of self-awareness. However, these approaches have not so far generated any clear success in terms of real and useful self-aware software. Here we inthe theory of abstract communication systems, which describes the world in terms of systems and their environment. Systems comprise dense, inter-referencing clusters of communications. We analyse natural self-aware systems highlighting the critical features which make them be self-aware. We analyse software systems in terms of abstract communication systems theory and compare their critical features with these natural self-aware systems. We describe the necessary features of hypothetical self-aware software, ...