How to Avoid Shipwrecks in Software Development

Image credits: Photo by Matheus Guimarães from Pexels

Building software can feel a bit like steering a ship through an endless ocean. We have to fight storms, waves, fog and even some icebergs. How do we know our correct direction? And how can we check our current position? There is no GPS signal to guide us developers. Nonetheless, we need to be able to course-correct, like a good captain does with his ship. The best way to do this is to establish feedback loops.

Feedback is essential for learning and interacting with the world. Kids know this intuitively, and they are not ashamed of trying things out early on. In contrast, we adults tend to rely on our skills and experiences to get things done correctly. This attitude is a bit risky in the complex world of software engineering. It’s no wonder so many projects are still failing to fulfill customer needs while costing more money and time than originally planned.

One of the most important ways to avoid going in the wrong direction is to establish feedback loops. Getting regular feedback allows us to learn and adapt quickly. It makes us more confident, too. Here are some examples:

Requirements Feedback

Early on, when requirements are gathered, is the best time to start the first feedback loop. Communicate with your stakeholders. Ask questions and paraphrase your current understanding of their needs. Ask them to explain things clearly and with details. Let them correct your statements if you got something wrong. Play dumb if you must. The point is to interact in a two-sided conversation instead of making blind assumptions.

Architecture and System Design

Architecture decisions come into play when new software services are built or larger changes are planned. It is essentially a design phase where the groundwork for a software’s future is laid. Hence, it is very important to get feedback from other developers who are experienced with architectural topics. Explain your thoughts to them and get their opinion. Discuss alternative options and their pros and cons. Don’t let architecture just happen. Make it a conscious decision with deliberate trade-offs.

Tests and CI/CD Pipelines

Verifying implementations with tests is a natural feedback loop. Even better, the feedback loop from automated tests can be short and fast. If you changed some part of the program and a test failed, it is likely that you made a mistake. That is a good thing, because now you can fix the bug instead of later, when it occurs in production. The same applies to build pipelines. Early integration and continuous deployment deliver fast feedback for learning and adapting.

Code Reviews

Code reviews allow both knowledge sharing and getting feedback from colleagues. When done with respect and empathy, they provide a good way of getting and giving feedback. Maybe some code sections are hard to read and understand. Maybe there is a more elegant or efficient way to solve a particular problem. Or someone supports your implementation and confirms that you did a great job. Whatever it is, nobody is perfect, and we can all improve by getting constructive feedback on our code.

User Feedback

Finally, there is user feedback, which should be included as early as possible. We can use prototypes or demos to show intermediate results to pilot customers, business experts or product owners. Their perspective is typically very business and customer-oriented, which helps a lot in getting valuable feedback. This is especially useful for topics like usability and frontend design. Moreover, it is another chance to check the understanding of requirements, ideally before the software goes into production.

Summary

Make sure to establish several feedback loops in your development process. Avoid just coding away blindly until some distant delivery date in the future. By doing this, you will get much better results and bring your ship into the harbor safely.

#SoftwareEngineering #FeedbackLoop #Tests #Requirements #Reviews

Bastian Isensee
Bastian Isensee
Software Engineer (Freelancer)

Quality-driven Software Engineer focused on business needs, knowledge sharing, FinTechs, Golang and Java