https://mamchenkov.net/wordpress/2004/07/26/how-to-design-programs/
How to Design Programs