Michael Siff

BA, BSE., MSE, University of Pennsylvania. PhD, University of Wisconsin-Madison. Special interests in programming languages, cryptology, and software engineering; author of research papers on interplay between type theory and software engineering. SLC, 1999–

Undergraduate Courses 2024-2025

Computer Science

Computer Networks

Open, Seminar—Fall

COMP 3065

This course is a rigorous introduction to digital communication networks from a liberal-arts perspective. The main question that we will address is how information of all kinds can be transmitted efficiently, between two points at a distance, in such a way that very little assumption need be made about the physical mode of transport and how the route the information travels need not be known in advance. We emphasize the importance of abstraction and the use of redundancy to establish error-free transmission even in the face of significant noise. We study protocol stacks from the application layer (canonical example: web browser) down to the physical transmission medium. We analyze how high-level information (for instance, a message including an image attachment being sent via email) is translated to bits, broken into discrete packets, sent independently using the basic building blocks of the Internet—and then how those packets are reassembled, seemingly instantaneously, in the correct order. We will attempt to demystify the alphabet soup of networking terminology, including TCP/IP, HTTP, HTTPS, VPN, NFC, WiFi, Bluetooth, and 5G. We will consider major shifts in technology that have transformed communication networks from the telegraph to the telephone to radio, from copper wire to fiberoptics and satellite, and the ubiquity of cellular networks. We also will consider the close relationship between the open-source movement and the rise of the Internet and web.

Faculty

Data Structures and Algorithms

Intermediate, Seminar—Spring

COMP 3865

Prerequisite: Inrtoduction to Computer Programming

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. Throughout the course, we will use Java, a strongly typed, object-oriented programming language. Topics covered will include types and polymorphism, arrays, linked lists, stacks, queues, priority queues, heaps, dictionaries, balanced trees, and graphs, as well as several important algorithms for manipulating those 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.

Faculty

Games Computers Play

Open, Seminar—Spring

COMP 3112

This is an introduction to computer programming through the lens of old-school, arcade-style video games such as Pong, Adventure, Breakout, Pac-Man, Space Invaders, and Tetris. We will learn programming from the ground up and demonstrate how it can be used as a general-purpose, problem-solving tool. Throughout the course, we will emphasize the power of abstraction and the benefits of clearly written, well-structured code. We will cover variables, conditionals, iteration, functions, lists, and objects. We will focus on event-driven programming and interactive game loops. We will consider when it makes sense to build software from scratch and when it might be more prudent to make use of existing libraries and frameworks rather than reinventing the wheel. We will also discuss some of the early history of video games and their lasting cultural importance. Students will design and implement their own low-res, but fun-to-play, games. No prior experience with programming or web design is necessary (nor expected nor even desirable).

Faculty

Privacy, Technology, and the Law

Open, Seminar—Fall

COMP 3207

What do Bitcoin, ChatGPT, self-driving vehicles, and Zoom have in common? The answer lies in this course, which focuses on how a few digital technologies are dramatically altering daily life. In this course, we will develop a series of core principles that attempt to explain the rapid change and to forge a reasoned path into the future. We will begin with a brief history of privacy, private property, and privacy law. Two examples of early 20th-century technologies that required legal thinking to evolve: whether a pilot (and passengers) of a plane are trespassing when the plane flies over someone's backyard and whether the police can listen to a phone call from a phonebooth (remember those?) without a warrant. Quickly, we will arrive in the age of information and can update those conundrums: A drone flies by with an infrared camera. A copyrighted video is viewed on YouTube via public WiFi. A hateful comment is posted on Reddit. A playful TikTok is taken out of context and goes viral for all to see. An illicit transaction involving Bitcoin is made between seemingly anonymous parties via Venmo. A famous musician infuriates his or her fanbase by releasing a song supporting an authoritarian politician—but it turns out to be a deepfake. A core tension in the course is whether and how the Internet should be regulated and how to strike a balance among privacy, security, and free speech. We will consider major US Supreme Court cases that chart slow-motion government reaction to the high-speed change of today’s wired world.

Faculty

Previous Courses

Computer Science

Compilers

Intermediate, Seminar—Spring

Compilers are often known as translators—and for good reason: Their job is to take programs written in one language and translate them to another language (usually assembly or machine language) that a computer can execute. It is perhaps the ideal meeting between the theoretical and practical sides of computer science. Modern compiler implementation offers a synthesis of: (1) language theory, how languages (both natural languages and programming languages) can be represented on and recognized by a computer; (2) software design and development, how practical software can be developed in a modular way—e.g., how components of one compiler can be connected to components of another compiler to form a new compiler; and (3) computer architecture, understanding how modern computers work. During the semester, we will write a program implementing a nontrivial compiler for a novel programming language (partly of our own design). Topics we will cover along the way include the difference between interpreters and compilers, regular expressions and finite automata, context-free grammars and the Chomsky hierarchy, type checking and type inference, contrasts between syntax and semantics, and graph coloring as applied to register allocation. Conference work will allow students to pursue different aspects of compilers, such as compilation of object-oriented languages, automatic garbage collection, compiler optimizations, just-in-time compilation, WebAssembly, and applications of compiler technology to natural-language translation.

Faculty

Computer Organization

Intermediate, Seminar—Fall

Prerequisite: one semester of programming experience and permission of the instructor

This course investigates how computers are designed “underneath the hood” and how basic building blocks can be combined to make powerful machines that execute intricate algorithms. 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 Python and JavaScript, to system-level languages C and Java, down to the basic zeroes and ones of machine code. Topics include Boolean logic, digital-circuit design, computer arithmetic, assembly and machine languages, memory hierarchies, and parallel processing. Special attention will be given to the RISC architectures—now the world’s most common, general-purpose microprocessors. In particular, we will focus on the ARM architecture and Apple’s new M1 processors. Time permitting, we will investigate the relationship between energy consumption and the rise of multicore and mobile architectures.

Faculty

Databases

Intermediate, Seminar—Spring

A modern database system is a collection of interrelated facts recorded on digital media and a set of computer programs that efficiently access those facts. In the 21st century, databases have become ubiquitous via the Web and {cloud computing” to the point that users may not even realize where their data is stored, how it is accessed, and who has access to it. This course attempts to shed light on why and how our society has become so dependent on information processing by examining software (and, to a lesser extent, hardware) techniques that lead to the efficient storage and retrieval of information. We will illustrate core principles by designing databases using open-source platforms (such as PostgreSQL, SQLite and MySQL) and designing websites to manipulate those databases using client-side technologies (such as HTML, CSS, JavaScript and a bit of AJAX) and server-side programming languages (such as PHP, Python and Node.js). Major topics include relational database design, query languages (e.g., SQL, its relatives, and lower-level embedded query languages), the object-relational model, ACID properties, and the client-server paradigm. We will also consider how the era of big data has challenged the supremacy of the ACID/SQL model and given rise to NoSQL database systems such as MongoDB, Cassandra, and Neo4J. Each student will be responsible for designing and implementing a Web-accessible database application of their own choosing, using open-source database software and a Web-application programming language such as Node, PHP, Python, or Ruby. Students will work on their projects throughout the course and will demonstrate them to rest of the class at the close of the semester. In addition to regular reading assignments, there will be several problem sets and short programming assignments. There will also be a more substantial programming assignment used to illustrate issues pertaining to the practical implementation of database systems. Example conference topics include data mining, database privacy and access control, geographic information systems (GIS), logic databases, and the implementation of a miniature database system.

Faculty

Digital Disruptions

Open, Seminar—Fall

From TikTok to Zoom, from Bitcoin to Uber, from Instagram to Snapchat, to massively multiplayer online games, to the Internet of Things, and non-fungible tokens, digital technology plays an evermore "disruptive" role in society. In this FYS seminar, we ponder where this phenomenon may be taking us in the immediate and not-so-immediate future and whether there is (or will be) anything we can (or should) do about it. The miniaturization of electronic computers and the resulting increase in computing power, the decrease in short-term cost to harness that power, and the ubiquity of computer networks bring people and places together, making distances formerly thought of as insurmountable evermore trivial. With the advent of gigabit fiber-optic networks, smartphones, and wearable computers, information of all kinds can flow around the world, between people and objects and back again, in an instant. In many ways, the plethora of smaller, cheaper, faster networked devices improves our quality of life. But there is also a dark side of a highly connected society: the more smart phones, the more workaholics; the more text messages exchanged and the easier the access to drones, the less privacy; the greater reach of the internet, the faster the spread of misinformation and the more piracy, spam, and pornography; the more remote-controlled thermostats, the greater the risk of cyberterrorism. This seminar will focus on the relationship between digital networks (the web, social networks, and beyond) to current events, including the economy, politics, and the law. The second half of the course will focus on the cultural impact of digital technology ranging from video games and science fiction to the rise of artificial intelligence. This is not a technical course, though at times we will discuss some details that lie behind certain crucial technologies—in particular, the internet and the World Wide Web. While this course is open to all students, first-year students may take the course as a regular seminar or as their FYS seminar. In the latter case, students will have weekly conferences and be expected to enroll in Introduction to Web Programming in the spring as a continuation of their FYS experience.

Faculty

Intermediate Programming

Intermediate, Seminar—Fall

This course is designed for students who understand the basics of computer programming (whether in Python, JavaScript, or another language) but want to take their skills to the next level. We will use the elegant and sophisticated programming language Haskell to learn about software design, abstract data types, and higher-order functions. We will introduce the basic principles of computational complexity and tree structures. We will emphasize top-down problem-solving, using recursion. We will also learn how to use cloud-based version control; e.g., using git and GitHub. Time permitting, we will learn how to build larger programs that leverage databases and networking protocols.

Faculty

Introduction to Computer Programming

Open, Small Lecture—Fall

This lecture presents a rigorous introduction to computer science and the art of computer programming, using the elegant, eminently practical, yet easy-to-learn programming language Python. We will learn the principles of problem solving with a computer while gaining the programming skills necessary for further study in the discipline. We will emphasize the power of abstraction, the theory of algorithms, and the benefits of clearly written, well-structured programs. Fundamental topics include: how computers represent and manipulate numbers, text, and other data (such as images and sound); variables and symbolic abstraction; Boolean logic; conditional, iterative, and recursive computation; functional abstraction (“black boxes”); and standard data structures, such as arrays, lists, and dictionaries. We will learn introductory computer graphics and how to process simple user interactions via mouse and keyboard. We will also consider the role of randomness in otherwise deterministic computation, basic sorting and searching algorithms, how programs can communicate across networks, and some principles of game design. Toward the end of the semester, we will investigate somewhat larger programming projects and, so, will discuss file processing; modules and data abstraction; and object-oriented concepts such as classes, methods, and inheritance. As we proceed, we will debate the relative merits of writing programs from scratch versus leveraging existing libraries of code. Discussion topics will also include the distinction between decidable and tractable problems, the relationship between programming and artificial intelligence, the importance of algorithmic efficiency to computer security, and Moore’s Law and its impact on the evolution on programming languages and programming style. Weekly hands-on laboratory sessions will reinforce the programming concepts covered in class.

Faculty

Introduction to Web Programming

Open, Lecture—Spring

This lecture introduces the fundamental principles of computer science via the creation of interactive Web pages. We will focus on the core triumvirate of Web technologies: HTML for content, CSS for layout, and—most important for us—JavaScript for interactivity. Examples of the kinds of Web applications that we will build include a virtual art gallery; a password generator and validator; and an old-school, arcade-style game. We will learn programming from the ground up and demonstrate how it can be used as a general-purpose, problem-solving tool. Throughout the course, we will emphasize the power of abstraction and the benefits of clearly written, well-structured code. We will cover variables, conditionals, loops, functions, recursion, arrays, objects, JSON notation, and event handling. We will also discuss how JavaScript communicates with HyperText Markup Language (HTML) via the Document Object Model (DOM) and the relationship of HTML, JavaScript, and Cascading Style Sheets (CSS). Along the way, we will discuss the history of the Web, the challenge of establishing standards, and the evolution of tools and techniques that drive the Web’s success. We will learn about client-server architectures and the differences between client-side and server-side Web programming. We will consider when it makes sense to design from the ground up and when it might be more prudent to make use of existing libraries and frameworks rather than reinvent the wheel. We will also discuss the aesthetics of Web design: Why are some pages elegant (even art) when others are loud, awkward to use, or—worse yet—boring. Weekly hands-on laboratory sessions will reinforce the programming concepts covered in lecture. No prior experience with programming or Web design is necessary (nor expected nor even desirable).

Faculty

Privacy, Technology, and the Law

Open, Seminar—Spring

What do Bitcoin, NFTs, Zoom, self-driving vehicles, and Edward Snowden have in common? The answer lies in this course, which focuses on how a few very specific computer technologies are dramatically altering daily life. In this course, we will develop a series of core principles that explain the rapid change and will help us chart a reasoned path to the future. We begin with a brief history of privacy, private property, and privacy law. Two examples of early 20th-century technologies required legal thinking to evolve: 1) whether a pilot (and passengers) of a plane is trespassing when the plane flies over someone’s backyard; and 2) whether the police can listen to a phone call from a phone booth (remember those?) without a warrant. Quickly, we will arrive at the age of information and will be able to update these conundrums: a drone flies by with an infrared camera, a copyrighted video is viewed on YouTube via public WiFi, a hateful comment is posted on Reddit, a playful TikTok is taken out of context and goes viral for all to see, an illicit transaction involving Bitcoin is made between seemingly anonymous parties via Venmo. To get a better handle on the problem, we will consider the central irony of the internet: It 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, and now its open nature puts us at risk of 21st-century security threats such as electronic surveillance, aggregation and mining of personal information, and cyberterrorism. We will 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 will 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 smart phones, text messages, and electronic mail, have we unwittingly signed up ourselves 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 make the internet and its related technologies at once tremendously successful and 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 of how cutting-edge technologies, such as blockchains, are impacting commerce today and how quantum cryptography and quantum computing may impact the privacy of communications tomorrow.

Faculty

Programming the Web: An Introduction

Open, Seminar—Spring

This seminar introduces the fundamental principles of computer science via the use of HTML and JavaScript to create interactive web pages. Examples of the kinds of web applications that we will build include: a virtual art gallery; a password generator and validator; and an old-school, arcade-style game. We will learn JavaScript programming from the ground up and demonstrate how it can be used as a general-purpose, problem-solving tool. Throughout the course, we will emphasize the power of abstraction and the benefits of clearly written, well-structured code. We will cover variables, conditionals, loops, functions, arrays, objects, and event handling. We will also discuss how JavaScript communicates with HyperText Markup Language (HTML) via the Document Object Model (DOM) and the relationship of HTML, JavaScript, and Cascading Style Sheets (CSS). Along the way, we will discuss the history of the web, the challenge of establishing standards, and the evolution of tools and techniques that drive the web’s success. We will learn about client-server architectures and the differences between client-side and server-side web programming. We will consider when it makes sense to design from the ground up and when it might be more prudent to make use of existing libraries and frameworks rather than reinventing the wheel. We will also discuss the aesthetics of web design: Why are some pages elegant (even art) when others are loud, awkward to use, or, worse yet, boring!

Faculty

Random and Prime

Advanced, Seminar—Spring

Prerequisite: permission of instructor; at least one semester of a college-level programming course (preferably in Python); and at least one semester of proof-based, college-level mathematics

This course is a journey analogous to space exploration. Our infinite cosmos will be the set of natural numbers. Our exploratory rocket ships will be computer programs of our own design. The planets possibly bearing alien life forms are different classes of prime numbers. More literally, this course is a research-driven introduction to elementary number theory, its essential application to computer-network security, and its purported implications for the future of money (think of the buzzwords “crytpo,” “blockchain,” and “bitcoin”). We will write a series of computer programs of increasing sophistication, whose aim will be to identify patterns among prime numbers. We will pose philosophical questions regarding the nature of modern mathematics and computer science; for instance, to what extent can a computer be used to prove theorems? We will investigate what it means to be random: Can true randomness be generated by an algorithmic process? We will see examples of how some problems that appear to be very difficult may be solved quickly using random numbers, with the caveat that the answer we get is only “probably” true. In particular, we will contrast, on the one hand, the ease with which random numbers can be harnessed to discover primes and, on the other, the challenge of finding divisors of composite numbers. We will also consider the web-shaking implications if the latter problem turns out to be less difficult than it appears. Topics in elementary number theory include: primality, unique factorization, modular arithmetic, relative primality, Fermat's Little Theorem, primitive roots, and quadratic residues. Topics in cryptology include: Diffie-Hellman key exchange, RSA encryption, pseudorandom number generators, zero-knowledge proofs, and applications of these to blockchain databases and dreams of digital currency. Algorithmic topics include: modular exponentiation, probabilistic prime testing, factorization and discrete logarithms, and the theory of NP-completeness.

Faculty

Software Design and Development

Intermediate, Seminar—Year

Donald E. Knuth, one of the world's most distinguished computer scientists, has said both that “computer programs are fun to write” and that “software is hard.” The goal of this course is to give students a taste of what it is like to design and develop real software. The quotes by Knuth illustrate two themes of this course that are not necessarily at odds: The challenge of writing good software should not offset the pleasure derived from writing it. Some of the main topics that we will cover include the power of abstraction, the separation of design from implementation, version control, the selection of development environments, the creative use of existing software libraries and tools, the benefits of a flexible approach, and the role of maintaining good documentation. Nowere is the adage, “There is no substitute for experience,” more relevant than in software engineering. With that in mind, this course is intended to be hands-on. Design and development techniques will be taught primarily by having each student design and implement a single software project over the entire school year. Specific topics: design patterns, including Model-View-Controller; separating user-interface particulars from core algorithms; wireframe techniques; alpha vs. beta testing; using distributed software versioning tools, such as GitHub; the role of abstract data types and precise API specification; code reviews; workshopping; and the less heralded—but crucially important—skills of documentation writing, software testing, and project management.

Faculty