This course introduces students to key formal frameworks for understanding and designing intelligent systems. The course is broken down into two parts. During the first part (roughly 10 weeks), we closely examine computational models of cognition, develop a concrete sense of how these models can work in practice with the aid of hands-on exercises, and critically assess the adequacy of these models from empirical, computational, and conceptual perspectives. The second part of the course (roughly 3 weeks) provides students with the opportunity to choose how they want to build on the background gained in the first parts. In both renditions of the course, we spent these weeks discussing the social and ethical implications of the rapid growth in the design of artificial intelligence. The weekly robotics lab enables students to implement ideas from different approaches to AI using Arduino microprocessors. Sample exercises include constructing physical systems for automated discovery using symbolic heuristics, simple classification with perceptrons, and maze navigation using subsumption architectures.