Course Overview

Understand the course content and its instructional approach.

Intended audience

This course will help anyone who has to maintain and develop a codebase. As mentioned before, anyone who writes code must deal with bugs. Practicing software engineers and even students will find this course helpful. Some companies have special teams dedicated to fixing bugs, called continuous product development or sustaining development engineering. Individuals in such organizations will find this course especially useful. A large section of the course’s material contains guidelines and tips for software engineers who have to debug defects in production environments to which they might not have access. Most concepts and ideas explained in the course will help with “on-premise” software but can also be applied to cloud software products.

Course structure

The course outline is as follows:

  • The first few sections of the course explain each bug category and describe various bug types. For each bug category, we will describe its typical symptoms on the product, and what kind of mistake in the code might have led to this kind of issue. What is the relevant information needed to go after this bug, and what to do if the ideal information on the root cause of this issue is unavailable? Finally, we'll also touch upon tips to avoid these bugs. Initially, we’ll learn how bug triage works and the tools and information that could make this process easier.

  • We will then look at some standard debugging techniques. How do we reproduce the issue in-house or explain code behavior seen elsewhere? How do we trace code with the diagnostic information, and what would make diagnostic information most practical and valuable?

  • Programmers must deal with legacy code to extend its functionality or fix issues. In both situations, code must be read, understood, and tackled. The course has a section on code reading, which will help students and professionals with this task.

  • The course assumes the reader has some experience with programming and has to develop, evolve, or maintain a code base. Some language-specific details exist, but the broader concepts are agnostic to the platform and programming language. The section on multithreaded debugging, scaling, environmental issues, and resource leaks, such as those encountered in platforms like C/C++, are applicable across all programming languages. Anyone with a degree in computer science or a related field and reasonably relevant experience will be able to understand the language-specific parts of the course.

  • We’ll discuss a little about debugging at a higher level with monitoring and observability and also troubleshooting environments.

  • We'll finally discuss aspects of the software design and code that will make a system more debuggable.

Before we begin

We’ll be dealing with many example code snippets for explanations and quizzes. To minimize context switches and descriptions around our code examples, we’ll use an example software system for course management, from which we’ll use modules and code. Each such section will point out the areas of the software system one needs to know to proceed with it. Finally, course material only deals with bugs in the code and won’t touch upon any gaps between the product’s requirements and design.