Most people's image of software development is one of programmers slinking away at keyboards, creating magical lines of code that turn ideas into working apps or websites. The myth is that software programmers sit there coding furiously till a product is born. Had only it been that straightforward.
Though I hate to break it to you, coding is only one of the most challenging components of software development. It's not a stroll in the park, but once you have perfect syntax and logic, coding becomes, well, normal. The actual difficult task is initially knowing what the program is meant to accomplish. Indeed, obtaining the requirements correctly is more complex than coding when developing software. And if you have ever participated in a development project, you most likely nod along—perhaps with some battle scars.
Let's explore the less glamorous, sometimes disregarded process of requirements collecting and why it is the real make-or-break phase of software development. It is where all those budget overruns, project delays, and stressed-out developers originate.
The false simplicity illusion is seen in "Just Build It."
When a stakeholder—let's call him "Bob from Marketing"—comes to you and says, "We just need a simple feature added," one of my all-time favourite events in software development is about here. I mean, a day should be plenty of time, right?
By now, every developer's inner monologue is like this: "Oh Bob, if only you knew..."
From the outside, software development is straightforward. "I need a feature that lets users upload files," the product manager states; you then develop some code to do this. Straightforward, correct? Apart from that, it never is. The fact is as follows:
Which files are allowed to be uploaded—PDFs, Word documents, pictures, videos, or something else entirely?
How large may the files be—a few kilobytes or gigabytes?
What happens if the file upload fails in the middle?
Is the data encrypted? How are they stored?
What occurs when there are two simultaneous attempts by users to provide the same item?
When you multiply the requirements phase by the total number of features in a software project, you will see why it is both extremely important and extremely painful. For every request that seems straightforward, there are a thousand unspoken questions that need to be answered.
The "It's Just a Button" conundrum
Try obtaining the proper requirements if you believe that obtaining requirements is challenging. "One of my clients once said, "We just need a button that says 'Submit,'" Simple enough? Instead, it became a weeks-long ordeal. What transpires when you push the button? Will it be saved in the database? Does that mean an email should be sent? And if the user loses internet access? Is it better to throw an error, have it try again automatically, or seem nice?
The most excellent part is when you finally figure out what that button should do, and the client asks, "Oh, actually, is it possible to have the button say 'Send' instead of 'Submit'? Could you also make it blue and float to the top of the page as a user scrolls?
Greetings to all of us from the world of software needs.
People are not predictable, coders are
Essentially, developing software is a practice in handling uncertainty. Oddly enough, the portion of the process that is least uncertain is frequently the coding. Code writing is similar to puzzle solving once the requirements are apparent. Programming languages are a known set of rules with a known result—a functional feature. There are bugs, of course, but they're usually just logical mistakes or technical difficulties that you can resolve.
Conversely, people are the actual unpredictable factor. Clients, end users, and stakeholders don't always know what they want. And when they do, midway through the project, they frequently have second thoughts. The "simple" feature you started working on has suddenly grown into a full-blown project that is entirely different from the original request as requirements change and new priorities arise.
One thing is certain: No compiler can resolve ambiguous or contradictory requirements, and no amount of coding can save the day when the foundation is weak.
The spread of Inadequate requirements
Inadequate specifications can prevent entire timetables from being derailed, in addition to slowing down a project's early phases. To exemplify this, let me share a brief tale from my own experience:
My first project as an employee aimed to develop a customer management system. Despite the ambiguity of the requirements, we believed we had enough information. When the client realized, "Actually, we want to track product warranties in the system too," we were about halfway through the development process. Okay, I see. To consider warranties, we had to rebuild the database and completely redo a ton of code altogether. Not to mention a few dozen headaches, this prolonged the process by many weeks. It wasn't the first time the requirements had changed, of course.
The worst of it? After the system went live, the client determined they didn't really require the warranty feature. By now, I would be retired if I could have sent them an invoice for each pointless meeting we had.
Conditions and the art of questioning
As a developer, I've discovered the hard way that the best defence against the messiness of ambiguous needs later on is to ask questions. It's like playing the telephone when developers don't ask questions and begin writing what they assume the client wants, and the outcome is rarely positive.
Before developing even one line of code, the following inquiries should always be made:
- What issue do we aim to resolve?
- How do they anticipate this feature functioning, and who will use it?
- What is this project's long-term goal?
- Exist any edge cases that we haven't considered?
- What does this feature's success look like?
Although they may seem apparent to you, you'd be astonished at how many initiatives begin with a clear understanding of the answers to these fundamental questions. The worst thing is that until they are far into the code, developers frequently are unaware that the requirements are not complete. Usually, by that point, there is still time to prevent delays and redo.
Sort of—Agile to the rescue
Agile development has gained popularity in part because it recognizes a fundamental reality: requirements are never fully completed. Agile is based on the premise that requirements can be iterated upon and changed as needed. This flexibility is not a panacea, but it does help reduce the risks related to inadequate or evolving standards.
Every sprint in an agile setting involves acquiring, honing, and clarifying requirements. Sounds perfect. Sort of, anyway. The truth is that ambiguous requirements and inadequate communication can still cause delays in an agile framework. You're wasting time and spinning your wheels if the product owner is unable to provide the development team with a clear vision for the upcoming sprint.
Agile, however, is beneficial since it lets you adjust when new information becomes available. However, being able to alter course does not replace having essential needs at the start of each sprint. It implies that you will have more chances to identify errors before they become more serious.
AI and the requirements of the future: (Don't Get Your Hopes Up)
Artificial Intelligence is being hailed as the answer to every issue under the sun in today's world. The query that was put forth was, "Can't you AI develop programming for you?" was the question posed. Comes up frequently. While AI can produce code fragments and manage specific monotonous jobs, it cannot address the most challenging issue in software development, which is obtaining and comprehending requirements.
How come? AI is unable to read thoughts? It cannot have a conversation with stakeholders and pull out their hazy, incomplete thoughts about how they would like their program to work. It is unable to pose the problematic queries that must be resolved before any code is created. Furthermore, it can't foresee the alterations or direction changes that inevitably occur halfway through a project.
In reality, the reason AI will likely become sentient at some point and intelligent enough to gather requirements is perhaps more important than software development.
Defining the product is the real work
Ultimately, writing code isn't how software is made. It comprises selecting a product, understanding user needs, and translating those needs into implementable requirements. Coding is essential to creating a product work, but with a clear vision, even the best-written code will be useful.
Congratulations if you have ever worked on a project where the criteria were clearly, effectively conveyed, and accepted by all. You are an exceptional being. Muddling through ambiguous, changing, and occasionally outright contradicting requirements is just part of the work for the rest of us.
You may chuckle at them the next time they ask, "Isn't coding the hardest part of building software?" Determining what customers want, ensuring that they truly know what they desire, and convincing customers to persevere when they wait for the solution to be delivered are the most challenging parts of developing software.
Conclusion
Developing software involves more than just creating code; it also entails identifying, comprehending, and honing requirements. Debugging code and fixing faulty logic are possible, but if the project's basis is weak, it could collapse as a whole. The most challenging aspect of developing software is frequently hidden from view by others: it lies in the discussions, explanations, compromises, and never-ending revisions that take place before the first line of code is ever written.
Thus, nod and grin the next time you hear someone lamenting how complex coding is. As you know, fundamentals are the most important component.
Next PostPrevious Post