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–

Current undergraduate courses

Computer Organization

Spring

The focus of this course is on the selection and interconnection of components that make up 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 and machine languages, memory hierarchies, and parallel processing. Special attention will be given to the ARM family of instruction—set architectures, now the world's most common, general-purpose microprocessors. Time permitting, we will investigate the relationship between energy consumption and the rise of multicore and mobile architectures.

Faculty

Digital Zeitgeist

Fall

From Facebook, Twitter, and YikYak to massively multiplayer online games, to the Internet of Things, and to disruptive technologies ranging from Bitcoin to Uber, computer networks play an ever-increasing role in our daily lives. Where may this phenomenon be taking us in the immediate and not-so-immediate future? Is there (or should there be) anything we can (or should) do about it? The miniaturization of electronic computers and the resulting increase in computing power, decrease in short-term cost to harness that power, and ubiquity of computer networks bring people and places together, making distances formerly thought of as insurmountable ever more trivial. With the advent of gigabit fiber-optic networks, smart phones, and wearable computers, information of all kinds can flow, in an instant, between people and objects around the world and back again. In many ways, the plethora of smaller, cheaper, faster networked devices improves our quality of life; but we will also consider the dark side of a highly connected society: the more smart phones, the more workaholics; the more text messages and e-mails exchanged, the less privacy; the greater reach of the Internet, the more piracy, spam, and pornography. The nature of a course entitled Digital Zeitgeist is to move with the times, and those times move ever more rapidly. So even this description might seem outdated by the time you read it. Never fear, we will steer our discussion to the “bleeding edge,” as necessary. Consider these news stories (to name but a few) that would not have made it into this description were it written only a year earlier: the Gamergate controversy, “Citizen Four” (and its adoration), the Sony hack, the trial and conviction of the Silk Road founder, and the arrival of the Apple Watch. This is not a technical course, although at times we will discuss some details that lie behind certain crucial technologies—in particular, the Internet and the World Wide Web.

Faculty
Related Cross-Discipline Paths

Introduction to Computer Programming

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 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 intellgence, the importance of algorithmic efficiency to computer security, Moore's Law and its impact on the evolution of programming languages and programming style. Weekly hands-on laboratory sessions will reinforce the programming concepts covered in class.

Faculty
Related Cross-Discipline Paths

Introduction to Web Programming

Spring

This lecture introduces the fundamental principles of computer science via their application to the design and implementation of interactive websites. We will focus on the core triumvirate of Web technologies: HTML for content, CSS for layout, and—most important to us—JavaScript for interactivity. Examples of the kinds of Web applications that we will build include a virtual art gallery, an arcade-style game, and a mobile messaging app. 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, recursion, arrays, objects, JSON notation, and event handling. 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 to 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. We will strive to make the design of our websites reflect the spirit of their content. Weekly hands-on laboratory sessions will reinforce the programming concepts covered in lecture. No prior experience with programming or Web design is necessary (or expected or even desirable).

Faculty
Related Cross-Discipline Paths

Previous courses

Artificial Minds

Fall

Though science has continued to reveal, with increasing precision, the ways in which patterns of matter and energy arrange themselves into life, the mind has largely eluded physical explanation. How does thinking arise from brain cells, and how can thought control the body? Researchers in artificial intelligence (AI) believe that the best way to understand the mind is to reproduce it in a machine. They have been exploring ways to program computers to behave intelligently since the middle of the last century. How far has the field of AI come since then, and what are its prospects for the future? In this course, we will examine in detail the major paradigms of AI research, from symbolic approaches such as knowledge representation, propositional and predicate logic, and search methodologies to more recent approaches that focus on adaptation and learning, such as neural networks, genetic algorithms, artificial life, and robotics. We will also investigate the idea of swarm intelligence and machine creativity and consider some important philosophical questions surrounding AI, including consciousness, the mind-body problem, and the Turing Test.

Faculty

Collaborative Software Development

Spring

Donald E. Knuth, one of the world’s most distinguished computer scientists, has said both that “computer programs are fun to write” and “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, the role of maintaining good documentation, and, most importantly, how to write software in teams. No place 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 designing and developing a semester-long, collaborative software project. Examples of project categories include (but are not limited to) digital games and mobile applications. Specific topics include: design patterns, including Model-View-Controller; separating user-interface particulars from core algorithms; wireframe techniques; alpha vs. beta testing; using distributed, collaborative software versioning tools such as github; the role of abstract data types and precise API specification; code reviews; workshopping; the less heralded but crucially important roles of documentation writers, software testers, and project managers.

Faculty

Compilers: How Computers Execute Their Programs

Fall

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, and applications of compiler technology to natural-language translation.

Faculty

Databases

Spring

A modern database system is a collection of interrelated facts recorded on digital media and a set of computer programs to 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 these principles by designing databases using open-source platforms (such as MySQL) and by designing Web sites to manipulate those databases using client-side technologies (such as HTML, CSS, Javascript and AJAX) and server-side programming languages (such as PHP and Python). Major topics include relational database design, query languages (such as SQL, XQuery and XSLT), the object-relational model, ACID properties, and the client-server paradigm. Each student will be responsible for designing and implementing a Web-accessible database application of her or his choosing, using open-source database software and a Web-application programming language such as PHP, Python, or Ruby. Students will work on their projects throughout the course and will demonstrate them to the rest of the class at the close of the semester. We will also consider Web-application frameworks such as Ruby on Rails and Django. 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. Suggested conference topics include data mining, database privacy, geographical information systems (GIS), and the implementation of a miniature database system.

Faculty

First-Year Studies: Privacy vs. Security in a Networked World

FYS

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 seminar, 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 make the Internet at once tremendously successful and so challenging to regulate. Part of the course will be devoted to learning 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 quantum cryptography and quantum computing, may impact the privacy of electronic communications in the near future. We will hold several informal debates on current topics, such as whether Edward Snowden should be viewed as a hero or a traitor, the ethics of Wikileaks and Anonymous, and whether law-enforcement officials should be required to obtain warrants before examining smartphones.

Faculty

Privacy vs. Security in a Networked World

Spring

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.

Faculty

Random and Prime: A Computational Exploration of Number Theory

Spring

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 and its application to computer-network security. We will write a series of computer programs of increasing sophistication whose aim will be to identify patterns among prime numbers. In some cases we will search for empirical evidence in support of well established theories (for example, the Prime Number Theorem), in other cases we will be analyzing and interpreting data in an effort to discover new theorems and their applications (for example, regarding "safe primes").

We will pose philosophical questions regarding the nature of modern mathematics (and, therefore, computer science). For instance, to what extent can a computer be used to prove theorems? Is there a fundamental difference between theorems that seems to require "insight" for their proof (for example, using a non-constructive proof by contradiction to establish the infinitude of primes) as opposed to those that correspond to more algorithmic arguments?

We will investigate what it means to be random. Can randomness be generated by an algorithmic process? We will see examples of how some problems that appear the be very difficult may be solved quickly using random numbers with the caveat that the answer we get is only "probably" true. We discuss the philosophical and practical implications of this approach. 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: unique factorization, modular arithmetic, Euler's phi function, Fermat's Little Theorem, primitive roots, quadratic residues and Gauss' Law of Quadratic Reciprocity. Cryptology topics include: Diffie-Hellman key exchange, RSA encryption, El Gamal signatures, pseudorandom number generators, zero-knowledge proofs, and applications of these to electronic voting and digital currency. Algorithmic topics include: modular exponentiation, probabilistic prime testing, factorization and discrete logarithms, and the theory of NP-completeness.

There is no one single prerequisite for this course, but students should have either at least one semester of programming experience (preferably in Python; but C, C++, or Java should be fine) or some experience with mathematical proof (for example, one semester of college-level mathematics such as Discrete Mathematics). Cross listed with Mathematics. Intermediate, permission of instructor required.

Faculty

The Soul of the Machine: An Introduction to Computer Architecture

Fall

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.

Faculty