In software, collaboration is an engineering necessity as well as an ethical value
Author: Valeriano Sandrucci
Different contexts, similar problems
At Jaewa, we have spent years working on system integration, legacy software reengineering, distributed architectures, and the development of tailored solutions. We work with structured companies, SMEs, internal products, critical operational platforms, and ecosystems in which various systems have accumulated over time: a variety of contexts that makes it necessary to compare similar problems seen from different angles.
From the experience gained across this variety, a recurring fact emerges: software problems rarely originate in the code itself, but much more often in unspoken ambiguities, incompatible expectations between parties, unclear responsibilities, and, above all, in a poor relationship with uncertainty.
When we step in after the system is already compromised
We often find ourselves intervening in situations that are already compromised: unmanageable legacy systems, fragile integrations, blocked roadmaps, or exhausted teams after months of constant pressure. In those cases, our work resembles that of an emergency room: first you stabilize the patient, then you think about the path of evolution.
In almost all these scenarios there is an implicit fracture between those who develop the software and those who commission or govern it. On one side, there are technicians who see complexity, constraints, dependencies, and technical debt, while on the other there are those who know the domain, the business goals, the operational urgencies, and the expectations of the people who will use the system.
Almost always, both sides are right, and almost always, both sides are frustrated by the circumstances.
Stories that repeat themselves
The stories we hear tend to repeat themselves: night releases, escalations, impossible deadlines, and weeks spent chasing problems that emerged too late. These situations are often described as if they were inevitable, as if permanent tension were part of the job and conflict were the price to pay for “doing software seriously”.
In some environments, it almost becomes a rite of passage: anyone who has not experienced emergency nights, last-minute requirement changes, or trenches between business and development is not considered “senior”.
Common, but not inevitable
Our experience leads us to a different conclusion: these scenarios are common, but that does not make them virtuous, and they are not inevitable.
Developing software should not become a confrontation between those who “pay” and those who “build”, nor a zero-sum game in which one side wins only because the other absorbs pressure, risk, and ambiguity.
A healthy project works when technicians and clients manage to work as a team, recognizing that they have a concrete interest in doing so.
Why it benefits both sides
Technicians work better when they have time to understand the problem, when trade-offs are discussed openly, when priorities are clear, and when they are not forced to absorb every uncertainty through overtime or technical debt that no one sees.
In the same way, clients work better when they perceive transparency, when they understand what is risky and what is not, when they can make progressive decisions, and when they feel that their investment produces clarity even before it produces features.
In a truly collaborative project, no one feels they have to defend themselves from the other side, and even if discussions do not disappear, their nature changes: instead of serving to shift responsibility, they become a way to manage constraints and priorities.
An engineering necessity
This point is worth dwelling on. Collaboration in software is not an exclusively cultural or ethical matter. It is not about “being nice”, doing team building, or following some managerial trend: it is an engineering necessity.
In complex software projects, uncertainty exists anyway. We find it in requirements, architecture, integrations, performance, organizational processes, and the actual behavior of users. The choice is between managing it explicitly or letting it emerge in the form of conflict.
When a project pretends that uncertainty does not exist, sooner or later someone absorbs it late, in the form of delays, tensions, unexpected costs, lower quality, or operational burnout.
What it means to work as a team
Working as a team, in this context, has a very concrete meaning: making points of ambiguity explicit, discussing risks without softening them, distinguishing what we already know from what we do not yet know, and deciding step by step where to invest time, energy, and budget.
This does not mean abolishing roles or responsibilities, nor does it mean always agreeing. Rather, it means sharing an objective: reducing uncertainty enough to make better decisions.
First clarify, then invest
Our approach to Risk Aware Software Engineering comes from this idea.
For us, software engineering does not end with writing code. It must also serve to transform implicit complexity into manageable complexity: clarifying constraints, bringing trade-offs into focus, and distinguishing what is stable from what is still being explored.
For this reason, in our projects the level of commitment grows only as uncertainty decreases, in a path where first we clarify, then we validate, then we invest.
This is not mere “caution”. We do it because it is the most effective way to build sustainable systems without turning every project into a war of attrition.
Technology comes later
Technology comes after decisions, risk management, and the ability to face complexity without letting it degenerate into conflict.
In this logic, technology becomes a point of arrival rather than a premise.
We choose tools, languages, architectures, and patterns based on the real context, the constraints, the skills already present, the specific risks, and the goals of the people who will work with the system every day.
There is no technology that is better in absolute terms, but we can and must choose the one best suited to a specific problem, at a specific moment, with a specific level of residual uncertainty.
The meaning of collaboration
For this reason, our work is not measured by the lines of code produced, but by the quality of the decisions we are able to make possible together with the client.
When technicians and clients stop facing each other and start sharing uncertainty, the project changes nature, turning from a permanent negotiation into a shared path.
This, for us, is the meaning of collaboration in software. Not an ethical value to display, but an engineering choice that makes projects more sustainable, more predictable, and, in the end, more successful for everyone.
Author: Valeriano Sandrucci
