Six programming paradigms that will change how you think about coding