notes on How To Design Programs