This second course in a two-part series introduces the principles and practices of software design, basic data structures, and the historical and social aspects of computer science. Programming topics include a review of foundational programming concepts covered in the first course, exception-handling, recursion, linked lists, stacks, queues, priority queues, binary trees, graphs, and advanced sorting algorithms. Special attention will be placed on efficient algorithm design and Big-O notation. Additional topics cover historical and social aspects of computer science with implications for the future. The concepts are utilized in numerous activities in the course. This course is targeted at in-service K-12 teachers who intend to teach computer science in their schools and school districts.