I love gardening. It's so pleasant, stepping into your own backyard and just grabbing a handful of tomatoes, plucking a cucumber right off the vine, or snacking on a piece of basil. It's not that hard, really, but it does take some advance planning, tlc, and perseverance when things don't go according to plan... and there's always something that doesn't go according to plan.
Enjoying something so much, getting so much satisfaction out of it when things are going well, makes it that much more aggravating when things don't go well. What's usually a source of joy becomes a source of heartburn. Like when the cucumber plant is doing its thing, taking over most of the garden bed, and then dries up and dies. Or the year we got way more rain than normal and the tomato plants yellowed and began dying, most likely root rot. Or this summer, when the japanese beetles descended en masse and decimated our green beans. They didn't touch anything else, but they did so much damage to the beans that I just pulled all the plants out and made room for more peas. Sigh. I love green beans.
It's tough, in that moment of ripping things up, to not get discouraged but to instead be grateful of how well everything else is going, and to remember how well things have gone in the past. How quickly a little negative can overshadow a whole lot of positive! It's easy to lose perspective.
I run into this all the time when programming (and everywhere in life, if I'm being honest). There are so many times when I try to do something, when I pour extra hours of effort into a thing, and I can just feel how close all the pieces are to falling into place. But then I realize I'm going in circles, spending more time than I meant to, and a solution, whatever it might be, has escaped me at the moment. Git checkout, try again later. Sometimes a lot later.
Other times, the extra hours pay off, like this last weekend. I needed to make some adjustments to our test environment to support QA efforts, but without some significant refactoring of one of our solutions, I would've actually had to deploy something to production to support development. It's not the end of the world, but certainly less than ideal technical debt, so I bit the bullet and did the refactoring. (This is one of those times where, if you present a software developer with an interesting and meaningful problem, they'll work a little overtime all on their own.)
A couple times I hit a wall and had my trigger finger hovering over the "git checkout" command. Then I had a conversation with a coworker, who helped me realize that I had already solved the problem and something else was preventing it from working. Voila, problem solved! It was a great feeling, knowing the gamble paid off, and I reworked something in a way that'll benefit the entire team moving forward.
The trick now is to hang on to that memory, to get me through the next thing that doesn't work out so well. Because there will be one - there always is. Welcome to software development. I used to think there were things that were beyond my ability to understand, things that I just couldn't figure out. Now I realize there are things that take me a short time to understand, and things that take a long time. Maybe a really long time, if I have to invest in learning new concepts just to get off the ground.
Even when I do hit a wall and abandon the attempt though, it's seldom a waste. It still casts light on things that were dark and brings with it a certain understanding that'll apply to other types of problems too. And even when things don't work out as planned, at least I've learned one more way to not fix it. Life goes on; next time will be better.