Letter To The Perplexed Graduate Developer

Tal Wanish
Riskified Tech

--

Let me start by saying Welcome! You are about to embark on a magical journey, during which you’ll experience working with amazing technologies, grappling with exciting ideas and meeting inspiring individuals. You’ll finally have the opportunity to use the skills that you’ve acquired ​​through your sweat, blood and tears to benefit others.

I remember my first experiences as a fresh graduate in the working world being extremely overwhelming. Not only could I barely keep up with my colleagues’ conversations, but I also had no idea how to begin clearing the dense fog ahead of me as I ventured into the unknown.

In this blog post, I’d like to share a few guidelines that I’ve learnt along the way and believe can also help you adopt healthy habits and a proper mindset, as you move along the path of becoming a fully fledged developer.

Expand & Explore

From the very first assignment, you’ll notice how many different approaches and disciplines are involved with shipping even a single line of code from your local machine to the “real world”. Every step in this process will make you feel swamped by a zillion questions, since it involves some form of decision making and judgment.

Allow yourself to be in this state of cognitive overload. As time goes by, you’ll be able to break down this big chunk of ambiguity into smaller chunks. Still ambiguous, but at least you can label it (CI/CD, OO/FP, DDD, TDD, Staging/Production, Client/Server, etc) and decide whether you want to explore it further or set it aside.

I vividly remember how my mentor, Eli Segal, mentioned Clojure in some drowsy afternoon talk at my first job. As I began diving in, I became fascinated by modern applications of Functional Programming (which until then I’d considered to be a bit academic). As a result, I dropped OOP from my toolkit and have been practicing FP ever since.

Allow yourself to explore the areas that intrigue you. Cultivate your curiosity beyond your direct field of expertise. Right now, you aren’t required to decide what specific expertise you’d like to develop. Looking at things from a wider perspective will help you discover what inspires you.

Hello, Universe!

As I mentioned earlier, your code has a rough and rowdy way to go before it reaches its final destination. In between, it’ll go through the process of being built, packaged, merged, integrated, monitored and deployed, before it’s finally up and running.

It was my first mentor (thanks, again) who gave me the opportunity to write a small Clojure client for an open-source project he was doing. Only then did I have to deal with the deployment of my code from end to end, during which I released the same code with an automatically incremented version on an infinite loop. As a developer it’s important to be aware of this pipeline, as it forms the ecosystem in which your code lives. This isn’t strictly coding, but then again you aren’t just a coder either.

Following the same argument, make an effort to understand the domain of your code. Ask yourself who the consumers of your code are and whether it behaves as they expect it to. It’s imperative to be attentive to your users’ needs and pain points, in order to come up with valuable solutions. Though it’s tremendously hard, don’t give-up trying to grasp the “big picture” beyond this or that feature. Try to wear the hat of the user, the product manager and the architect at the same time — you will provide more value to your users. You are, after all, a server.

Learn to Learn

There is a lot to learn out there, as you probably already know. You’re fortunate to be part of a community that promotes the virtues of critical thinking and questioning the status quo. Find out how to learn new things in the most effective way, whether it’s a new technology or methodology. Be on the lookout for good teachers, and always keep one eye open for creative ideas that may arise.

Remember, however, that good ideas don’t come around all that often. Moreover, sometimes an idea that appears to be cutting edge, is in fact just an old idea adapted to a new situation. Try to identify the underlying abstractions — besides helping you avoid fashionable trends, you’ll be able to draw analogies to things you’re already familiar with.

Make it a habit to review your code every few months. Your first reaction will probably be “What was I thinking?”, but don’t let that discourage you. Consider it a positive sign of your progress and use it to learn from your mistakes.

Build Your Independence

When faced with a problem, take the time to do some research before asking others for help. Try to detect and single out which problem is worth lingering on and which ones are not. Be mindful of your colleagues’ time.

Practice persistence. There are times when the solution will only arise after a long and frustrating process. Debug effectively. Determine the root cause of your problem, by systematically eliminating all other possibilities. Make yourself think like a machine.
Even if you don’t succeed in solving the problem, you’ll benefit in the long run from your efforts.

As for me, I’ve found that one of the most effective ways to strengthen my independence is to favor uncharted territory over familiar. Whenever I get the opportunity to deal with something out of my scope, I gladly grab it!

Refine Your Workflow

No matter whether you’re coding or debugging, it’s important to keep your thoughts flowing smoothly. A context switch has a high price.

Always revisit your workflow to maintain a tight feedback loop. When will you know it’s tight enough? When you don’t lose your train of thought between an action you did and its resulting effect.
Ask yourself if you’re using the right tools.

Automate manual tasks that you find yourself repeating frequently. It’s my policy to script every procedure I find myself doing more than a couple of times.
Be jealous of your time.

Be Rigorous

Whenever you’re discussing a problem with colleagues, be sure to include both pros and cons for each solution. Put facts before opinions, and explain your decision (even if it’s simply “we didn’t have time to think it through”). Be conscious of your compromises.

When addressing a new requirement, spend some time untangling the flow into separate and isolated functionalities. When analyzing a possible solution, learn to differentiate between the essential complexity that is inherent to the problem, versus the incidental complexity that may arise from the solution itself¹.

Be Happy

As a relatively new traveler on the road, my last suggestion is to have fun!
Though this may be a trivial fact, it still holds true: If you enjoy what you do, you’ll be better at it.
Seek out what makes you excited. Connect with people who are enthusiastic about it like yourself. Choose a workplace that values your values. Don’t forget to enjoy the side quests, and don’t forget to enjoy the ride.

[1]: Ben Moseley, Peter Marks (February 6, 2006) Out of the Tar Pit

--

--