In addition to the following courses, students enrolled in the MSE programs can take electives from across Carnegie Mellon’s Pittsburgh campus.
17-603 Communications for Software Leaders I
Communications skills are fundamental to professionals in all fields, from architecture to software engineering to zoology, because they enable the exchange of ideas and the completion of organizational goals. The ability to identify an audience, to develop clear, persuasive presentations and written documents, and to handle the complex interactions that occur in the workplace make the difference between those who participate in an organization and those who lead it. This is the first course in a two-semester sequence designed to help you build and refine your skills so that you can communicate as a leader in your professional work. Through a combination of in-class exercises, case studies, projects, presentations, and written assignments, you will assess your current skill level and build upon it. There are no prerequisites to this course, other than a willingness to keep an open mind, to give and receive feedback, and to participate in interactive in-class discussions.
17-604 Communications for Software Leaders II
17-611 Statistics for Decision Making
Measurement and analysis play a critical role in effective and efficient software development, the construction of data driven applications, as well as providing the scientific basis for software engineering effort to be repeatable, reliable and predictable. This course combines a refresher in basic statistics with an introduction to measurement theory to enable students to define valid measurements in their domain of application.
17-612 Business & Marketing Strategy
Organizations must protect their profitability goals through prudent investment in well-supported engineering proposals, while avoiding misdirected initiatives. Such goals are further constrained by finance, policy, and market risk. This course covers key concepts to compete in a world where cost containment, cost leadership and market share play a critical role in keeping a company competitive, as does innovation and engineering prowess.
17-614 Formal Methods
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.
17-615 Data Structures and Algorithms
Software engineers must be proficient in data abstraction, algorithm verification, and analysis. This course will teach students practical techniques for selecting appropriate data structures and algorithms, reasoning about algorithmic correctness and computational complexity, performance, and other properties, as well as how to analyze tradeoffs among algorithmic strategies.
17-616 DevOps and Continuous Integration
DevOps practices serve to 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.
17-622 Agile Methods
Agile software development methods emphasize self-organization, adaptive planning, evolutionary development, frequent delivery and working closely with and incorporating feedback from customers throughout the development process. This course introduces students to two well-known agile methods: Scrum and Kanban, connecting these practices to established group dynamics and knowledge management theories to explain why they work and under what circumstances.
17-623 Quality Assurance
Engineering quality software relies on the effective selection and application of quality assurance tools and techniques. In this course, students learn to define and measure software quality, learn when and how to apply software testing, static analysis, code review, and demonstration, and they will gain experience in using modern quality assurance frameworks.
17-624 Advanced Formal Methods
This course builds on the introductory Formal Methods class (17-614) to cover more advanced techniques for modeling and reasoning about software systems, including abstraction and refinement, declarative specifications, advanced temporal logics, and probabilistic modeling. The course will also explore applications of modeling and analysis techniques in various domains, such as security, enterprise systems, distributed computing, and cyber-physical systems.
17-625 Design Patterns and API Design
Design patterns describe a reusable solution to a commonly recurring problem. This course will review object-oriented creational patterns for generating new objects, structural patterns for organizing and restricting access among objects, and behavioral patterns for managing inter-object communications. This course also reviews common frameworks where design patterns are used, including in the design of application programmer interfaces.
17-626 Requirements for Information Systems
Software engineering requires understanding the problem, before identifying solutions. In this course, students study ways to elicit and analyze problem statements using scenarios, use cases and mockups. They begin with poorly defined problem statements, which they refine through multiple iterations and modes of expression to yield more actionable software specifications.
17-627 Requirements for Embedded Systems
Software engineering requires understanding the problem, before identifying solutions. In this course, students study ways to elicit and analyze problem statements for real-time systems along multiple dimensions, including concurrency, dependability and safety. This includes developing and aligning mathematical and physical models for the effective application of control theory.
17-632 Software Project Management
Software projects operate like temporary organizations established to achieve a one-time objective in an agreed time frame. They require the execution of interrelated, normally non-repeating activities, by multidisciplinary groups. Therefore, projects require prescriptive planning, budgeting, staffing and risk management. This course introduces student to fundamental project management techniques and tools such as activity planning, milestone planning, estimation, work-breakdown structures, critical paths.
17-634 Applied Machine Learning
Autonomous and intelligent systems increasingly rely on automated decision making based on statistical models. Popular models are used for classification or prediction. This course introduces students to unsupervised and supervised machine learning in the context of software engineering, including the analysis of natural language in bug reports and mobile app reviews. Techniques covered include latent Dirichlet allocation, TF/IDF, naive Bayes, linear regression, decision trees, and random forests.
17-635 Software Architecture
Successful design of complex software systems require the ability to describe, evaluate, and create systems at an architectural level of abstraction. This course covers commonly-used software system structures, techniques for designing and implementing these structures, models and formal notations for characterizing and reasoning about architectures, tools for generating specific instances of an architecture, and case studies of real-world system architectures. It teaches the skills and background that students need to evaluate the architectures of existing systems and to design new systems in principled ways using well-founded architectural paradigms.
17-636 Applied Distributed Systems
Modern software engineering depends heavily on distributed computation and storage. This requires a practical understanding of computer networking, computer and network security, and virtualization using containers. This course covers the fundamentals of distributed computing required to study modern deployment and continuous integration, and the design and analysis of data-intensive and scalable systems and sensor-based systems.
17-642 Software Management Theory
This course examines software development from an organizational perspective and is designed for students who aim to understand the relationship between business context, software development processes, knowledge creation, culture and organizational structure with the purpose of becoming change agents who manage the software development function at the business unit or department-level or above. The course highlights the need to follow good work principles in order to avoid ethical failures as evidenced by recent events.
17-643 Quality Management
Software engineers must consider quality during every phase of a project from inception to delivery and beyond. This class introduces the managerial challenges, including defining a quality management process, understanding the costs associated with achieving and missing quality goals, understanding tradeoffs and gaining experience using collected quality metrics to inform project-level decisions.
Neural networking has shown promise in multiple areas in artificial intelligence, including image classification, natural language processing and speech processing. Software engineers should understand the fundamentals differences in deep learning architecture and how to perform error analysis. This course introduces students to a variety of neural network architectures, including convolutional neural nets, recurrent neural nets, encoder-decoder with attention, and long-short term memory, as well as experience diagnosing and improving model performance.
17-647 Engineering Data-intensive and Scalable Systems
Internet services companies such as Google, Yahoo!, Amazon, and Facebook have pioneered systems that have achieved unprecedented scale while still providing high level availability and a high cost-performance. These systems are data intensive, primarily performing data I/O and manipulation rather than computation. They often operate in the commercial space and thus the cost-performance must be profitable in real-time, around the clock. This course covers the design and construction of data intensive scalable systems, with a focus on consistency, time and synchronization. This course will teach students how deployment, monitoring, and upgrading these systems impact their design.
17-648 Sensor-based Systems
There is an increasing and visible trend in adoption of new approaches to automate business processes, replacing repeatable tasks and leveraging artificial intelligence as organizations prepare to renew themselves with a new competitive advantage through efficiencies and scale in operations. Product and service delivery operations, and industrial control systems are increasingly being connected by sensors and actuators that deliver event-based data that is critical to optimizing performance. This course teaches how to design intelligent systems that work effectively in a secure and reliable manner while producing data that can be analyzed using machine learning.