Course Descriptions

All courses are four credits unless otherwise specified.

COMP 141: Computer Science I: Programming Fundamentals
Prerequisites: None. Normally offered every fall and spring.
An introduction to the fundamental concepts and practices of procedural programming. Topics include data types, control structures, functions, arrays, files, and the mechanics of running, testing, and debugging. Emphasis is placed on program design and problemsolving techniques. The course also includes an introduction to the historical and social context of computing and an overview of computer science as a discipline.

COMP 142: Computer Science II: Object-Oriented Programming
Prerequisite: COMP 141. Normally offered every fall and spring.
An introduction to the fundamental concepts and practices of object-oriented programming. The object-oriented programming paradigm is introduced, with a focus on the definition and use of classes as a basis for fundamental object-oriented program design. Other topics include an overview of programming language principles, simple analysis of algorithms, basic searching and sorting techniques, and an introduction to software engineering issues.

COMP 172: Discrete Structures for Computer Science
Prerequisite: COMP 141. Normally offered every fall and spring.
An introduction to and survey of the mathematics used in computer science including functions, relations, sets, counting, logic, Boolean algebra, proof techniques, induction, recursion, computational complexity, and computability. Other topics may be included as time permits.

COMP 231: Introduction to Computer Organization
Prerequisite: COMP 141. Normally offered every spring.
A bottom-up exploration of the interaction between computer hardware and software. Topics begin with an introduction to digital logic, and continue through elementary processor design, to assembly language, machine data representation, and computer arithmetic. Other topics in contemporary computer architecture such as multicore processors and GPGPU’s may be discussed as time allows. Projects include hardware and simulated digital circuits as well as programs in assembly language.

COMP 241: Computer Science III: Data Structures and Algorithms
Prerequisites: COMP 142 and COMP 172. Normally offered every fall and spring.
An introduction to the fundamental concepts of data structures and the algorithms that arise from them, using the object-oriented design paradigm. Data structures covered include stacks, queues, linked lists, hash tables, trees, and graphs. Other topics include an introduction to iterative and recursive algorithmic strategies and basic algorithm analysis.

COMP 251: Introduction to Computer Systems
Prerequisite: COMP 142. Normally offered every fall and spring.
This course is an introduction to system-aware computer programming. Beginning with an overview of the fundamental elements and concepts that are common to all computer systems, including computer architecture, operating systems, compilers, and networks, students will learn how these affect the performance and behavior of computer programs. Additionally, students will learn a system-level programming language and set of tools for writing low-level programs at the operating system boundary. Students completing COMP251 will be prepared for advanced topics in systems, including operating system programming, parallel and distributed computing, and networking. Topics include: memory management and organization; caching and the memory hierarchy; system calls; network programming and I/O; processes, threads, synchronization, and concurrency; performance analysis and measurement; and debugging.

COMP 265: Computer Science Professional Development (1 credit)
Prerequisite: COMP 241 and permission of instructor. Offered as needed.
This course is designed to help students prepare for meaningful computer science-related internships and careers. Key areas of focus are: (1) How to network effectively using such tools as LinkedIn; (2) Preparing for computer science interviews; (3) How to use Rhodes resources for career planning; (4) Creating effective resumes; (5) How to leverage internships for career development. Enrollment by permission of the instructor.

COMP 315: Computer Networks
Prerequisite: COMP 251. Offered every few semesters based on student interest and instructor availability.
An introduction to the structure and components of computer networks, packet switching, layered architectures, loosely coupled computer communication, network services and protocols, as well as the analysis of generic network models. Topics include: network topologies, router architectures, network-aware applications, content dissemination systems, network security, and performance issues.

COMP 320: Computer Graphics
Prerequisite: COMP 241. Offered every few semesters based on student interest and instructor availability.
Coverage of the basic concepts of 2D and 3D graphics, including an overview of graphics hardware, use of a graphics application programming interface, user interface design, techniques for computer animation, and graphical algorithms such as geometric transformations, clipping, windowing, hidden surface removal, and raster graphics techniques for the representation of curves, surfaces, and solids.

COMP 322: Computer Vision and Image Processing
Prerequisite: COMP 241. Offered every few semesters based on student interest and instructor availability.
An introduction to computer vision, a discipline that develops methods to interpret and analyze images and videos. This course will focus heavily on computer vision as it relates to image processing, covering topics such as the characterization and representation of digital images, image enhancement, image restoration, image analysis, and image segmentation. This class will also highlight other classic computer vision topics such as object detection, three-dimensional reconstruction, and tracking and motion estimation. Students will also look at real world applications of these techniques including facial recognition, medical image analysis, robot navigation, and computational photography.

COMP 325: Graphics, Virtual Environments, and Human Computer Interaction
Prerequisite: COMP 241. Offered every few semesters based on student interest and instructor availability.
An introduction to the basics of 3D computer graphics, virtual environments (VEs), and human-computer interaction (HCI). Fundamental graphics topics include ray-tracing, 3D modeling, animation, lighting, rendering, cameras, and more. Topics will also include how to interact with and experience a 3D model using the input and output devices that are typically found in a VE system (like the Oculus Rift). This project-based course will focus on using hardware and creating software for VE applications with fundamental HCI principles in mind.

COMP 330: Operating Systems
Prerequisite: COMP 251. Suggested prerequisite: COMP 241. Offered every year.
An introduction to the fundamentals of operating systems design and implementation. Topics include the process model and implementation of processes, an overview of the major components of a modern operating system, mutual exclusion and interprocess synchronization, a survey of scheduling algorithms, memory management techniques, and file systems.

COMP 340: Databases
Prerequisite: COMP 241. Offered every few semesters based on student interest and instructor availability.
An introduction to the design and use of database systems, as well as the key issues in building such systems. Topics include the relational model, logical database design, query languages, and database implementation issues such as storage and indexing, query processing and optimization, concurrency control, and transaction management. In addition to traditional database topics, this course provides an introduction to key technologies for managing and exchanging data on the World Wide Web.

COMP 342: Bioinformatics
Prerequisite: COMP 241. Offered every few semesters based on student interest and instructor availability.
This course is an introduction to the fields of bioinformatics and computational biology, with a central focus on algorithms and their application to a diverse set of computational problems in molecular biology. Fundamental concepts from computer science such as greedy algorithms, dynamic programming, recursion, and asymptotic notation will be taught within the context of motivating problems drawn from contemporary biology. Example biological topics include sequence alignment, motif finding, gene rearrangement, DNA sequencing, phylogeny, and gene expression analysis.

COMP 345: Data Mining
Prerequisite: COMP 241. Offered every few semesters based on student interest and instructor availability.
An introduction to data mining and knowledge discovery. Data mining concerns itself with the goal of getting a computer to learn or discover patterns, especially those found within large datasets. Students will be introduced to various models and learn how to apply them in practice. Topics include classification, clustering, association rules, and recommender systems.

COMP 350: Theory of Computation
Prerequisite: COMP 172. Normally offered every year or every other year. At least one of COMP 350 and 355 is offered every year.
A study of theoretical models for computing. The hierarchy of finite state machines, pushdown machines, context free grammars, and Turing machines will be analyzed, along with their variations. The basic concepts of decidability, complexity theory, and NP-Complete problems will be introduced.

COMP 355: Advanced Algorithms
Prerequisite: COMP 172 and COMP 241. Normally offered every year or every other year. At least one of COMP 350 and 355 is offered every year.
An in-depth study of the design and analysis of advanced algorithms, including the performance tradeoffs and resources required by various algorithmic implementations. Major classes of computational problems will be identified and explored. Advanced data structures and approximation heuristics are introduced as required for solution design. Topics vary depending on the specific problems covered but will include the Master Theorem, dynamic programming, divide-and-conquer and greedy algorithms.

COMP 360: Programming Languages
Prerequisite: COMP 241 and COMP 251. Offered every few semesters based on student interest and instructor availability.
A wide-ranging and in-depth coverage of fundamental programming language concepts, presenting design issues of the various language constructs, and examining the design choices for these constructs in a range of the most popular contemporary programming languages. Language design alternatives are examined and critiqued. Methods of syntax description, common approaches to describing the semantics of programming languages, and various implementation approaches are covered.

COMP 362: Compiler Construction
Prerequisite: COMP 251. Recommended: COMP 231 Offered every few semesters based on student interest and instructor availability.
Introduction to programming language structure, lexical analysis, syntax analysis, code generation, error recovery and optimization. Students will be introduced to introductory topics in compiler theory and practice. Topics covered include lexical analysis, parsing methods, syntax tree generation and traversal, code generation, and optimization.

COMP 367: Programs and Proofs with Dependent Types
Prerequisite: COMP 142 and (COMP 172 or MATH 201). Offered every few semesters based on student interest and instructor availability.
An introduction to writing computer-verified software and proving mathematical theorems using dependent types. Students will learn to write code using a dependently-typed functional programming language, both to create programs with built-in proofs of correctness and to prove mathematical truths. A main theme of the course is the connection between types and programs on one hand, and propositions and proofs on the other. Other topics include functional programming, algebraic datatypes, and constructive logic. Students who do not meet the COMP 142 prerequisite but have other forms of programming experience are encouraged to reach out to the instructor about enrolling in the course. (more info)

COMP 370: Human-Robot Interaction
Prerequisite: COMP 241. Offered every few semesters based on student interest and instructor availability.
This course focuses on the emerging field of human-robot interaction, bringing together research and application of methodology from robotics, human factors, human-computer interaction, interaction design, cognitive psychology, education, and other fields to enable robots to have more natural and more rewarding interactions with humans throughout their spheres of functioning.

COMP 372: Artificial Intelligence
Prerequisite: COMP 241. Offered every few semesters based on student interest and instructor availability.
An introduction to the basic knowledge representation, problem solving, and learning methods of artificial intelligence (AI). Students study the core algorithms and data structures used in AI, abstract real problems into the prototypical tasks that have been studied in AI, and learn to map between abstract tasks and the basic AI techniques that address them.

COMP 375: Machine Learning
Prerequisite: COMP 241, and at least one calculus course (e.g., MATH 112, 115, 116, or anything beyond). Offered every few semesters based on student interest and instructor availability.
Machine learning is the practice of programming computers to learn and improve through experience, and is becoming pervasive in science and technology. This course will cover the mathematical underpinnings, algorithms, and practices that enable a computer to learn. Topics will include supervised learning, unsupervised learning, and the evaluation of learning algorithms. Students will write computer programs and apply course skills to solve real-world prediction and pattern recognition problems.

COMP 380: Parallel Systems
Prerequisite: COMP 251. Offered every few semesters based on student interest and instructor availability.
An introduction to concurrent programming models and parallel computer architectures. Students will learn the basic techniques of parallel program design, implementation, and performance analysis. Topics include shared-memory and distributed-memory systems, parallel and distributed algorithms, and high-performance computing.

COMP 385: Distributed Systems
Prerequisite: COMP 251. Offered every few semesters based on student interest and instructor availability.
An introduction to modern distributed systems and how such systems enable the construction of large-scale and highly-available software. Students will explore foundational topics (e.g., consensus, consistency, and fault tolerance) as well as applied (distributed file systems, cloud computing, data processing and analytics systems).

COMP 451/452: Research in Computer Science (1-4 credits)
Prerequisite: permission of instructor. Offered as needed.
Qualified students may conduct original research in computer science under the supervision of a faculty mentor. A student may use four combined credits from 451 and 452 towards one upper-level major elective. Students should expect to commit at least three hours per week per credit.

COMP 455: Readings in Computer Science (1-4 credits)
Prerequisite: permission of instructor. Offered as needed.
This course allows students to do advanced work not provided for in the regular courses. Its content will be fixed after consultation with the student and in accord with his or her particular interests.

COMP 460: Internship (1-4 credits)
Prerequisite: permission of instructor. Offered as needed.
Internships in Computer Science, which are normally arranged by the Director of Career Services, permit a qualified student to receive academic credit for off-campus work experience. Upon completion of the internship, the student makes written and oral reports focusing

COMP 461: Professional Development for Paid Internship (1 credit)
Prerequisite: permission of instructor. Offered as needed.
The purpose of this course is to allow students to complete their F11 while simultaneously completing a paid computer science internship. The idea of this class is analogous to COMP460 where students work for academic credit and complete an F11 component through Rhodes. This course carries one hour of credit that is awarded on a Pass/Fail basis and requires that a student be involved in an off-campus paid internship.

COMP 465: Special Topics in Computer Science (1-4 credits)
Prerequisite: varied depending on course content. Offered as needed.
An occasional offering of topics not covered in the existing computer science courses. Examples of topics include machine learning, compilers, and cybersecurity.

COMP 485: Senior Software Engineering
Prerequisite: senior standing. Offered every year.
The software systems we often find the most useful and magical are also the largest and most complex to build and understand. In order for these systems to be reliable, maintainable, and secure, they must be built according to disciplined and well-founded methods. This course examines these methods—both in the large (defining requirements, system design, architecture patterns, software process, etc.) and in the small (version control, testing, benchmarking, code review, etc.). At the same time, students will engage in the construction of a large software system or feature.

COMP 486: Senior Seminar
Prerequisite: senior standing. Offered every year.
Students embark on a semester long group project. Each team will produce a robust, scalable, and maintainable large-scale piece of software based on the project proposal completed in COMP 485. In addition to collaborating on a specific project, students present material on a wide range of software development topics, including software engineering, professional ethics, and current trends in languages, tools, and methodologies. As a senior seminar, the course has a strong problem-solving focus, encourages student participation and leadership, develops communication skills, and stresses integration of the student’s full undergraduate experience.