I recently gave a presentation to undergraduate students about some of the challenges of working on large-scale software development projects. One of the key challenges that I highlighted was communication. Although this is not specific to a software development project, it is extremely important. If communication is not performed properly, then it becomes nearly impossible to solve technical problems. In my presentation I identified three types of communication that are often challenging to perform: manager to developer, developer to manager, and developer to developer communication. In this post I will discuss each of these types of challenges, provide an example of that challenge, and then describe a solution for overcoming that challenge.
The first type of communication challenge that I identified was communication from managers to developers. This type of communication is extremely important because the managers are responsible for giving developers their tasks and letting them know which tasks are most important. If the managers do not communicate effectively then the developers will not complete the correct tasks or may incorrectly implement requirements. One common communication “technique” that I have seen managers use is the shifting deadline. Figure 1 illustrates this technique. When the manager uses this technique they tell the developers that a hard deadline is approaching in order to get them to work hard and complete many tasks. The developers will inevitably be unable to complete all of the work before the deadline, at which point the manager will reveal that there is a small extension to the deadline. The developers are then encouraged to keep working very hard until the new “deadline”, which is eventually revealed to be false as well. By using this technique managers are attempting to get developers to consistently work long hours, but developers are able to quickly identify the pattern and will soon no longer trust the deadlines. What managers should instead do is discuss the work that needs to be completed with the developers in order to determine what is feasible and to create a realistic schedule and deadline.
Communication from developers to managers is often challenging as well. Once the manager is accurately reporting the tasks that need to be completed and the deadlines for the work, it is the responsibility of the developer to work on the highest priority items and to keep management informed of any problems or unforeseen challenges identified during development. If the developer finds that the amount of work that they are being asked to complete is unrealistic given the deadline, then they should immediately inform their managers. Given the pressures that the developer is under, which are illustrated in Figure 2, it is often tempting to take shortcuts in order to meet deadlines. Such shortcuts include not completely implementing requirements, not writing unit tests, or overlooking potential security problems. The developer should not make the decision to take these shortcuts, but should instead inform his or her managers of the problems and let them make a decision.
The final communication challenge that I identified occurs between developers. Even though it is the job of management to coordinate with other teams when there are changes that affect the software as a whole, the developers must still meet with each other as needed in order to overcome technical challenges and conflicts. One such conflict, modifying a common method, is illustrated in Figure 3. In this situation the developer modifies a common method Mc in order to make some method M1 work correctly. However, in doing so, the developer inadvertently makes methods M2 through Mn stop working. This is a problem for the other developers, who will spend a large amount of time debugging the problem. It may also cause future developers to lose confidence in common methods and may result in a large amount of code duplication. Before modifying any common method, a developer should at least send out an email in order to discuss the change and to make sure that it does not adversely affect any existing methods or functionality. Since the other teams may not fully understand the impacts of a change, it is important to develop a set of regression tests that can be run every time the software is modified. This will allow developers to make changes to common methods and functionality with greater confidence that other parts of the system will continue to work as expected.
In this post I highlighted three types of communication challenges. These are not the only communication challenges and they are not specific to software development; however, when communication is not performed well during software development then it is nearly impossible to correctly implement a system that meets the client’s needs. Although it is important for a developer to build and maintain technical skills, the developer will not be able to put those skills to practical use unless he or she is able to effectively communicate. Because it is often difficult to notice that a breakdown in communication has occurred until there is a crisis, it is important for developers (and managers) to learn from their mistakes. As a team improves their communication skills, there is a greater likelihood that they will be able to deliver high-quality software.