University of Virginia Computer Science
CS150: Computer Science, Fall 2005

CS150 Syllabus

Course Objective. The goal of this course is to teach students with no prior experience in computing to think like computer scientists.

The course is designed to enable students to appreciate, use and understand ideas at the core of computer science. This course covers ideas that will be useful and interesting to students, whether or not they major in computer science.

Course Description. In the past hundred years, computer science has changed the world more than any other field. Without nuclear Physicists, World War II may have lasted longer, but without computer scientists the other side may have won. Without computer science, humans would not have walked on the Moon, modern medicine would not exist, and Wal-Mart would be a small store in Arkansas.

But this course is not about the pragmatic impact of computer science; it is about how computer science changes the ways we think, solve problems and understand the world. Despite its name, computer science has very little to do with the beige boxes we call computers, and it is far from being a science. It has more in common with music and mathematics than it does with science or engineering. At its core, computer science is the study of imperative knowledge. Whereas mathematics is all about declarative knowledge ("what is"), computer science is all about "how to" knowledge.

Computer science is the study of how to describe and predict properties of information processes. Most of what we know about describing information processes stems from three simple ideas:

  1. You can define things in terms of themselves (recursive definitions).
  2. You can treat procedures and data as one and the same (first class procedures).
  3. When you give something a name, it becomes more useful (abstraction).
Although these ideas are simple, they have profound implications that it takes many years to fully appreciate.

The kinds of properties we want to predict about information processes include whether or not there is a procedure that can always solve a given problem (computability), and how much time and space will be required to solve a given problem (complexity).

Expected Background: This course is open to students with no prior background in computer science or programming, but appropriate and challenging for experienced CS majors also. The only background we assume is:

Meetings: Mondays, Wednesdays and Fridays at 1:00-1:50 pm in THN E316.

Books: There are two required books for this course:

We will not cover all of either book, but will cover most of Chapters 1–4 of SICP and most of Part I of GEB. There will also be a few additional readings.

Web page: This page is updated often and students are expected to visit it regularly (almost every day). All lectures, notes and assignments for the course will be posted on the web site.


David Evans (, phone x2-2218, Olsson 236A). My office hours will be posted on the course website.

Assistant Coaches:
David John Faulkner (
Daniel Scott Upton (

Email: Send mail to to reach the whole course staff.


Problem Sets. There will be eight problem sets that involve both written questions and programming problems. Some problem sets will be done by small groups of students. For almost all students, doing the problem sets will be the best way to learn the course material.

The expected problem set due dates and topics (which are subject to change) are:

Unless noted otherwise, problem sets are due at the beginning of class (1:00 pm) on the day they are due.

Quizzes. There will be several short in-class quizzes throughout the semester. These may or may not be announced in advance. Except in unusual circumstances, these will have no effect on your grade. Instead, they are used to allow you and I to determine if important concepts have been understood throughout the semester.

Exams. There will be two exams during the semester and a final. All exams will be open book and open notes. All exams will be take-home unless I have any reason to believe there are any untrustworthy students in this class.

Collaboration Policy

Your fellow students are your best resource. Except on Exams and some Quizzes which are done individually, students are encouraged to discuss readings and assignments in study groups. Some assignments may have a specific collaboration policy, which should be explained clearly on the assignment. If this is ever unclear, ask to make sure before proceeding.

Students are also encouraged to consult outside sources, including human experts. Always list the resources you used (students, outside experts, papers, web sites) on your submission. The only resource you may not use are CS150 problem sets from previous semesters of CS200. It is to your advantage for the course staff to be able to reuse effective assignments from previous semesters, and important that we can trust you to no abuse those materials.

All students are required to sign the course pledge, which applies to the entire course.


Language: Formal Systems and Languages, Rules of Evaluation

Be able to identify the primitives, means of combination, and means of abstraction for a language; describe a language using BNF or RTN; determine the set of the surface forms in a language described by a BNF grammar or RTN; determine what a surface form in a language means if you are given evaluation rules for the language; determine the value of a Scheme expression following the rules of evaluation.

Recursive Definitions

Understand a recursive definition; solve a problem by defining a procedure recursively; reason about the process produced by evaluating an application of a recursively defined procedure; define and understand procedures that take procedures as parameters; define and understand procedures that produces procedures as results.

Programming with Lists

Define procedures that manipulate lists, use and understand procedures that traverse lists.

Programming with Mutation and Objects

Define and understand procedures that use mutation; draw environment diagrams; explain what environment diagrams mean; define procedures that create objects; explain a class hierarchy; define procedures that use inheritance; explain how a method is selected given class definitions.

Metalinguistic Abstraction

Understand an evaluator; modify and evaluator to change the meaning of a language; explain why the difference between eagar and lazy evaluation matters; explain the advantages and disadvantages of static type checking; understand an evaluator that does static type checking.

Programming for the Internet

Measure the latency and bandwidth of a network; explain the advantages and disadvantages of packet switching; make a dynamic web site; construct a SQL command to select or insert data in a database table; learn a new language given a BNF grammar and an informal description of its evaluation rules.