The Computer Science department offers multiple ways to begin study of computer science, suitable for students considering a computer science major or minor, those who may want to use computing within another major, and those who are curious about computer science and want to start with an introduction that is not programming-intensive.
For students considering a major or minor in computer science:
If you are interested in a major or minor in computer science, the recommended entry point is any COMSC-151 offering. This is a programming-intensive course introducing the use of computers as a problem-solving tool. There are a variety of COMSC-151 offerings (for example, COMSC-151CP, COMSC-151DS, and COMSC-151HC) which all cover the same essential material but with differing motivating examples.
Students with prior programming experience may take a placement test to determine eligibility to skip the above and start with COMSC-205.
COMSC-100 Computing and the Digital World
An introduction to basic computer science concepts. Lectures will cover topics such as the origins of computing, computer architecture, artificial intelligence, and privacy and security. There will be some programming exercises.
COMSC-106 Fundamentals of Applied Computing
Have you ever used Google's image search tool and wondered how the search results were found? Why is it so difficult for a computer to "see" as we do? Computer scientists are actively researching how to approach this challenge of "computer vision." This course will introduce the fundamentals of applied computing using computer vision as a motivating theme. Students will learn foundations of programming (in the Python programming language) before working with computational tools more independently.
COMSC-107 iDesign Learning Lab
When charting a path through college and beyond, a metacognitive framework can provide scaffolding for intentional reflection. Situated in the Fimbel Maker & Innovation lab, this course will leverage tangible activities to ground discussions on factors and strategies that impact learning. For example, embedding a microcontroller to create motion-sensitive lights in a ballet skirt parallels the cycle of self-regulated learning. No prior experience with electronics or computer science is assumed, and students will work with hands-on tutorials that teach the basics required to develop their own interactive technology projects.
COMSC-109 iDesign Studio
Designers are continually innovating ways of incorporating technology into today's world, from projections of butterflies on Grammy performance dresses to "smart" purses that sense when your wallet is missing. The recent emergence of low-cost, user-friendly components is making this new world of design accessible to a broad community. In this course, students will think critically about products already in the marketplace and will be given the tools to create their own designs. A sequence of hands-on workshops on electronics basics and microcontroller programming will provide the surprisingly minimal level of comfort and background in technology required to produce prototypes of these designs.
COMSC-120 Introduction to R
An introduction to the programming language R and how it can be used for statistical analysis and visualization of data. Students will learn how to write basic R programs that can read, write, and manipulate data. They will make use of R functions for executing common statistical analysis and learn how to display the results using graphs and charts. Through a series of projects, students will get experience with writing their own functions, learn how to make use of R documentation and how to extend their own knowledge of the language.
COMSC-121 Object-Oriented Programming
This course will introduce object-oriented programming to students who have a foundation in Python programming and are interested in continuing on to COMSC-205 Data Structures. It includes coverage of classes, objects, methods, and sub-typing.
COMSC-122 Java Programming Language
This course will teach the Java programming language to students who already have programming ability in another object-oriented programming language.
COMSC-132 Engineering for Everyone
Engineers change the world we live in every day by developing technologies that influence nearly every aspect of our lives. In this course, we will study how engineered things shape the world we live in. Students will engage in a team-based, hands-on engineering design project, from brainstorming solutions to a contemporary problem, to building, testing, and iterating design solutions. In the process, students will learn basic programming and fabrication skills. We will reflect together on the ethics of engineering design, and leave with a more nuanced understanding of the ways technology and society interact. Who decides what technologies matter? What is a "good" technological solution, and for whom is it "good"?
COMSC-133 Topic Problem Solving
COMSC-133DV Data Visualization: Design and Perception
Data visualizations such as graphs, charts, and infographics are everywhere! But creating data visualizations which communicate effectively is not a simple task. In this introductory course, students will explore how design influences the ways that data are understood and how they can use this to craft effective visualizations for different types of data. Experience working with data, design, or data visualization are not expected; students will work on a series of projects which will build these skills over the semester.
COMSC-150 Introduction to Computer Science
Introduction to the field of computer science. Introduces students to Python programming including algorithms, basic data structures (lists, dictionaries), and programming techniques. Does not include object-oriented programming.
COMSC-151 Introduction to Computational Problem Solving
Thematic introduction to the field of computer science. Draws on problems found in the thematic focus of each topics course. All topics courses within COMSC-151 cover the same concepts and skills and satisfy requirements in the Computer Science major and minor as well as the Data Science major. This course is programming-intensive and includes the topic of object-oriented programming. Students may wish to consider COMSC-150 as an alternative entry point that does not cover the topic of object-oriented programming.
COMSC-151CP Introduction to Computational Problem Solving: 'Computing Principles'
Introduces students to algorithms, basic data structures, and programming techniques. Students learn computing principles by exploring problems drawn from a broad set of domains, such as cryptography, data analysis and games.
COMSC-151DS Introduction to Computational Problem Solving: 'Big Data'
Introduces students to algorithms, basic data structures, and programming techniques, and focuses on data collection, preparation, analysis. Explores programming for data manipulation, the presentation and representation of data, and the ethics of working with data at scale.
COMSC-151HC Introduction to Computational Problem Solving: 'Humanities Computing'
Introduces students to algorithms, basic data structures, and programming techniques. Students will explore solving problems that arise in humanities disciplines: various forms of text analysis, image manipulation, animation, and sound manipulation.
COMSC-151SG Introduction to Computational Problem Solving: 'Computing for Social Good'
Introduces students to algorithms, basic data structures, and programming techniques. Includes discussion of the ways in which computing can improve human lives and society, such as improving accessibility for people with disabilities, or helping organize a rescue team during an emergency.
COMSC-161 Introduction to Computer Science Part 2: Object-Oriented Programming
This course builds on the programming concepts learned in COMSC-150, covering object-oriented programming and introducing the Java programming language.
COMSC-205 Data Structures
This course builds on the basic programming concepts learned in Computer Science 151, shifting the focus to the organization of data in order to improve efficiency and simplicity of programs. Topics include the study of abstract data types and data structures (such as linked lists, stacks, queues, and binary trees). This course is programming-intensive and introduces the Java programming language.
COMSC-205PY Data Structures (in Python)
This course builds on the basic programming concepts learned in Computer Science 150 and Computer Science 121, shifting the focus to the organization of data in order to improve efficiency and simplicity of programs. Topics include the study of abstract data types and data structures (such as linked lists, stacks, queues, and binary trees). This course is programming-intensive.
COMSC-221 Introduction to Computing Systems
This course looks at the inner workings of a computer and computer systems. It is an introduction to computer architecture. Specific topics include assembly language programming, memory, and parallelism. This course is programming intensive.
COMSC-225 Software Design and Development
Building large software systems introduces new challenges to software development. Appropriate design decisions and programming methodology can make a major difference in developing software that is correct and maintainable. In this course, students will learn techniques and tools that are used to build correct and maintainable software, improving their skills in designing, writing, debugging, and testing software. Topics include object-oriented design, testing, design patterns, and software architecture. This course is programming intensive.
COMSC-226 Engineering Robotic Systems
This intermediate-level course presents a hands-on introduction to robotics. Each student will construct and modify a robot controlled by an Arduino-like microcontroller. Topics include kinematics, inverse kinematics, control-theory, sensors, mechatronics, and motion planning. Material will be delivered through one weekly lecture and one weekly guided laboratory. Assignments include a lab-preparatory homework, guided lab sessions, and out-of-class projects that build upon the in-class sessions. Students have access to the Fimbel Maker and Innovation lab for fabricating and demonstrating their robots.
COMSC-243HR Topic: 'Human-Robot Interaction'
Human-Robot Interaction is an interdisciplinary field that examines a broad set of questions about robots that are designed to interact with humans (e.g., educational, assistive, and service robots). How does the behavior and appearance of a robot change how humans perceive and interact with it? How can we design and program robots that are natural, trustworthy, and effective? In this course, students learn the algorithmic foundations of interactive robots, gain experience building and evaluating interactive robots, and read and present scholarly research papers. Class time is split between lecture, presentations by students, discussions, and hands-on activities.
COMSC-243ST Topic: 'Introduction to Search Technologies'
The vast amount of unstructured and structured data on the web and in organizational databases has increased the need for approaches to processing large volumes of text. Such analyses help researchers and businesses to gain insights -- that would otherwise be too resource- and time-consuming to do manually -- into issues such as how much a consumer can be expected to spend in a particular context, the rise of hate groups and their impact on social media, or to whom a newly discovered manuscript may be attributed. In this course, students are introduced to tools and techniques used to gain these insights, such as Map-Reduce and Sentiment Analysis, in the context of Natural Language Processing and search technologies (e.g., Google).
COMSC-243SW Topic: 'Computing Systems Workshop'
Beneath the polished surface of high-level programming languages like Python and consumer devices like gaming consoles and smartphones lie the elemental parts of computer systems -- elements like hardware components, operating systems, and digital logic. This course will use a hands-on approach combining both hardware and software as a way of understanding such systems at a low level. Students will have the chance to construct various tangible projects using Raspberry Pi computers and will have access to the Fimbel Maker & Innovation lab. Specific topics will touch on low level data representation, sound generation, and the classic Nintendo Entertainment System.
COMSC-295 Independent Study
COMSC-311 Theory of Computation
Are there any limits to what computers can do? Does the answer to this question depend on whether you use a PC or a Mac? Is C more powerful than PASCAL? This seminar explores these questions by investigating several models of computation, illustrating the power and limitations of each of these models, and relating them to computational problems and applications. Topics include finite state automata, pushdown automata, grammars, Turing machines, the Universal Turing Machine, and computability.
How does Google Maps find the best route between two locations? How do computers help to decode the human genome? At the heart of these and other complex computer applications are nontrivial algorithms. While algorithms must be specialized to an application, there are some standard ways of approaching algorithmic problems that tend to be useful in many applications. Among other topics, we explore graph algorithms, greedy algorithms, divide-and-conquer, dynamic programming, and network flow. Students learn to recognize when to apply each of these strategies as well as to evaluate the expected runtime costs of the algorithms they design.
COMSC-316 Developing Innovative Software
Tired of writing programs that nobody ever uses? Then, this is the course for you. Many people come up with novel ideas for software, but lack the resources or ability to develop the software. Students will apply their programming skills to develop and deliver software based on the requirements of a client. Students will learn critical communication skills required to work with a client, work in teams with classmates, and experience the software lifecycle from requirements elicitation through delivery. Students will synthesize many topics learned in prior courses as well as explore new technologies required to complete a specific project. Programming intensive.
COMSC-322 Operating Systems
An introduction to the issues involved in orchestrating the use of computer resources. Topics include operating system evolution, memory management, virtual memory, resource scheduling, multiprogramming, deadlocks, concurrent processes, protection, and design principles. Course emphasis: understanding the implications of OS design on the programs you run and write (i.e., on their security, performance, etc.). This course is programming intensive.
COMSC-334 Artificial Intelligence
Artificial Intelligence, as a field, has grown from its humble beginnings in science fiction to become one of the broadest fields in computer science, encompassing an incredibly wide array of topics. One of the common threads between these topics is "How do we build computer systems which exhibit logic and reason?" or rather "How do we build systems which can solve problems intelligently without resorting to brute force?" We'll cover a few major topics in this course, most notably search, logical reasoning, and planning as well as game playing/theory, uncertain reasoning, and graphical models. This course is programming intensive.
COMSC-335 Machine Learning
How does Neflix learn what movies a person likes? How do computers read handwritten addresses on packages, or detect faces in images? Machine learning is the practice of programming computers to learn and improve through experience, and it is becoming pervasive in technology and science. This course will cover the mathematical underpinnings, algorithms, and practices that enable a computer to learn. Topics will include supervised learning, unsupervised learning, evaluation methodology, and Bayesian probabilistic modeling. Students will learn to program in MATLAB or Python and apply course skills to solve real world prediction and pattern recognition problems. Programming Intensive.
COMSC-341CC Topics: 'Compiler Design'
Principles and practices for the design and implementation of compilers and interpreters. Will cover the stages of the compilation and execution process: lexical analysis; parsing; symbol tables; type systems; scope; semantic analysis; intermediate representations; run-time environments and interpreters; code generation; program analysis and optimization; and garbage collection. Students will construct a full compiler.
COMSC-341CV Topics: 'Computer Vision'
This course provides an introduction to image analysis and 3D interpretation from image data. It uncovers the mystery behind standard techniques in image processing like filtering, edge detection, stereo vision, flow, etc. Math lovers, this course is for you! Throughout the semester, each student will develop their own computer vision library through programming assignments. Furthermore, students will learn about newer, advanced machine-learning-based computer vision algorithms.
COMSC-341GP Topics: 'Game Programming'
Video games are not only fun to play but interesting and challenging to program, involving elements that are useful in programming other sorts of systems as well. They incorporate graphics, audio, and animation, must model relatively complex systems, and often have relatively strict requirements on timing. In this course, we explore techniques behind game implementation by implementing some of our own. This course is programming (and gaming) intensive.
COMSC-341NL Topics: 'Natural Language Processing'
This course provides an introduction to natural language processing, the discipline of enabling computers to process and understand human language. We will learn fundamental techniques for automated text and speech analysis and understanding, with insights from linguistics. Students will get hands-on practice implementing computational algorithms, reading scholarly research articles and will design and carry out an independent final project.
COMSC-341NP Topics: 'Intro to Networking Architecture and Protocols'
This course is an introduction to computer networking with a focus on the Internet. At the high level, we will emphasize concepts and principles which have contributed to the Internet's success scaling from its modest beginnings to a system used by over half of the world's population. At the low level, we will survey techniques, technologies and protocols that underlie networks, as well as key protocols built atop these networks. Specific topics include layering, routing, addressing, reliable delivery, congestion control, DNS, HTTP, and others.
COMSC-341TE Topics: 'Text Technologies for Data Science'
This course focuses on text analysis and technologies. We look at the challenges of working with massive amounts of unstructured vs semi-structured vs structured data. In that context, we explore some of the ways that statistical analyses are applied to things like search, categorization e.g. spam filtering, recommender systems, plagiarism detection, and hidden message finding.
COMSC-343 Programming Language Design and Implementation
Ever wonder why there are so many semicolons in Java programs, or what it would mean for a language to not be object-oriented? In this course, we will explore issues related to the design and implementation of programming languages. Along the way, we will discover answers to these questions and more. Topics will include syntax, semantics, runtime support for languages as well as an introduction to functional programming.
COMSC-395 Independent Study