I did nand2tetris (also known as "The Elements of Computing Systems")  in high school. I learned as much from is as I learned in my my first two and a half years as a CS major (except for learning Scheme/Racket first semester). I highly recommend it to anybody who has basic mastery of any programming language. The necessary software is Java based (and therefore cross-platform) and free, the first half of the book is free, and the whole book can be purchased for $30.
For people who do not yet know how to program, I recommend "Invent your Own Computer Games with Python" . I like it because it is strongly result-oriented while still teaching lots of principles, and because it is available as a paper book or electronically on the website. Each chapter covers a simple computer game. The chapter opens with a description of how the game works. Then, you are presented with the entire source code of the program. You are supposed to type the code yourself (like BASIC / asm listings in home computing magazines of yore). After the listing, the a few common errors are described, along with where to look for the mis-typed line. If you mistyped a program and can't figure out what you did wrong, the website has a diff utility that will compare your code to the book's and show you the differences - including where the bug is.
At this point in the chapter, you have a working, playable computer game, and you have at least a passing familiarity with the code that makes it work. The rest of the chapter covers small pieces of the code from the game - pieces that use operations or concepts that the previous games haven't. The chapter explains the concepts in more detail, and gives several examples to play with.
I already had a firm grasp of Java when I read "Invent with Python", but I learned Python very quickly and painlessly with it, and recommend it to everyone who asks me what they should do to get into programming.