If you've taken recent programming classes, then I'm assuming that you took courses in C++ and some higher level languages. If this is the case, I suggest you look into
NESHLA.
On the other hand, if you want to get near and dear to your NES, you'll want to program in 6502 assembly. If you don't know that, go ahead and start learning. I have some time in programming (not officialy of course, just a little schooling), and I've been finding it hard to think in terms of the
machine as opposed to 'If' statements and the like. I find it more interesting to try and learn in this way. I haven't been studying like I should though
Check out the
main page of this site and start scanning through some of the documents there to get an idea, but I suggest learning 6502 assembly first. There's a book by Rodnay Zaks that's pretty good for that. It's called 'Programming the 6502' (go figure). It's something else
EDIT: Celius beat me to it