It is often difficult to understand why software engineers struggle to deliver successful software projects on time and without bugs. Well, software development is no walk in the park.
Software is difficult to build because the development process requires a large amount of collaboration between skilled software designers and the intended recipient of the final product. If the skill of the designers is poor, or if communication errors arise, then the software will be flawed.
There are many reasons why software is challenging to build, with the main one being lack of monitoring. Monitoring is one of the essential aspects when it comes to software development. This aspect requires sufficient attention for you to have a successful build. Other reasons include the young software industry, lack of user input, and external factors.
This article is not to justify any shoddy or half-baked software development practices but to try to shed some light on what some developers go through. It gives some of the reasons why software is challenging to build.
Reasons Why Software is Difficult to Build
Despite the brilliant development processes, software development is still a difficult task. Here are some reasons why.
Software industry Still Young.
The software, like any other, needs time to perfect its processes. For instance, the construction industry has been around for thousands of years. The construction of bridges, roads, and houses improved over this span. Possibly in the early days, there could have been the collapse of many bridges and houses before they learned what to do and what not to as far as construction is concerned. Even now, engineers are still discovering the proper techniques to perfect their structures.
In the same way, the software industry has a long way to go being only around 50 years old. It will take a significant amount of time to gain experience similar to the manufacturing and construction industries.
Moreover, the construction industry of today utilizes prefabricated parts and materials. Most of them are machine-made and have undergone tests on several projects. Unfortunately for the software industry, there is no luxury of the pre-built components like other industries.
The software systems are essentially founded on discovering, inventing, and creating new components to obtain a result. Each of the new systems is custom projects built from scratch, hence the next point.
Every line of code is a possible point of failure.
Since every new project is custom-built, it is true to say that every line of code is unverified and should therefore be tested. However, in reality, this is an impractical step. Every line of code comes with hundreds of likely dependencies, states, outputs, or inputs to deal with.
Each line can affect or be affected by external factors of other lines. Even if you were to test each line, it is impossible to detect an unknown factor that could cause a potential error. And that is not all; testing one line of code at a time is only the tip of the iceberg.
No line exists independently- each of them forms part of an entire system. Therefore, you will be required to test the whole system to ensure that each part functions correctly for the application to work. And with the complexity of the software, it is nigh impossible to test each path.
In reality, even the best of project teams opts to implement processes designed to increase the possibility of having defect-free software. These processes include coding standards, automated regression testing, smoke testing, design and code reviews, unit testing, and other techniques. All these are employed to enhance the software quality.
Furthermore, the testing is not free. Each project should answer one fundamental question- how critical the software is and what amount of testing it should undergo to ensure its correctness. Often, the testing process is hastened, and many software is presented with too many defects.
For other systems, when the testing is extended past a specific point, the returns are diminishing. Most software developments have experienced this- where the value of releasing the software is more than what is gained when you continue to test it for defects. This explains why some commercial software is released even with defects.
Lack of User Input
Research companies have for over ten years conducted a study on IT projects on their companies to determine the factor that caused a challenge in software development. It was discovered to be a lack of user input. The following reasons were given; users are often too busy and have other things to do. The management usually promotes the system, and therefore, the users do not have buy-in, and finally, poor relations between the IT team and the user community.
Without the input and involvement of the user, the project is headed for failure. The user is fundamentally the subject domain expert and has the authority to make the necessary decisions keeping in mind the project’s timescales. And when good user input is achieved, we face yet another challenge, as explained below.
Users Not Knowing What They Want Until They See It
In software development, any analysis of user requirements has hit a dead end. It has become an indisputable fact that the users will only think that they have an idea of what they want. But ultimately, it dawns on them when they see and use something to understand what they need. This is usually the case when the software being developed is a new process or idea they have never used.
Numerous studies have confirmed this concept by stating that approximately 25% of projects experience a change in initial requirements during the development process. This accounts for the typical ‘scope creep problem that almost all projects face. It starts when the user begins to see the first designs causing them to think more critically about their needs.
The challenge is whether the user ignores the new requirements and continues building the software with the risk that it would not deliver to customer’s expectations or takes on the latest changes as they come expanding the projects and raising the costs. This dilemma is a common one with no simple answer.
There are prices to pay in both cases despite the efforts to make several techniques like Agile development that will make it easier for the user to adapt to the changes as they come. It becomes even more complicated with the knowledge that even the small changes can cause a significant impact on the software.
All software developers, at some point, are faced with the daunting challenge of change of requirements in the development phase. Though it is doable, it is not easy at all. And when you decide to accommodate the new requirements, it affects both the budget and timeline unless you have to remove other requirements.
Low Entry Barriers for Programmers
Many people can quickly write a code, but this does not guarantee you that you will have an easy time developing great working software. It is like trying to learn a new language. It is possible to understand the grammar and get a few vocabularies, but when it comes to discussing with the native speakers, that is a whole other story.
Recent studies have summed it up for us- the productivity ratio between various developer grades goes up to 28:1. Therefore, you will only have to go for the best developers if you are hiring. This is also not easy because the great ones are rare.
The software industry has not put any barriers for new programmers in place, so it is teeming with poor programmers that negatively affect more projects. Additionally, even the young developers who are potentially good tend to make some mistakes that an experienced developer can avoid through experience.
It is always good to hire an experienced developer, even with the high price they are worth. They deliver better, less code, and more quickly. The project will have fewer defects and save you money in the long run.
Software Affected By External Factors
All physical structures tend to obey physical laws such as mass, atmosphere, and gravity. And with the knowledge we have acquired for hundreds of years about this world, we can make predictions and even mold it.
However, the software is a mindware and does not follow the physical laws but must adhere to external constraints like performance criteria, legacy data formats, scalability, integration with software, hardware, and many others.
As a software developer, you need to understand and consider all these external factors, which is not easy; even with a simple requirement like multiple support browsers, the challenge of building and testing the software increases exponentially.
Estimation is an art, not science.
As earlier mentioned, all projects are custom-built. You have to work without any pre-built components. The project is likely to suffer from scope reep; it is no surprise that estimating the timescale of the project cannot be a scientific task. Not with the many unknowns. There is the experience factor in estimation since you can anticipate the unknowns likely to be encountered and account for some time.
Often many projects overlap each other because of the very optimistic estimates set by inexperienced developers that things will flow smoothly and do not anticipate any unknowns. For projects that involve new technology or complex external interfaces, the estimation might be even more challenging. Their risks are harder to quantify and make the correct allowance for.
Software applications can be likened to an iceberg- you cannot see the 90%. There is significant complexity that is not in plain sight, and the user will only uncover them as they proceed. The next time you think about the software applications, remember the developers struggling to deliver within a timeline and fighting a wave of complexity and challenges.