Creating a Disciplinary Commons in Computer Science

Course Portfolio

CS-210

Fall & Spring 2005-06

Ravi Gandham

Department of Computer Science
Bellevue Community College

Preface:

The course portfolio is developed as a result of my participation in Disciplinary Commons project. At this time it is somewhat a work in-progress and will be published for public consumption by the end of June 2006.

Course Overview:

The course CS210 (Fundamentals Of Computer Science I) introduces computer science and programming for CS majors. Students learn design and implementation of algorithms and programming in a structured, modular language, with emphasis on problem solving, program design, and style. This course is generally known and referred to as CS1 in other educational institutions. The programming language used to teach this class is C++. The prerequisite for this course is MATH 105 (Precalculus I) with a C- or better grade. This course is a prerequisite for and continued in a follow on course: CS211: Fundamentals of Computer Science II.

Intended Audience:

This course portfolio created mainly for my own understanding of how I teach and how I can make improvements going forward when teaching this and other similar courses. It is possible that some or all the things that are observed in this portfolio can be of help to other instructors, at other educational institutions, with their pedagogy when teaching similar CS 1 course. I also hope that this teaching portfolio will contribute to the repository of publicly available CS portfolios.

http://depts.washington.edu/comgrnd/

Course Objectives:

The general purpose of CS210 is to introduce students to programming with a strong emphasis on problem solving. I am planning to accomplish this by discussing various problem-solving methods, continuing on to design of programs, and finally implementing solutions using C++ language.

My main objectives are to teach students problem solving and beginning computer programming. Here are my goals to achieve this significant learning objective:

·       Make this class a positive and fun learning experience for my students. The goal here is to differentiate this class from other typical problem solving or programming classes.

·      Teach the beauty of problem solving combined with the power of computer programming. The students would be best served if both these activities were interleaved in a meaningful way.

·       Demonstrate constructing the solutions and programs using all techniques that the students have learned so far. My students should be able to apply the things that they’ve learned in this class when they take other Computer Science courses possibly using different programming languages.

Context:

Students

My students mostly map to BCC’s student demographics with couple of exceptions (BCC students at a glance). About 50% of my students are fulltime and most of them fall in to 25-32 yr age group. Even though BCC ‘s student population has about 60% female students, no more than 15% of my students are female. Since I teach this class in evenings, most of my students have a day job.  I do have some students in an older age group (>32 yrs) who generally fall in to worker retraining and/or on a job growth path by getting a college degree. Most of my students (>50%; >BCC Student average) are Engineering (Mechanical Engineering/ Electrical Engineering) or Computer Science majors trying to transfer to a 4-year college for a Bachelors Degree. Some of my students (<25%) already have knowledge of and experience in computer programming using a high-level language. Most of my students continue on to CS211, upon a successful completion of this course.

Constraints and Significance

I teach an evening class and as noted above most of my students have day jobs and are somewhat tired and distracted by the time of class and try their best not to “nods off” during the class. There are no computers in my classroom for students’ use as this is not a hands-on class. I am a part-time instructor with limited participation in day-to-day affairs of the CS department to be able to make high-level decisions regarding course content, selection of textbooks and scheduling. I should add that I do have significant control on course design and delivery. Over the last 3-4 years the student enrollment this class was dropping, mostly due to downturn in high-tech industry. This has a direct effect on the student participation and how team activities are organized. I find that a significant percentage (>75%) of students are weak in math and problem solving skills, even though they’ve met the course requirements for enrolling in this class.

Content:

Here is a fragment of Course Calendar (Fall 2005) showing first two week of planned classroom activities and assignments.

Class Dates

Lecture / Discussion

Reading Assignment

Week 1

Sept 20

Review Syllabus

Discuss Chapter 1, Q&A

Chapter 1: Introduction to Computers, Problem Solving, and Programming

Chapter 2: Overview of C++

Sept 22

Discuss Chapter 2, Q&A

Student Introductions

Week 2

Sept 27

Begin Chapter 3, Q&A

Discuss Program #0, Q&A

Chapter 3: Top-Down Design with Functions and Classes

Sept 29

Finish Chapter 3, Q&A

Quiz 1: Chapters 1 & 2

Program #1 & Problem #1 due

 

I tend to keep the “operations” simple: Less “clutter” in terms of day-to-day class activities, higher-level specifications for programming assignments, simplified submission requirements etc. I feel that this helps keep students’ focus and is confirmed by the positive feedback from students. While this is good, it also sometimes leaves things open for interpretation and can create confusion/miscommunication. These instances are rare.

 

Methods:

My Role:

Here are my classroom activities.

The main classroom activities are: Brief lecture, Presentation of the chapter materials, and Summary. All of these are interspersed with discussions.

I start every class by spending a couple of minutes going over the class timeline, as described in the course syllabus.

At the beginning of every chapter, I spend 5-10 min by talking to my students about what we are going to learn in that particular chapter and how it fits in to what they’ve already learned. I pose them some “what-if” and “how” questions to highlight the importance of the things that we are trying to learn. This is followed by 15-20 PowerPoint slides that present the chapter materials in a comprehensive and logical order. Students are encouraged to ask and answer questions. I ask them questions throughout this presentation. This is followed by a brief summarization of all the things that were discussed. This completes the delivery of the chapter materials.

Now it is time to practice the concepts that were learned. The students are asked to solve simple logical problems (4-6 per chapter) and implement their solutions in C++ using the concepts that they’ve learned in this and previous chapters. They were given 10-15 min to complete each of these problems. Once this time is up, I demonstrate problem solving and coding the solutions, sometimes using different ways and means of arriving at the final solution. Students are encouraged to ask questions and reconcile the solutions they’ve come up with my solution(s). Time permitting, this process is repeated for solving all problems.

Other activities in my classroom are, administering exams, going over exam solutions when passing them back, describing the requirements and specifications of assignments.

Students' Role:

Students are mostly listening and taking notes. They are participating by asking and answering questions. During the practice session, they are engaged in problem solving and coding solutions. Students were also given some free time (about 10 minutes) at end of most class periods to discuss any questions they might have, on subject matter and on homework assignments, with other students and me. This seems to help as I observed that most students stay around and talk with each other. I also notice that some students, who are seem to be nervous talking to me, are at ease when discussing things with their classmates.

Why use these above teaching methods?

Synchronizing to course timeline is done to keep us all on the “same page” in terms of what had happened, what is planned for the day/week and what is due. This is done to set the expectations of the students.

The brief lecture helps me to logically tie chapter materials, and, at the same time, enthuse the students to learn by highlighting the importance of new materials.

The presentation enables me to deliver the course materials (refer to constraints/context for more on this) to the students in a given timeframe.

The constant discussions are meant to keep all students engaged and, some “slower” students “at par” with rest of the class.

The summary is to package all the things that were promised and discussed in that chapter.

The practice session with demo provides an opportunity for the students to tryout the things that they’ve just learned. This helps them to better digest the concepts.

How are they related to my teaching objectives?

My main course objective is to teach the students the logical problem solving combined with power of computer programming. Both of these emphasized in my teaching methodology.

What sort of evidence of student learning will they yield?

By end of that chapter and before beginning the next chapter, the students will have a good understanding of what is being taught and how it fits in with what they’ve learned before in previous chapters. They are able to apply this knowledge in solving problems and coding solutions, at that level.

How I would teach a particular unit – Repetition Control Structures

(Teaching materials/content goes here)

Teaching Philosophy:

What do I believe about student learning that shapes my decisions about goals, course design, methods, etc. related to this course?

Here are some of the most important learning traits of my students:

What is my philosophy for teaching this course?

I loved it when I was a student. I was fortunate enough to have been taught by teachers who understood my learning needs and desires and patiently explained the concepts in a simple and practical way. They expected me to build on my existing foundation of knowledge and challenged me to solve larger problems. They further encouraged me to fine-tune and polish the solutions. I simply want to be like them as a teacher.

I would ease my students in to being comfortable with the learning atmosphere, by making the learning process simple. There would be few basic rules and activities in the classroom. I would like to “provoke” my students to make connections to between all things that they know to the new concepts that were being introduced. Everyone is encouraged to interact with the class and me by asking and answering questions. I will provide a forum for discussions so that we can all learn from one another. I have a lot of enthusiasm for developing and solving problems that can be used to demonstrate the concepts discussed in class.

After involved in teaching this course over the last few quarters, I now understand the difficulties my students sometimes have in understanding, organizing and completing the work required to finish programming projects. I will be available to empathize with and help them.

My goal as a teacher is that I want my students to gain the necessary knowledge to be able to apply it for solving problems in their future studies and in the real world. There is nothing more gratifying than this for me. It makes me a teacher!

Evidence of Student Learning:

Why did I choose this work to include?

I collected samples of a final examination and last two programming assignments. In this class, the student learning is represented and assessed by their performance in examinations and programming assignments.

What is its significance?

The final examination is comprehensive and is from all chapter materials that were discussed in class. The students are expected to apply the problem solving strategies and concepts of C++ in completing the assignments. The last two assignments deal with problems of larger scope involving the use of divide-and-conquer and object-oriented design and development principles. They are expected to capture and to represent the sum total of all things that were learnt in this class.

What does it tell me about student learning?

Examination of these selected items will indicate the basic knowledge of problem solving and C++ language. In addition, it should reflect the aptitude of students to be able to “construct” solutions, when solving problems of non-trivial nature, from the basic building blocks of problem solving and C++ programming.

Assessment:

CS210 students are assessed by how they perform in quizzes, programming and problem solving assignments. Quizzes are the most rigorously graded in terms of penalizing and providing feedback to the students. The solutions to the quiz questions are discussed in the class, when they are handed back to students. When grading programming and problem solving assignments, the students are given a significant credit for their effort and fulfillment of the requirements of the assignment. This “effort” is evident from the included summary and other submission materials. Some additional aspects observed and graded are: working code, problem solving decisions, design process, generality of code, test cases and sample runs.

My intention when assigning and assessing these exercises is that I want my students to learn from them to be able to apply and scale what they learn in this course to later courses and professional life.

Here are some common examples of grading comments. These are collected from assignments that were graded.

 

Programming errors

 

Programming Assignment #2: Simple calculator

 

Coded without a stopping condition

 

while (TRUE)

{

       code…

}

 

Grading comment:  There is no stopping condition. This will go on forever, and there is no graceful way of ending this. Need to change the Always TRUE condition to the check if the input parameter is ‘q’ (see requirements and sample output in the assignment).

 

while ((Op != 'q'))

{

       code…

}

 

Programming Assignment #3: ISBN Validation

 

Student code only processes until second last character in the string

 

//process 1 - 9 digits of 10 digit isbn string

 

              for (int i=0; i < isbn.length(); i++)

 

Grading Comment:  The For loop is executed as long as the check (second test) is true. That means, the loop starts wih i=0, and the number of times it will run is equal to the number of characters in the string. Instead it needs to run 1 less character, so need to change the check condition to: i < isbn.length()-1;

Correct code is: for (int i=0; i < isbn.length()-1; i++)

 

Programming Assignment #5: Lunar Lander

 

Validation of data by the class not implemented resulting in a possible GIGO.

 

{

cout << "Velocity Value in meters/sec : ";

cin >> spd;

}

 

Grading Comment: You need to check the values being input to make sure they fall in the acceptable range of values that the program can handle. Also would be helpful to provide the acceptable range of value in the input prompt, like:

 

{

       cout << "Velocity Value in meters/sec – Range 1 - 100 : ";

       cin >> spd;

       while ((spd < 1) or (spd > 100))

       {     

cout << “Incorrect value for Velocity”

cout <<” Please enter a Velocity value between 1-100.”; ";

              cin >> spd;

       }

}

 

Programming Assignment #4: Book Catalog

 

Deleting a book/contact record that was in an array data structure; Lack of a variable to keep track of the current count of valid records and array now contains dummy and non-existent records, interlaced with valid records. This leads to inefficient design of having to check the validity of the data by comparing against some system defined ‘dummy data’.

 

Grading Comments:

When records in the array are deleted, the array needs to be managed as such. One strategy is to copying the records up, overwriting the deleted record, and updating the counter variable to indicate total number of records.

When deleting a records/entry from an array, by just setting the data values to dummy is not enough. That will lead to inefficient design and problem when saving the data to permanent storage, and then when reading the data back, additional code will be needed to check if the data is valid or not (say by comparing against some code defined dummy data code).

A possible strategy would be to:

1. Use a counter variable to keep track of how many valid or active records are there in the array.

2. Move the records up, overwriting the deleted record.

3. When storing data permanently, store the counter variable also, to allow you to read back only actual active records.

 

Quality/Efficiency/Style Issues

 

Programming Assignment #5: Lunar Lander

 

Time is defined as a data-member; Incorrect abstraction.

 

class lunar

{

public:

       lunar();

       lunar(float ffr, float spd, float alt, float f,

       float m, float maxffr, float th);

       float get_fuelFlowRate() const;

       float get_speed() const

. . .

 

private:

       float fuelFlowRate;

float speed;

float altitude;

              . . .

       float Time;

};

 

Grading Comment: Time is a variable that is independent of the Lunar Lander class abstraction. To store it in as a private data member is incorrect, since it is not contained or a component of the class. Instead it is a global variable of and whose value is supplied by the user of this object. The object then uses this value to “run” the Lander.

 

Conclusion

My main objective of this course was to teach problem solving on the way to teaching programming. Students are expected to learn problem solving techniques and C++ language aspects to be able to combine them to program to realize the power of computing. This will help with them with when pursuing further CS education and in IT jobs. I found that this is difficult, if not impossible, for me to achieve, because of, the lack of student aptitude, due to lack of sufficient time and resources, due to excessive students’ interest in learning a particular programming language rather than the programming concepts, and, finally but not the least important of the reasons, the deficiency of pedagogical practices employed by me, namely, not spending enough time on problem solving and/or spending too much time on language aspects, not incorporated these design requirements in to and not assessing the usage of these in programming assignments. By following the feedback design principles, to balance this desire with reality, I need to both temper this course objective and incorporate the “missing” practices.

Changes to Make

I am planning to make the following changes to this course: