Challenges of Distributed Systems and How to Overcome Them — Programming Keynou