First of all, I wanted to thank everyone who attended today’s session. I know there’s a lot going on in the world right now, but it was good to see so many people still engaged in learning and moving forward in their careers.
Hopefully, we were able to share some valuable tips and insights from our experiences and if you’re still interested in learning more about the program feel free to hop in on a free info session:
Sign up for our next Online Info Session - Outco Interview Prep | Career Accelerator for Software…
We covered a lot of questions today but I thought I’d just recap some of the main points I mentioned for anyone looking to review them.
Enjoy!
How Do I Get Better at Problem-Solving?
The generic answer to this question is to do as many practice problems as possible. Practice, practice, practice because practice makes perfect, after all.
But to me, this always raised more questions than it answered. How do I practice? How often? What kinds of problems? How do I know when I’ve mastered a subject? How do I track my progress?
This advice then starts to get very personalized, based on what you know already, what kind of interviews you need to prep for, what your strengths and weaknesses are…
Now, if you’re looking for a guide on how to breakdown the approach solving algorithm problems specifically, I’d suggest taking a look at this comprehensive post we have on the subject:
But if you’re looking for a single, overarching principle, for how to approach improving your problem-solving skills, I’d say this:
Learn with the objective of teaching.
Teaching others is the best way I’ve found at mastering a subject. Working as an engineer and an instructor for Outco was the single, most critical reason why I got good at problem-solving.
There are a few reasons why, to me, this is the best method of learning:
First, to teach someone else how to solve a problem, you have to know how to solve it yourself. There’s no way to fake it. You can’t just look up the answer, or pass some unit tests, and trick yourself into thinking you understand the problem. Your only metric is whether or not someone else can solve the problem after you’ve taught them.
Second, your understanding will be far more solid than if you just do a single pass at the problem. You’re forced to fill in the gaps, transcend roadblocks, handle edge cases. You’ll need to make sure you are able to answer your own questions about the problem and anticipate new questions that might arise. Teaching requires, time, effort, and preparation. The result is that you end up with a much more solid foundation.
Third, you get new insights into how others think. It acts as a mirror for you to reflect on some of your own dead-ends that you might have run into along the way. You also might get new perspectives on how to approach a problem. This might be a different way to diagram it, or a new example to test, or a way of looking at the problem you might not have thought of, and ultimately that will just be one more tool in your arsenal.
Fourth, you develop your communication skills. If you can teach a problem to someone else, you’ll be able to explain your solution to an interviewer. When I first started at Outco I thought I was a good teacher, but one year into the job I looked back and realized how far I had come and how much more I still needed to learn. You can always more succinct ways of explaining something.
And finally, it’s an awesome way to make new connections by helping others. Silicon Valley is small. You never know who you might cross paths with again in the industry. And you’ll always have co-workers, teammates, bosses or clients. I’ve run into former students everywhere from the subway, to the gym at Google, to other tech company’s cafeterias, to having them as interviewers. So it pays to build up some good karma.
How do I Create Systems to Support My Success?
The job search is a marathon, not a sprint. Individual interviews always have a non-negligible amount of luck associated with their outcome, regardless of how prepared you are. But that’s not where your focus should be.
Focus on what you can control: how you prepare for interviews, how you network, how you do practice problems, how you handle rejections, and how you recharge.
You can build systems to support your success in all those domains. I like to think about in terms of layers:
Your Environment
This layer is all about your immediate, physical surroundings.
Do you have the right tools to help you study? Whiteboards, markers, laptops, monitors, comfortable desks and chairs, etc.
Are you surrounded by other people working towards the same goal as you? Do you have colleagues, mentors, and/or mentees?
Do you have nutritious and comfort foods/snacks to keep you energized? Do you have ways of staying hydrated and caffeinated?
Do you have a way of limiting distractions, and places to decompress?
Your Behaviors
This layer is all about what you actually do in that environment.
Have you actually put in the hours? Coding, sending out applications, working on side projects, doing interviews, taking calls…
Are you eating right?
Are you sleeping enough?
Are you getting enough exercise?
Are you taking breaks, and doing activities you enjoy to take your mind off coding?
Your Capabilities
These are the actual new skills you are building.
Ask yourself, what are the new kinds of problems or topics you need to learn?
Can you solve recursion problems? What about graph and tree problems? How about dynamic programming?
How quickly can you solve these problems? Can you do it on a laptop as well as you can on a whiteboard?
What languages or frameworks do you know? What kinds of projects or apps can you build with them? How well are those projects architected and how clean is your code? How many people can you work with?
Do you know how to craft a good reverse-recruiting message? Do you know how to do the right kind of background research on a position or person?
Do you know how to eat healthily and exercise properly? Do you know how to rest?
What’s the Right Mindset to Grow as an Engineer?
One of the most rewarding but also challenging aspects of coding is just how immersed you really have to be in what you’re doing to be able to do it. Truly making headway into any kind of meaningful problem, whether at work or in an interview requires intense focus, patience, creativity, and attention to detail.
And no matter what, you can’t give up. You have to push through whatever obstacle or discomfort you might be faced with. To me, this can be taxing, so adopting the right mindset is crucial.
I always seem to do my best work when I’m in a mood to explore and be curious. It becomes about playing around with the problem and being immersed in solving the puzzle. It’s like detective work:
Debugging is love, Debugging is life
I can’t be thinking about something else while I’m working through a tough problem. It requires my full attention.
But being present and curious isn’t something that can necessarily be turned on or off. Sometimes it takes time to get into the right rhythm and to get enough momentum going to be productive.
But a big challenge I consistently face when trying to get into that rhythm is being scattered and feeling off-balance.
I think this comes down to there being a lot of distractions in today’s world since I don’t remember this being an issue for me in the pre-social media days.
It’s brain overload to the point where it all becomes useless noise. There’s too much context switching. Too many apps, messages, emails, texts, tweets, DMs, posts, pings, and popups.
It’s information pollution.
So what can we do about it?
Well, for me, I’ve picked up meditating and that seems to really help. I know that carries with it certain connotations because of how some people use the term, but I don’t mean anything crazy by it.
It’s simply finding some quiet time, away from distractions, where you can just let your thoughts unfold.
It’s nothing mystical, there’s not really a wrong way to do it, and you don’t necessarily need to think about anything specific while doing it.
I usually just put on some light music, sit cross-legged, and set a timer.
My friend even made a free app to help you track how frequently you’ve been doing it, and it lets you notify your friends when you finish a session:
And here’s the playlist I use when I need to get into the zone:
https://open.spotify.com/playlist/10F0A0lcAFMx470gwXbW3L?si=xOej0JdMQMeARp-ua_JUrA
My sessions typically range anywhere from 5 minutes to an hour. Usually, it’s at the end of the day when I have some time to unwind, but shorter sessions at the beginning typically help me get focused for the day so I don’t feel like I’m scrambling.
One thing I find is that it can be tough to just do nothing. It can feel like I’m wasting my time and not being productive.
But as the old Abraham Lincoln saying goes:
“Give me six hours to chop down a tree and I will spend the first four sharpening the axe”
The truth is that it always ends up being a productivity multiplier because it helps me address all the noise going on inside of my head. I just let them have their moment, and then I move on to more important thoughts.
Because making the most out of every day comes down to just being focused and able to perform at your best. If you can do that, I think you’ll have a very successful career as a software engineer.
Thanks for reading, and hopefully I’ll see you in a future session!