I would recommend the classic book Structure and Interpretation of Computer Languages. Its available for free online. It is the book taught at MIT. I do want to say it's not easy after the first couple of chapters. The videos are available online as well. But this is a great way to start.
Professor Felleisen is an amazing professor, I had him for the fall semester for "Fundamentals of CS 1" and he really pushed you. Then his higher level course, "Software Development", I hear that he radically changes the requirements at the last minute. I guess that's to help you learn how to design a solid program in the beginning and then be able to easily change it down the road. It's supposed to be more like the "real world" (but I'm not quite sure when I'll get there).