Preliminary curriculum objectives
These are my preliminary ideas for creating a curriculum for a summer enrichment program for middle school and high school students who are interested in computers and computing. Comments on the curriculum objectives below are very much appreciated.
1. Expose students to the profession of computing
1.1. Distinguish between using programs (power user) and writing programs (software developer)
Students in introductory computer programming courses tend to be power users and computer generalists seeking to advance their computer skills. However, programming a computer is very different from using a computer. In this curriculum, we seek to make that distinction and help them decide for themselves if computer programming is something they wish to pursue beyond the course.
1.2. Explore and differentiate possible career and university paths
The computing profession includes: computer science, information systems, information science, software engineering, computer engineering, database engineering, network engineering, systems engineering, software architecture, human-computer interface design, computational science, computational statistics, numerical modeling, and library science. Clearly, the profession of computing offers vast choices in further study and work. However, students at the middle school and high school level are not aware of these choices, and do not become aware until after they commit to an undergraduate program at a university. We wish to share these choices and possibilities with students and encourage them to seek what truly interests them.
1.3. Share vision and examples that good designers are well-rounded and incorporate elements of many arts and sciences
The best problem-solvers and designers start first as users, then draw from their own experiences in the arts and sciences as well as their teammates. Most introductory courses consist of students working alone to solve small, well-defined assignments that have little to relate to the real-world. In reality, professionals do the opposite; work in teams on large systems that are not well-defined and require knowledge from many domains of interest.
2. Promote problem modeling and solving skills of every student
2.1. Introduce students to programming as a skill that builds on practice
Learning to program is analogous to learning how to write poetry or how to write music. It requires a lot of practice and self-evaluation, and we seek to instill this notion in all of the students.
2.2. Introduce students to object-based thinking and programming
In our experience, we find that students who start with procedural programming techniques and move to object-based techniques have a much harder time transitioning compared to students who learn object-based techniques before procedural techniques. By exposing students to objects early, they use objects long before they design them. That way, when they do design objects, they will understand how a user would feel about the quality of the design. We will not spend any time on object theory and terminology. We will focus only on concepts and practice.
2.3. Reinforce the notion that programming is part of a larger problem solving process
When a problem is presented, the instinctual response is to go straight to the computer to start coding a program. Although this may work for small, well-defined programs, this rarely works in practice. We will show students how to formulate the problem clearly, conceive a plan to solve the problem, then solve the problem by writing a computer program. Beyond writing the program, students will ask themselves “Did I write the program correctly such that it runs without error?” and “Did I write the correct program to solve the original problem?” Again, we will not focus on the software engineering theory, but rather just practice good problem solving skills, with guidance from the instructor.
3. Provide students with a fun and enriching class and lab experience
3.1. Encourage creativity and teamwork in the classroom
Programming is inherently a creative activity in two respects: devising elegant algorithms to solve a problem clearly and succinctly, and drawing on other knowledge and experiences to devise a solution. Instead of limiting solutions to one individual’s knowledge and experiences, we will encourage collaboration between individuals in the classroom and foster an environment that encourages participation and positively reinforces out-of-box thinking.
3.2. Solving several open-ended problems and evaluating tradeoffs, good and bad
Except for in the classroom, there are few problems where there is only one solution. We will encourage each student to solve problems based on their own judgment and feedback from any collaboration they participate in. However, the students are still beginners and we will make sure that students do not plow forward with a solution that will obviously not work.
3.3. Provide a programming environment geared towards interests of the students
Students in the current generation are very visual in their thinking and interests (video games, movies, graphical computing environments). As a result, we will provide a programming environment that is very visual where students can view themselves as a movie director, game designer, or program designer out to solve a problem and produce a known desired result. In addition, the programming environment will have many parallels to the physical world so students can relate their knowledge and experience into the programming environment. This is a contrast to industrial programming environments, which assume the developer is already aware of the model of computing: hardware, programming languages, operating systems, etc.
4. Provide students with a means to continue exploring after the course is over
4.1. Provide course materials and software for students to use after the class is over
All of the course materials will be made available on the Web via a Creative Commons License, where the school, the students, as well the general public can use the material freely as long as authorship credit is maintained in the material. The school will receive credit in the work as well as the developer(s) of the course material.
4.2. Provide students with resources to explore related academic and career paths
Handouts and/or links on the Web will be provided for the students to explore college and university programs related to the computing profession. In addition, narratives of professionals in the computing profession will be provided for students to read on the Web if they are interested.
4.3. Provide sufficient background in the course for the student to transition to an industrial-strength programming language in subsequent coursework or self-enrichment
The programming environment, although geared for beginners, will focus on object-based thinking, algorithmic thinking, and aids students in the debugging process. These concepts will carry over to industrial-strength languages, with only the programming environment changing from a graphical one to a textual one.


