https://eazyreads.com/engineering-process/software-design-principles-and-pattern-hour-1/