Programming on Purpose: Essays on Software Design