Hi, I’m Sean and I’m a successful failure

Successful Failure

Hi! I’m Sean and I’ve been fortunate enough to have contributed to projects like AMO, Rust, Tensorflow, Ruby on Rails, Homebrew, Hugo and Microsoft Docs to name a few. If you’ve seen any of my previous blogs, you would know that I aim for a positive narrative, only writing about my successes.

To be 100% honest, I struggled a lot at the beginning of my OSS journey and I still do one year later. It’s not because I’m seeking bugs that are drastically outside my capabilities, but rather I tend to venture into new territory, inching my comfort zone a little at a time. Regardless of the outcome, these experiences have been chartered onto my existing career map and help me stay aware of the future battles that I choose.

So, please let me correctly introduce myself — Hi, I’m Sean and I’m a successful failure.

A Personal Definition

My definition of “failure” isn’t as concrete as “pass” or “fail”, but something much more malleable that has been shaped by my own life experiences. This isn’t to say that I apply this definition to any other individuals, or that I don’t hold myself accountable for serious failures, but rather it’s a mindset that allows me to identify personal [pro/re]gressions.

As such, it’s an appropriate time to reflect on a recent experience for a project that I’m deeply involved with— AMO:

AMO — The home of Firefox extensions, themes, and much more

Simple Fixes, Right?

Venturing into the well known forest of AMO contrib: welcome labels, I aimed to give some love to older bugs:

Bugs dating back to 2016!

My attention was quickly captured by the keyword “response” in #1764: Use an actual Response object in createApiResponse:

https://github.com/mozilla/addons-frontend/issues/1764

Immediately I thought “hey, I think I know what that is! A response is what an API call returns!” What sold me was the fact that we needed to “stub” a function using fetch-mock. Essentially, we would need to hard code the behaviour of createApiResponse to return a result we controlled.

Piece of cake, right? 🍰

Attempt #1

Wrong. I spent hours reading the API docs for fetch-mock, making careful consideration of what arguments would go where and eventually was left with 6 failing tests — but progress is progress 👏🏽

Luckily just at that time, one of the maintainers, @wildurand, reached out to see how I was doing:

Check-in by Will

I asked Will for some help on deciphering the existing implementation of createApiResponse, hoping it’d shed more light. He was able to get back to me with some leads but once again those hit dead ends and I was left feeling lost.

I remember thinking “This is so embarrassing.. I’ve submitted harder patches than this before.. I can’t even imagine what Will must be saying 😐😓😭”

It was a slap to my ego and hopefully only a few frowns from the team that I’ve been working alongside for so long. I knew that the light at the end of the tunnel wasn’t coming anytime soon but I wasn’t out of tricks just as yet.

Attempt #2

I’m a big fan of leveraging debugging tools like breakpoints, especially in VSCode, my IDE of choice.

And so, I configured breakpoints around points of interest in hopes of finding a new path:

Unable to see the resolved Promise that may have led to more hints 😣

No luck once again. At this point, I spent close to 15 hours with little progress to show for it. I felt defeated and tucked away my ego to ask again for help.

Will’s response surprised me:

Reassuring words to hear

He even went a step further to let me know that I didn’t need to use fetch-mock all this time. Wait, whaaaat? Yep, that’s right — I spent a handful of hours investigating something I didn’t need to.

My initial gut instinct was telling me “why are we using a library when we can just create our own Response object?” It turns out that voicing my opinion from the beginning would have been beneficial. That was the real outcome from this patch.

Lesson Learned

Will realized that I was stuck and offered an entire working patch:

A gift from Will

While extremely appreciative of his time and effort spent to provide an answer, I know that being spoonfed answers won’t help me grow.

On the other hand, I learned a valuable lesson to communicate my opinion and dismiss any assumptions right from the beginning.

Final Thoughts

Everyone has their good and bad days. In this case, I grew as a result of frustration and determination. I didn’t want to give up so easily, but at the same time I developed tunnel vision on figuring out how to use a library instead of exploring other solutions.

Don’t be afraid to ask for help, but be ready to discuss the outcome of your attempts

To put it into perspective, a saying that I recently heard from two Googlers was the difference between a junior and senior intern. They mentioned that the junior gets posed a problem and reacts with “I don’t know what to do” whereas the senior says “I don’t know what to do but I’m going to keep at it.

Subtle difference in mindset, enormous difference in outcome — such is the difference between a failure and a successful failure.

Sean 👨🏽‍💻