When I was an undergrad (ages ago), we had to take a course called computational physics. The thrust of the course was learning how to program, understanding algorithms, and then implementing the algorithm using self-made code written in Fortran.
I took the course four (or five?) times, because I kept on failing the course. Let me describe what it was like-- it was so long ago that if you had a laptop, you were considered to be divine; even having your own desktop was A Big Thing. Since I am not Kintaro Oe (if you don't know who he is, watch Goldenboy!), I was unable to pass the course because I had no computer and had limited access. I only passed the course when I got admitted to the theory group; we had a single computer that we took turns (ab)using.
The text that we used was DeVries' Computational Physics. It was a good text; I learned a lot about making readable code as well as understanding the algorithms that we use for solving differential equations. In fact, upon comparing the current offerings of the same subject to what we had then, I realized that what we had was quite demanding. Although I complained a lot about the workload, I did eventually develop an appreciation for the course, thanks to De Vries. The way it taught was by giving a series of problems-- you had to create a working program and then produce the needed output. There really is no way to learn programming and algorithms except by actually doing it.
At that time I had to rely on photocopies of the book, since I had no money to buy it. So imagine how happy I was when I dropped by C and E bookstore to find my friendly old textbook on sale. The price they were selling it for was ridiculous-- they were selling it for about 0.75 USD, so I bought all four remaining copies. I plan to use these books to teach a newer generation of undergraduates in the theory group the joys of programming in Fortran.