10 Useful Tips for Debugging and Troubleshooting in Programming

- Lance Johnson 02.06.2015


Writing clean code is not just a simple way to keep you, the programmer, headache-free; it immensely improves your productivity.  The skill to find the bugs in a program are often lacking in newbie programmers but every once in a while, even veteran programmers find themselves completely stumped by a piece of code that simply refuses to run the way it is supposed to, with no apparent reason.  Whether you are an ace programmer or a relative newcomer to this arena, debugging and troubleshooting can eat into your time, patience and energy dramatically leaving you toying with the idea of rewriting the code from scratch. If you find yourself in this kind of situation, you should probably keep these 10 useful tips for troubleshooting and debugging in mind.

1) Use the Debugger

Using a debugger designed for the language you are using is a simple and effective first step to take when troubleshooting problematic code. Debuggers let you follow how each line of the code is being executed within the program; they enable verification of the variable values too which makes it easier to spot glitches that may be ‘invisible’ otherwise. For some programming languages, there may be more than one debugger available. In such situations, choosing one that has graphical interfaces and options to halt code execution may be the better idea.

2) Keep Track of Bugs

Keeping track of the bugs that are encountered in your program serves the purpose of giving you an idea of which kind of functions are being affected which, in turn, may hint at where the problem may lie. Bug tracking also ensures that you do not overlook any issues before releasing the second version. Maintain a single list of bugs where all the problems can be listed. If possible create the list in a shareable document like google docs so that other team members can view and contribute to the document. This will make it easy for you to spot links between bugs and categorize them so that you know which groups can be resolved by addressing one specific problem area.

Your bug tracker can be a text file or a specially designed bug tracking solution. No matter which you choose, just make sure it is accessible and usable by all, even non- programming team members who may identify and report problems with the code.

3) Pay Special Attention to Boundary Conditions

Did you know that bugs love boundary conditions like loop beginnings and endings, file beginnings and endings, entry and exit to modules and such like? Paying extra attention to these areas is a good way to spot bugs early on in the troubleshooting process. Check if your boundary conditions are accurate for the code and are what you expect. 

4) The Humble Print Statement

The Print statement is a surprisingly effective debugging tool that you can use to pinpoint the section of code that has the bug. Savvy programmers make generous use of these statements to keep track of data values and variable types. They indicate how the data is flowing through a piece of code so that the programmer can quickly spot the problem area where things are not as they should be. If inserting a print statement is a ‘no can do’ why not use a logging system instead?

5) Readable Code Backed by Comments

Making your code readable so that looking at it gives the reader a good idea of what it is supposed to do is a great way to make debugging easy. Add comments to packets of code to explain what is expected to happen and why this code is being used and how the section relates to the rest of the program. Your code can easily be debugged even by a person unfamiliar with the program if the comments are lucid and the code follows a rational, logical sequence and naming pattern.

6) Using Version Control Effectively

The advantage of version control is an undeniable one since it allows the programmers to roll back to the last working version with ease. Plus, by using a version control system you can also have different versions of the same code safeguarded when they are being worked on by different programmers. Once the final, working version of code is delivered by all the programmers working on the project, the versions can be merged to give one seamless, perfectly working program that is ready to run without glitches. Become familiar with the different ways to view work history with git it will allow you to get a better idea of all the changes the code has undergone within a distributed team environment. 

7) Coding with a Single Point Objective

One of the best practices to follow in programming is to write functions that have a single point objective. When one piece of code is designed to carry out several functions, the chances of glitches are far higher and it is far more difficult to identify the error as well. Code written with a focused objective is far easier to check and test too. In fact, automated testing, which is a valuable debugging tool, becomes easy with such code.

8) Explaining the Problem Out loud

Known by the peculiar term Rubber Duck debugging, this debugging measure involves a clear, simple description and explanation of the bug out loud to gain complete clarity on what is happening. This forces the programmer to think logically and present the bug in a logical, sequential manner too. Often, this simple explanation indicates to the programmer what and where the problem is. The explanation is often made to a non- programming colleague or even a teddy bear or rubber duck, which is where the term rubber duck debugging came from! The idea is that the programmer can identify the problem area on his own if he can manage to break the problem down into simple terms which makes for better understanding of the process and the problem.

9) Using Lint Programs

Lint programs can spot potential problem areas before the code is executed and/ or check for correct syntax and style. Run your lint program in the editor even at the writing stage to weed out issues before the code is even ready to run. You can also put your completed code through a lint program to determine where bugs lie. This kind of program ensures that bugs that arise due to bad syntax, typing mistakes and data type mismatches can be caught early on. TSLint is a great example of a Linter that can be used in VSCode. 

10) Efficient Documentation

Documentation makes your code easy for users to understand. Good documentation indicates the work flow of the code and shows where other interfaces are called in. In effect, it gives an outline of what should happen when the code is performing perfectly. Efficient documentation shows the parts of the program that are not supported by a thorough understanding of the system and these are the parts that are most likely to be troublesome. 

schedule a call