Software Engineering of Distributed Systems