The Nature of Code by Daniel Shiffman

It is, by far, the best book I have read on software engineering for beginners.