How to Complain Like an Engineer (and Actually Fix Things)
software engineeringteam communicationdeveloper productivityengineering culture
563 Words
2026-03-05 00:00 +0000

Software development guarantees one thing: something will break.
A program throws a mysterious error. A tool fails silently. A process feels inefficient. A test takes forever. A linter complains about nonsense.
Frustration is normal. Complaints are normal.
What matters is what happens next.
There’s a huge difference between venting and improving. The same frustration can either create noise or move the team forward. The difference is structure.
1. “It doesn’t work” Is Not a Bug Report
Unhelpful:
I got an error! What should I do?
This forces everyone else to do the detective work.
Constructive:
I got this error. Here are the exact steps to reproduce it, the log output, the traceback, my environment details, and what I’ve already tried.
Now we have something concrete. A reproducible case turns emotion into engineering.
A good complaint contains:
- Context
- Evidence
- What you’ve already attempted
- A hypothesis, if you have one
Even a wrong hypothesis is useful. It shows thinking.
2. Don’t Burn the System Down Because It Annoyed You
Frustration tempts us toward extreme solutions.
Unhelpful:
The linter gave a false positive. Let’s remove the linter.
Or:
This test is slow. Let’s stop running tests.
That’s the engineering equivalent of removing a smoke detector because it beeped during cooking.
Constructive:
The linter produced a false positive in this case. I investigated and it seems related to rule X. We could tune the configuration or downgrade it to a warning.
Or:
This test takes 90 seconds. Can we mark it as slow and move it out of the unit test suite? Also, here’s a breakdown of where the time is spent.
Now we’re not destroying guardrails — we’re refining them.
A Small Real-World Example
In one team I worked with, a test suite suddenly slowed from 3 minutes to nearly 15. The immediate reaction in chat was predictable:
CI is unusable. We need to disable half the tests.
Instead, one developer profiled the suite. It turned out a new integration test was hitting a real external API instead of a mock. Every test run was waiting on network latency.
The fix took 20 minutes: isolate the test, mock the dependency, and mark it as integration-only.
The team kept its coverage. CI returned to normal speed. Nobody had to “solve” the problem by deleting safety nets.
The difference wasn’t technical skill. It was how the complaint was structured.
3. “This Code Is Bad” Is Not Feedback
Criticism without reasoning creates defensiveness.
Unhelpful:
This code is wrong.
That statement contains zero data.
Constructive:
This implementation tightly couples A and B. That makes testing harder and increases the risk of side effects. I suggest extracting an interface here, which would reduce the coupling and improve testability.
Notice what changed:
- The flaw is specific.
- The impact is explained.
- A solution is proposed.
Now we’re collaborating instead of judging.
A Pattern Worth Remembering
A constructive complaint usually follows this structure:
- Describe the observable problem.
- Provide evidence.
- Explain the impact.
- Suggest a direction for improvement.
This turns irritation into iteration.
Complaints are not the enemy of good engineering. Vague complaints are.
Well-structured criticism sharpens thinking, improves systems, and builds trust — because it signals care rather than frustration.
The next time something annoys you in a codebase or process, pause. Gather the facts. Write it clearly. Offer a direction.
You’ll be surprised how often “This is broken” becomes “This just got better.”