Feedback That Actually Works
2026-04-13
Feedback is one of those things everyone agrees is important, yet it is often done poorly. In practice, it either comes too late, lands badly, or quietly turns into criticism that nobody asked for. When done well, however, feedback becomes one of the most effective tools for growth, both individually and within teams.
What follows is not a rigid framework, but a set of principles that make feedback more human, more effective, and ultimately more useful.
Feedback Starts With Consent
Feedback without consent is not feedback. It is unsolicited criticism.
That distinction matters more than it may seem. Feedback is a collaborative act. It only works when both sides are willing participants. Before offering feedback, ensure the other person actually wants it. A simple “Is now a good time for some feedback?” is often enough.
Even in scheduled settings like reviews or one-on-ones, do not assume readiness. People bring their day with them. A quick check-in helps you gauge whether the moment is suitable.
It also helps to clarify intent upfront. A short framing like “I’m sharing this because I think it will help you with X” creates context and reduces defensiveness. It signals that the goal is constructive, not judgmental.
GPT Code Review
2024-04-16
In my hobby and open source projects, I often work alone. This can result in becoming somewhat insulated while working in my own bubble. Some time ago, I began using a pull request workflow with self-review. This method has proven quite effective, though occasionally, minor oversights still slip through the cracks.
Recently, with the rise of large language models (LLMs) like ChatGPT, we have access to remarkable language understanding tools. I've now automated the process to submit a code review request for every pull request I make.
C++ Defer
2024-03-24
In the development of C++ applications, especially those interfacing with C-style APIs, managing resources efficiently while ensuring exception safety can be challenging. To address this, I wrote a Zig-inspired defer construct, offering a practical solution for scenarios where implementing a full RAII wrapper is deemed excessive.
The defer construct is designed as follows:
namespace stdex
{
class defer
{
public:
defer(const std::function<void ()>& fun) noexcept
: fun(fun) {}
~defer()
{
if (fun)
{
fun();
}
}
void cancel() noexcept
{
fun = {};
}
private:
std::function<void ()> fun;
defer(const defer&) = delete;
defer& operator = (const defer&) = delete;
};
}