- May 13, 2021
A Mountain of Unknown
The staggering pace of growth and change in tools, technologies, and capabilities is one of the most exciting and daunting aspects of the web. As a developer in client services, a critical component of my job has always involved learning what needs to be learned in order to allow our clients to understand and take advantage of the benefits of this pace. Whether it’s an unfamiliar codebase, a new framework, or new browser capabilities — new challenges are always on the horizon.
At Happy Cog, I’m fortunate to be able to lean on the incredible wealth of knowledge and experience of our team to surface new ideas, give me a starting point, help me over a hump, or point me back in the right direction. This culture no doubt shapes the quality of solutions we’re able to deliver to our clients. But even in this environment, project challenges can feel isolating when they’re unusually complex or unfamiliar.
One of my first projects at Happy Cog was a large CMS re-platforming. This project had lots of moving parts, and a sizable team to support it. A few months in, a task landed on my plate for a specific, self-contained piece of functionality: an email relay for the client’s job board. Applicants could send an email to a job-specific auto-generated email address, and the system would forward incoming email to the job poster, obfuscating the poster’s true email address.
There were a few additional requirements to consider:
- It should stop forwarding messages when the job posting expires
- It should allow attachments, for applicants to include a resume
- It should work for any existing job postings migrated over for launch
- It should try to avoid forwarding spam
- It should be able to handle brief downtime for maintenance
Reading through the details, I understood all the requirements, and they felt familiar, like something I’d used — as a user — in the past. But thinking through how I would develop this, I realized:
I’ve never done anything remotely similar to this.
In fact, I don’t even know what I don’t know.
For me, that feeling was scary. As familiar as the feature felt to me as a user, it felt utterly foreign to me as a developer. And with no prior experience in this area, how could I even decide on the solution, much less build it?
Flash forward a few weeks, and with lots of help from other members of the development team, (panic), web searches, (self-doubt), documentation reading, (career-questioning), and debugging later, and I was able to come up with a solution that met all the requirements.
Kidding. But this isn’t a post about the solution or how you can build your own email relay service using SES Inbound Mail Processing, S3, SQS, SNS, and a small Lambda function. This is a post about what I realized about myself during this process, and how I got through each day along the way.
You Will Get Through It
My primary takeaway from this experience was a deeper understanding of the relationship between my excitement about solving a problem, and the number of unknowns in that problem. For me, not knowing something can be really exciting! Needing to learn a new skill or technology is exciting! And big problems are exciting! But there’s a critical mass of those things, and once a problem exceeds it, my confidence falls, my interest plummets, and excitement gives way to dread.
Looking back on those few weeks, getting through each day was tough, but the things I took away from that time I now carry with me into every new challenge.
Get One Thing Done
Progress — no matter how small — is crucial. For me, it was incredibly easy to spiral into doom and helplessness. When you feel that descent starting, try to take a step back and assess what you know right this second. I almost always realized that there was at least one thing I knew and could tackle at that moment in time. No matter how trivial, taking one crumb off what needs to be done always feels good.
Similarly, knowing you’re tackling a big problem can make it easy to zoom out and let new unknowns creep into your knowns. I tried to keep my days focused on the small things to keep me from going back to feeling overwhelmed by the big thing.
Set a Progress Framework
Having a day full of micro-decisions about what’s next when you’re feeling overwhelmed is a recipe for disaster. Instead, take a moment to separate yourself from the problem and decide what your progress should look like. For me, this came down to two options:
- In Sequence — My problem involved a particular flow through different systems, and I could tackle them one-by-one in that order.
- By Difficulty — Start with what’s easy to build momentum, or get the hard thing out of the way first and ride downhill from there.
Freeing myself from asking “what’s next?” helped me focus my efforts, recognize how far I’d gotten, and feel confident about what was to come.
Importantly, allow yourself to change your framework, but not in the name of procrastination. In this case, I started tackling things by difficulty, thinking I’d get the hardest aspects out of the way first, but ended up shifting to a sequential approach once I came to a better understanding of the inherent dependencies in my problem.
Work Toward Better Questions
It’s easy to want to work toward the solution immediately, but when tackling big problems with lots of unknowns, sometimes you need to work toward better questions instead. Rather than focusing on how to come up with the solution, try focusing on how to come up with the questions that will narrow and better define your problem. A new or specific question can sometimes be as impactful as an answer.
Once you are looking for answers, you may not find much information covering your exact problem or situation if it’s complex or project-specific. If results are sparse, you may have better results looking for resources covering one small part of your problem. Finding a good resource or example that tackles that small part can get you the momentum you need to keep pushing through.
The Usual Advice
It might seem cliché, but the basics honestly do help:
- Be vocal! The web has brought humanity closer than ever before; there’s no need to struggle in silence. Moreover, talking out your problem with a coworker, friend, or loved one is a great way to rubber duck yourself.
- Take a break, go for a stroll, and get a good night’s sleep. Fresh eyes can do wonders for tough problems.
- Psych yourself up! You’ve solved tons of problems before, you’ll get through this, and you’ll solve tons more in the future. Give yourself a pep talk, put on your favorite playlist, and get to it.
Reflect and Go Forth
We all need a reminder every now and then that we can achieve more than we think we’re capable of. In client services, you don’t always get to choose the problems you tackle, and every once in a while something ends up in your queue that throws you for a loop, and pushes you in new and different ways.
But once you get to the other side, take a few moments to reflect on what you’ve learned, both about the problem and about yourself, and carry those lessons with you. One day you’ll be in that position again with another problem; it might look different, and have its own nuances, and challenge you in ways you can’t anticipate now, but you’ll be ready. Not with the solution, but with the tools to get you there.
And I know I’ll get through it — as can you.