Sometimes, you have to climb those insurmountable walls.
There are a lot of things that I like about being a computer science student, but one thing I've found to be hard time after time, no matter how much experience I have, is delving into unfamiliar territory. Whether it be for a class that requires a bunch of skills I don't have, or an internship where I'm taking on a task that's completely new to me, or a project for the research lab I work with, learning something new is intimidating and difficult. Some people are great at getting their hands dirty and learning by doing, but I'm not one of those people at all. The initial hesitation to get started because I don't even know where to get started combined with the reluctance to take on the sheer volume of work that comes with learning form this insurmountable wall that is scary to look at, let alone climb. And then there's the added fear of failure, of messing up, of embarrassing yourself by asking others for help-- and suddenly, there's really no desire at all to do anything but stick with what you know.
The thing is, computer science-- and life-- are all about picking up new skills and adapting to the times. You have to be willing to climb that learning curve again and again to survive in a world where technology changes every day and new languages and frameworks are introduced every year. It might take a week of just sitting down and making your head hurt by digging through APIs, or asking dumb questions to the people who know what's going on, or making mistakes and admitting that you don't know, but you have to go through that period of uncertainty before you can become an expert. You had to do it to learn what you already know, and you have to do it to learn more. The only way I'm going to know more about the different fields of robotics is if I continually take on projects that I know nothing about and learn through those projects. The only way I'm going to finish my graphics projects is if I overcome the fear of starting and just get it done.
Here's what I usually do to climb the learning curve. I spend a week, or maybe if I'm lucky, a few days, building up the mental endurance for the task ahead and striking down all the doubts that run through my mind. I use this time to ask people for guidance, to do a little bit of light reading, and maybe dip my toes into the water, so to speak. I also use this time to do everything else that is on my to-do list to ensure that I can't procrastinate by doing other work. Once I've done everything else I possibly can and I can't procrastinate any longer, I plunge myself into the world of the unknown. I start off by breaking down the task of learning into subtasks. What are all the things I need to know to finish the project in front of me? What do I need to know immediately, and what can I learn later on? What resources do I have at my disposal to help me? From there, I do whatever I need to to learn the necessary initial skills-- tutorials online, skimming API or codebase code, and so on. I try to convince myself that I'm as prepared as I'll ever be, and then I finally start working. Once I've started working on a project that I don't feel equipped to do, it becomes much easier to continue working because now I'm invested in its outcome.
And for all the fear that I face when confronting unfamiliar projects, it's paid off every time. I've become more confident, and I've learned a lot of different coding and administrative skills. I've become stronger and more able to parse things that I don't have the expertise to understand. And the more learning curves I'm willing to climb, the less work I have to do to prepare myself for future projects. So don't be afraid to delve into a discipline or field that you know nothing about or take on a project that requires skills outside your technical expertise. You'll come out of it with more skills, more fortitude, and more experience.