https://levelup.gitconnected.com/programming-concepts-that-every-javascript-developer-should-know-cea7a113c7bd