CS1 Logo (small)

CS1 Workshop Summary

CS1 fulfills numerous roles beyond simply teaching students basic programming and problem-solving skills. The course needs to attract and retain the interest of potential majors while providing non-majors with a coherent view of the discipline within a single course. This workshop aimed to address these larger issues for the course. We considered a variety of approaches for the presentation of the core content for CS1 and how the presentation of the material affects the engagement, understanding, and motivation of students from different backgrounds and with different goals. The techniques aimed to level the playing field between students with varying programming experience while at the same time give these students an understanding of the breadth of the discipline.

The schedule indicates what the individual workshop sessions were about. Each presentation has an associated abstract telling what the presentation topic was. Each presenter agreed to provide links to materials they use in their CS1 courses, and those links are now available for faculty who would like to see the materials and possibly use them in their own courses.

On the second day of the workshop, we split into three working groups, all of whom addressed two questions, and each of whom addressed some specific question(s). The groups reported back to the workshop body. Here we include a summary of the answers to those questions.


Working group notes: CS1 workshop

Editor: Christine Alvarado

Question 1: What are the core topics for CS1?  What concepts do we want our students to learn?  Why?

  • Problem solving: How to decompose a problem and compose a solution
  • Abstraction
  • Data representation
  • Algorithms:
    • Understand (describe) what one is
    • Design a (step-by-step) algorithm to solve a problem
    • Familiarity with classic algorithms: e.g, Find largest, GCD, binary/linear search
    • Programming: Translate an algorithm into a programming language
    • Hand-simulate an algorithm or code
    • Analysis and complexity
  • Control Structures
  • Recursion
  • Logical operations (formal logic?)
  • Specific data structures/types
    • Arrays
    • Primitives (ints, bools, floats…)
  • Testing 
  • Debugging
  • Social impact of computing (easy technique: use ACM Tech news, Moravian math dept: culture points—i.e. you have to find applications of CS topics in the real world)
  • Exposure to the central areas of study in CS (e.g., AI, OS, etc)
  • Communication (reading, writing, speaking technical information) 

Question 2: What programming languages should be used as a basis for those concepts?  Why?

The specific language choice depends on the particular situation, but you need at least one.
Suggestions:

  • Scheme
  • Scratch from MIT—application that implements a drag and drop language 
  • Ruby
  • Python
  • Java
  • C and/or C++
  • C# 
  • Alice

Environment that allows immediate interaction (supportive environment).
Suggestions:

  • Dr. Java
  • Dr. Scheme
  • BlueJ
  • BlueJ/NetBeans
  • IDLE (python)
Other environments:
  • Eclipse
  • Greenfoot
  • JGrasp

Either a language that supports multiple paradigms or multiple languages in the first three courses.

Group Question 1:  Should there be separate courses for CS majors and non-majors?  Why?

You have to decide based on the context of your institution.  Here are the common points:

  • Most students don’t know if they are majors or non-majors. Ideally, because students don’t know whether they are CS majors or not, there should be one course for them that conveys an essence of the discipline and also can prepare them for continuing in the curriculum.
  • CS1 should be for both majors and non-majors, but at some institutions there needs to be other courses e.g. service courses and courses that teach about how CS affects society.
    • Separation can help level the disparity in ability and incoming competence.
    • Non-programming courses may provide more opportunities for students to understand CS

Group Question 2: When should objects be introduced? Early, late, or never? Why?

Some thougts:
  • If you are using Java, introduce the use of objects early.
    • E.g., Strings, Scanner, GUI components, (good) graphics objects
  • You may choose to postpone object specification/creation (perhaps indefinitely)
  • Argument for early: Avoid the paradigm shift later.
  • Object does not necessarily mean Java object or C++ object.  The point is that the object is an abstraction.  If you step back away from the implementation, then the question is about what methods are associated with what data or package of data.


Group Question 3: What application areas are best for supporting the desired concepts?  What application areas are best for motivating students?

Teach what excites both professor and students.

Challenge: How to find the balance between breadth and depth:

  • How do you get breadth with substance?
  • How do you get depth while keeping all students' interest?
Possible solutions:
  • Multiple courses each with a single (distinct) focus 
  • A single course that addresses many topics


Sample course topics/courses:

  • Networking: Tom Murtagh, Williams College
  • Computer Science Unplugged: New Zealand
  • Games: Jessica Bayliss, 
  • Bioinformatics
  • Media Computation: Mark Guzdial, GA Tech; Tom Bressoud and Joan Krone, Denison University
  • Robotics
  • Social applications: Charles Kelemen, Privacy and Trust in Cyberspace, Swarthmore College; Sarah Baase, "Gift of Fire", UCSD
  • Breadth: Harvey Mudd College, Middlebury College

A couple of libraries/platforms:

  • Unreal Tournament
  • Greenfoot

Value of workshop:

  Not the core content as outlined, which is (mostly) agreed upon, but the approaches to presenting that material that also illustrate the discipline and reduce focus on programming.  Benefits of more accurate idea of CS and retain and motivate potential students to continue while also giving those that do not continue “liberal arts” ideals.

… then include abstacts for example approaches for the “how”

Other questions:

  • Should we introduce concurrency in CS1?
  • How do improve the reputation of CS?  
A sample course description:

    "Computer Science I: Algorithmic Problem-Solving and Abstraction

    [sentence motivating importance of computer science]

    This course will cover the fundamental concepts of problem-solving  and analytic [reasoning, thinking] with       applications in areas such as  _________ using a programming language [or specific language].

    No prior programming experience is expected."
  • How do we make CS more appealing to a diverse range of students (women, minorities)?  (Both appealing before they begin, and appealing after the finish)
    ---> make the course more interesting with a greater variety of real- world applications
    e.g., nifty.stanford.edu
  • How do we educate students, other faculty, the public about what CS is?