https://sdtimes.com/softwaredev/martin-fowler-revisits-refactoring/