2013-2014 Computer Science Courses
Privacy vs. Security in a Networked World
The Internet was developed at the height of the Cold War as a way to maintain a robust communication system in the event of a nuclear attack. It is ironic, then, that the same technology may put us at risk of 21st-century security threats such as electronic surveillance, aggregation and mining of personal information, and cyberterrorism. In this lecture, we contrast doomsday myths popularized by movies such as War Games with more mundane scenarios such as total disruption of electronic commerce. Along the way, we address questions such as: Does modern technology allow people to communicate secretly and anonymously? Can a few individuals disable the entire Internet? Can hackers launch missiles or uncover blueprints for nuclear power plants from remote computers on the other side of the world? We will also investigate other computer security issues, including spam, computer viruses, and identity theft. Meanwhile, with our reliance on cell phones, text messages, and electronic mail, have we unwittingly signed ourselves up to live in an Orwellian society? Or can other technologies keep “1984” at bay? Our goal is to investigate if and how society can strike a balance so as to achieve computer security without substantially curtailing rights to free speech and privacy. Along the way, we will introduce the science of networks and describe the underlying theories that makes the Internet at once tremendously successful yet so challenging to regulate. A substantial portion of the course will be devoted to introductory cryptology—the science (and art) of encoding and decoding information to enable private communication. We will conclude with a discussion on how cutting-edge technologies such as quantum cryptography and quantum computing may impact the privacy of electronic communications in the near future. Group conferences will include a mix of seminar-style debates over privacy rights and hands-on laboratories in which students will experiment with network simulators and code-making and code-breaking software.
A Liberal Artist's Guide to Web Design
Is the Singularity Near?
Something profound is happening on planet Earth. The past 100 years have witnessed the most rapid and far-reaching technological advances in human history. Think of the world of 1913 as compared to the world of 2013. Back then, automobiles, flying machines, and telephones were curiosities only recently invented; television, space travel, computers, mobile phones, and the Internet were unimagined and still decades in the future. What of the next 100 years? A number of serious, highly respected scientists and scholars believe that the relentlessly accelerating pace of technological change over the next few decades will transform our human civilization into something radically different, almost unrecognizable—an event that will mark the beginning of a new “posthuman” era in evolutionary history. This event, often called the Singularity, will be driven by advances in molecular biology, genetic engineering, nanotechnology, and machine intelligence. Ray Kurzweil, a well-known technologist and AI pioneer, has argued that the transition from biologically-based to technologically-based evolution is natural and inevitable and will bring enormous benefits to society. Others, taking a more pessimistic view of the human future, warn of the increasing risk of self-extinction posed by the development of ever more-powerful technologies and worry that our genes may have finally outsmarted themselves. How realistic is the Singularity scenario, and just how seriously should we take these ideas? In this course, we will explore these questions in depth, focusing in particular on developments in computational intelligence and on placing these ideas within the larger context of human and cosmic evolution.
The Way of the Program: An Introduction to Computer Science
This course is an introduction to computer science and the art of computer programming using the elegant, yet easy-to-learn, programming language Python. Students will learn the principles of problem solving with a computer while gaining the programming skills necessary for further study in the discipline. Throughout the course, we will emphasize the power of abstraction and the benefits of clearly written, well-structured programs. We will begin with basic procedural programming and work our way up to object-oriented concepts such as classes, methods, and inheritance. Along the way, we will explore the fundamental concepts of algorithms and their efficiency, binary representations of data, digital logic, and recursion. Other topics include introductory computer graphics, file processing, sorting and searching algorithms, basic data structures (such as lists, dictionaries, and binary trees), and some principles of game design and implementation. Weekly laboratory sessions will reinforce the concepts covered in class through extensive hands-on practice at the computer.
Introduction to Creative Computing
Interested in learning how to code but not sure where to start? This introductory course is designed for individuals with little-to-no programming experience. Through weekly creative assignments, students will learn the principles of problem solving with a computer while mastering the fundamentals of programming (variables, conditionals, iteration, functions, and objects). These tools are the basic building blocks of programming needed to create cutting-edge graphics applications, including video games, interactive art, live video processing, and data visualizations. When designing our applications, we will spend time considering the needs of the user to create a smooth and intuitive experience. The easy-to-use, Java-based “Processing” programming environment is the primary vehicle for the class. The final weeks of the semester will take on a workshop format to support the development of a final project utilizing more advanced techniques such as image processing, computer vision, and data parsing.
The Soul of the Machine: An Introduction to Computer Architecture
The focus of this course is on the selection and interconnection of components to create a computer. There are two essential categories of components in modern computers: the hardware (the physical medium of computation) and the software (the instructions executed by the computer). As technology becomes more complex, the distinction between hardware and software blurs. We will study why this happens, as well as why hardware designers need to be concerned with the way software designers write programs and vice versa. Along the way, we will learn how computers work from higher-level programming languages—such as Java, Python, and C—down to the basic zeroes and ones of machine code. Topics include Boolean logic, circuit design, computer arithmetic, assembly language, machine code, memory hierarchies, and parallel processing. Time permitting, we will investigate the relationship between energy consumption and the rise of multicore and mobile architectures. Permission of the instructor is required. Students should have at least one semester of programming experience, preferably in C, C++, Java, or Python.
Data Structures and Algorithms
In this course, we will study a variety of data structures and algorithms that are important for the design of sophisticated computer programs, along with techniques for managing program complexity. We will use Java—a strongly typed, object-oriented programming language—throughout the course. Topics covered will include types and polymorphism, arrays, linked lists, stacks, queues, priority queues, heaps, dictionaries, balanced trees, and graphs, along with several important algorithms for manipulating these structures. We will also study techniques for analyzing the efficiency of algorithms. The central theme tying all of these topics together is the idea of abstraction and the related notions of information hiding and encapsulation, which we will emphasize throughout the course. Weekly lab sessions will reinforce the concepts covered in class through extensive hands-on practice at the computer. Students should have at least one semester of programming experience in an object-oriented language such as Python, Java, or C++.