Carnegie Mellon University

S3D Courses

Undergraduate Courses

Fall 2020

In this course, students will study the social impacts of computing technology and systems. The course will provide a brief introduction to ethics and to the new and difficult ethical questions modern computing technology presents us with. It will focus on a number of areas in which computers and information technology are having an impact on society including data privacy, social media, and autonomous technologies.

Instructor: Skirpan, Michael

Software engineers today are less likely to design data structures and algorithms from scratch and more likely to build systems from library and framework components. In this course, students engage with concepts related to the construction of software systems at scale, building on their understanding of the basic building blocks of data structures, algorithms, and program and computer structures. The course covers technical topics in four areas: (1) concepts of design for complex systems, (2) object-oriented programming, (3) static and dynamic analysis for programs, and (4) concurrency. At the conclusion of this course, students will have substantial experience building medium-sized software systems in Java.

Instructor:
Garrod, Charles
Bloch, Josh

Students gain exposure to the fundamental principles of software engineering. This includes both core CS technical knowledge and the means by which this knowledge can be applied in the practical engineering of complex software in real-world settings. Topics related to software artifacts include coding, software architecture, measurement, and quality assurance of various qualities (e.g., robustness, security, performance, maintainability) with static and dynamic analysis, testing, code review, and inspection. Topics related to software process include requirements engineering, process models and evaluation, personal and team development, and supply chain issues including outsourcing and open source. This course has a strong technical focus, a strong focus on developing team skills, and will include both written and programming assignments. Students will get experience with the latest software engineering tools and practices.

Instructor:
Le Goues, Claire
Hilton, Michael
Razak, Saquib

Scientific foundations for software engineering depend on the use of precise, abstract models for describing and reasoning about properties of software systems. This course considers a variety of standard models for representing sequential and concurrent systems, such as state machines, algebras, and traces. It shows how different logics can be used to specify properties of systems, such as functional correctness, deadlock freedom, and internal consistency. Concepts such as compositionality, abstraction, invariants, non-determinism, and inductive definitions are recurrent themes throughout the course. After completing this course, students will: 1. Understand the strengths and weaknesses of certain models and logics including state machines, algebraic and process models, and temporal logic; 2. Be able to select and describe appropriate abstract formal models for certain classes of systems, describe abstraction relations between different levels of description, and reason about the correctness of refinements; 3. Be able to prove elementary properties about systems described by the models introduced in the course; and 4. Understand some of the strengths and weakness of formal automated reasoning tools. Prerequisites: Undergraduate discrete math including first-order logic, sets, functions, relations, and simple proof techniques such as induction.

Instructor:
Garlan, David
Kang, Eunsuk

DevOps is the term given to a modern movement to establish practices that significantly reduce the time to production of committed code. This time involves deployment - the period between the completion of the code by the developers and the placing of the code into normal production and dealing with operations issues. Deployment time can be days, weeks, or even months when using normal development practices. Operational issues such as dealing with incidents and errors introduce other delays. Modern internet companies deploy a system multiple or even dozens of times every day. Achieving this velocity requires coordinated process and design activities together with supporting tooling. This course will cover the deployment process and the associated tooling, it will highlight reasons why release schedules can be slow, and it will introduce the practices that are used to enable high velocity deployments. It will also cover the kinds of problems that are created because of high velocity and how modern internet companies deal with these problems.

Instructor:
Bass, Len
Yasar, Hasan

Agile methods refers to a number of software development approaches that adopt self-organization, adaptive planning, evolutionary development, frequent delivery and working closely with and incorporating feedback from customers throughout the development process as their principles of operation to achieve responsiveness. This course will introduce students to two well known agile methods: Scrum and Kanban, connecting their practices to established group dynamics and knowledge management theories to explain why they work and under what circumstances

Instructor:
Miranda, Eduardo
Telang, Sujata

This class is fundamentally about software quality assurance and control. This course will introduce various quality assurance tools and techniques to software engineering students. Students will build their quality toolbox not only with useful tools and techniques, but with the knowledge of when those tools should be used, how to evaluate their results, and what assurances they can provide. The key learning objectives of the course include: 1. Understand software quality: how to define it, analyze it, and measure it. 2. Select the proper analytical tool/technique for a given situation and explore how to analyze results. 3. Understand the strengths and weaknesses of different quality assurance techniques, such as software testing, static analysis, code review, and demonstration. 4. Learn to collect, manage, and evaluate quality metrics. 5. Analyze and verify a variety of software properties including, but not limited to, functionality, security, reliability, and performance. 6. Gain experience with real quality assurance tools including static analysis tools, software testing frameworks, and software quality measurement tools

Instructor:
Gennari, Jeffrey
Timperley, Christopher

This course builds on the introductory Models class to cover more advanced techniques for modeling and reasoning about complex software systems. Concepts introduced in this course include abstraction and refinement, declarative specifications, advanced temporal logics, and probabilistic modeling. The course will also explore applications of modeling and automated reasoning techniques in various domains, such as security, distributed computing, and cyber-physical systems. After completing this course, students will: 1. Understand how to specify and reason about operations over complex system structures, 2. Understand relationships between software artifacts at different levels of abstraction; 3. Be able to model and reason about systems with uncertainty and stochastic behaviors; and 4. Understand potential applications of modeling techniques to practical software engineering problems. Prerequisites: Completion of Mini 1: Models of Software Systems. Sections D, PP and G are NOT available for on-campus students. Admission to the class is by approval from the instructor: If you are not a software engineering masters student, send email to garlan@cs.cmu.edu for permission to enroll. The email should briefly describe your background, whether you have taken a course with similar materials as in Mini 1, and why you would like to take the course. The course must be taken for a letter grade (not pass/fail). This is a graduate level course.

Instructor: Garlan, David Kang, Eunsuk

Note: This course previously offered as 15-421. As layers upon layers of technology mediate increasingly rich business processes and social interactions, issues of information security and privacy are growing more complex too. This course takes a multi-disciplinary perspective of information security and privacy, looking at technologies as well as business, legal, policy and usability issues. The objective is to prepare students to identify and address critical security and privacy issues involved in the design, development and deployment of information systems. Examples used to introduce concepts covered in the class range from enterprise systems to mobile and pervasive computing as well as social networking. Format: Lectures, short student presentations on topics selected together with the instructor, and guest presentations. Target Audience: Primarily intended for motivated undergraduate and masters students with CS background. Also open to PhD students interested in a more practical, multi-disciplinary understanding of information security and privacy.

Instructor:
Christin, Nicolas
Sadeh, Norman

Note: Previously offered as 08-533.

This course focuses on policy issues related to privacy from the perspectives of governments, organizations, and individuals. We will begin with a historical and philosophical study of privacy and then explore recent public policy issues. We will examine the privacy protections provided by laws and regulations, as well as the way technology can be used to protect privacy. We will emphasize technology-related privacy concerns and mitigation, for example: social networks, smartphones, behavioral advertising (and tools to prevent targeted advertising and tracking), anonymous communication systems, big data, and drones. This is part of a series of courses offered as part of the MSIT-Privacy Engineering masters program. These courses may be taken in any order or simultaneously. Foundations of Privacy (Fall semester) offers more in-depth coverage of technologies and algorithms used to reason about and protect privacy. Engineering Privacy in Software (Spring semester) focuses on the methods and tools needed to design systems for privacy. This course is intended primarily for graduate students and advanced undergraduate students with some technical background. Programming skills are not required. 8-733, 19-608, and 95-818 are 12-unit courses for PhD students. Students enrolled under these course numbers will have extra assignments and will be expected to do a project suitable for publication. 8-533 is a 9-unit course for undergraduate students. Masters students may register for any of the course numbers permitted by their program. This course will include a lot of reading, writing, and class discussion. Students will be able to tailor their assignments to their skills and interests. However, all students will be expected to do some writing and some technical work.

Instructor:
Bauer, Lujo
Libert, Timothy

Datasets are growing, new systems for managing, distributing, and streaming data are being developed, and new architectures for AI applications are emerging. This course will focus on techniques for managing and analyzing large datasets, and on new and emerging architectures for applications in machine learning and data science. Topics include machine learning algorithms and how they must be reformulated to run at scale on petabytes of data, as well as data management and cleaning techniques at scale. In addition to large-scale aspects of data science and machine learning, this course will also cover core concepts of parallel and distributed computing and cloud computing, including hands-on experience with frameworks like Spark, streaming architectures like Flink or Spark Streaming, MLlib, TensorFlow, and more. The course will include programming assignments and a substantial final project requiring students to get hands-on experience with large-scale machine learning pipelines or emerging computing architectures.

Instructor:
Miller, Heather
Hilton, Michael

Machine learning and sensors are at the core of most modern computing devices and technology. From Amazon Echo to Apple Watch to Google Photos to self-driving cars, making sense of the data coming from powerful but noisy sensors is the key challenge. The aim of the course will be to explore this intersection of sensors and machine learning, understand the inner workings on modern computing technologies, and design the future ones. We will cover data collection, signal processing, data processing, data visualization, feature engineering, machine learning tools, and some prototyping technologies. The course will focus on class discussions, hands-on demonstrations, and tutorials. Students will be evaluated on their class participation, multiple mini projects, and a final team project.

Instructor: Goel, Mayank

Note: This course previously offered as 15437. This course will introduce concepts in programming web application servers. We will study the fundamental architectural elements of programming web sites that produce content dynamically. The primary technologies introduced will be the Django framework for Python and Java Servlets, but we will cover related topics as necessary so that students can build significant applications. Such topics include: HTTP, HTML, CSS, Javascript, XML, Design Patterns, Relational and Non-relational Databases, Object-Relation Mapping tools, Security, Web Services, Cloud Deployment, Internationalization, and Scalability and Performance Issues. Students must be comfortable programming in Java and/or Python to register for this course. Students must provide their own computer hardware for this course. Please see the Related URL above for more information.

Instructor: Eppinger, Jeffrey

The course takes a software engineering perspective on building software systems with a significant machine learning or AI component. It discusses how to take an idea and a model developed by a data scientist (e.g., scripts and Jupyter notebook) and deploy it as part of scalable and maintainable system (e.g., mobile apps, web applications, IoT devices). Rather than focusing on modeling and learning itself, this course assumes a working relationship with a data scientist and focuses on issues of design, implementation, operation, and assurance and how those interact with the data scientists modeling. This course is aimed at software engineers who want to understand the specific challenges of working with AI components and at data scientists who want to understand the challenges of getting a prototype model into production; it facilitates communication and collaboration between both roles.

Instructor:
Kaestner, Christian
Kang, Eunsuk

This class focuses on the design of programming interfaces, the APIs, within larger real-world software and ecosystems. We discuss the history and importance of APIs, and the principles behind designing good APIs. This includes study of specific examples of APIs, both good and bad, for inspiration and precaution. Students gain experience with the major steps of API design: gathering requirements, documenting, testing, implementing, refining, evolving, and reimplementing APIs. The principles taught are largely language-independent, though most examples are in Java or C. Students may be able to do assignments in other languages, within reason.

Instructor: Bloch, Josh

Software engineers today are less likely to design data structures and algorithms from scratch and more likely to build systems from library and framework components. In this course, students engage with concepts related to the construction of software systems at scale, building on their understanding of the basic building blocks of data structures, algorithms, and program and computer structures. The course covers technical topics in four areas: (1) concepts of design for complex systems, (2) object-oriented programming, (3) static and dynamic analysis for programs, and (4) concurrency. At the conclusion of this course, students will have substantial experience building medium-sized software systems in Java.

Instructor:
Garrod, Charles
Bloch, Josh

NOTE: Previously offered as 08-532.

A survey of how legislatures and courts cope with rapidly advancing computer technologies and how scientific information is presented to, and evaluated by, civil authorities. The course is also an introduction to the legal process generally and the interaction between the legal system and technology organizations. Topics include: patents, copyrights in a networked world, law of the Internet, free speech, data security, technology regulation, international law, and trans-border crime. Open to juniors, seniors and graduate students in any school. Open to sophomores by permission of the instructor. Prerequisites: none.

Instructor: Shamos, Michael

This course is designed to be a graduate-level course covering the topics at the intersection of machine learning and game theory. Recent years have witnessed significant advances in machine learning and their successes in detection, prediction, and decision-making problems. However, in many application domains, ranging from auction and ads bidding, to entertainment games such as Go and Poker, to autonomous driving and traffic routing, to the intelligent warehouse, to home assistants and the Internet of Things, there is more than one agent interacting with each other. Game theory provides a framework for analyzing the strategic interaction between multiple agents and can complement machine learning when dealing with challenges in these domains. Therefore, in the course, we will introduce how to integrate machine learning and game theory to tackle challenges in multi-agent systems. The course will multiple topics as listed below

Instructor: Fang, Fei

Spring 2020

Should autonomous robots make life and death decisions on their own? Should we allow them to select a target and launch weapons? To diagnose injuries and perform surgery when human doctors are not around? Who should be permitted to observe you, find out who your friends are, what you do and say with them, what you buy, and where you go? Do social media and personalized search restrict our intellectual horizons? Do we live in polarizing information bubbles, just hearing echoes of what we already know and believe? As computing technology becomes ever more pervasive and sophisticated, we are presented with an escalating barrage of decisions about who, how, when, and for what purposes technology should be used. This course will provide an intellectual framework for discussing these pressing issues of our time, as we shape the technologies that in turn shape us. We will seek insight through reading, discussion, guest lectures, and debates. Students will also undertake an analysis of a relevant issue of their choice, developing their own position, and acquiring the research skills needed to lend depth to their thinking. The course will enhance students ability to think clearly about contentious technology choices, formulate smart positions, and support their views with winning arguments.

Instructor:
Herbsleb, Jim

Software engineers today are less likely to design data structures and algorithms from scratch and more likely to build systems from library and framework components. In this course, students engage with concepts related to the construction of software systems at scale, building on their understanding of the basic building blocks of data structures, algorithms, and program and computer structures. The course covers technical topics in four areas: (1) concepts of design for complex systems, (2) object-oriented programming, (3) static and dynamic analysis for programs, and (4) concurrency. At the conclusion of this course, students will have substantial experience building medium-sized software systems in Java.

Instructor:
Garrod, Charles
Bloch, Josh

Cryptocurrencies such as Bitcoin have gained large popularity in recent years, in no small part due to the fantastic potential applications they could facilitate. This course will first provide an overview of the technological mechanisms behind cryptocurrencies and distributed consensus and distributed ledgers (blockchains), introducing along the way the necessary cryptographic tools. It will then focus on more advanced blockchain applications, such as smart contracts, that is, contracts written as code. Finally, the course will also introduce some of the legal and policy questions surrounding cryptocurrencies.

Instructor:
Christin, Nicolas

There is growing recognition that technology alone will not provide all of the solutions to security and privacy problems. Human factors play an important role in these areas, and it is important for security and privacy experts to have an understanding of how people will interact with the systems they develop. This course is designed to introduce students to a variety of usability and user interface problems related to privacy and security and to give them experience in designing studies aimed at helping to evaluate usability issues in security and privacy systems. The course is suitable both for students interested in privacy and security who would like to learn more about usability, as well as for students interested in usability who would like to learn more about security and privacy. Much of the course will be taught in a graduate seminar style in which all students will be expected to do a weekly reading assignment and each week different students will prepare a presentation for the class. Students will also work on a group project throughout the semester. The course is open to all graduate students who have technical backgrounds. The 12-unit course numbers (08-734 and 5-836) are for PhD students and masters students. Students enrolled in these course numbers will be expected to play a leadership role in a group project that produces a paper suitable for publication. The 9-unit 500-level course numbers (08-534 and 05-436) are for juniors, seniors, and masters students. Students enrolled in these course numbers will have less demanding project and presentation requirements.

Instructor:
Cranor, Lorrie

This course covers both foundations and practical aspects of the automated analysis of programs, which is becoming increasingly critical to find software errors and assure program correctness. The theory of abstract interpretation captures the essence of a broad range of program analyses and supports reasoning about their correctness. Building on this foundation, the course will describe program representations, data flow analysis, alias analysis, inter-procedural analysis, dynamic analysis, Hoare Logic, and symbolic execution. Through assignments and projects, students will design and implement practical analysis tools that find bugs and verify properties of software. This course satisfies the Logic and Languages constrained elective category of the Computer Science major, and the Technical Software Engineering requirement for the Software Engineering minor.

Instructor:
Le Goues, Claire

Startup engineering is critical to innovation. The skills required to effectively prototype, launch, and scale products are vital to engineers everywhere, from fledgling companies founded in dorm rooms to local mid-size companies to internal startups from multi-national tech giants. However, developing software in a startup environment poses unique engineering challenges. These challenges include making and justifying foundational architectural and technical decisions despite extreme uncertainty; rapidly prototyping and evaluating new ideas and features, while building minimum viable products; prioritizing engineering effort in severely constrained environments; and communicating effectively both within a small engineering team and with internal and external non-technical stakeholders. This course teaches the skills necessary to engineer successfully in a startup environment, through lectures, group projects, case study discussions, and guest speakers drawn from experienced, practicing startup engineers. This is an engineering-focused course; no entrepreneurship background is required or expected. Students do not need to have a startup idea to participate fully. Prerequisites: 17-214 OR 15-213

Instructor:
Hilton, Michael
Miller, Heather

Many programmers think of programming languages as having a fixed, standard set of features--but in fact, languages are being extended all the time, and new languages are constantly being developed, providing great expressive power. In this course, students will learn about techniques for designing and prototyping programming languages. Design topics include language features, a practical approach to semantics, conceptual design techniques, and examples of both general purpose and domain-specific language designs. Prototyping topics include interpreters, source-to-source translators, languages as libraries, and paper prototyping techniques used for lightweight user evaluations. In course assignments, students will practice design and prototyping techniques, implementing prototype languages in several different styles. The course will end with a project in which students design, implement, and evaluate their own programming language.

Instructor:
Aldrich, Jonathan

This course is a project-based course in which students conduct a semester-long project for a real client in small teams. This is not a lecture-based course; after the first few weeks the course consists primarily of weekly team meetings with the course instructors, with teams making regular presentations on their software development process. Students will leave the course with a firsthand understanding of the software engineering realities that drive SE practices, will have concrete experience with these practices, and will have engaged in active reflection on this experience. After the course, students will have the teamwork, process, and product skills to be immediately competent in a software engineering organization, and will be able to evaluate the new processes and techniques they will encounter in the workplace.

Instructor:
Hilton, Michael
Timperley, Christopher

These days we are surrounded by sensing and computation. Smart devices, such as smartphones, smartwatches, are packed with sensors. While they are already very useful devices, we have only started to scratch the surface here. The aim of this class will be to introduce the students to building and understanding smart sensing devices. The course will include discussion into contribution of various fields, including human-computer interaction, embedded computing, computer vision, distributed systems, machine learning, signal processing, security, and privacy. We will discuss how these various disciplines are coming together to form an end-to-end system that generates useful and user-actionable data. We will take a hands-on approach towards building and evaluating these systems. The students will gain practical experience in developing sensing systems in different application domains, such as activity recognition, health sensing, gestural interaction, etc. You will learn about embedded systems and understand the advantages and limitations of different platforms. You will learn about sensors and how to interface them with the real world to be able to get useful and actionable data. You will learn how to build a network of sensors that can communicate with each other. You will also learn about storing the sensor data for visualization, analysis and presentation both locally and to the cloud. The course will be a combination of lectures, tutorials, class discussions, and demonstrations. Students will be evaluated based on 5 mini-projects/assignments, class participation, weekly reading summaries, and a final project. All hardware resources will be provided to the students and they will be given an option to take their final prototypes with them for the cost of the hardware components. Students should have reasonable programming experience and an interest in tinkering.

Instructor:
Goel, Mayank
Agarwal, Yuvraj

This course will introduce concepts in programming web application servers. We will study the fundamental architectural elements of programming web sites that produce content dynamically. The primary technologies introduced will be the Django framework for Python and Java Servlets, but we will cover related topics as necessary so that students can build significant applications. Such topics include: HTTP, HTML, CSS, Javascript, XML, Design Patterns, Relational and Non-relational Databases, Object-Relation Mapping tools, Security, Web Services, Cloud Deployment, Internationalization, and Scalability and Performance Issues. Students must be comfortable programming in Java and/or Python to register for this course. Students must provide their own computer hardware for this course. Please see the Related URL above for more information.

Instructor:
Eppinger, Jeffrey

This class focuses on the design of programming interfaces, the APIs, within larger real-world software and ecosystems. We discuss the history and importance of APIs, and the principles behind designing good APIs. This includes study of specific examples of APIs, both good and bad, for inspiration and precaution. Students gain experience with the major steps of API design: gathering requirements, documenting, testing, implementing, refining, evolving, and reimplementing APIs. The principles taught are largely language-independent, though most examples are in Java or C. Students may be able to do assignments in other languages, within reason.

Instructor:
Bloch, Josh
Garrod, Charles

Software engineers today are less likely to design data structures and algorithms from scratch and more likely to build systems from library and framework components. In this course, students engage with concepts related to the construction of software systems at scale, building on their understanding of the basic building blocks of data structures, algorithms, and program and computer structures. The course covers technical topics in four areas: (1) concepts of design for complex systems, (2) object-oriented programming, (3) static and dynamic analysis for programs, and (4) concurrency. At the conclusion of this course, students will have substantial experience building medium-sized software systems in Java.

Instructor:
Bloch, Josh
Garrod, Charles

Optimization: mathematical programming, robust optimization, influence maximization Game Theory and Mechanism Design: security games, human behavior modeling, auction and market equilibrium, citizen science Machine Learning: classification, clustering, probabilistic graphical models, deep learning Sequential Decision Making: Markov Decision Processes (MDPs), partially observable MDPs, online planning, reinforcement learning In addition to providing a deep understanding of these methods, the course will introduce which societal challenges they can tackle and how, in the areas of (i) healthcare, (ii) social welfare, (iii) security and privacy, (iv) environmental sustainability. The course will also cover special topics such as AI and Ethics and AI and Humans. The course content is designed to not have too much overlap with other AI courses offered at CMU. Although the course is listed within SCS, it should be of interest to students in several other departments, including ECE, EPP and SDS. The students in this 9-unit course are expected to have taken at least three mathematics courses covering linear algebra, calculus, and probability. The students will work in groups on a systematic literature review or a project exploring the possibility of applying existing AI tools to a societal problem, with a survey paper or technical report and presentation delivered at the end of the semester.

Instructor:
Fang, Fei