Programming Principles II: Going Beyond the Basics