The tale of the dropdown and the checkbox
Over the course of my career, I've often written large software systems which are eventually taken over by other developers.
Sometimes those systems end up having a very long lifespan. Sometimes those lifespans are long enough that those systems come back to me. And sometimes a lot of developers have gone through the system while it was out of my hands.
In the rare case where a system has returned to my realm of responsibility, the system in question is often large enough that doing an inventory of all the changes since it left my care would often prove to be prohibitive, let alone practical.
So I get to rediscover my own systems through the eyes of its past care takers, one odd decision at a time. Sort of like those Choose Your Own Adventure books we'd read as a kid, except that I don't get to choose, I just get to read the bizarre choices of past developers.
In one particular system, I had a user complain that whenever he'd archive an item in the web management portal, the item would disappear from the portal, but would still be visible on the public web site.
Being mostly a backend developer, my first instinct was to check the database. Looking at the table, I quickly found my original field of StatusID
from years past, and found that it's value was a 1
for Active
.
"Well, of course it's going to show. You have to set it to Inactive.", I said.
After watching the field update to a 2
for Inactive
.
"Oh right. One sec ... ok, that worked! Thanks.", he replied.
Great, nothing to fix, I thought. And went about my day.
A few weeks later, the user came back with the same issue. This, I thought, is odd. So I decided to take a deeper look this time around. I asked the user to share his screen with me and have him show me how he would go about archiving an item. And there it was. I couldn't believe it.
In the UI, right below the Status dropdown, there was a new checkbox with a simple label of Archived. My soul wept in silence as it questioned the decision of this phantom developer of the past. "Why would you add a checkbox when status is an integer and was meant to be expandable?", I cried to myself.
Looking closer at the database table, I found the Archived
field, arrogantly tacked onto the end of the long list of fields it already contained. A quick look around also confirmed that there was now a lot of code that had been written on top of this now thorny addition. A refactor would have been more work and effort than I would have cared for at the time.
So I did the only sensible thing I could do. I tossed dogmatism out the window and took the most pragmatic solution I could find.
First, I added a ficticious 3
for Archived
to the Status dropdown. Then I nuked the checkbox and its label. And then I simply added a bit of logic so that if Archived
was selected in the Status dropdown, it would save a StatusID
of 2
and set Archived
to true
in the database. And on load, if Archived
is true
, it ignores the StatusID
and sets the Status dropdown to 3
for Archived
. A quick manual update of the table to set all Archived
rows to a StatusID
of 2
for inactive, and I was done.
No refactor, just a quick fix, yet months went by and I never heard of the issue again. You can often get a lot done with some good pragmatism when you stop worrying about design patterns and just look for real solutions to real problems.
Leave me a comment below or find me online and let me know what you think!