https://medium.com/@tejeswar_79802/understanding-the-difference-between-imperative-and-declarative-programming-a921f5ef5436