I examine various aspects of teaching and learning computer science. The research projects in my group deal with a variety of ages - from middle-school students to students in higher-education institutes - and in a variety of computer science topics, from basic topics to advanced and complex topics. Most of these research projects are done through the prism of fundamental ideas of computer science (such as abstraction, non-determinism, reductive thinking, reversing, and more). We characterize and identify such ideas and examine various frameworks for conveying them to students.