Programming Fundamentals: Understanding What Your Code Actually Does