notes from ThinkCS Chapter15