Early in my career I was working on a project that ran into some undesirable behavior with an upstream service we depended on. My teammate took me over to the team that owned that service and we had an impromptu chat about what the issue we were facing was and why the service had this (in our view) unfortunate behavior.

The senior engineer we met with took the time to explain all the reasons for this behavior and how complicated the system was that we were working with. At the end of this, I was convinced that we were out of luck, but my teammate was undeterred and bravely asked if something could change about the system to help us. To my surprise, when they were asked about changing this seemingly fundamental behavior in their system, they happily responded “sure it can change, it’s just software!”

Their point was not that it should change, or that they would be able to make the change we wanted on a timeline that worked for us, but simply that it could change. We work in the world of software that we control nearly everything about, and can make changes however we want.

Sometimes changes are hard and take a long time because there’s pesky stuff like “data” that needs modification too. But generally as software engineers we can make any change we need, in much the opposite way that a civil engineer cannot simply change a structure once it has been built.

In the end, we did work around the issue we were facing on our own, without needing the changes to the upstream system. In this case, it was absolutely the right decision to not make changes just for the functionality we thought we needed. But this message has always stuck with me as a reminder whenever something in software seems “really hard” to modify. It’s just software, it can change. Change is always possible, for any part of it, and we should remember this fact to make sure we change the right things rather than the convenient ones.