Current Courses
This undergraduate course focuses on understanding lower-level (closer to hardware) issues in computer design and programming. The course starts with the C programming language, down to assembly and machine-level code, to basic operating system concepts. Students learn to read assembly code and reverse-engineer programs in binary.
This undergraduate courseis an intensive, hands-on study of practical techniques and methods of software engineering. Topics include fundamental concepts in SE, software process models, requirements specification, planning principles and techniques for cost-effective engineering of quality software, detailed design and modeling experience to represent creational, structural and behavioral aspects of a software system using a common modeling language, implementation, testing, software quality assurance, software project management and scheduling, risk management, and software maintenance.
This undergraduate course introduces students to the field of software analytics which focuses on collecting and analyzing traces of the software development process to derive actionable insights and developer support tooling. The course is structured around a selection of different software development activities (defect detection and fixing, testing etc.). Students will mine and analyze open-source software artifacts to understand how these activities manifest themselves in real-world software projects and how this empirical evidence can guide developer decisions. This is a research-based course where students read, discuss, and reproduce seminal and state of the art papers.
This undergraduate course introduces students to intermediate representations, inter-procedural and intra-procedural analyses, call graphs, pointer analysis, and analysis frameworks. Students acquire a solid knowledge about the theory of program analysis, as well as practical experience through the course assignments and project.
Previous Courses
This undergraduate course introduces students to the principles, methods, tools, and practices of professional programming in C and Linux. The lectures focus on the fundamental principles of software engineering based on abstract data types and their implementations. The laboratories complement the lectures by offering an intensive hand-on experience through tutorials and exercises.In this course, students also learn about how memory is allocated for the programs they write.
This undergraduate course introduces students to the interface between software and hardware, as well as the major issues with the design and implementation of parallel programs that run in multiple processors. Students leave this course with an understanding of how machine code is generated by a compiler/assembler.
In this senior undergraduate course, students learn about the best processes to follow to produce better quality software that is also more maintainable. The course discussess different types of tests, automated quality assurance tools and pipelnes, and quality models. The course is geared towards practicing all covered concepts using state-of-the-art tools with lots of hands-on projects and assignments.
This undergraduate course introduces students to intermediate representations, inter-procedural and intra-procedural analyses, call graphs, pointer analysis, and analysis frameworks. Students acquire a solid knowledge about the theory of program analysis, as well as practical experience through the course assignments and project.
Software analytics aims to leverage many sources of software data (e.g., source code, version control systems, continuous integration logs, testing logs, crowd-sourced documentation websites such as Stack Overflow) to provide support for such decisions. This graduate course covers various tools and techniques used for analyzing software data in order to provide actionable insights related to library & API usage, code recommender systems, software evolution, software security, and collaborative software development.
This seminar-based graduate course explores seminal and state-of-the-art research on software maintenance, evolution, and reuse. While a variety of problems related to maintenance and reuse are explored in this course, the common methodology used for studying these problems is mining software repositories. Mining software repositories involves mining and analyzing software engineering data from various repositories such as version control repositories, bug repositories, developer forums, etc. The course instructor will provide some background lectures during the first two weeks of the course. During the remainder of the course, students will present and discuss papers related to the course topics
This is a graduate-level course focusing on Software Product Lines (SPLs), as well as highly-configurable software in general. The course covers different ways of implementing SPLs as well as advanced research techniques for analyzing and maintaining highly configurable software. This course requires active participation: approximately 2/3 of the course involves seminar-style presentations and discussions of recent research papers as well as the course assignments and project. The remaining 1/3 consists of lectures and hands-on demos. Various large-scale open-source software such as the Linux kernel, WordPress, and debian will be discussed in the covered papers and lectures.
This graduate course provides a platform for students to discuss research papers that study what it takes to build secure software. It also enables students to conduct in-depth research in software security, with the ability to apply it to their own area of interest (e.g., computer architecture, machine learning).
This is a special topics undergraduate course that was taught for two years. Developing high-quality software involves more than just writing code. Software engineers engage in many activities such as code review, testing, fixing bugs, or running various checks on their code. In this course, students learn about modern software development practices and tools that support the various activities of the software development process. This course adopts a hands-on approach to practicing core skills that have become necessary for effective software engineers. The course will alternative between a selected theme (e.g., web-based systems, distributed systems, AI-based systems, open-source development etc.) to provide a concrete domain for students to practice the different activities within. Many of the topics covered in this course have been integrated into the revamped software engineering course above.